비록 시작은 코딩일기지만, 그 끝은 창대하게
어엿한 개발자 블로그로 성장할 수 있도록.
본 게시글은
Endless Creation Spring Study
에 사용하는 자료입니다.
Spring MVC
를 알아보기 전에 먼저 MVC pattern
에 대해 먼저 알아보도록 하자. Spring MVC
는 기존의 MVC Model 1
과 MVC Model 2
에서 진화(?) 된 Architecture
이다.
참고로, MVC pattern
의 M, V, C 는 각각 다음과 같이 정리된다.
Model :: 데이터 혹은 데이터를 처리하는 영역
View :: 결과 화면을 만들어 내는 데 사용하는 자원
Controller :: 웹의 Request(요청)을 처리하는 View
와 Model
사이의 Handler
역할
먼저 과거에 JSP
를 활용하던 시절에 활용했던 MVC Model 1
에 대해 알아보자.
MVC Model 1
에서는 JSP 하나에서 View
와 Business 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 end
와 Back end
의 혼재로 분업이 힘들다.
유지보수 관점에서 상당히 불리하다.
MVC Model 2
에서 가장 중요한 핵심은 Controller
의 등장이다.
MVC Model 1
과 달리 JSP
에서는 View
처리를 담당하고 Business Logic
을 따로 분리하여 처리한다. MVC Model 2
의 주요 구성 요소는 다음과 같다.
Servlet
JSP
Java Beans
Client
로 부터 요청이 들어오면 이에 대한 Business Logic
처리는 Java Beans
가 담당하고, 요청 결과는 JSP
로 View
단을 처리한다. 그리고 이를 위한 모든 흐름 제어는 Controller
역할을 하는 Servlet
이 담당한다.
즉, MVC Model 2
부터 진정한 MVC Pattern
이라고 할 수 있는 형태이다. 다음과 같이 정리할 수 있다.
MVC Model 2
는 MVC Model 1
의 단점을 해소하지만 개발 및 설계의 난이도가 높아진 다는 단점이 있다.
장점 ::
Business Logic
과 View
의 분리로 코드가 간결해진다.
이를 바탕으로 분업이 용이하다.
유지보수 또한 용이하다.
단점 ::
Java에 대한 깊은 이해가 필요로 하다.
개발 및 설계의 난이도가 높다.
Spring MVC
구조는 그림으로 보면 이해하는데에 굉장히 도움된다.
여기서 Dispatcher Servlet
이 Spring MVC
에서 굉장히 큰 핵심이다. 왜 핵심이냐면 기존의 Servlet
은 다음과 같이 요정 URI
의 각각에 맞는 Servlet
을 생성하고 그에 맞는 Controller
에게 요청을 보내는 코드를 따로 작성해야 했다.
하지만 Front Controller Pattern
을 적용하면 다음과 같이 구성할 수 있다.
즉, Spring MVC
는 Dispatcher Servlet
을 Front Controller Pattern
에 맞춰 구성하였다. 이렇게 한곳에서 Client
의 요청을 처리할 수 있게 됨으로써 인코딩처리, 에러처리, 공지 등등을 한곳에서 전부 처리 할 수 있게 되었다.
Spring MVC
의 처리 과정을 살펴보자. (교재 P.250 ~ p.251)
먼저 Front Controller
인 DispatcherServlet
이 모든 요청을 담당한다. Client
로부터 요청이 들어오면 DispatcherServlet
은 그 요청을 처리하기 위한 Controller
객체를 검색한다. 이때 DispatcherServlet
은 직접 Controller
를 검색하지 않고 HandlerMapping
Bean 객체에게 Controller
검색을 요청한다.
HandlerMapping
은 Client
의 요청 경로를 이용해서 이를 처리할 Controller
Bean 객체를 DispatcherServlet
에 전달한다. 예를 들어 웹 요청 경로가 '/hello'
라면 등록된 Controller
Bean 중에 해당 요청 경로를 처리할 Controller
를 반환한다.
DispatcherServlet
이 Controller
를 전달받았다고 해서 바로 해당 Controller
의 Method() 를 실행할 수 있는 것은 아니다. DispatcherServlet
은 @Controller
Annotation을 이용해서 구현한 Controller
뿐만 아니라 Spring 2.5
까지 주로 사용됐던 Controller Interface
를 구현한 Controller
, 그리고 특수 목적으로 사용되는 HttpRequestHandler Interface
를 구현한 클래스를 동일한 방식으로 실행할 수 있도록 만들어졌다. 이를 위해 중간에 사용되는 것이 바로 HandlerAdapter
Bean 이다.
DispatcherServlet
은 HandlerMapping
이 찾아준 Controller
객체를 처리할 수 있는 HandlerAdapter
Bean 에게 요청 처리를 위임한다. HandlerAdapter
는 Controller
의 알맞은 Method()를 요청을 처리하고 그 결과를 DispatcherServlet
에 반환한다. 이때 HandlerAdapter
는 Controller
의 처리 결과를 ModelAndView
라는 객체로 변환해서 DispatcherServlet
에 반환한다.
HandlerAdapter
로부터 Controller
의 요청 처리 결과를 ModelAndView
로 받으면 DispatcherServlet
은 결과를 보여줄 View
를 찾기 위해 ViewResolver
Bean 객체를 사용한다. ModelAndView
는 Controller
가 반환한 View
이름을 담고 있는데 ViewResolver
는 이 View
이름에 해당하는 View
객체를 찾거나 생성해서 반환한다. 응담을 생성하기 위해 JSP
를 사용하는 ViewResolver
는 매번 새로운 View
객체를 생성해서 DispatcherServlet
에 반환한다.
DispatcherServlet
은 ViewResolver
가반환한 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
에 대한 올바른 이해가 필요로 하다.