정리중
웹 애플리케이션의 핵심은 클라이언트의 요청을 받아 적절한 응답을 내보내는 과정에 있다. 스프링 부트(Spring Boot) 환경에서 하나의 REST API 요청이 들어왔을 때, 인프라 계층부터 비즈니스 로직을 거쳐 다시 응답으로 나아가기까지의 내부 동작 원리를 정리한다.
클라이언트의 HTTP 요청은 가장 먼저 외부망과 맞닿아 있는 리버스 프록시 서버인 Nginx에 도달한다. Nginx는 보안과 효율성 측면에서 중요한 역할을 수행한다.
Nginx를 통과한 요청은 서블릿 컨테이너인 톰캣의 **Connector(NIO)**에 의해 처리된다.
Executor는 스레드 풀에서 유휴 스레드를 하나 할당한다. 이 스레드는 요청이 완료될 때까지 ThreadLocal 영역에 요청 문맥을 유지하며 실행된다.HttpServletRequest와 HttpServletResponse를 생성하여 이후 계층으로 전달한다.디스패처 서블릿(DispatcherServlet)에 도달하기 전, 서블릿 컨테이너 수준에서 Filter들이 순차적으로 실행된다. 필터는 스프링 컨텍스트 외부(혹은 경계)에서 동작하며 전역적인 처리를 담당한다.
DelegatingFilterProxy를 통해 스프링 빈으로 등록된 필터들이 제어권을 넘겨받아 실행된다.모든 API 요청의 중앙 접점이자 스프링 MVC의 핵심 컴포넌트이다.
RequestMappingHandlerMapping에서 요청 URL 경로와 HTTP 메서드에 부합하는 HandlerMethod(컨트롤러의 특정 메서드)를 찾는다.RequestMappingHandlerAdapter)를 호출하여 실행 준비를 마친다.컨트롤러 메서드의 파라미터를 분석하여 실제 데이터를 주입하는 과정이다.
@RequestBody가 선언된 경우, RequestResponseBodyMethodProcessor가 작동하며 내부에 등록된 MappingJackson2HttpMessageConverter를 호출한다.@Valid)도 함께 진행되는 경우가 많다.컨트롤러 실행 직전과 직후, preHandle()과 postHandle() 메서드를 통해 비즈니스 공통 로직을 수행한다. 필터가 서블릿 단위의 공통 처리를 담당한다면, 인터셉터는 스프링 컨텍스트 내부에서 컨트롤러와 긴밀하게 연결된 상세 권한 체크나 API 호출 로깅 등에 사용된다.
실질적인 비즈니스 요구사항이 처리되는 구간이다.
@Transactional이 선언된 서비스 메서드 호출 시, 스프링은 CGLIB 또는 JDK Dynamic Proxy를 통해 트랜잭션을 시작한다. 메서드 실행 중 예외가 발생하면 롤백을 수행하고, 정상 종료 시 커밋을 진행한다.데이터베이스와의 상호작용이 일어나는 계층이다.
비즈니스 로직이 종료되어 컨트롤러가 DTO를 반환하면 응답 생성이 시작된다.
HttpMessageConverter가 다시 가동되어 자바 객체를 JSON 텍스트로 직렬화(Serialization)한다.