본문 바로가기

Java

(41)
Dispatcher Servlet 두번째 저번 글에서는 DispatcherServlet이 어떤식으로 동작하는지 직접 코드를 보며 설명했습니다. 이번 글에서는 DispatcherServlet 이 사용하는 인터페이스에 대해 살펴보겠습니다. 각각 어떤 인터페이스가 있으며 어떤 역할을 수행하는지 보겠습니다. DispatcherServlet은 처음 구동시에 위의 인터페이스들을 초기화하는 과정을 겪습니다. 1. MultipartResolver 파일 업로드 요청을 처리하는데에 사용되는 인터페이스 입니다. 바이너리 데이터를 부분씩 처리하는 로직을 손쉽게 사용할 수 있도록 MultipartResovler가 처리해줍니다. 보다 구체적으로는 HttpServletRequest 를 MultipartHttpServletRequest로 변환해주는 작업을 담당합니다. 인터..
Java8 Java8 버전을 이용해 개발을 하면서도 정확하게 어떤 특징이 있는지 공부하지 못했단 생각이 듭니다. 이번 기회에 이에 대해 분석하고 글을 작성해보고자 합니다. 1. interface 의 변경 기존의 interface는 상수와 추상 메소드만을 정의할 수 있었지만, Java8 이후부터는 default method 를 구현하여 method body를 작성할 수 있습니다. 또한 static method 도 사용이 가능합니다. 이제 method body 도 작성할 수 있단 점에서 추상 클래스와 차이점이 없어 보이는데 다른점이 있습니다. 인터페이스는 상수만을 사용할 수 있기 때문에 멤버변수 사용에 제한적입니다. 또한, 생성자가 없어서 생성시 초기화 해주는 작업이 필요한 경우 적합하지 않습니다. 무엇보다 가장 큰 ..
DispatcherServlet dispatcher servlet 이 하는 일은 아래와 같은 순서로 일어납니다. 1) 요청을 분석합니다. 2) 요청을 처리할 핸들러를 핸들러매핑에게 위임하여 찾아옵니다. 3) 핸들러를 실행할 수 있는 "핸들러 어댑터"를 찾습니다 4) "핸들러 어댑터"를 사용해 핸들러의 응답을 처리합니다. - 뷰이름에 해당하는 뷰를 찾아 모델 데이터를 렌더링합니다. - @ResponseBody가 있으면 Converter를 사용해 응답 본문을 만들고 최종 응답을 보냅니다. - 예를 들어 @ResponseBody가 있으면 ModelAndView 는 null이고 응답 바디를 생성해 리턴합니다. 5) 예외 발생시 예외처리 핸들러에게 요청처리를 위임합니다. 6) 핸들러의 리턴값을 통해 어떻게 처리할지 판단합니다. request를 ..
Servlet Servlet container tomcat 등 servlet을 관리하는 역할입니다. 초기화, 실행, 사용 등의 라이프사이클을 제어합니다. 서블릿 컨테이너가 서블릿을 실행하는 방법은 서블릿 생명주기와 관련있습니다. 최초 서블릿을 호출할 때 init 메소드를 호출합니다. 그 뒤 http method 에 따라서 doGet, doPost 등의 메소드가 호출됩니다. destroy 의 경우는 서블릿 컨테이너의 재량에 따라 서블릿이 더 이상 메모리에 올려둘 필요가 없다고 판단되거나 서블릿 컨테이너가 종료될 때 destroy가 호출됩니다. Servlet listener 서블릿 컨테이너에서 발생하는 이벤트(라이프사이클, 애트리뷰트, 세션 등)로 특정 코드를 실행해야할 때 사용할 수 있는 개념입니다. 서블릿 컨테이너가 ..
Null-safety Null 관련 어노테이션을 작성해보겠습니다. @NonNull @Nullable @NonNullApi @NonNullFields 이렇게 input 에 null 이 들어오지 않도록 , return 도 null 이 되지 않도록 설정할 수 있습니다. AppRunner에 null 을 입력해보니 compile error 가 뜨지 않습니다.. 이럴경우 STS 에서 추가 설정을 해주어야 합니다.
AOP `Aspect Oriented Programming 의 개념과 주요 용어 포인트컷 문법 @Aspect 어노테이션 객체지향 기본원칙을 적용해서 핵심기능과 부가기능을 분리해서 모듈화하는 것은 매우 어렵습니다. 스프링AOP는 OOP를 보완하는 수단으로 흩어진 Aspect를 모듈화할 수 있는 기법입니다. 핵심기능과 부가기능 업무 로직을 포함하는 기능을 핵심기능(core concerns) 핵심 기능을 도와주는 부가적인 기능(로깅, 보안 등) --> 부가기능(cross-cutting concerns) 핵심 기능에서 부가기능을 분리해서 모듈화하는 프로그래밍 기법이 AOP 입니다. Aspect는 Crosscutting Concerns 를 모듈화한 것을 의미합니다. 모듈안에는 advice (해야할 일들), Join po..
SpEL Spring Expression Language 객체 그래프를 조회하고 조작하는 기능을 제공합니다. Value 어노테이션의 값 안에 #을 붙이면 표현식으로 인식됩니다. Property 를 참고하는 방법은 $ 을 붙이면 됩니다. 표현식에서는 property 를 사용할 수 있지만 property 안에서는 표현식을 사용할 수 없습니다. ExpressionParser 를 이해하면 SpEL 를 이해할 수 있습니다.
Data binding 사용자가 입력한 값을 어플리케이션 도메인에 맞게 동적으로 변환하여 넣어주는 기능을 "Data binding" 이라고 합니다. 즉, 사용자가 입력한 "문자열"을 객체의 int, boolean, date 등의 도메인으로 변환하는 것입니다. 먼저 get 요청으로 오는 event 를 Event 객체로 받아서 그 아이디를 return 하는 메소드를 아래와 같이 구현하였습니다. Test 를 위해 Test 클래스를 작성하겠습니다. @WebMvcTest 는 계층형 테스트와 관련있습니다. 웹과 관련된 Bean만 등록해줍니다. get 요청으로 보내진 1 이라는 숫자는 아직 Event 객체로 매핑될 수 없기 때문에 테스트 수행시 에러가 발생할 것입니다. **** 이때 혹시 "no test found with test run..