본문 바로가기

분류 전체보기

(55)
Spring Boot - 요청 프로세스와 검증 먼저 Spring Boot의 요청 처리 프로세스를 다시 한 번 알아보자1. 사용자로부터 요청이 들어온다. 2. DispatcherServlet이 받아서 Header에 저장된 부가적인 정보를 이용해서 요청 처리를 위임할 Controller를 찾는다 (HandlerMapping)3. 요청를 위임할 HandlerAdapter를 찾아서 전달한다.※ 직접 Controller로 요청을 위임하지 않는 이유는 Controller 구현 방식이 다양하기 때문에 Adapter 패턴을 적용해 컨트롤러의 구현 방식에 상관 없이 요청을 위임한다.4. HandlerAdpater가  Controller를 호출한다. 여기까지가 스프링 부트를 공부할 때, 평범하게 알고가는 요청 프로세스이다.여기서 조금 더 자세히 알아보자. Contro..
Redis란? Redis는 Remote Dictionary Sever 의 약자로, 데이터를 드스크가 아닌 메모리에 저장하는 방식의 오픈소스 인메모리 데이터 저장소이다. Key-Value 구조를 사용하며, 초당 5만에서 25만 건의 요청을 처리할 수 있는 뛰어난 성능을 자랑한다.Redis GitHub에서 소스를 확인할 수 있다.Redis의 특징1. Key-Value 기반 구조Redis는 Key-Value Store라는 점에서 자바의 해시 테이블과 유사하다. 데이터는 메모리에 저장되므로 빠른 응답 속도와 높은 처리율을 제공한다. 그러나 메모리는 디스크보다 비싸고, 대규모 데이터를 저장하기에는 비용적인 제약이 있다.2. 데이터 지속성Redis는 메모리에 저장된 데이터를 디스크에 영구적으로 저장할 수 있는 기능을 제공한다. ..
Java 런타임 데이터 영역 C/C++ 개발자는 메모리 관리 측면에서 보면 각 객체의 소유권과 라이프타임 모두 관리할 책임을 지기 때문에 잡다한 것들을 다 하는 노가다꾼이라고 할 수 있다.  반대로 자바 개발자는 가상 머신이 제공하는 가비지 컬렉터 덕분에 메모리 할당과 해제를 직접 하지 않아도 메모리 누수나 오버플로 문제를 거의 겪지 않는다. 하지만 통제권을 위임 했기에 문제가 생기면 가상머신의 메모리 관리 방식을 이해하지 못하는 한 해결하기가 상당히 어렵다.  런타임 데이터 영역자바 가상 머신은 런타임 환경에 필요한 메모리를 몇 개의 데이터 영역으로 나누어서 관리한다. 각 영역은 목적과 생성/삭제 시점이 존재한다. 어떤 영역은 가상 머신 프로세스의 시작과 동시에 만들어지며, 어떤 영역은 사용자 스레드의 시작/ 종료에 맞춰 생성/삭..
Rust 소유권과 Lifetime 러스트의 소유권을 알기 전에 러스트의 메모리 관리에 대해 알아보자.Rust의 메모리 관리Java, Go, Python, Javascript와 같은 언어들은 GC를 사용하고 C/C++과 같은 경우에는 수동으로 프로그래머가 메모리를 관리한다.이와는 다르게 Rust는 컴파일 시점에 메모리 관리 규칙을 검사한다. 컴파일 시점에 메모리 관리를 확인 하면서 생기는 여러가지 특징이 있다.소유권 규칙에 따라 컴파일 시점에 메모리 할당/해제를 관리한다.규칙에 어긋나면 컴파일되지 않는다.규칙을 잘 지키면 컴파일러가 알아서 잘 처리해준다.실행시간 손해가 없다.개발자가 실수할 여지가 없다.Rust의 메모리는 블록(scope)이 끝날 때 해제가 된다. 예를 들어fn main() { { let s = "hell..
Java Annotation Java에서 @를 가진 식별자는 컴파일러가 애너테이션으로 해석한다. 애너테이션은 메서드, 생성자, 필드, 클래스 뿐만 아니라 매개변수, 예외처리 또는 흔하지는 않지만 코드 내 위치에 나타내게 된다.@Servicepublic class HttpService implements RemoteService { @NonNull private final Integer port; @Autowired public HttpService(@Qualifier("port") Integer port) {this.port = port;} @Override Response sendRequest(String req) throws @Critical NetworkException{}}위와 ..
Java native 키워드로 Rust코드와 연동하기 native 메서드는 자바가 아닌 C, C++, Rust와 같은 다른 언어들로 구현된 메서드를 뜻한다. 이 메서드를 사용하면 자바에서는 지원하지 않는 기능을 활용할 수 있고 성능상의 이유로 사용하지 못했던 코드를 사용할 수 있다.native 키워드 사용 방법메서드 선언부에 native 키워드를 사용하고, 메서드의 바디는 작성하지 않는다.일반적으로 JNI(Java Native Interface)를 통해 구현된다.public class NativeExample { // 네이티브 메서드 선언 public native int add(int num1, int num2); static { // 네이티브 라이브러리를 로드 System.loadLibrary("add"); ..
Java Modifier(제어자) 제어자란제어자는 클래스, 생성자, 메서드, 필드에 추가되는 키워드로 기능을 추가하며 타깃의 의미를 변경한다. 제어자는 일반적으로 접근제어자와 비접근 제어자 두 그룹으로 분리된다. 접근 제어자public, protected, private 잘 알려진 제어자로 이 키워드는 클래스, 생성자, 필드, 메서드 등에 적용될 수 있으며 적용되는 타깃에 대한 접근을 제어하는 역할을 한다.생성자 측면에서는 접근 제어자만 적용이 가능하며 제어자가 존재하지 않으면 package-private이 된다. 비접근 제어자비접근 제어자는 클래스, 메서드, 필드 기준 으로 나누어서 설명할 수 있다. 클래스 기준abstract - 클래스를 인스턴스화될 수 없는 클래스로 만드는 제어자 final - 클래스 구현을 마무리해 상속할 수 없게..
Java Reflection(3) Method - 클래의 메서드에 접근클래스의 모든 메서드들은 java.lang.reflect.Method타입의 객체로서 표현된다. Class.getDeclaredMethods()모든 메서드를 반환값으로 출력한다.Class.getMethod()super 클래스에서 상속된 메서드와 인터페이스를 포함한 모든 public 메서드를 출력한다.Method의 PropertiesMethod객체의 함수들 중 몇개만 알아보자. Method.getName(), Method.getSimpleName()클래스에 사용된 메서드의 이름을 문자열로 추출할 수 있다. (package 명 포함/ 미 포함) Method.getReturnType()특정 메서드의 반환 타입을 나타내는 클래스 객체를 알 수 있다. Method.getParam..