Spring

Spring Framework_ControllerVersion02_DispatcherServlet, HandlerMapping, Controller, ViewResolver

onivv 2024. 3. 5. 23:16

[ Spring MVC구조 ] ⭐

웹의 흐름 : 요청 → 응답 (1cycle)

  1. 사용자(브라우저, Client)가 요청을 보냄
  2. DispatcherServlet(FrontController)에서 요청을 확인
    • 서블릿 컨테이너가 사용자 요청을 받고,
      web.xml 파일이나 어노테이션을 통해 DispatcherServlet에게 어떤 URL 패턴의 요청을 전달할지 설정
      이후 DispatcherServlet은 해당 URL 패턴에 맞는 컨트롤러로 요청을 전달
    • 사용자의 모든 URL요청(xxx.do)을 받아들이고, 요청을 적절한 Controller에 전달
    • web.xml 파일에서 설정
  3. HandlerMapping에서 해당 요청에 대해 어떤 Controller가 처리할지 확인
    • 팩토리 패턴을 활용해 요청(String)을 받으면 Controller(객체)를 반환
    • URL과 컨트롤러의 매핑 : [ key - 요청 URL , value - new xxxController() ]
  4. Controller 메서드 수행 후 String 반환(경로, 방식)
    • 어떤 경로로 가야하는지와 어떻게(redirect/forward)가야하는지에 대한 정보를 String으로 반환
    • 메서드 수행 시 Service를 이용하고 Service는 DAO를 이용
    • Controller > Service > DAO (서로가 의존관계)
  5. ViewResolver Controller에서 반환된 String을 보고 사용자(브라우저, Client)에게 View 페이지를 응답

[ Spring_MVC 패턴_ControllerVersion01 ]

https://onivv.tistory.com/145

 

Spring Framework_ControllerVersion01_DispatcherServlet, HandlerMapping, Controller, ViewResolver

[ Spring MVC구조 ] ⭐ 웹의 흐름 : 요청 → 응답 (1cycle) 사용자(브라우저, Client)가 요청을 보냄 DispatcherServlet(FrontController)에서 요청을 확인 서블릿 컨테이너가 사용자 요청을 받고, web.xml 파일이나 어

onivv.tistory.com


✅ Version01_개발자가 직접 만든 DS, HM, VR

                                              ▼

 Version02_Spring Framework에서 제공하는 DS, HM, VR, Controller

 

  1. DispatcherServlet
    • web.xml : Spring Framework에서 제공하므로 DispatcherServlet 클래스 경로 변경
    • dispatcher-servlet.xml : DI(의존주입, init()_멤버변수 초기화)를 위한 설정파일
  2. SimpleUrlHandlerMapping
    • dispatcher-servlet.xml : <bean> 객체 생성, DI(의존주입)_Setter주입
  3. Controller
    • Controller output의 핵심은 어디로(경로), 어떻게(방식:redirect,forward) 무조건 있어야함
    • Spring Framework에서 제공하는 Controller를 implements(구현, 상속)해서 사용
    • implements Controller → import org.springframework.web.servlet.mvc.Controller
    • handleRequest() : Parameters → request, response / Returns → ModelAndView
  4. InteralResourceViewResolver 
    • dispatcher-servlet.xml : <bean> 객체 생성, DI(의존주입)_Setter주입

 

[ Spring Framework_DispatcherServlet ]

web.xml

  • <servlet-class> - Servlet 클래스 경로 변경
    ver01 : com.spring.controller.common.DispatcherServlet
    ver02 : org.springframework.web.servlet.DispatcherServlet
web.xml

<servlet>	: HttpServlet을 상속받고 있는 클래스를 web.xml에 등록할 때 사용
<servlet-name>	: 등록하는 Servlet의 이름 부여 (별칭)
<servlet-class>	: Servlet 클래스 경로 지정

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

<servlet-mapping> : DispatcherServlet 서블릿과 '*.do' URL패턴을 매핑
<servlet-name>	: 실행할 Servlet 이름 지정
<url-pattern>	: Servlet을 실행할 때 사용할 URL 지정

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.do</url-pattern>	// '.do'로 끝나는 모든 요청이 dispatcherServlet에게 전달
</servlet-mapping>

 

dispatcher-servlet.xml

  • ver01에서는 init() 메서드로 POJO인 handler, viewResolver를 초기화 해줬음
    하지만 web.xml은 서블릿 컨테이너 설정파일로 not POJO만 다루는 서블릿 컨테이너 설정파일임
    따라서 POJO 클래스를 초기화해줄 설정파일을 별도로 만들어야함
  • DI(의존주입, init())을 위한 설정파일
    DispatcherServlet만을 위한 컨테이너가 생김 → presentation layer(표면 계층)가 생김!
  • java로 돌렸을 때 applicationContext.xml을 대체해서 스키마가 같음

[ver01] DispatcherServlet.java

dispatcher-servlet.xml

▶ Handlermapping 초기화
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/___.do">___</prop>
        </props>
    </property>
</bean>

<bean id="___" class="package경로.___Controller" />

▶ ViewResolver 초기화
<bean id="viewResolver" class="org.springframework.web.servlet.view.InteralResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>

 

[ Spring Framework_SimpleUrlHandlerMapping ]

dispatcher-servlet.xml

  • ver01 : 개발자가 만든 HM 사용, DI로 생성자 주입 → ver02 : SF기본 제공하는 HM  사용, DI로 Setter 주입

[ver01] HandlerMapping.java

설정 내용
<bean> Spring Framework에서 기본제공하는 HM 객체 new
<property> mappings 의존주입(Setter 주입) 
<props> mappings에 주입하는 타입은 Map
<prop key="키값_경로"> value값_객체 </prop>
<bean> value값 객체 new
dispatcher-servlet.xml

▶ Handlermapping 초기화
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/___.do">___</prop>
        </props>
    </property>
</bean>

<bean id="___" class="package경로.___Controller" />

 

[ Spring Framework_Controller ]

ver01_Controller.java - Interface

  • Spring Framework에서 제공하는 Controller를 impements(구현, 상속)
  • 모든 xxxController 객체는 handleRequest() 를 @Override
    handleRequest() : Parameters → request, response / Returns → ModelAndView

@Override handleRequest()

  • ModelAndView : "Model : data, View : 다음페이지" 를 의미
    addObject(String attributeName, @Nullable Object attributeValue) ← 데이터 request객체(무거운 not POJO) 대체
    setViewName(@Nullable String viewName) ← 경로

 

[ Spring Framework_InteralResourceViewResolver ]

ver01_ViewResolver.java - Class

  • ver01 : 개발자가 만든 VR 사용, DI로 Setter 주입 → ver02 : SF기본 제공하는 VR  사용, DI로 Setter 주입

[ver01] DispatcherServlet.java

dispatcher-servlet.xml

▶ ViewResolver 초기화
<bean id="viewResolver" class="org.springframework.web.servlet.view.InteralResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>

 

[ View 페이지 은닉(하이딩) ]

View 페이지 은닉(하이딩)

  • WEB-INF 폴더 내의 파일은 클라이언트에서 직접적으로 접근할 수 없음
    또한, 접근 권한을 유효성 검사하기 위해 Spring에서는 WEB-INF 폴더에 있는 View 페이지를 은닉(하이딩)함
    WEB-INF 폴더의 하위는 오직 ViewResolver를 통해서만 접근가능함을 이용한 것
  • 따라서 클라이언트가 직접 URL을 통해 View 페이지에 접근하는 것을 막고,
    컨트롤러를 통해서만 뷰에 접근할 수 있도록 함