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
| # | 계층 | 호출자 | 수신자 | 메서드 / 설명 | 방향 |
|---|---|---|---|---|---|
| 1 | Tomcat | Browser | Connector | HTTP Request | → |
| 2 | Tomcat | Connector | CoyoteAdapter | service() | → |
| 3 | Tomcat | CoyoteAdapter | ApplicationFilterChain | doFilter() | → |
| 4 | Spring Security | ApplicationFilterChain | DelegatingFilterProxy | doFilter() | → |
| 5 | Spring Security | DelegatingFilterProxy | FilterChainProxy | doFilter() | → |
| 6 | Tomcat | ApplicationFilterChain | StandardWrapperValve | invoke() | → |
| 7 | Spring MVC | StandardWrapperValve | FrameworkServlet | service() | → |
| 8 | Spring MVC | FrameworkServlet | DispatcherServlet | doDispatch() | → |
| 9 | Spring MVC | DispatcherServlet | HandlerMapping | getHandler() | → |
| 10 | Spring MVC | HandlerMapping | DispatcherServlet | HandlerExecutionChain 반환 | ← |
| 11 | Spring MVC | DispatcherServlet | HandlerInterceptor | preHandle() | → |
| 12 | Spring MVC | DispatcherServlet | HandlerMethodArgumentResolver | resolveArgument() / DTO 바인딩 | → |
| 12-1 | Spring MVC | AbstractJackson2HttpMessageConverter | Jackson ObjectMapper | readValue() → DTO 객체 생성 | ↺ |
| 12-2 | Spring Validation | WebDataBinder | SmartValidator | validate() → @Valid 검증 | ↺ |
| 12-3 | Spring MVC | DispatcherServlet | ExceptionHandler | MethodArgumentNotValidException 처리 | ↺ |
| 13 | Spring MVC | DispatcherServlet | Controller | handle() | → |
| 14 | Service | Controller | Service | 비즈니스 로직 호출 | → |
| 15 | Data Access | Service | (JPA 또는 MyBatis) | 조회 분기 시작 | → |
| 15-J1 | JPA | Service | JpaRepository | findBy() | → |
| 15-J2 | JPA | JpaRepository | EntityManager | createQuery() | → |
| 15-J3 | DB | EntityManager | DB | SQL 실행 | → |
| 15-J4 | DB | DB | EntityManager | ResultSet 반환 | ← |
| 15-J5 | JPA | EntityManager | JpaRepository | Entity 매핑 | ← |
| 15-J6 | JPA | JpaRepository | Service | Entity 반환 | ← |
| 15-M1 | MyBatis | Service | Mapper | selectBy…() | → |
| 15-M2 | DB | Mapper | DB | SQL 실행 | → |
| 15-M3 | DB | DB | Mapper | ResultSet 반환 | ← |
| 15-M4 | MyBatis | Mapper | Service | DTO/VO 반환 | ← |
| 16 | Service | Service | Controller | 결과 반환 | ← |
| 17 | Response | Controller | DispatcherServlet | 응답 분기 시작 | ← |
| 17-V1 | Spring MVC | Controller | DispatcherServlet | ModelAndView 반환 | ← |
| 17-V2 | Spring MVC | DispatcherServlet | HandlerInterceptor | postHandle() | → |
| 17-V3 | Thymeleaf | DispatcherServlet | ViewResolver | resolveViewName() | → |
| 17-V4 | Thymeleaf | ViewResolver | DispatcherServlet | ThymeleafView 반환 | ← |
| 17-V5 | Thymeleaf | DispatcherServlet | ThymeleafView | render(model) | → |
| 17-V6 | Thymeleaf | ThymeleafView | ThymeleafView | TemplateEngine.process() | ↺ |
| 17-V7 | Thymeleaf | ThymeleafView | DispatcherServlet | HTML 반환 | ← |
| 17-V8 | Spring MVC | DispatcherServlet | Browser | HTTP Response (HTML) | ← |
| 17-R1 | Spring MVC | Controller | DispatcherServlet | Object / ResponseEntity 반환 | ← |
| 17-R2 | Spring MVC | DispatcherServlet | HandlerMethodReturnValueHandler | handleReturnValue() | → |
| 17-R3 | Spring MVC | HandlerMethodReturnValueHandler | HttpMessageConverter | writeWithMessageConverters() | → |
| 17-R4 | Spring MVC | HttpMessageConverter | HttpMessageConverter | JSON 직렬화 | ↺ |
| 17-R5 | Spring MVC | HttpMessageConverter | DispatcherServlet | Response Body 작성 완료 | ← |
| 17-R6 | Spring MVC | DispatcherServlet | Browser | HTTP Response (JSON) | ← |