ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] 스프링 MVC 프레임워크 설계 구조
    WEB/Spring 2020. 7. 19. 19:56

    1. 웹 프로그래밍을 구축하기 위한 설계 모델

     

     

    Model 1

    위의 그림과 같이 브라우저(클라이언트)에서 요청을 서버로 보내면 WAS(웹 어플리케이션 서버)에서 처리를 하게 됩니다. 이때 관련 정보를 DB(데이터베이스)에 접근해서 데이터를 찾고 그 데이터를 사용자의 응답에 맞게 가공하여 브라우저에게 응답해주는 모델입니다. 

    모든 것을 하나에 구현하기 때문에 개발속도가 빠르다는 장점이 있지만 유지보수의 측면에서 아주 큰 단점을 가지고 있습니다.

    Model 2

    Model2는 이러한 Model1의 단점을 보완한 설계 모델입니다. 철저하게 기능은 Service, DB와 연동되는 것은 DAO, 사용자에게 보여주기 위한 것은 View, 그리고 이러한 것들을 컨트롤 해주는 것을 Controller 모듈로 분리합니다.  

    이렇게 각각의 기능들을 모듈화 시키는 것을 Model2 방식이라고 합니다.

     

    이렇게 각 기능들을 모듈화하면 어떤 장점이 있을까요? 바로 유지보수가 쉬워집니다!

    각각의 기능들이 분리 되어있기 때문에 예를들어 View를 고치고 싶다면 jsp 파일만 고치면되고, 새로운 기능이 추가되어서 이를 컨트롤 해야한다면 Controller 모듈만 수정하면 됩니다. 또한 DB와 통신하는 것을 개선하고 싶다면 Model 모듈을 수정하면 됩니다. 

     

    현재 거의 모든 웹 어플리케이션의 프로젝트는 Model2를 따르고 있으므로 굉장히 중요한 설계 모델입니다.

     

    2. 스프링 MVC 프레임워크 설계 모델

     

    MVC 프레임워크 설계 구조

    대략적인 흐름은 다음과 같습니다.

    브라우저(클라이언트)에 요청이 들어오면 DispatchServlet이 요청을 받고 그 정보들을 HandlerMapping에 보내는데, 들어온 정보를 여러 Controller 중 가장 적합한 Controller를 찾아 선택합니다. 그 후에 DispatchServlet이 HandlerAdapter에게 요청을 하고 선택된 Controller 메소드 중에서 가장 적합한 메소드를 선택하고 그 데이터 결과를 Model로 가져옵니다. 다음으로 DispatchServlet은 ViewResolver를 찾습니다. ViewResolver는 Controller로 부터 온 Model 데이터와 View라는 정보에서 가장 적합한 jsp 페이지 View를 선택합니다. 마지막으로 찾아진 jsp 파일을 브라우저에게 응답하게 됩니다.

     

     

    사용자의 요청은 Front-Controller인 DispatchServlet을 통해서 처리합니다. 스프링 MVC 프로젝트의 web.xml을 보면 아래와 같이 모든 요청을 DisptachServlet이 받도록 처리하고 있습니다.

    <!-- Processes application requests -->
    	<servlet>
    		<servlet-name>appServlet</servlet-name>
    		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    		<init-param>
    			<param-name>contextConfigLocation</param-name>
    			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    		</init-param>
    		<init-param>
    			<param-name>throwExceptionIfNoHandlerFound</param-name>
    			<param-value>true</param-value>
    		</init-param>
    		<load-on-startup>1</load-on-startup>
    	</servlet>

     

    HandlerMapping은 요청의 처리를 담당하는 컨트롤러를 찾기 위해 존재합니다. HandlerMapping 인터페이스를 구현한 여러 객체들 중 RequestMappingHandlerMapping 같은 경우 @RequestMapping 어노테이션이 적용된 것을 기준으로 판단하게 됩니다.

    적절한 컨트롤러가 찾아졌다면 HanlderAdapter를 이용해서 해당 컨트롤러를 동작시킵니다.

     

    Controller는 개발자가 작성하는 클래스로 실제 요청을 처리하는 로직을 작성하게 됩니다. 이때 View에 전달해야 하는 데이터는 주로 Model 이라는 객체에 담아 전달합니다. Controller는 다양한 타입의 결과를 반환하는데 이에 대한 처리는 ViewResolver를 이용하게 됩니다.

     

    ViewResolver는 Controller가 반환한 결과를 어떤 View를 통해서 처리하는 것이 좋을까 해석하는 역할입니다. 가장 흔하게 사용하는 설정은 servlet-context.xml에 정의된 InternalResourceViewResolver 입니다.

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    		<beans:property name="prefix" value="/WEB-INF/views/" />
    		<beans:property name="suffix" value=".jsp" />
    	</beans:bean>

     

    View는 실제로 응답 보내야 하는 데이터를 jsp 등을 이용해서 생성하는 역할을 하게 됩니다. 만들어진 응답은 DispatchServlet을 통해 클라이언트에게 전송됩니다.

     

    모든 요청은 DispatchServlet을 통하도록 설계되는데, 이런 방식을 'Front-Controller' 패턴이라고 합니다. Front-Controller 패턴을 이용하면 전체 흐름을 강제로 제한할 수 있습니다. 또한 모든 요청의 처리에 대한 분배가 정해진 방식대로만 동작하기 때문에 좀 더 엄격한 구조를 만들어 낼 수 있습니다.

     

     

    출처 : 인프런, 자바 스프링 프레임워크 - 신입 프로그래머를 위한 강좌

     

    댓글

Designed by Tistory.