[Spring Boot - ๐ŸฑPetClinic๐Ÿถ] 9. Dispatcher Servlet๐ŸŽฎ

์‘ค๋ฐยท2023๋…„ 4์›” 20์ผ

[Spring Boot - ๐ŸฑPetClinic๐Ÿถ]

๋ชฉ๋ก ๋ณด๊ธฐ
9/11

๐Ÿ˜… Controller ๋ถ„์„(2)์— ๋“ค์–ด๊ฐ€๊ธฐ ์•ž์„œ

Controller์—์„œ ๊ฐ ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ๋ถ„์„ํ•˜๋Š”๋ฐ ๋ฉ”์„œ๋“œ๋กœ ๋“ค์–ด์˜ค๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์€ ๋ˆ„๊ฐ€ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•œ ์˜๋ฌธ์ด ์ƒ๊ฒผ๋‹ค. Controller ๋ถ„์„์„ ๋งˆ์ € ํ•˜๊ธฐ์— ์•ž์„œ ์ „์ฒด์ ์ธ ํ๋ฆ„์„ ์•„๋Š” ๊ฒŒ ๋จผ์ €๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์„ ์ฐพ์•„๋ดค๋‹ค.

๐ŸŽฎ Dispatcher Servlet

Dispatcher Servlet์— ๋“ค์–ด์˜จ ์š”์ฒญ์˜ ์ฒ˜๋ฆฌ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. Dispatcher Servlet์—์„œ ์š”์ฒญ์„ ๋ฐ›๋Š”๋‹ค.
    • doService ๋ฉ”์„œ๋“œ์—์„œ doDispatch ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
  2. Handler Mapping์„ ํ†ตํ•ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  Handler(@Controller)๋ฅผ ์ฐพ๋Š”๋‹ค.
    • doDispatch ๋ฉ”์„œ๋“œ์—์„œ getHandler ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
  3. ์ฒ˜๋ฆฌํ•  Handler๊ฐ€ ์žˆ๋‹ค๋ฉด Handler Adapter๋ฅผ ์ด์šฉํ•ด Handler ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ / ์ฒ˜๋ฆฌํ•  Handler๊ฐ€ ์—†๋‹ค๋ฉด ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  4. Handler ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ModelAndView๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  5. Dispatcher Servlet์€ ๋ฆฌํ„ด๋ฐ›์€ ModelAndView์—์„œ View ์ด๋ฆ„์„ View Resolver๋กœ ์ „๋‹ฌ, View ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ๋ฐ›๋Š”๋‹ค.
  6. Dispatcher Servlet์€ View์—๊ฒŒ Model์„ ์ „๋‹ฌํ•ด์„œ ํ™”๋ฉด ํ‘œ์‹œ๋ฅผ ์š”์ฒญํ•œ๋‹ค.
    • Model์ด null์ด๋ฉด View ๊ทธ๋Œ€๋กœ ๋ Œ๋”๋ง
    • Model์ด null์ด ์•„๋‹ˆ๋ฉด View์— Model ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์„œ ๋ Œ๋”๋ง
  7. Dispatcher Servlet์€ View ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๐Ÿ•น Handler Adapter

์œ„์˜ 3๋ฒˆ ํ•ญ๋ชฉ์„ ์กฐ๊ธˆ ๋” ์ž์„ธํ•˜๊ฒŒ ๋ณด์ž๋ฉด

  1. DispatcherServlet ํด๋ž˜์Šค์˜ doService() ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ์‹คํ–‰๋˜๋Š” doDispatch() ๋ฉ”์„œ๋“œ ์‹คํ–‰
    • doService() ๋ฉ”์„œ๋“œ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ํ˜ธ์ถœ
  2. doDiapatch() ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ getHandlerAdapter(handler) ๋ฉ”์„œ๋“œ ์‹คํ–‰
  3. HandlerAdapter๋ฅผ ๊ฐ€์ ธ์˜จ ํ›„ Handler Adapter๋กœ handle() ๋ฉ”์„œ๋“œ ์‹คํ–‰
    • handle() ๋ฉ”์„œ๋“œ๋Š” HandlerAdapter ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋˜์–ด ์žˆ๊ณ , AbstractHandlerMethodAdapter ํด๋ž˜์Šค์— ๊ตฌํ˜„๋จ
  4. AbstractHandlerMethodAdapter์— ๊ตฌํ˜„๋œ handle() ๋ฉ”์„œ๋“œ๋Š” handleInternal() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ด
    • handleInternal()๋Š” abstract ๋ฉ”์„œ๋“œ๋กœ RequestMappingHandlerAdapter์—์„œ ๊ตฌํ˜„๋จ
  5. handleInternal() ๋ฉ”์„œ๋“œ๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์„ ๊ฑฐ์ณ invokeHandlerMethod() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ
  6. invokeHandlerMethod() ๋ฉ”์„œ๋“œ์—์„œ๋Š” ModelFactory์™€ ModelAndViewContainer๋ฅผ ์ƒ์„ฑ
  7. +) createInvocableHandlerMethod()๋ฅผ ํ†ตํ•ด ServletInvocableHandlerMethod ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ๊ฐ์ฒด์— setter ๋ฉ”์„œ๋“œ๋กœ argumentResolver, returnValueHandler, binderFactory, parameterNameDiscoverer๋ฅผ ์„ธํŒ…ํ•ด ์คŒ
    • ์ด ๊ณผ์ •์—์„œ argumentResolver๊ฐ€ @Controller์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผํ•˜์ง€๋งŒ ์ƒ์„ฑํ•ด์„œ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒŒ ์•„๋‹๊นŒ..? ๋ผ๊ณ  ์ถ”์ธก ์ค‘...
  8. ServletInvocableHandlerMethod ํƒ€์ž… ๊ฐ์ฒด์˜ invokeAndHandle() ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ ModelAndViewContainer๋ฅผ ์ฑ„์›Œ์คŒ
  9. ModelAndViewContainer์™€ ModelFactory, WebRequest๋ฅผ ํ†ตํ•ด ModelAndView๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” getModelAndView() ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ ๋ฐ˜ํ™˜ํ•จ
  10. ๋ฐ˜ํ™˜ ๊ฒฐ๊ณผ์ธ ModelAndView๋ฅผ Dispatcher Servlet๊นŒ์ง€ ๋ฐ˜ํ™˜๋ฐ›์Œ

6~9๋‹จ๊ณ„๋Š” ์ •ํ™•ํ•˜์ง€ ์•Š๋‹ค.. (ํด๋ž˜์Šค๋ฅผ ํƒ€๊ณ  ์ถ”์ ํ•˜๋‹ค ๋ณด๋‹ˆ ๊ธฐ๊ฐ€ ๋นจ๋ ค์„œ ๊ทธ๋งŒ..)
๊ธ€๋กœ ํ’€์–ด ์“ฐ๋‹ˆ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒƒ ๊ฐ™์•„ ํ”Œ๋กœ์šฐ ์ฐจํŠธ๋ฅผ ๊ทธ๋ ค๋ดค๋‹ค.

๐Ÿงฉ ๋งˆ๋ฌด๋ฆฌ

Dispatcher Servlet์ด Handler Adapter๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  @Controller(Handler)์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ์•„์„œ ์‹คํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ๊นŒ์ง€๋Š” ์•Œ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ถ”์ƒ์ ์œผ๋กœ๋งŒ ์•Œ๊ณ  ์žˆ์—ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋œฏ์–ด๋ดค์Œ์—๋„ ์•„์ง๋„ ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๊ทธ๋ž˜๋„ ๋œฏ์–ด๋ณด๊ธฐ ์ „๋ณด๋‹ค๋Š” ์ด๋ก ์ ์œผ๋กœ ์•Œ๋˜ ๋‚ด์šฉ์„ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋๋‹ค. ๋‹จ์ˆœํžˆ '์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ž‘์„ฑํ•œ ๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’์€ ๋ˆ„๊ฐ€ ์–ด๋–ป๊ฒŒ ์•Œ๊ณ  ๋„ฃ๋Š” ๊ฒƒ์ผ๊นŒ?'์— ๋Œ€ํ•œ ์˜๋ฌธ์œผ๋กœ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ ํด๋ž˜์Šค๋ฅผ ๊ณ„์†ํ•ด์„œ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€๋ฉด์„œ ํ๋ฆ„์„ ํŒŒ์•…ํ•˜๋‹ค ๋ณด๋‹ˆ ์ƒ๊ฐ๋ณด๋‹ค ์ฒ˜๋ฆฌ ๊ณผ์ •์ด ๋ณต์žกํ–ˆ๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’์€ Argument Resolver๊ฐ€ ๋„ฃ์–ด์ฃผ๋Š” ๋“ฏํ•˜๋‹ค. (์•„๋‹ ์ˆ˜๋„...)

์ฝ”๋“œ๋ฅผ ๋œฏ์–ด๋ณด๋ฉฐ ๊ฐ€์žฅ ์‹ ๊ธฐํ–ˆ๋˜ ๋ถ€๋ถ„์€ @Controller์— ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค๋ฅผ ์ฝ์–ด์™€์„œ (์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ) ์ผ๋ จ์˜ ๊ณผ์ •์„ ๊ฑฐ์ณ Dispatcher Servlet์ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํ•˜๋‚˜์˜ ๊ฐ์ฒด(?) ํ˜•ํƒœ๋กœ ์ €์žฅ๋œ๋‹ค๋Š” ๋ถ€๋ถ„์ด์—ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ์ด ๋ถ€๋ถ„์€ ์„œ๋ฒ„๊ฐ€ ๋ถ€ํŒ…๋  ๋•Œ ์‹คํ–‰๋œ๋‹ค.) ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด Dispatcher Servlet์€ getHandler๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋กœ ์ €์žฅ๋œ Handler๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ๊ฐ€์ ธ์˜จ Handler๋Š” ๊ฐ Controller ๋ณ„ @InitBinder, @ModelAttribute์™€ ๋”๋ถˆ์–ด ๊ฐ ์š”์ฒญ์— ๋งคํ•‘๋œ ๋ฉ”์„œ๋“œ๋“ค๊ณผ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ •๋ณด๋“ค์ด ์žˆ์—ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋™์ž‘ ๊ณผ์ •์„ ๋ชฐ๋ผ๋„ ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋‹ค๋ฅธ ๋กœ์ง๋“ค๋งŒ ์ž˜ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ์„œ๋ฒ„๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†๋„๋ก Spring Framework๋ฅผ ๋งŒ๋“  ๊ฐœ๋ฐœ์ง„๋“ค์—๊ฒŒ ๊ฐ์‚ฌํ•œ ๋งˆ์Œ์ด ๋“œ๋Š” ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ์ด๊ฑธ ์•Œ์•„์„œ ๊ตฌํ˜„ํ•ด์„œ ์จ์•ผ ํ–ˆ๋‹ค๋ฉด ์•„๋งˆ.. ํฌ๊ธฐํ•˜์ง€ ์•Š์•˜์„๊นŒ...ใ…Ž ์‹œ๊ฐ„์€ ์ข€ ๊ฑธ๋ ธ์ง€๋งŒ, ํ•œ ๋ฒˆ์€ ๋œฏ์–ด๋ณด๋ฉด ์ข‹์„๋ฒ•ํ•œ ๋‚ด์šฉ์ด์—ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ์—ฌ์œ ๊ฐ€ ์ƒ๊ธด๋‹ค๋ฉด ์กฐ๊ธˆ ๋” ์ž์„ธํ•˜๊ฒŒ ๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

[์ฐธ๊ณ ]

Dispatcher Servlet ์„ค๋ช… -
https://velog.io/@betterfuture4/Spring-Dispatcher-Servlet-%EC%A0%95%EB%A6%AC
https://tecoble.techcourse.co.kr/post/2021-06-25-dispatcherservlet-part-1/
https://tecoble.techcourse.co.kr/post/2021-07-15-dispatcherservlet-part-2/
https://terasolunaorg.github.io/guideline/5.0.1.RELEASE/en/Overview/SpringMVCOverview.html#overview-of-spring-mvc-processing-sequence
Handler Adapter ๋™์ž‘ ์„ค๋ช… -
https://velog.io/@jihoson94/Spring-MVC-HandlerAdapter-%EB%B6%84%EC%84%9D%ED%95%98%EA%B8%B0

profile
๊ฐœ๋ฐœ์ž์ง€๋ง์ƒ

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