본문 바로가기
개념 공부/Spring

[Spring MVC] Spring MVC 구조와 DispatcherServlet

by clean01 2024. 5. 18.

Spring MVC의 구조와 그 핵심인 DispatcherServlet에 대해 알아봅시다.

MVC란

MVC란 Model, View, Controller의 약자로, 애플리케이션 개발 영역을 각각 Model, View, Controller로 나누어 개발하는 디자인 패턴입니다.

MVC 패턴 도입 전에는 비즈니스 로직과 뷰를 렌더링 하는 부분 등의 코드가 모두 한 jsp 파일에 있었는데, MVC 패턴을 도입한 이후에는 UI 영역과 도메인(비즈니스 로직) 영역이 분리 되어 서로에게 영향을 쥐 않으면서 개발과 유지 보수가 가능하게 되었다.

Model(모델)

Spring MVC 기반의 웹 애플리케이션이 클라이언트의 요청을 전달 받으면 요청 사항을 처리하기 위한 작업을 합니다.
처리한 작업의 결과 데이터를 클라이언트에게 응답으로 돌려주어야 하는데, 이때 클라이언트에게 응답을 돌려주는 결과 데이터를 Model이라고 합니다.

클라이언트의 요청 사항을 구체적으로 처리하는 영역을 서비스 계층(service layer)라고 하고, 요청 사항을 처리하기 위한 로직을 코드로 구현해 놓은 것을 비즈니스 로직이라고 합니다.

View(뷰)

View는 Model에 들어있는 데이터를 이용해서 애플리케이션 화면에 보이는 리소스를 제공하는 역할을 합니다. 예를 들면 브라우저에 html 화면을 띄워주는 것이 뷰 영역입니다.

Controller(컨트롤러)

컨트롤러는 클라이언트 측의 요청을 직접적으로 전달 받는 엔드포인트이며, Model과 View 사이에서 상호작용을 돕는 역할을 합니다.

예를 들면 클라이언트가 보낸 request를 컨트롤러가 받아 요청 uri를 보고 적절한 서비스 로직(비즈니스 로직)을 골라서 수행합니다.
그렇게 비즈니스 로직을 거쳐 만들어진 정보들(=클라이언트에게 넘겨주어야 할 정보들)을 Model 안에 넣고 그 Model을 View로 전달합니다.


Spring MVC 프레임워크의 구조

그럼 MVC가 무엇인지 알아보았으니, Spring MVC 프레임워크의 구조를 알아보겠습니다.

스프링 MVC 프레임워크란 MVC 패턴을 편리하게 쓸 수 있도록 프레임워크로 만들어진 것인데, 여러 방식의 Controller들을 유연하게 쓸 수 있도록 구현되어있습니다. (물론 가장 많이 쓰이는 Controller가 있기는 하지만)

Spring MVC의 전체적인 구조는 이렇게 생겼습니다.

전체적인 흐름은 아래와 같습니다.

  1. DispatcherServlet이 클라이언트의 모든 요청을 받습니다.
  2. 요청 정보에 대해 HandlerMapping에 위임을 해서 적절한 핸들러(=Controller)를 찾습니다.
  3. 2번에서 찾은 Handler에 맞는 HandlerAdapter
    를 찾습니다. 이 과정에서 HandlerAdapter 구현체 안에 있는 supports() 함수가 호출됩니다.
  4. HandlerAdapterController에 있는 비즈니스 로직 처리를 호출합니다.
  5. Controller는 비즈니스 로직을 수행하고, 처리 결과를 Model에 설정하며 HandlerAdapter에 view name(뷰의 논리 이름)을 반환한다.
  6. 5번에서 반환 받은 view name을 ViewResolver에게 전달하고, ViewResolver는 해당하는 View 객체를 반환합니다.
  7. DispatcherServletView에게 Model을 넘겨주고 화면을 렌더링 할 것을 요청합니다. 참고로, 모델을 반환하면 뷰가 렌더링이 되고, 그렇지 않은 경우(대표적으로 @RestController) view가 렌더링 되지 않습니다.

참고: boolean supports(Object handler)

supports() 메소드는 HandlerAdapter 인터페이스 안에 선언되어 있는 메소드입니다. 모든 핸들러 어댑터 구현체들은 HandlerAdapter 인터페이스를 구현하고 있는데, 각각의 구현체 안에서 supports() 메소드가 오버라이딩 됩니다.
supports() 메소드는 supports()메소드의 인자로 들어온 handler가 현재 핸들러 구현체 타입이 맞는지 판단하여 맞으면 true, 다르다면 false를 반환합니다.

Reference

'개념 공부 > Spring' 카테고리의 다른 글

[JPA 개념] 연관 관계 매핑  (2) 2024.06.06
[JPA 개념] JPA의 기본 어노테이션 알아보기  (3) 2024.06.06