
Spring 애플리케이션을 실행하고 요청을 보내면 유독 첫 요청이 오래 걸립니다. 이것은 우연이 아니고 디스패처 서블릿의 구조와 관련이 있습니다. 이번에는 왜 스프링에서는 첫 요청이 처리되는데 오래 걸리는지 그리고 어떻게 해결할 수 있는지 살펴보도록 하겠습니다. 1. 스프링의 서블릿 초기화 작업들 [ 디스패처 서블릿과 서블릿의 생명 주기 ] 스프링에는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임하는 디스패처 서블릿이 있다. 디스패처 서블릿은 J2EE 스펙의 HttpServlet 클래스를 확장한 서블릿 기반의 기술인데, 첫 요청이 오래 걸리는 이유는 서블릿의 생명주기와 연관이 있다. 서블릿의 생명 주기는 3가지 단계로 나뉘어지는데, 그림으로 보면 다음과 같다. 초기화: 요청이 들어오면 서블릿이 웹 ..
Spring에서 수동으로 빈을 등록할 때에는 @Configuration 클래스 안에서 @Bean을 사용해야 합니다. 이번에는 왜 @Configuraiton 클래스 안에서 @Bean을 사용해야 하는지 살펴보도록 하겠습니다. 1. @Configuration 안에 @Bean을 사용해야 하는 이유, proxyBeanMethods [ @Configuration 안에 @Bean을 사용해야 하는 이유 ] @Bean 어노테이션을 이용한 수동 빈 등록 스프링에서는 일반적으로 컴포넌트 스캔을 사용해 자동으로 빈을 등록하는 방법을 이용한다. 하지만 @Bean 어노테이션을 사용해 수동으로 빈을 등록해야 하는 경우도 있다. 대표적으로 다음과 같은 경우에 @Bean으로 직접 빈을 등록해준다. 개발자가 직접 제어가 불가능한 라이브..

최근에 어디에선가 API에 매핑되는 컨트롤러와 메소드를 찾는 방법이 있냐는 질문을 보게 되었습니다. 마침 최근에 디스패처 서블릿 코드를 보면서, 디스패처 서블릿이 어떻게 컨트롤러로 요청을 위임하는지 알게 되었는데, 이번에는 어떻게 이러한 문제를 해결할 수 있는지 살펴보도록 하겠습니다. 1. HandlerMapping과 HandlerMethod 간단히 살펴보기 [ 핸들러 매핑(HandlerMapping) ] 핸들러 매핑(HandlerMapping)과 RequestMappingHandlerMapping 클래스 스프링은 컨트롤러와 메소드 정보를 관리하고 있다가, 요청이 왔을 때 디스패처 서블릿이 어느 컨트롤러가 이를 처리해야하는지 식별하고 위임한다. 컨트롤러에는 @RequestMapping 관련 어노테이션이 ..

몇몇 포스팅과 조금 오래된 책들을 보면 필터(Filter)는 서블릿 기술이라서 Spring의 빈으로 등록할 수 없으며 빈을 주입받을수도 없다는 내용이 나옵니다. 하지만 실제로 테스트를 해보면 Filter 역시 스프링 빈으로 등록이 가능하고, 빈의 주입도 받을 수 있는데 왜 이러한 설명들이 나오게 되었는지 다뤄보고자 합니다. 1. 서블릿 필터(Servlet Filter)가 스프링 빈으로 등록 가능한 이유 [ 필터(Filter)는 스프링 빈으로 등록이 불가능했다! ] 몇몇 포스팅과 예전 책들을 보면 필터(Filter)는 서블릿 기술이라서 Spring의 빈으로 등록할 수 없다는 내용이 나온다. 또한 필터는 J2EE표준 스펙 기능이지만 인터셉터는 스프링 프레임워크가 제공하는 기술이므로 필터와 달리 인터셉터는 스..

이번에는 SpringBoot의 실행 과정을 소스 코드로 직접 살펴보려고 합니다. 지난번에는 빈들을 찾아서 객체로 만들고 후처리를 해주는 refresh 메소드를 자세히 살펴보았는데, 마지막으로 DispatcherServlet(디스패처 서블릿) 동작 과정을 코드로 살펴보려고 합니다. 많은 디자인 패턴이 적용되어 있고, 요청을 처리하는 프론트 컨트롤러이자 핵심 클래스인만큼 열심히 살펴보도록 하겠습니다. 아래의 내용은 SpringBoot 2.6.3를 기준으로 작성되었습니다. 1. DispatcherServlet(디스패처 서블릿) 동작 과정 [ DispatcherServlet(디스패처 서블릿) 동작 과정 ] 디스패처 서블릿은 모든 요청을 가장 먼저 받는 프론트 컨트롤러이다. 디스패처 서블릿의 동작 과정을 이해하기..