Spring MVC

seongmin·2022년 10월 22일
0

Spring

목록 보기
19/38
post-thumbnail

Spring MVC

Spring의 모듈 중에는 웹 계층을 담당하는 몇가지 모듈이 있다. 특히 서블릿(Servlet) API를 기반으로 클라이언트의 요청을 처리하는 모듈이 있는데, 이 모듈의 이름이 spring-webmvc 이다.

개발자들 사이에서는 Spring Web MVC를 줄여서 Spring MVC 라고 부르고 있고, Spring MVC가 웹 프레임워크의 한 종류이기 때문에 Spring MVC 프레임워크라고도 부른다.

  • Spring MVC 는 클라이언트의 요청을 편리하게 처리해주는 프레임워크이다.

  • 학습 중 만들 샘플 애플리케이션은 Spring MVC 가 제공해주는 기능을 이용해서 만든다.

Model

Spring MVC 기반의 웹 애플리케이션이 클라이언트의 요청을 전달 받으면 요청 사항을 처리하기 위한 작업을 한다.

이렇게 처리한 작업의 결과 데이터를 클라이언트에게 응답으로 돌려줘야하는데, 이 때 클라이언트에게 응답으로 돌려주는 작업의 처리 결과 데이터Model 이라고 한다.

클라이언트의 요청 사항을 구체적으로 처리하는 영역을 서비스 계층(Service Layer)이라고 하며, 실제로 요청 사항을 처리하기 위해 Java 코드로 구현한 것을 비즈니스 로직(Business Logic)이라고 한다.

View

View는 앞에서 설명한 Model 데이터를 이용해서 웹브라우저 같은 클라이언트 애플리케이션의 화면에 보여지는 리소스(Resource)를 제공하는 역할을 한다.

View의 형태는 아래와 같이 나눌 수 있다.

  • HTML 페이지의 출력

클라이언트 애플리케이션에 보여지는 HTML 페이지를 직접 렌더링해서 클라이언트 측에 전송하는 방식이다.

즉, 기본적인 HTML 태그로 구성된 페이지에 Model 데이터를 채워 넣은 후, 최종적인 HTML 페이지를 만들어서 클라이언트 측에 전송해준다.

Spring MVC에서 지원하는 HTML 페이지 출력 기술에는 Thymeleaf, FreeMarker, JSP + JSTL, Tiles 등이 있다.

  • PDF, Excel 등의 문서 형태로 출력

Model 데이터를 가공해서 PDF 문서나 Excel 문서를 만들어서 클라이언트 측에 전송하는 방식이다.

문서 내에서 데이터가 동적으로 변경되어야 하는 경우 사용할 수 있는 방식이다.

  • XML, JSON 등 특정 형식의 포맷으로의 변환

Model 데이터를 특정 프로토콜 형태로 변환해서 변환된 데이터를 클라이언트 측에 전송하는 방식이다.

이 방식의 경우 특정 형식의 데이터만 전송하고, 프런트엔드 측에서 이 데이터를 기반으로 HTML 페이지를 만드는 방식이다.

  • 장점
    • 프런트엔드 영역과 백엔드 영역이 명확하게 구분되므로 개발 및 유지보수가 상대적으로 용이하다.
    • 프런트엔드 측에서 비동기 클라이언트 애플리케이션을 만드는 것이 가능해진다.

Controller

Controller는 클라이언트 측의 요청을 직접적으로 전달 받는 엔드포인트(Endpoint) 로써 Model과 View의 중간에서 상호 작용을 해주는 역할을 한다.

즉, 클라이언트 측의 요청을 전달 받아서 비즈니스 로직을 거친 후에 Model 데이터가 만들어지면, 이 Model 데이터를 View로 전달하는 역할을 한다.

정리

  • Spring의 모듈 중에서 서블릿(Servlet) API를 기반으로 클라이언트의 요청을 처리하는 모듈이 바로 spring-webmvc 이다.

  • spring-webmvc 모듈이 Spring MVC이다.

  • Spring MVC는 웹 프레임워크의 한 종류이기 때문에 Spring MVC 프레임워크라고도 부른다.

  • Spring MVC에서 M은 Model을 의미한다.

  • 클라이언트에게 응답으로 돌려주는 작업의 처리 결과 데이터를 Model이라고 한다.

  • Spring MVC에서 V는 View를 의미한다.

  • View는 Model 데이터를 이용해서 웹브라우저 같은 클라이언트 애플리케이션의 화면에 보여지는 리소스(Resource)를 제공한다.

  • 우리가 실질적으로 학습하게 되는 View는 JSON 포맷의 데이터를 생성한다.

  • Spring MVC에서 C는 Controller를 의미한다.

  • Controller는 클라이언트 측의 요청을 전달 받아 Model과 View의 중간에서 상호 작용을 해주는 역할을 담당한다.

  • Spring MVC에서 MVC의 전체적인 동작 흐름은 다음과 같다.

Client가 요청 데이터 전송 → Controller가 요청 데이터 수신 → 비즈니스 로직 처리 → Model 데이터 생성 → Controller에게 Model 데이터 전달 → Controller가 View에게 Model 데이터 전달 → View가 응답 데이터 생성

Spring MVC 동작방식과 구성요소

(1) 먼저 클라이언트가 요청을 전송하면 DispatcherServlet 이라는 클래스에 요청이 전달된다.

(2) DispatcherServlet 은 클라이언트의 요청을 처리할 Controller 에 대한 검색을 HandlerMapping 인터페이스에게 요청한다.

(3) HandlerMapping 은 클라이언트 요청과 매핑되는 핸들러 객체를 다시 DispatcherServlet 에게 리턴해준다.

핸들러 객체는 해당 핸들러의 Handler 메서드 정보를 포함하고 있다.
Handler 메서드는 Controller 클래스 안에 구현된 요청 처리 메서드를 의미한다.

(4) 요청을 처리할 Controller 클래스를 찾았으니 이제는 실제로 클라이언트 요청을 처리할 Handler 메서드를 찾아서 호출해야 한다. DispatcherServletHandler 메서드를 직접 호출하지 않고, HandlerAdpater 에게 Handler 메서드 호출을 위임한다.

(5) HandlerAdapterDispatcherServlet 으로부터 전달 받은 Controller 정보를 기반으로 해당 ControllerHandler 메서드를 호출한다.

(6) ControllerHandler 메서드는 비즈니스 로직 처리 후 리턴 받은 Model 데이터를 HandlerAdapter 에게 전달한다.

(7) HandlerAdapter 는 전달받은 Model 데이터와 View 정보를 다시 DispatcherServlet 에게 전달한다.

(8) DispatcherServlet 은 전달 받은 View 정보를 다시 ViewResolver 에게 전달해서 View 검색을 요청한다.

(9) ViewResolverView 정보에 해당하는 View 를 찾아서 View 를 다시 리턴해준다.

(10) DispatcherServletViewResolver 로부터 전달 받은 View 객체를 통해 Model 데이터를 넘겨주면서 클라이언트에게 전달할 응답 데이터 생성을 요청한다.

(11) View 는 응답 데이터를 생성해서 다시 DispatcherServlet 에게 전달한다.

(12) DispatcherServletView 로부터 전달 받은 응답 데이터를 최종적으로 클라이언트에게 전달한다.

DispatcherServlet의 역할

클라이언트로부터 요청을 전달 받으면 HandlerMapping, HandlerAdapter, ViewResolver, View 등 대부분의 Spring MVC 구성 요소들과 상호 작용을 하고 있는 것을 볼 수 있다.

그런데 DispatcherServlet이 굉장히 바빠보이지만 실제로 요청에 대한 처리는 다른 구성 요소들에게 위임(Delegate)하고 있다.

이처럼 DispatcherServlet이 애플리케이션의 가장 앞단에 배치되어 다른 구성요소들과 상호작용하면서 클라이언트의 요청을 처리하는 패턴을 Front Controller Pattern 이라고 한다.

정리

  • Spring MVC의 요청 처리 흐름

    • 클라이언트의 요청을 제일 먼저 전달 받는 구성요소는 DispatcherServlet이다.

    • DispatcherServlet은 HandlerMapping 인터페이스에게 Controller의 검색을 위임한다.

    • DispatcherServlet은 검색된 Controller 정보를 토대로 HandlerAdapter 인터페이스에게 Controller 클래스내에 있는 Handler 메서드의 호출을 위임한다.

    • HandlerAdapter 인터페이스는 Controller 클래스의 Handler 메서드를 호출한다.

    • DispatcherServlet은 ViewResolver에게 View의 검색을 위임한다.

    • DispatcherServlet은 View에게 Model 데이터를 포함한 응답 데이터 생성을 위임한다.

    • DispatcherServlet은 최종 응답 데이터를 클라이언트에게 전달한다.

    • DispatcherServlet이 애플리케이션의 가장 앞단에 배치되어 다른 구성요소들과 상호작용하면서 클라이언트의 요청을 처리하는 패턴을 Front Controller Pattern이라고 한다.

0개의 댓글