๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Springboot

[Spring] Spring MVC: DispatcherServelt

by ๋Œ€๋ณต2 2025. 5. 30.

์„œ๋ก 

์ง€๋‚œ ๊ธ€์—์„œ Springboot์˜ ๋™์ž‘ ์›๋ฆฌ์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด์•˜๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ํ•ด๋‹น ๋™์ž‘์›๋ฆฌ์—์„œ ํ•ต์‹ฌ์ด ๋˜๋Š” DispatcherServlet์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ ์ž ํ•œ๋‹ค.


DispatcherServlet

DispatcherServlet์€ Spring MVC์—์„œ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ(Front Controller) ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•ต์‹ฌ ์„œ๋ธ”๋ฆฟ์ด๋‹ค.
HTTP ์š”์ฒญ์„ ๋ฐ›์•„ ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ „๋‹ฌํ•˜๊ณ , ์‘๋‹ต๊นŒ์ง€ ์ฒ˜๋ฆฌํ•˜๋Š” ์š”์ฒญ-์‘๋‹ต ํ๋ฆ„์˜ ์ค‘์‹ฌ ํ—ˆ๋ธŒ์ด๋‹ค.

 

DispatcherServlet ์ •์˜

  • javax.servlet.http.HttpServlet์„ ์ƒ์†ํ•œ ์„œ๋ธ”๋ฆฟ์œผ๋กœ,
  • ๋ชจ๋“  HTTP ์š”์ฒญ์„ ๋ฐ›์•„ Spring ๋‚ด๋ถ€ ์ปดํฌ๋„ŒํŠธ์— ์œ„์ž„ํ•˜๊ณ , ์ตœ์ข… ์‘๋‹ต๊นŒ์ง€ ์ฑ…์ž„์ง„๋‹ค.
  • web.xml ๋˜๋Š” Spring Boot์—์„œ๋Š” ์ž๋™ ์„ค์ •์„ ํ†ตํ•ด ๋“ฑ๋ก๋œ๋‹ค.

DispatcherServlet์˜ ํƒ„์ƒ ๋ฐฐ๊ฒฝ

Spring MVC๋Š” Front Controller ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ,
๋ชจ๋“  ์š”์ฒญ์„ ๋‹จ์ผ ์ง„์ž…์ ์—์„œ ๋ฐ›์•„ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด DispatcherServlet์ด ๋„์ž…๋˜์—ˆ๋‹ค.

DispatcherServlet์€ ๋ฐ”๋กœ ์ด Front Controller ํŒจํ„ด์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์ด๋ฉฐ, ์Šคํ”„๋ง MVC ์•„ํ‚คํ…์ฒ˜์˜ ํ•ต์‹ฌ ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.


์ฃผ์š” ํŠน์ง•

  • HttpServlet์„ ์ƒ์†๋ฐ›๋Š” ์„œ๋ธ”๋ฆฟ ํด๋ž˜์Šค
    • ํ‘œ์ค€ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ(Tomcat, Jetty ๋“ฑ) ์œ„์—์„œ ๋™์ž‘
    • web.xml์— ๋ช…์‹œ์ ์œผ๋กœ ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜, @SpringBootApplication ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์ž๋™์œผ๋กœ ๋“ฑ๋ก
  • ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ํ๋ฆ„์„ ์ œ์–ดํ•˜๋Š” ์ค‘์•™ ํ—ˆ๋ธŒ ์—ญํ• ์„ ์ˆ˜ํ–‰
  • ๋‹ค์–‘ํ•œ ์ปดํฌ๋„ŒํŠธ๋“ค๊ณผ ๊ธด๋ฐ€ํ•˜๊ฒŒ ํ˜‘๋ ฅํ•˜๋ฉด์„œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ -> Spring MVC์˜ ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์˜ ๊ธฐ๋ฐ˜
    • HandlerMapping: ์š”์ฒญ URL์— ๋งค์นญ๋˜๋Š” ์–ด๋–ค ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ• ์ง€ ์ฐพ์•„๋‚ด๋Š” ์—ญํ• (@RequestMapping ์–ด๋…ธํ…Œ์ด์…˜ ๊ฐ™์€ ์ •๋ณด๋ฅผ ํ™œ์šฉ)
    • HandlerAdapter: HandlerMapping์ด ์ฐพ์•„๋‚ธ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ค‘๊ฐ„์—์„œ ์–ด๋Œ‘ํŒ…(์ ์‘)
    • ViewResolver: ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ๋ทฐ ์ด๋ฆ„(๋…ผ๋ฆฌ์  ์ด๋ฆ„)์„ ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋Š” View ๊ฐ์ฒด(๋ฌผ๋ฆฌ์  ๋ฆฌ์†Œ์Šค)๋กœ ๋ณ€ํ™˜(ex: "hello"๋ผ๋Š” ๋ทฐ๋ฅผ "/WEB-INF/views/hello.jsp"์™€ ๊ฐ™์€ ์‹ค์ œ JSP ํŒŒ์ผ๋กœ ๋งคํ•‘)
    • ExceptionResolver: ์š”์ฒญ ์ฒ˜๋ฆฌ ์ค‘์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ ์ ˆํ•œ ์—๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๊ฑฐ๋‚˜ JSON ํ˜•ํƒœ๋กœ ์—๋Ÿฌ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋กœ์ง์„ ๊ฒฐ์ •

์žฅ์ ๊ณผ ๋‹จ์ 

์žฅ์ 

  • ์š”์ฒญ-์‘๋‹ต ํ๋ฆ„์˜ ์ผ๊ด€์„ฑ ์ œ๊ณต
  • ๋‹ค์–‘ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ํ™•์žฅ ๊ฐ€๋Šฅ(์ปดํฌ๋„ŒํŠธ๋“ค์€ ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜)
  • JSP, Thymeleaf, FreeMarker ๊ฐ™์€ ๋‹ค์–‘ํ•œ ํ…œํ”Œ๋ฆฟ ์—”์ง„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, REST API๋ฅผ ์œ„ํ•œ JSON/XML ์‘๋‹ต ๋“ฑ ๋‹ค์–‘ํ•œ ๋ทฐ ๋ฐ ์‘๋‹ต ํ˜•์‹ ์—ฐ๋™ ๊ฐ€๋Šฅ
  • Annotation ๊ธฐ๋ฐ˜ ์„ ์–ธ์  ๋งคํ•‘ ์ง€์›

๋‹จ์ 

  • ์ „์ฒด ๊ตฌ์กฐ๋ฅผ ์ฒ˜์Œ์— ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค
  • DispatcherServlet์ด ๋ชจ๋“  ํ๋ฆ„์„ ์ฑ…์ž„์ ธ์„œ SRP ์œ„๋ฐฐ ๊ฐ€๋Šฅ
  • DispatcherServlet์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋ธ”๋ฆฟ API์˜ ๋™๊ธฐ ๋ธ”๋กœํ‚น(Blocking) I/O ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜ ๋™์ž‘
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Spring WebFlux์™€ ๊ฐ™์€ ๋ฆฌ์•กํ‹ฐ๋ธŒ(Reactive) ๋ฐ ๋น„๋™๊ธฐ ๋…ผ๋ธ”๋กœํ‚น(Non-blocking) I/O ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์™€๋Š” ๊ทผ๋ณธ์ ์ธ ๋™์ž‘ ๋ฐฉ์‹์— ์ฐจ์ด๊ฐ€ ์žˆ์Œ