# ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์˜ HandlerMapping, HandlerAdapter, ViewResolver
Study Repository

๋‹ค์–‘ํ•œ ๋ฐฉ์‹์˜ 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๋ฅผ ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ตœ๊ทผ์—๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ์ด๋Ÿฐ ์ž‘์—…๋„ ๋ชจ๋‘ ์ž๋™ํ™” ํ•ด์ค๋‹ˆ๋‹ค.

'๐Ÿ“• Java&Spring > MVC' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

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

ํ™œ๋™ํ•˜๊ธฐ