Spring MVC 3-tear와 구조 및 동작 순서

Sundae·2023년 11월 5일
post-thumbnail

Spring MVC 3-tear


Spring 프로젝트는 다음과 같이 MVC 3-tear 계층으로 구성한다.

MVC 2패턴과 3-tear는 단순히 유사한 개념(Controller와 Service를 분리한)라고 생각할 수 있지만 엄연히 다르다. MVC는 디자인 패턴으로써 추상적이라 할 수 있지만 스프링 3-tear는 Architecture로, 각각의 계층을 물리적이고 독립된 모듈로 개발하는 구조이다.

즉, Spring은 MVC 디자인 패턴과 3-tier Layered 둘을 적용한 구조라고 볼 수 있다. 아래 이미지는 3-tier Layered의 구조이다.

아래 이미지는 3-tier Layered의 동작 순서이다. Client에서 HTTP 요청을 보내면 Presentation 계층에서 요청에 따라 Busineese계층으로 요청을 전달한다. Busineese계층에서 Data Access계층을 통해 요청을 처리한 결과를 반환하고, 다시 Presentation 계층에서 Client에게 Response한다.

Presentation 계층

화면에 보여주는 로직을 구성하는 영역이다. 컨트롤러에서 사용자의 요청에 맞는 응답을 처리해주며, View 템플릿(thymeleaf,jsp), HTML등이 담당하는 영역이다.

Busineese 계층

일반적으로 Controller와 Dao의 중간 영역에서 사용된다.
보통 이곳에서 비즈니스 로직을 처리한다.

Persistance/Data Access계층

Database에 접근하는 영역이다. Dao(Data Access Object)가 해당 영역에 속한다. 프로젝트에 JPA API를 사용한다면, Repository가 해당 영역에 속한다.

Spring 구조 및 동작 순서


Spring MVC의 구조는 위의 이미지와 같으며 동작 순서는 다음과 같다.

  1. Client로부터 HTTP 요청이 오면 Dispatcher Servlet에게 요청이 전달된다. Dispatcher Servlet은 이 요청을 적합한 컨트롤러에 위임해주는 프론트 컨트롤러(Front Controller)이다. 요청을 적합한 컨트롤러에 위임하려면 어떤 컨트롤러인지 알아야하므로 HandlerMapping을 통해 정보를 얻는다.

  2. Handler Mapping은 Client 요청을 처리할 핸들러(Handler)를 찾아주는 역할을 한다.

  3. Handler Mapping은 요청 헤더에 담겨있는 정보를 기반으로 적절한 핸들러를 찾고 반환한다.

  4. 이후, DispatcherServletHandler Mapping을 통해 반환된 핸들러 정보를 갖고 Handler Adapter에게 요청 처리를 위임한다.

  5. Handler AdapterDispatcherServletController 사이의 다리 역할을 하며, Controller의 알맞은 메서드를 호출하여 요청을 위임한다.

  6. ControllerService가 수행한 요청에 대한 처리 결과를 받고 반환한다.

  7. Handler AdapterController의 처리 결과를 ModelAndView 객체로 변환해서 DispatcherServlet에 반환한다.

  8. 반환받은 ModelAndView를 통해 View name을 ViewResolver에게 전달한다.

  9. View Resolver는 View name을 통해 View 객체를 반환한다.

  10. DispatcherServlet은 반환받은 View 객체와 ModelAndView의 Model을 더해 render 메소드를 호출하여 페이지 렌더링을 수행한다.

  11. 렌더링된 페이지를 Client에게 Response한다.


나가는 글


최근, Spring Boot를 배우고 있다. 본 포스팅을 남기려 알고있던 것과 여러 정보들을 찾는 도중 몰랐던 정보들을 많이 알게됐다.
특히, Controller와 Handler Adapter에서 반환 데이터를 ModelAndView로 변환하여 넘기는데, 나는 항상 @ResponseBody 어노테이션을 사용해왔기 때문에 변환 과정에 대해서 모르고 있었다. View에 관한 것도 마찬가지로 지금까지 페이지 요청이 들어오면 페이지 경로를 Resource 클래스로 반환해왔었다.

하나씩 정리하여 글로 남기니 흐름이 뚜렷이 보이는 것 같다. 다음은 Spring Security에 대한 것도 정리해봐야겠다.

profile
성장 기록 / 글에 오류가 있다면 댓글 부탁드립니다.

0개의 댓글