๋ค์ํ ๋ฐฉ์์ HandlerMapping, HandlerAdapter, ViewResolver
by rlaehddnd0422ํธ๋ค๋ฌ ๋งคํ, ํธ๋ค๋ฌ ์ด๋ํฐ๋ ์ด๋ค ๊ฒ๋ค์ด ์ฌ์ฉ๋๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
์ด ์ ์ ๋ง๋ค์๋ ControllerV5์์๋ Map, List ์ปฌ๋ ์ ์ ์ฌ์ฉํด์ ์ง์ ํธ๋ค๋ฌ์ ์ด๋ํฐ๋ฅผ ๋ง๋ค์์์ต๋๋ค.
๊ทธ๋ผ ์ด๋ฒ์๋ Spring MVC์์ ์ด๋ค ํธ๋ค๋ฌ ๋งคํ , ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ์ฌ์ฉํ๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
HandlerMapping & HandlerAdapter
Controller Interface
: ๊ณผ๊ฑฐ ๋ฒ์ ์ ์คํ๋ง ์ปจํธ๋กค๋ฌ ์ธํฐํ์ด์ค
public interface Controller {
ModelAndView handlerRequest(HttpServletRequest request, HttpServletResponse response)
throws Exception;
}
Controller ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ OldController๋ฅผ ํตํด ๊ฐ๋จํ๊ฒ ํธ๋ค๋ฌ ๋งคํ ํ ์คํธ๋ฅผ ์งํํด๋ณด์.
@Component("/springmvc/old-controller")
public class OldController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("OldController.handlerRequest");
}
}
@Component("/springmvc/old-controller")
> ์ด ์ปจํธ๋กค๋ฌ๋ฅผ "/springmvc/old-controller"๋ผ๋ ์ด๋ฆ์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก.
์ด ์ปจํธ๋กค๋ฌ๋
http://localhost:8080/springmvc/old-controller
๋ฅผ ํตํด ์คํํ ์ ์์ต๋๋ค.
์ด ์ปจํธ๋กค๋ฌ๋ ์ด๋ค ๋ฐฉ์์ผ๋ก ํธ์ถ๋๋ ๊ฒ์ผ๊น์?
์ปจํธ๋กค๋ฌ๊ฐ ํธ์ถ๋๋ ค๋ฉด ๋ค์ 2๊ฐ์ง๊ฐ ํ์ํฉ๋๋ค.
1. ํธ๋ค๋ฌ ๋งคํ
> ํธ๋ค๋ฌ ๋งคํ์ ํตํด ์ด ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ์ ์ ์์ด์ผ ํฉ๋๋ค.
> "์คํ๋ง ๋น์ ์ด๋ฆ"์ผ๋ก ํธ๋ค๋ฌ๋ฅผ ์ฐพ์ ์ ์๋ ํธ๋ค๋ฌ ๋งคํ์ด ํ์ํฉ๋๋ค.
2. ํธ๋ค๋ฌ-์ด๋ํฐ
> ํธ๋ค๋ฌ ๋งคํ์ ํตํด ์ฐพ์ ์ปจํธ๋กค๋ฌ๋ฅผ ์คํํ ์ ์๋ ์ด๋ํฐ๊ฐ ํ์ํฉ๋๋ค.
> "Controller" ์ธํฐํ์ด์ค๋ฅผ ์คํํ ์ ์๋ ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ์ฐพ๊ณ ์คํํด์ผ ํฉ๋๋ค.
์คํ๋ง์ ์ด๋ฏธ ํ์ํ ํธ๋ค๋ฌ ๋งคํ, ์ด๋ํฐ๋ฅผ ๋๋ถ๋ถ ๊ตฌํํด๋์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๊ฐ ์ผ์ผ์ด ํธ๋ค๋ฌ ๋งคํ๊ณผ ์ด๋ํฐ๋ฅผ ๋ง๋ค ์ผ์ ์์ต๋๋ค.
์คํ๋ง ๋ถํธ๊ฐ ์๋ ๋ฑ๋กํ๋ ํธ๋ค๋ฌ ๋งคํ๊ณผ ์ด๋ํฐ๋ฅผ ๋ช๊ฐ์ง๋ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. HandlerMapping
1 : RequestMappingHandlerMapping / ์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ์ ์ปจํธ๋กค๋ฌ์ธ @RequestMapping์์ ์ฌ์ฉํฉ๋๋ค.
2 : BeanNameUrlHandlerMapping / ์คํ๋ง ๋น์ ์ด๋ฆ์ผ๋ก ํธ๋ค๋ฌ๋ฅผ ์ฐพ์ต๋๋ค.
2. HandlerAdapter
1 : RequestMappingHandlerAdapter / ์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ์ ์ปจํธ๋กค๋ฌ์ธ @RequestMapping์์ ์ฌ์ฉ
2 : HttpRequestHandlerAdapter / HttpRequestHandler ์ฒ๋ฆฌ
3 : SimpleControllerHandlerAdapter / Controller ์ธํฐํ์ด์ค ์ฒ๋ฆฌ
โ๏ธ ์์๋๋ก ์ฐพ๊ณ ๋ง์ฝ ์์ผ๋ฉด ๋ค์์์๋ก ๋์ด๊ฐ๋ ๋ฐฉ์
OldController์ ๊ฒฝ์ฐ์๋
HandlerMapping : BeanNameUrlHandlerMapping
HandlerAdapter : SimpleControllerHandlerAdapter
์ ์ฌ์ฉํฉ๋๋ค.
1. BeanNameUrlHandlerMapping ์คํ -> OldController ๋ฆฌํด
2. SimpleControllerHandlerAdapter๋ฅผ ํตํด OldController๋ฅผ ๋ด๋ถ์์ ์คํ
HttpRequestHandler
์ด๋ฒ์๋ Controller ์ธํฐํ์ด์ค๊ฐ ์๋ ๋ค๋ฅธ ํธ๋ค๋ฌ๋ฅผ ์์๋ณด๊ฒ ์ต๋๋ค.
HttpRequestHandler ๋ ์๋ธ๋ฆฟ๊ณผ ๊ฐ์ฅ ์ ์ฌํ ํํ์ ํธ๋ค๋ฌ์ ๋๋ค.
@Component("/springmvc/request-handler")
public class MyHttpRequestHandler implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("MyHttpRequestHandler.handleRequest");
}
}
1. HandlerMapping
๋ง์ฐฌ๊ฐ์ง๋ก @Component์ ๋น ์ด๋ฆ์ ๋ฑ๋กํ๊ธฐ ๋๋ฌธ์ BeanNameUrlHandlerMapping ์คํํ๊ณ ํธ๋ค๋ฌ์ธ MyHttpRequestHandler ๋ฆฌํด
2. HandlerAdapter
HttpRequestHandler๋ฅผ ์์๋ฐ์๊ธฐ ๋๋ฌธ์ HttpRequestHandlerAdapter๊ฐ ์คํ์ด ๋ฉ๋๋ค.
3. ์ด๋ํฐ ์คํ
HttpRequestHandlerAdapter๋ฅผ ์คํํ๋ฉด์ ํธ๋ค๋ฌ ์ ๋ณด๋ ํจ๊ป ๋๊ฒจ์ฃผ์ด HttpRequestHandlerAdapter๋ ํธ๋ค๋ฌ์ธ MyHttpRequestHandler๋ฅผ ๋ด๋ถ์์ ์คํํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํฉ๋๋ค.
MyHttpRequestController์ ๊ฒฝ์ฐ์๋
HandlerMapping : BeanNameUrlHandlerMapping
HandlerAdapter : HttpRequestHandlerAdapter
์ ์ฌ์ฉํฉ๋๋ค.
RequestMappingHandlerMapping (ํธ๋ค๋ฌ ๋งคํ)
RequestMappingHandlerAdapter (ํธ๋ค๋ฌ ์ด๋ํฐ)๋ @RequestMapping ์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ง์ํ๋ ๋งคํ๊ณผ ์ด๋ํฐ๋ก ๋ค์์ ์์ธํ๊ฒ ์ค๋ช ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
ViewResolver
์ด๋ฒ์๋ ๋ทฐ๋ฆฌ์กธ๋ฒ์ ๋ํด ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
OldController - View ์กฐํํ ์ ์๋๋ก ๋ณ๊ฒฝ
@Component("/springmvc/old-controller")
public class OldController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("OldController.handlerRequest");
return new ModelAndView("new-form");
}
}
http://localhost:8080/springmvc/old-controller
์คํํด๋ณด๋ฉด ์น๋ธ๋ผ์ฐ์ ์ Whitelabel Error Page๊ฐ ๋์ค๊ณ , ์ฝ์์ OldController.handlerRequest ์ถ๋ ฅ.
application.properties ์ ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํ์.
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
๋ทฐ ๋ฆฌ์กธ๋ฒ - InternalResourceViewResolver
์คํ ๋ถํธ๋ InternalResourceViewResolver๋ผ๋ ๋ทฐ ๋ฆฌ์กธ๋ฒ๋ฅผ ์๋์ผ๋ก ๋ฑ๋กํ๋๋ฐ ์ด ๋, application.properties์ ๋ฑ๋กํ
view.prefix, view.suffix์ ๋ณด๋ฅผ ์ฌ์ฉํด์ ๋ฑ๋กํฉ๋๋ค.
์ด ์ธ์๋ BeanNameViewResolver ( ๋น ์ด๋ฆ์ผ๋ก ๋ทฐ๋ฅผ ์ฐพ์๋ฌ ๋ฆฌํด ) ๋ฑ๋ฑ ์ฌ๋ฌ๊ฐ์ง ๋ทฐ ๋ฆฌ์กธ๋ฒ๊ฐ ์์ต๋๋ค.
InternalResourceViewResolver๋ JSP๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๋ทฐ๋ฅผ ๋ฆฌํดํฉ๋๋ค.
1. ํธ๋ค๋ฌ ์ด๋ํฐ ํธ์ถ
ํธ๋ค๋ฌ ์ด๋ํฐ๋ก new-form์ด๋ผ๋ ๋ทฐ ์ด๋ฆ ํ๋
2. ViewResolver ํธ์ถ
new-form ์ด๋ผ๋ ๋ทฐ ์ด๋ฆ์ผ๋ก viewResolver๋ฅผ ์์๋๋ก ํธ์ถ. ( BeanNameViewResolver -> InternalResourceViewResolver -> ...)
BeanNameViewResolver๋ new-form์ด๋ผ๋ ์ด๋ฆ์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋ ๋ทฐ๋ฅผ ์ฐพ์์ผ ํ๋๋ฐ ์๊ธฐ ๋๋ฌธ์
InternalResourceViewResolver๊ฐ ํธ์ถ๋ฉ๋๋ค.
3. InternalResourceViewResolver ํธ์ถ
InternalResourceView๋ฅผ ๋ฆฌํด
4. InternalResourceView๋ JSP์ฒ๋ผ forward()๋ฅผ ํธ์ถํด์ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ
5. view.render() ํธ์ถ๋๊ณ InternalResourceView๋ forward()๋ฅผ ์ฌ์ฉํด JSP ์คํ
โ๏ธJSP๊ฐ ์๋ ํ์๋ฆฌํ๋ฅผ ๋ทฐ ํ ํ๋ฆฟ์ผ๋ก ์ฌ์ฉํ๋ฉด ThymeleafViewResolver๋ฅผ ๋ฑ๋กํด์ผ ํฉ๋๋ค.
์ต๊ทผ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์ถ๊ฐํ๋ฉด ์คํ๋ง ๋ถํธ๊ฐ ์ด๋ฐ ์์ ๋ ๋ชจ๋ ์๋ํ ํด์ค๋๋ค.
'๐ Backend > MVC Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring MVC ๊ธฐ๋ณธ ๊ธฐ๋ฅ - Logging (0) | 2023.03.10 |
---|---|
Spring MVC - @RequestMapping, @RequestParam, ModelAndView (0) | 2023.03.09 |
Spring MVC ๊ตฌ์กฐ (0) | 2023.03.03 |
Adapter ํจํด (0) | 2023.03.02 |
Front-Controller ํจํด (0) | 2023.02.27 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422