๐Ÿ“—Spring MVC Study [ Handler Mapping, Handler Adapter ]

Caruhยท2025๋…„ 3์›” 19์ผ

Spring MVC

๋ชฉ๋ก ๋ณด๊ธฐ
10/17
post-thumbnail

ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘๊ณผ ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ

  • ํ˜„์žฌ Spring์€ annotation ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ๋‚˜ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์›๋ฆฌ๋ฅผ ์•Œ์•„๋ณด๊ธฐ์œ„ํ•ด ๊ณผ๊ฑฐ์— ์‚ฌ์šฉํ–ˆ๋˜ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ณต๋ถ€ํ•ด๋ณด์ž.

Controller Interface

  • ๊ณผ๊ฑฐ ๋ฒ„์ „ ์Šคํ”„๋ง ์ปจํŠธ๋กค๋Ÿฌ
 public interface Controller {
 ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse 
 response) throws Exception;
 }
  • ์Šคํ”„๋ง๋„ ์ฒ˜์Œ์—๋Š” ์ด๋Ÿฐ ๋”ฑ๋”ฑํ•œ ํ˜•์‹์˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ œ๊ณตํ–ˆ์—ˆ๋‹ค.
  • ์ฐธ๊ณ 
    • Controller ์ธํ„ฐํŽ˜์ด์Šค๋Š” @Controller์™€ ์ „ํ˜€ ๋‹ค๋ฆ„.
@Component("/springmvc/old-controller")
public class OldController implements Controller {
	@Override
	public ModelAndView handleRequest(HttpServletRequest request, 
	HttpServletResponse response) throws Exception {
 		System.out.println("OldController.handleRequest");
		return null;
    }
 }
  • @Component : ์ด ์ปจํŠธ๋กค๋Ÿฌ๋Š” /springmvc/old-controller๋ผ๋Š” ์ด๋ฆ„์˜ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์—ˆ๋‹ค.
  • ๋นˆ์˜ ์ด๋ฆ„์œผ๋กœ URL์„ ๋งคํ•‘

์ด ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜์—ˆ์„๊นŒ?

์ด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋˜๋ ค๋ฉด ๋‹ค์Œ 2๊ฐ€์ง€๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

  • HandlerMapping (ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘)

    • ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘์—์„œ ์ด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    • ์˜ˆ) ์Šคํ”„๋ง ๋นˆ์˜ ์ด๋ฆ„์œผ๋กœ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘์ด ํ•„์š”ํ•˜๋‹ค.
  • HandlerAdaptor (ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ)

    • ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘์„ ํ†ตํ•ด์„œ ์ฐพ์€ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
    • ์˜ˆ) Controller ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ฐพ๊ณ  ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

์‚ฌ์‹ค์ƒ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘๊ณผ ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ์ผ์€ ๊ฑฐ์˜ ์—†๋‹ค. > ์Šคํ”„๋ง์ด ์ด๋ฏธ ํ•„์š”ํ•œ ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘๊ณผ ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋ฅผ ๋Œ€๋ถ€๋ถ„ ๊ตฌํ˜„ํ•ด๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ์ž๋™ ๋“ฑ๋กํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘๊ณผ ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ

  • ์‹ค์ œ๋กœ๋Š” ๋” ๋งŽ์ง€๋งŒ ์ค‘์š”ํ•œ ๋ถ€๋ถ„ ์œ„์ฃผ๋กœ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ์ƒ๋žต

HandlerMapping

0 = RequestMappingHandlerMapping์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ ์ปจํŠธ๋กค๋Ÿฌ์ธ @RequestMapping์—์„œ ์‚ฌ์šฉ
1 = BeanNameUrlHandlerMapping์Šคํ”„๋ง ๋นˆ์˜ ์ด๋ฆ„์œผ๋กœ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฐพ๋Š”๋‹ค.

HandlerAdapter

0 = RequestMappingHandlerAdapter์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ ์ปจํŠธ๋กค๋Ÿฌ์ธ @RequestMapping์—์„œ ์‚ฌ์šฉ
1 = HttpRequestHandlerAdapterHttpRequestHandler ์ฒ˜๋ฆฌ
2 = SimpleControllerHandlerAdapterController ์ธํ„ฐํŽ˜์ด์Šค(์• ๋…ธํ…Œ์ด์…˜X, ๊ณผ๊ฑฐ์— ์‚ฌ์šฉ) ์ฒ˜๋ฆฌ
  • ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘๋„, ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋„ ๋ชจ๋‘ ์ˆœ์„œ๋Œ€๋กœ ์ฐพ๊ณ  ๋งŒ์•ฝ ์—†์œผ๋ฉด ๋‹ค์Œ ์ˆœ์„œ๋กœ ๋„˜์–ด๊ฐ„๋‹ค. ์—ฌ๊ธฐ์„œ ์ˆœ์œ„๋Š” ์ˆซ์ž๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ์ž‘์„์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค.

1. ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘์œผ๋กœ ํ•ธ๋“ค๋Ÿฌ ์กฐํšŒ

  1. HandlerMapping์„ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•ด์„œ, ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฐพ๋Š”๋‹ค.
  2. ์ด ๊ฒฝ์šฐ ๋นˆ ์ด๋ฆ„์œผ๋กœ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฐพ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๋นˆ ์ด๋ฆ„์œผ๋กœ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฐพ์•„์ฃผ๋Š” BeanNameUrlHandlerMapping๊ฐ€ ์‹คํ–‰์— ์„ฑ๊ณตํ•˜๊ณ  ํ•ธ๋“ค๋Ÿฌ์ธ OldController๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

2. ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ์กฐํšŒ

  1. HandlerAdapter์˜ supports()๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํ˜ธ์ถœ
  2. SimpleControllerHandlerAdapter๊ฐ€ Controller ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ๋Œ€์ƒ์ด ๋œ๋‹ค.

3. ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ์‹คํ–‰

  1. ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด ์กฐํšŒํ•œ SimpleControllerHandlerAdapter๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ ํ•ธ๋“ค๋Ÿฌ ์ •๋ณด๋„ ํ•จ๊ป˜ ๋„˜๊ฒจ์ค€๋‹ค.
  2. SimpleControllerHandlerAdapter๋Š” ํ•ธ๋“ค๋Ÿฌ์ธ OldController๋ฅผ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ •๋ฆฌ - OldController ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘, ์–ด๋Œ‘ํ„ฐ

  • OldController๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ ์‚ฌ์šฉ๋œ ๊ฐ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Œ
  • HandlerMapping = BeanNameUrlHandlerMapping
  • HandlerAdapter = SimpleControllerHandlerAdapter

๐Ÿ“ญ Reference

profile
Backend Developer

0๊ฐœ์˜ ๋Œ“๊ธ€