HTTP 요청 전체 흐름

브라우저에서 HTTP 요청이 시작되어 Tomcat → Spring Security → Spring MVC → (JPA 또는 MyBatis) → DB → (Thymeleaf 또는 REST API) 를 거쳐 응답이 반환되기까지의 흐름입니다.

sequenceDiagram actor Browser participant Connector participant CoyoteAdapter participant FilterChain as ApplicationFilterChain participant SecurityProxy as DelegatingFilterProxy participant SecurityChain as FilterChainProxy participant WrapperValve as StandardWrapperValve participant FrameworkServlet participant DispatcherServlet participant HandlerMapping participant Interceptor as HandlerInterceptor participant ArgumentResolver as HandlerMethodArgumentResolver participant Controller participant Service participant JpaRepository participant EntityManager participant MyBatisMapper as MyBatis Mapper participant DB participant ReturnValueHandler as HandlerMethodReturnValueHandler participant MessageConverter as HttpMessageConverter participant ViewResolver participant ThymeleafView Browser->>Connector: HTTP Request Connector->>CoyoteAdapter: service() CoyoteAdapter->>FilterChain: doFilter() FilterChain->>SecurityProxy: doFilter() SecurityProxy->>SecurityChain: doFilter() SecurityChain->>SecurityChain: doFilterInternal()에서 체인 선택 SecurityChain-->>FilterChain: 인증/인가 통과 FilterChain->>WrapperValve: invoke() WrapperValve->>FrameworkServlet: service() FrameworkServlet->>DispatcherServlet: doDispatch() DispatcherServlet->>HandlerMapping: getHandler() HandlerMapping-->>DispatcherServlet: HandlerExecutionChain DispatcherServlet->>Interceptor: preHandle() DispatcherServlet->>ArgumentResolver: resolveArgument() (@RequestBody DTO 바인딩) ArgumentResolver-->>DispatcherServlet: 컨트롤러 파라미터 준비 완료 DispatcherServlet->>Controller: handle() Controller->>Service: 비즈니스 로직 호출 alt JPA로 조회 Service->>JpaRepository: findBy() JpaRepository->>EntityManager: createQuery() EntityManager->>DB: SQL 실행 DB-->>EntityManager: ResultSet EntityManager-->>JpaRepository: Entity 매핑 JpaRepository-->>Service: Entity 반환 else MyBatis로 조회 Service->>MyBatisMapper: selectBy...() MyBatisMapper->>DB: SQL 실행 DB-->>MyBatisMapper: ResultSet MyBatisMapper-->>Service: DTO/VO 반환 end Service-->>Controller: 결과 반환 alt Thymeleaf View 반환 Controller-->>DispatcherServlet: ModelAndView DispatcherServlet->>Interceptor: postHandle() DispatcherServlet->>ViewResolver: resolveViewName() ViewResolver-->>DispatcherServlet: ThymeleafView DispatcherServlet->>ThymeleafView: render(model) ThymeleafView->>ThymeleafView: TemplateEngine.process() ThymeleafView-->>DispatcherServlet: HTML DispatcherServlet-->>Browser: HTTP Response (HTML) else REST API 반환 Controller-->>DispatcherServlet: Object / ResponseEntity DispatcherServlet->>ReturnValueHandler: handleReturnValue() ReturnValueHandler->>MessageConverter: writeWithMessageConverters() MessageConverter->>MessageConverter: JSON 직렬화 MessageConverter-->>DispatcherServlet: Response Body 작성 완료 DispatcherServlet-->>Browser: HTTP Response (JSON) end
# 계층 호출자 수신자 메서드 / 설명 방향
1TomcatBrowserConnectorHTTP Request
2TomcatConnectorCoyoteAdapterservice()
3TomcatCoyoteAdapterApplicationFilterChaindoFilter()
4Spring SecurityApplicationFilterChainDelegatingFilterProxydoFilter()
5Spring SecurityDelegatingFilterProxyFilterChainProxydoFilter()
6TomcatApplicationFilterChainStandardWrapperValveinvoke()
7Spring MVCStandardWrapperValveFrameworkServletservice()
8Spring MVCFrameworkServletDispatcherServletdoDispatch()
9Spring MVCDispatcherServletHandlerMappinggetHandler()
10Spring MVCHandlerMappingDispatcherServletHandlerExecutionChain 반환
11Spring MVCDispatcherServletHandlerInterceptorpreHandle()
12Spring MVCDispatcherServletHandlerMethodArgumentResolverresolveArgument() / DTO 바인딩
12-1Spring MVCAbstractJackson2HttpMessageConverterJackson ObjectMapperreadValue() → DTO 객체 생성
12-2Spring ValidationWebDataBinderSmartValidatorvalidate() → @Valid 검증
12-3Spring MVCDispatcherServletExceptionHandlerMethodArgumentNotValidException 처리
13Spring MVCDispatcherServletControllerhandle()
14ServiceControllerService비즈니스 로직 호출
15Data AccessService(JPA 또는 MyBatis)조회 분기 시작
15-J1JPAServiceJpaRepositoryfindBy()
15-J2JPAJpaRepositoryEntityManagercreateQuery()
15-J3DBEntityManagerDBSQL 실행
15-J4DBDBEntityManagerResultSet 반환
15-J5JPAEntityManagerJpaRepositoryEntity 매핑
15-J6JPAJpaRepositoryServiceEntity 반환
15-M1MyBatisServiceMapperselectBy...()
15-M2DBMapperDBSQL 실행
15-M3DBDBMapperResultSet 반환
15-M4MyBatisMapperServiceDTO/VO 반환
16ServiceServiceController결과 반환
17ResponseControllerDispatcherServlet응답 분기 시작
17-V1Spring MVCControllerDispatcherServletModelAndView 반환
17-V2Spring MVCDispatcherServletHandlerInterceptorpostHandle()
17-V3ThymeleafDispatcherServletViewResolverresolveViewName()
17-V4ThymeleafViewResolverDispatcherServletThymeleafView 반환
17-V5ThymeleafDispatcherServletThymeleafViewrender(model)
17-V6ThymeleafThymeleafViewThymeleafViewTemplateEngine.process()
17-V7ThymeleafThymeleafViewDispatcherServletHTML 반환
17-V8Spring MVCDispatcherServletBrowserHTTP Response (HTML)
17-R1Spring MVCControllerDispatcherServletObject / ResponseEntity 반환
17-R2Spring MVCDispatcherServletHandlerMethodReturnValueHandlerhandleReturnValue()
17-R3Spring MVCHandlerMethodReturnValueHandlerHttpMessageConverterwriteWithMessageConverters()
17-R4Spring MVCHttpMessageConverterHttpMessageConverterJSON 직렬화
17-R5Spring MVCHttpMessageConverterDispatcherServletResponse Body 작성 완료
17-R6Spring MVCDispatcherServletBrowserHTTP Response (JSON)