본문으로 바로가기

스프링MVC의 기본 구조 5-3

category 카테고리 없음 2018. 12. 18. 11:50

▶모델2와 스프링MVC

스프링MVC는 내부적으로 Servlet API를 활용함.그리고 모델2라는 방식으로 처리되는 구조이므로 모델2방식에 대해서 간단히 살펴볼 필요가 있음.모델2방식은 쉽게 말해서 '로직과 화면을 분리'하는 스타일의 개발 방식임.모델2방식은 MVC의 구조를 사용하는데,이를 그림으로 표현하면 아래와 같음.




모델 2방식에서 사용자의 Request는 특별한 상황이 아닌 이상 먼저Controller를 호출하게 됨. 이렇게 설계가 가장 중요한 이유는 View를 교체하더라도 사용자가 호출하는 URL 자체에 변화가 없게 만들어 주기 때문임.컨트롤러는 데이터를 처리하는 존재를 잉용해서 데이터Model를 처리하고  Response 할 때 필요한 데이터(Model)를 View쪽으로 전달하게 됩니다.Servlet을 이용하는 경우 개발자들은 ServletAPI RequestDispatcher등을 이용해서 이를 직접 처리해 왔지만 스프링MVC는 내부에서  이러한 처리를 하고 ,개발자들은 스프링MVC의 API를 이용해서 코드를 작성하게 됨.


스프링MVC의 기본 구조는 아래 그림과 같이 표현할 수 있음.


사용자의 Request는 Front-controller인 DispatcherServlet을 통해서 처리함.

생성된 프로젝트의 web.xml을 보면 아래와 같은 모든 Request를 DispatcherServlet이 받도록 처리하고 있음.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 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>
        <load-on-startup>1</load-on-startup>
    </servlet>
        
    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
cs

②③

HandlerMapping은 Request의 처리를 담당하는 컨트롤러를 찾기 위해서 존재함.

HandlerMapping 인터페이스를 구현한 여러 객체들 중 RequestMappingHandlerMapping같은 경우는 개발자가 @RequestMapping 어노테이션이 적용된 것을 기준으로 판다 하게 됨.적절한 컨트롤러가 찾아졌다면 HandlerAdapter를 이용해서 해당 컨트롤러를 동작시킴.


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


ViewResolver는 Controller가 반환한 결과를 어떤 View를 통해서 처리하는 것이 좋을지 해석하는 역할임.

가장 흔하게 사용하는 설정은 servlet-context.xml에 정의된 InternalResourceViewResolver임.


1
2
3
4
5
<!-- 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>
cs


View는 실제로 응답 보내야 하는 데이터를 JSP등을 이용해서 생성하는 역할을 하게 됨. 만들어진 응답은DispatcherServlet을 통해서 전송됨.


위 그림을 보면 모든 Request는 DispatcherServlet을 통하도록 설계되는데,이러한 방식을 Front-Controller 패턴이라고 함.

Front-Controller패턴을 이용하면 전체 흐릉을 강제로 제한할 수 있음. 예를 들어 HttpServlet을 상속해서 만든 클래스를 이용하는 경우 특정 개발자는 이를 활용할 수 있지만 다른 개발자는 자싱이 원래 하던 방식대로 HttpServlet을 그대로 상속해서 개발할 수고 있음.Front-Controller 패턴을 이용하는 경우에는 모든 Request의 처리에 대한 분배가 정해진 방식대로만 동작하기 때문에 좀 더 엄격한 구조를 만들어 낼 수있음.


(이거 진짜 중요한 겁니다............)