Spring
Spring Framework_ControllerVersion02_DispatcherServlet, HandlerMapping, Controller, ViewResolver
onivv
2024. 3. 5. 23:16
[ Spring MVC구조 ] ⭐
웹의 흐름 : 요청 → 응답 (1cycle)
- 사용자(브라우저, Client)가 요청을 보냄
- DispatcherServlet(FrontController)에서 요청을 확인
- 서블릿 컨테이너가 사용자 요청을 받고,
web.xml 파일이나 어노테이션을 통해 DispatcherServlet에게 어떤 URL 패턴의 요청을 전달할지 설정
이후 DispatcherServlet은 해당 URL 패턴에 맞는 컨트롤러로 요청을 전달 - 사용자의 모든 URL요청(xxx.do)을 받아들이고, 요청을 적절한 Controller에 전달
- web.xml 파일에서 설정
- 서블릿 컨테이너가 사용자 요청을 받고,
- HandlerMapping에서 해당 요청에 대해 어떤 Controller가 처리할지 확인
- 팩토리 패턴을 활용해 요청(String)을 받으면 Controller(객체)를 반환
- URL과 컨트롤러의 매핑 : [ key - 요청 URL , value - new xxxController() ]
- Controller는 메서드 수행 후 String 반환(경로, 방식)
- 어떤 경로로 가야하는지와 어떻게(redirect/forward)가야하는지에 대한 정보를 String으로 반환
- 메서드 수행 시 Service를 이용하고 Service는 DAO를 이용
- Controller > Service > DAO (서로가 의존관계)
- ViewResolver가 Controller에서 반환된 String을 보고 사용자(브라우저, Client)에게 View 페이지를 응답
[ Spring_MVC 패턴_ControllerVersion01 ]
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
- DispatcherServlet
- web.xml : Spring Framework에서 제공하므로 DispatcherServlet 클래스 경로 변경
- dispatcher-servlet.xml : DI(의존주입, init()_멤버변수 초기화)를 위한 설정파일
- SimpleUrlHandlerMapping
- dispatcher-servlet.xml : <bean> 객체 생성, DI(의존주입)_Setter주입
- Controller
- Controller output의 핵심은 어디로(경로), 어떻게(방식:redirect,forward) 무조건 있어야함
- Spring Framework에서 제공하는 Controller를 implements(구현, 상속)해서 사용
- implements Controller → import org.springframework.web.servlet.mvc.Controller
- handleRequest() : Parameters → request, response / Returns → ModelAndView
- 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을 대체해서 스키마가 같음
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 주입
설정 | 내용 |
<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
- 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 주입
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 페이지 은닉(하이딩) ]
- WEB-INF 폴더 내의 파일은 클라이언트에서 직접적으로 접근할 수 없음
또한, 접근 권한을 유효성 검사하기 위해 Spring에서는 WEB-INF 폴더에 있는 View 페이지를 은닉(하이딩)함
WEB-INF 폴더의 하위는 오직 ViewResolver를 통해서만 접근가능함을 이용한 것 - 따라서 클라이언트가 직접 URL을 통해 View 페이지에 접근하는 것을 막고,
컨트롤러를 통해서만 뷰에 접근할 수 있도록 함