본문 바로가기
Framework/Spring

[Spring Boot] MVC pattern

by 코딩하는 랄로 2024. 1. 8.
728x90

Spring Boot를 공부하기 위해서 가장 기초적인 게시판을 하나 만들어보면서 Spring Boot의 동작 방식과 구조, 사용방법 등을 자세히 알아보겠다. 먼저, 게시판을 만들기 전에, Spring의 MVC pattern 에 대해서 다루어보겠다.

 

 

 

Model & View

MVC pattern에서 Model은 데이터를 다루는 비즈니스 로직을 담당한다.  이 외에도 여러개의 데이터 변경 작업을 하나의 작업으로 묶는 transaction을 다루는 일도 한다. 주로 spring 프로젝트에서 DAO ( Data Access Object ) , Sevice 클래스에 해당한다.

 

View 는 model이 처리한 데이터나 그 결과를 가지고 사용자에게 출력할 ( 서버가 응답할 ) 화면을 만드는 작업을 담당한다. view가 html, css, js 등을 이용하여 생성한 파일을 웹 브라우저가 넘겨 받아 해당 파일들을 이용하여 웹페이지를 출력하게 되는 것이다.

 

 

 

Controller

Controller란  model 과 view 를 연결시키는 다리 역할을 한다. 그렇다면, Controller는 언제 model 과 view를 연결하여 사용자에게 정보를 제공할까? 바로 사용자에게 요청이 들어왔을 때이다. 사용자에 요청이 들어왔을 때, 해당 요청을 처리하기 위한 비즈니스 로직(model)을 처리하고 이를 이용하여 화면(view)을 통해 사용자에게 응답하는 구조인 것이다.

 

즉, Controller는 다음과 같은 일을 하는 것이다.

  • client의 요청을 받았을 때, 그 요청에 대한 비즈니스 로직을 수행하는 model을 호출함
  • client가 보낸 데이터가 있다면, 해당 데이터를 model에 전달하기 쉽도록 가공함
  • model이 작업을 완료하면, 해당 결과를 가지고 화면을 생성하도록 view 에게 전달
  • Servlet과 JSP를 이용하여 작성할 수 있음

 

 

Front Controller

Controller는 세부족으로 front controlle와 application controller로 나뉘게 된다. client에서 요청이 들어오면 먼저 front controller에서 공통적인 작업을 먼저 수행하고 요청에 맞는 적절한 application contoller에게 그 이외의 작업을 위임하는 구조인 것이다.

 

이 후에는 위에서 알아본 것과 같이 각각의 application controller가 적절한 model과 view를 선택하여 비즈니스 로직을 처리하고 화면을 생성 후 client에게 응답하는 것이다. 즉, front controller는 인증이나 권한 같은 모든 요청에 대하여 공통적으로 처리해야 하는 로직을 위한 것이고 Spring 은 이러한 역할을 하는 DispatcherServlet이라는 클래스를 이미 구현하여 사용할 수 있도록 하였다.

 

 

 

Spring MVC 의 주요 구성 요소

Spring을 사용하기 위해서는 가장 기초적으로 Spring MVC의 주요 구성 요소에 대해서 알아야 한다.

  • DispatcherServlet : client의 모든 요청이 거쳐가는 front controller의 역할을 하는 class이다. 적절한 application controller를 찾아서 요청을 위임하고 결과를 받아 View에게 전달하여 알맞은 응답을 생성한다.
  • Handler Mapping : URL과 요청 정보를 기준으로 어떤 Handler 객체를 사용할지 결정하는 객체이며, DispatcherServlet은 하나 이상의 Handler Mapping을 가질 수 있다.
  • Controller : client 요청을 처리한 뒤, Model을 호출하고 그 결과를 DispatcherServlet에게 알려줌
  • ModelAndView : Controller과 처리한 데이터 및 화면에 대한 정보를 보유한 객체
  • View : Controller의 처리 결과 화면에 대한 정보를 보유한 객체
  • ViewResolver : Contoller가 리턴한 View 이름을 기반으로 Controller 처리 결과를 생성할 View를 결정하는 객체

 

 

 

Spring MVC의 요청 처리 과정

Spring MVC의 구성 요소에 대해서 알아보았으니, client의 요청에 따라 Spring MVC 안에서 어떻게 처리 되는지를 알아보자. 

  • 요청이 DispatcherServlet으로 들어오게 되면 안에 있는 HandlerMapping 클래스에 의해서 적절한 Controller가 결정된다. ( request => DispatcherServlet => HandlerMapping => Contoller )
  • Contoller는 적절한 Model을 호출하여 비즈니스 로직을 처리하고 적절한 view와 함께 modelAndView 객체에 담아 DispatcherServlet에 전달한다.( Controller => Model => ModelAndView => DispatcherServlet )
  • DispatcherServlet은 ViewResolver에게 ModelAndView에 담겨있는 View 정보를 넘겨준다. ( DispatcherServlet => ViewResolver )
  • ViewResolver는 view를 결정하고 이를 DistpatcherServlet에 반환하면 DispatcherServelt이 view.render()를 호출하여 실행된 view에 대한 결과를 응답으로 넘겨준다. ( ViewResolver => DispatcherServlet => View => response )

 

 

 

Handler Adaptor

간단하게 Spring MVC의 구조와 요청을 처리하는 과정에 대해 알아보았다. 해당 과정을 그림으로 나타내면 다음과 같다.

 

그림을 보면, 이전에는 다루지 않았던 핸들러 어댑터에 관련된 부분이 추가가 된 것을 볼 수 가 있다. 그림에서 처럼 핸들러 매핑을 통해 적절한 핸들러를 찾은 뒤 해당 핸들러를 동작시키기 위한 어댑터를 찾기 위해서 조회하는 것을 볼 수 있다.

 

이 때, 반환받은 핸들러 어댑터를 통해서 핸들러, 즉 컨트롤러를 동작시키는 것이다. 이런 과정이 추가로 필요한 이유는 다양한 형태의 핸들러가 존재하기 때문이다. 단순히 Controller annotation을 통해 핸들러를 구현하기도 하지만 Controller interface를 구현하는 방식으로 핸들러를 구현하기도 한다.

 

다양하게 구현되어 있기 때문에 이를 실행시키기 위한 어댑터를 만들어서 목록을 생성하여 두는 것이다. Spring의 핸들러 어댑터는 다음의 우선순위를 기반으로 어댑터를 찾는다.

  • 0순위 : annotation 기반의 handler를 실행시킬 수 있는 adaptor ( RequestMappingHandleAdaptor )
  • 1순위 : HttpRequestHandler 인터페이스를 통해 구현된 핸들러를 실행시킬 수 있는 adaptor ( HttpRequestHandlerAdaptor )
  • 2순위 : Contoller 인터페이스를 통해 구현된 핸들러를 실행시킬 수 있는 adaptor ( SimpleControllerHandlerAdaptor )

 

 

 

 

 

reference : se_bb.log, API_DEV

728x90