본문으로 바로가기

[Spring] Lifecycle

category Framework/Spring 2022. 1. 15. 00:58

개요

Spring 을 사용하기 위해서는 Spring MVC 의 생명주기(Request Lifecycle)에 대한 이해가 필요합니다.

해당 포스트 에서는 Spring의 생명주기와 각 요소들이 어떤 역할을 하는지에 대해 기술합니다.

 

Spring MVC Request Lifecycle

Filter

Client의 요청(Request) 이 있을시 가장 먼저 실행되고, 가장 마지막으로 거치게 되는 영역으로 요청 및 응답에서 전역적으로 적용되어야 하는 로직을 기술한다. (Security, Encoding 등..)

 

DispatcherServlet

요청되는 모든 Request 를 우선적으로 받아 처리해주는 서블릿으로 요청된 End-Point 에 대한 Interceptor 와 Controller의 맵핑을 검색하고, 요청을 전달한다.

 

HandlerMapping

DispatcherServlet 으로부터 요청받은 End-Point 에 맵핑되는 Controller 의 정보를 리턴한다.

 

HandlerInterceptor

Request 가 Controller 에 매핑되기 전 앞단에서 선행되어야 하는 부가적인 로직을 기술한다.

(세션, 쿠키, 권한인증 등..)

 

Controller

Request 와 매핑되는 단계로 Request에 전달된 데이터를 처리할 Service 를 호출하고 처리된 데이터를 리턴한다.

Service를 호출하기 위해 Service Bean 을 스프링 컨테이너로 부터 주입받아야한다.

 

Service

데이터 처리 및 가공을 위한 비즈니스 로직을 수행한다.

주입된 Repository 를 통해 DB에 접근하여 데이터의 C,R,U,D 를 처리한다.

 

Repository

DB에 접근하는 객체로 DAO(Data Access Object) 라고 부른다.

Service Layer 에서 요청된 Entity 정보를 받아 DB의 C,R,U,D 기능을 제공한다.

 

ViewResolver

Controller에서 리턴한 View 의 정보를 DispatcherServlet으로부터 넘겨받아 해당 View 를 렌더링 한다.

렌더링 된 View는 DispatcherServlet으로 리턴하고, DispatcherServlet에서는 해당 View 화면을 Response 한다.

 

Filter & Interceptor 의 차이점, 그리고 AOP

Filter 와 Interceptor 는 Controller 를 통해 비즈니스로직이 실행되는 흐름에 간섭하는 역할은 한다는 점에서 동일하다.

하지만 두 Layer 에는 중요한 차이점이 존재한다.

실행시점

Filter 의 경우 DispatchServlet 진입 이전인 Web Application 단에서 실행이 된다.

따라서 Spring 컨테이너에 의해 관리되는 인스턴스(기능)들을 사용할 수 없다.

 

Interceptor 의 경우 Spring Application 단에서 실행이 되므로 Bean 으로 등록된 Spring 컨테이너의 인스턴스를 모두 사용할 수 있다는 점에서 다르다.

 

위 이미지에서 AOP에 해당하는 영역은 Controller, Service, Repository 등의 어플리케이션 핵심 로직을 모두 포함하며, Filter와 Interceptor 모두 이러한 핵심로직에 진입하기에 앞서 선행되어야 하는 로직들을 포함한다고 이해하면 되겠다.

 

그렇다면, 굳이 Filter 와 Interceptor 를 각각의 계층으로 구분해둔 이유는 무엇일까?

Interceptor는 Spring Application 에 등록된 기능들을 사용할 수 있지만 이는 생명주기 내에서 필요로 하는 의존성들이 컨테이너에 바인딩 되었다는 뜻이 되겠고, 이는 해당 인스턴스가 메모리 내에 한 부분을 점유하고 있다고 볼 수 있다.

따라서, Spring 컨테이너에 필요한 인스턴스를 등록하지 않은 시점에 필터링 후 응답을 내려줄 수 있는 로직이라고 한다면 생명주기 내에서 불필요한 메모리를 소비하지 않고 응답을 내려줄 수 있다는 말이 된다.

 

Spring 뿐만 아니라 다른 언어의 백엔드 웹을 지원하는 프레임워크를 사용하더라도 요청과 응답에 대한 생명주기(Lifecycle)을 이해하는 것은 이러한 관점에서 매우 중요하다고 할 수 있겠다.

'Framework > Spring' 카테고리의 다른 글

[Spring] 00. Spring Triangle 스프링의 핵심 3대 요소  (0) 2022.01.14
[Spring] Security 가 적용된 Test  (0) 2022.01.14
[Spring] Open API 3 (with Swagger3)  (0) 2022.01.11
[Spring] Swagger 3  (0) 2022.01.11
[Spring] Filter & Interceptor  (0) 2021.12.22