GitHub

https://github.com/Backcoder-June

BackCoder 기록 그리고 숙달

Back to the Spring

DispatcherServlet // HandlerMapping // ViewResolver

Backcoder 2022. 8. 18. 23:03

[ MVC servlet-context.xml 태그 이용 Mapping ]

- @Mapping 방식을 사용하기 이전의 방식

- 단점이 많다. 

 

 

[ Mapping 과정 ] 

사용자가 특정 URL로 요청 => Dispatcher Servlet("/")이 받아서 servlet-context.xml 참조 
=> handlerMapping ( 마치 HashMap처럼 어떤 key 값 ("/url") 이 들어오면 어떤 Controller 로 연결시킬지 저장해둠 ) 
=> 해당 Controller(servlet)에서 요청에 대한 처리를 한 후 
=> ModelAndView / handleRequest 모델에 응답을 담음 ( addObject / setViewName ) 
=> return mv 응답


[ web.xml ] 
: 전반적인웹 환경설정
( MVC 한정이 아닌 전반적인 web 설정 )
< - DispatcherServlet >
URL pattern "/"  
=> 모든 요청 일단 "/" 에서 받음 

- 대문 역할해주는 firstController 
- 사용자의 모든 요청을 이 대문 Controller 에서 받아서

=> servlet-context.xml 로 넘김

 



[* servlet-context.xml ]
: Spring MVC 관련 설정파일 ( 위치 :  webapp - web inf - spring - appservlet - servlet-context.xml )
=> handlerMapping / component-scan / viewResolver / 

- viewResolver 
: /web-inf/views/ 경로 + .jsp 붙여줌 
=> 파일명만 return 하면 되게끔  

HandlerMapping  >
: URL  <=> Controller 맵핑 

1. 먼저, 컨트롤러들을 bean 으로 등록시켜둔다.
<beans:bean id="hello" class="springMVC.HelloController"></beans:bean>
<beans:bean id="list" class="springMVC.ListController"></beans:bean>

2. 핸들러맵핑 
<beans:bean id="urlMapping" 
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<beans:property name="mappings">
<beans:props>
<beans:prop key="/hello">hello</beans:prop>
<beans:prop key="/list">list</beans:prop>
</beans:props>
</beans:property>
</beans:bean>

 

: /hello  URL이 들어오면 =>  /hello.jsp  파일로 맵핑하겠다.  

 

 

=> 대충 이런 과정을 거치는 xml 방식 맵핑이었는데  단점ㅡ한계가 너무 컸다. 

 

[[ MVC xml태그 이용의 한계 (servlet-context.xml) ]]

(1) View Model을 같이 보내야 한다.  
(2) 하나의 URL 요청당 하나의 Controller 가 필요하다. 
(3) 그 Controller 는 매개변수로 HttpServletRequest/Response 를 취해야해서 
 다른 매개변수를 취하지 못한다. 
(4)  Handler url 하나하나 맵핑해야됨 

 

 

=====================================================================

 

 

[[ Spring MVC 등장 ]] 

=> @어노테이션Mapping   방식으로 단점들을 해결할 수 있다.

 

@Controller
public class A {

@GetMapping("/a") 
LoginDTO m1(){ } 
@PostMapping("/b")
String c2(String s){ } 
}

 

[[ @GetMapping @PostMapping ]] (4.버전부터 사용가능)
==
@RequestMapping(value="/login", method=RquestMethod.GET)
@RequestMapping(value="/login", method=RquestMethod.POST)

 

- 하나의 Controller 안에서 
타입, 매개변수 자유로운 메소드로 몇개든지 맵핑해주는 메소드를 만들 수 있다. 

- servelt-context.xml  <context:componenet-scan> 설정은 필요 
( 패키지 여러개일 때, base-package 바꿔서 추가 / 너무 많을시 속도 느려짐 ) 

 

 

[ Spring MVC - URL요청에 대한 Controller Mapping 순서 ]

 

URL ]

- Spring MVC 에서는 파일명을 직접 URL로 사용하지 못하는게 규칙
-  View 파일은 WEB-INF/views 에 넣어놓는게 MVC 규칙

 

1. @GetMapping( " /url " ) / @PostMapping( " /url " ) 

요청 : 정해둔 Mapping URL 로 받음

2. ViewResolver  

- 응답 : return "VIEW파일명" 으로 응답 ( URL 은 Mapping URL 유지됨 )