[Spring Study] - Spring MVC

uHan2·2021년 1월 29일
1

TIL.BackEnd

목록 보기
9/12

비록 시작은 코딩일기지만, 그 끝은 창대하게
어엿한 개발자 블로그로 성장할 수 있도록.


Spring Study

본 게시글은
Endless Creation Spring Study
에 사용하는 자료입니다.


Spring MVC

Spring MVC :: 개요

Spring MVC 를 알아보기 전에 먼저 MVC pattern 에 대해 먼저 알아보도록 하자. Spring MVC 는 기존의 MVC Model 1MVC Model 2 에서 진화(?) 된 Architecture 이다.

참고로, MVC pattern 의 M, V, C 는 각각 다음과 같이 정리된다.

  • Model :: 데이터 혹은 데이터를 처리하는 영역

  • View :: 결과 화면을 만들어 내는 데 사용하는 자원

  • Controller :: 웹의 Request(요청)을 처리하는 ViewModel 사이의 Handler 역할


Spring MVC :: MVC Model 1

먼저 과거에 JSP 를 활용하던 시절에 활용했던 MVC Model 1 에 대해 알아보자.

MVC Model 1 에서는 JSP 하나에서 ViewBusiness Logic 을 전부 처리하는 구조다. MVC Model 1 의 주요 구성 요소는 다음과 같다.

  • JSP

  • Java Beans

JSP 페이지 내에 Business Logic 처리를 위한 Java 코드와 View 출력을 위한 코드가 공존한다. Client 에서 요청이 들어오면 JSP 가 직접 Java Beans 혹은 따로 작성한 Service Class 를 이용해 작업을 처리하고, 처리한 정보를 Client 에 출력한다. 즉, JSP 혼자서 거의 모든 업무를 처리한다.

과거에 많이 사용하던 방식이다. 현재는 유지보수가 중요하지 않고 혼자 작업하며 빠른 결과물을 원할때가 아니라면 (그런 일이 실제로 있을 진 모르겠다) 사용하지 않는 모델이다.

MVC Model 1 의 장단점은 다음과 같다.

  • 장점 ::

    • 구조가 단순하여 익히기 쉽다. (개발 및 설계의 난이도가 낮다)

    • 숙련된 개발자가 아니더라도 구현 자체는 용이하다.

  • 단점 ::

    • Business Logic 처리를 위한 Java 코드와 View 처리를 위한 코드의 공존으로 JSP 의 코드가 상당히 복잡하다.

    • Front endBack end 의 혼재로 분업이 힘들다.

    • 유지보수 관점에서 상당히 불리하다.


Spring MVC :: MVC Model 2

MVC Model 2 에서 가장 중요한 핵심은 Controller 의 등장이다.

MVC Model 1 과 달리 JSP 에서는 View 처리를 담당하고 Business Logic 을 따로 분리하여 처리한다. MVC Model 2 의 주요 구성 요소는 다음과 같다.

  • Servlet

  • JSP

  • Java Beans

Client 로 부터 요청이 들어오면 이에 대한 Business Logic 처리는 Java Beans 가 담당하고, 요청 결과는 JSPView 단을 처리한다. 그리고 이를 위한 모든 흐름 제어는 Controller 역할을 하는 Servlet 이 담당한다.

즉, MVC Model 2 부터 진정한 MVC Pattern 이라고 할 수 있는 형태이다. 다음과 같이 정리할 수 있다.

MVC Model 2MVC Model 1 의 단점을 해소하지만 개발 및 설계의 난이도가 높아진 다는 단점이 있다.

  • 장점 ::

    • Business LogicView 의 분리로 코드가 간결해진다.

    • 이를 바탕으로 분업이 용이하다.

    • 유지보수 또한 용이하다.

  • 단점 ::

    • Java에 대한 깊은 이해가 필요로 하다.

    • 개발 및 설계의 난이도가 높다.


Spring MVC :: Dispatcher Servlet

Spring MVC 구조는 그림으로 보면 이해하는데에 굉장히 도움된다.

여기서 Dispatcher ServletSpring MVC 에서 굉장히 큰 핵심이다. 왜 핵심이냐면 기존의 Servlet 은 다음과 같이 요정 URI 의 각각에 맞는 Servlet 을 생성하고 그에 맞는 Controller 에게 요청을 보내는 코드를 따로 작성해야 했다.

하지만 Front Controller Pattern 을 적용하면 다음과 같이 구성할 수 있다.

즉, Spring MVCDispatcher ServletFront Controller Pattern 에 맞춰 구성하였다. 이렇게 한곳에서 Client 의 요청을 처리할 수 있게 됨으로써 인코딩처리, 에러처리, 공지 등등을 한곳에서 전부 처리 할 수 있게 되었다.

Spring MVC 의 처리 과정을 살펴보자. (교재 P.250 ~ p.251)

  1. 먼저 Front ControllerDispatcherServlet 이 모든 요청을 담당한다. Client 로부터 요청이 들어오면 DispatcherServlet 은 그 요청을 처리하기 위한 Controller 객체를 검색한다. 이때 DispatcherServlet 은 직접 Controller 를 검색하지 않고 HandlerMapping Bean 객체에게 Controller 검색을 요청한다.

  2. HandlerMappingClient 의 요청 경로를 이용해서 이를 처리할 Controller Bean 객체를 DispatcherServlet 에 전달한다. 예를 들어 웹 요청 경로가 '/hello' 라면 등록된 Controller Bean 중에 해당 요청 경로를 처리할 Controller 를 반환한다.

  3. DispatcherServletController 를 전달받았다고 해서 바로 해당 Controller 의 Method() 를 실행할 수 있는 것은 아니다. DispatcherServlet@Controller Annotation을 이용해서 구현한 Controller 뿐만 아니라 Spring 2.5 까지 주로 사용됐던 Controller Interface 를 구현한 Controller, 그리고 특수 목적으로 사용되는 HttpRequestHandler Interface 를 구현한 클래스를 동일한 방식으로 실행할 수 있도록 만들어졌다. 이를 위해 중간에 사용되는 것이 바로 HandlerAdapter Bean 이다.

  4. DispatcherServletHandlerMapping 이 찾아준 Controller 객체를 처리할 수 있는 HandlerAdapter Bean 에게 요청 처리를 위임한다. HandlerAdapterController 의 알맞은 Method()를 요청을 처리하고 그 결과를 DispatcherServlet 에 반환한다. 이때 HandlerAdapterController 의 처리 결과를 ModelAndView 라는 객체로 변환해서 DispatcherServlet 에 반환한다.

  5. HandlerAdapter 로부터 Controller 의 요청 처리 결과를 ModelAndView 로 받으면 DispatcherServlet 은 결과를 보여줄 View 를 찾기 위해 ViewResolver Bean 객체를 사용한다. ModelAndViewController 가 반환한 View 이름을 담고 있는데 ViewResolver 는 이 View 이름에 해당하는 View 객체를 찾거나 생성해서 반환한다. 응담을 생성하기 위해 JSP 를 사용하는 ViewResolver 는 매번 새로운 View 객체를 생성해서 DispatcherServlet 에 반환한다.

  6. DispatcherServletViewResolver 가반환한 View 객체에게 응답 결과 생성을 요청한다. JSP 를 사용하는 경우 View 객체는 JSP 를 실행함으로써 Client 에게 전송할 응답 결과를 생성하고 이로써 모든 과정이 끝이 난다.

처리 과정을 보면 DispatcherServlet 을 중심으로 HandlerMapping, HandlerAdapter, Controller, ViewResolver, View, JSP 가 각자 역할을 수행해서 Client 의 요청을 처리한다. 이 중 하나라도 어긋나면 Client 의 요청을 처리할 수 없게 되므로 각 구성요소를 올바르게 설정해야 한다.

요즘은 Spring Boot 를 통해 웹 애플리케이션을 개발하는 것이 추세이다. 물론 Spring MVC@EnableWebMvc Annotation 등을 활용해서 비교적 간편하게 셋팅을 할 수 있지만, Spring Boot 를 통한 설정이 매우 훨씬 간단하기도 해서 실무에서도 이미 많이 쓰고있다고 한다.

특히 Spring Boot@SpringBootApplication Annotation 은 정말 마법과도 같은 역할을 하기 때문에 한번 찾아보면 좋을 것이다. 하지만 Spring Boot 는 별다른 것이 아니고 Spring 의 셋팅을 간소화 한 것이기 때문에 Spring 에 대한 올바른 이해가 필요로 하다.


profile
For the 1% inspiration.

0개의 댓글