JSP Servlet ๋ณต์Šต 3

moon.kickยท2025๋…„ 5์›” 15์ผ

review

๋ชฉ๋ก ๋ณด๊ธฐ
3/5

๐ŸŽ‰ DispatcherServlet ๊ธฐ๋ฐ˜ MVC ๊ตฌ์กฐ ์ตœ์ข… ์š”์•ฝ ๐ŸŽ‰

DispatcherServlet ๊ธฐ๋ฐ˜์˜ MVC ๊ตฌ์กฐ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ ํ๋ฆ„์„ ์ค‘์•™ ์ง‘์ค‘์‹์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ์—ญํ•  ๋ถ„๋‹ด์„ ํ†ตํ•ด ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๋Š” ๋””์ž์ธ ํŒจํ„ด์ด์•ผ. ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ์™€ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„.

  1. ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ (View โ†’ DispatcherServlet): ์‚ฌ์šฉ์ž๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ํŠน์ • URL์„ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ์•ก์…˜์„ ์ˆ˜ํ–‰ํ•˜๋ฉด, ์ด ์š”์ฒญ์€ ์›น ์„œ๋ฒ„๋ฅผ ๊ฑฐ์ณ DispatcherServlet์—๊ฒŒ ์ „๋‹ฌ๋ผ. @WebServlet("/") ๋˜๋Š” ํŠน์ • ํŒจํ„ด์œผ๋กœ ๋งคํ•‘๋˜์–ด ๋ชจ๋“  ์š”์ฒญ์„ Front Controller๋กœ์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•ด.

  2. Handler Mapping (DispatcherServlet โ†’ Handler): DispatcherServlet์€ ๋ฐ›์€ ์š”์ฒญ์˜ URL์ด๋‚˜ ๋‹ค๋ฅธ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ, ์ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  Handler (์ผ๋ฐ˜์ ์œผ๋กœ Controller)๋ฅผ ์ฐพ์•„. ์ด ๊ณผ์ •์€ ์„ค์ • ํŒŒ์ผ (actionMapping.properties, XML ์„ค์ •, ์–ด๋…ธํ…Œ์ด์…˜ ๋“ฑ)์— ์ •์˜๋œ ๋งคํ•‘ ์ •๋ณด๋ฅผ ํ™œ์šฉํ•ด ์ด๋ฃจ์–ด์ ธ. (์ด์ „ ๊ฐ•์˜ ๋…ธํŠธ์—์„œ HandlerMappingListener๊ฐ€ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•ด๋‘” map์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ๋ฐ”๋กœ ์ด ์—ญํ• ์˜ ํ•œ ์˜ˆ์‹œ์•ผ!)

  3. Controller ์‹คํ–‰ (DispatcherServlet โ†’ Controller): DispatcherServlet์€ Handler Mapping์„ ํ†ตํ•ด ์ฐพ์€ Controller์˜ ํŠน์ • ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ, ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ์ •๋ณด (HttpServletRequest)์™€ ์‘๋‹ต ์ •๋ณด (HttpServletResponse)๋ฅผ ํ•จ๊ป˜ ์ „๋‹ฌํ•ด.

  4. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ (Controller โ†’ Service โ†’ Model): Controller๋Š” ์ „๋‹ฌ๋ฐ›์€ ์š”์ฒญ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•„์š”ํ•œ Model ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด Service ๊ณ„์ธต์„ ํ˜ธ์ถœํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ด. Service๋Š” DAO (Data Access Object)๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ๋„ ํ•ด.

  5. ModelAndView ๋ฐ˜ํ™˜ (Controller โ†’ DispatcherServlet): Controller๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ์ธ Model ๋ฐ์ดํ„ฐ์™€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ View์˜ ์ด๋ฆ„์„ ํ•จ๊ป˜ ๋‹ด์€ ModelAndView ๊ฐ์ฒด๋ฅผ DispatcherServlet์—๊ฒŒ ๋ฐ˜ํ™˜ํ•ด.

  6. View Resolver (DispatcherServlet โ†’ View): DispatcherServlet์€ ModelAndView๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ View ์ด๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹ค์ œ View ๊ฐ์ฒด (JSP, Thymeleaf ๋“ฑ)๋ฅผ ์ฐพ์•„. View Resolver๋Š” ์„ค์ •๋œ ๊ทœ์น™์— ๋”ฐ๋ผ View ์ด๋ฆ„์— ์ ‘๋‘์‚ฌ, ์ ‘๋ฏธ์‚ฌ๋ฅผ ๋ถ™์—ฌ ์‹ค์ œ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•ด.

  7. View ๋ Œ๋”๋ง (DispatcherServlet โ†’ View โ†’ Client): DispatcherServlet์€ ์ฐพ์€ View์—๊ฒŒ Model ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ณ , View๋Š” ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ์ตœ์ข…์ ์ธ ์‘๋‹ต (HTML, JSON ๋“ฑ)์„ ์ƒ์„ฑํ•˜๊ณ  ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ ์‘๋‹ต์„ ์ „์†กํ•ด.

๐ŸŽจ DispatcherServlet์˜ ์ข€ ๋” ๊นŠ์€ ๊ธฐ๋Šฅ๋“ค (๋‚ด๊ฐ€ ์•„๋Š” ์„ ์—์„œ!) ๐ŸŽจ

์‹ค์ œ DispatcherServlet์€ ๋‹จ์ˆœํžˆ ์š”์ฒญ์„ ๋ฐ›๊ณ  Controller๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•ด์„œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ํ›จ์”ฌ ํŽธ๋ฆฌํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค์–ด ์ค˜. ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ๊ธฐ๋Šฅ๋“ค์„ ์•Œ๋ ค์ค„๊ฒŒ.

  • Handler Interceptor: ์š”์ฒญ ์ฒ˜๋ฆฌ ์ „ํ›„์— ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด์•ผ. ๋งˆ์น˜ ์š”์ฒญ์ด Controller์— ๋„์ฐฉํ•˜๊ธฐ ์ „์ด๋‚˜ Controller๊ฐ€ ์‘๋‹ต์„ ๋ณด๋‚ด๊ธฐ ์ „์— "๊ฐ€๋กœ์ฑ„์„œ" ๊ณตํ†ต์ ์ธ ๋กœ๊น…, ์ธ์ฆ, ๊ถŒํ•œ ๊ฒ€์‚ฌ ๋“ฑ์˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€. ์—ฌ๋Ÿฌ ๊ฐœ์˜ Interceptor๋ฅผ ๋“ฑ๋กํ•ด์„œ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์–ด.

  • Exception Resolver: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์ค‘์— ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ ์ค‘์•™ ์ง‘์ค‘์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด์•ผ. Controller๋‚˜ Service ๊ณ„์ธต์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด DispatcherServlet์€ ๋“ฑ๋ก๋œ Exception Resolver๋“ค์—๊ฒŒ ์ด ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฌผ์–ด๋ณด๊ณ , ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•œ Resolver๊ฐ€ ์žˆ์œผ๋ฉด ํ•ด๋‹น Resolver์—๊ฒŒ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๋งก๊ฒจ. ์ด๋ฅผ ํ†ตํ•ด ์—๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๊ฑฐ๋‚˜, API ์‘๋‹ต์„ ์ผ๊ด€๋œ ํ˜•์‹์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์–ด.

  • Locale Resolver & Theme Resolver: ๋‹ค๊ตญ์–ด ์ง€์›์ด๋‚˜ ์›น ํŽ˜์ด์ง€์˜ ํ…Œ๋งˆ๋ฅผ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ ์šฉํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ๋Š” ๊ธฐ๋Šฅ์ด์•ผ. Locale Resolver๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ํ—ค๋” ๋“ฑ์„ ๋ถ„์„ํ•ด์„œ ์‚ฌ์šฉ์ž์˜ ์–ธ์–ด ์„ค์ •์„ ํŒŒ์•…ํ•˜๊ณ , Theme Resolver๋Š” ์„ค์ •๋œ ํ…Œ๋งˆ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์„œ View์—์„œ ์ผ๊ด€๋œ ๋””์ž์ธ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค˜.

  • Multipart Resolver: ํŒŒ์ผ ์—…๋กœ๋“œ์™€ ๊ด€๋ จ๋œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด์•ผ. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํผ์„ ํ†ตํ•ด ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๋ฉด, Multipart Resolver๊ฐ€ ์ด ์š”์ฒญ์„ ๋ถ„์„ํ•ด์„œ ํŒŒ์ผ ๋ฐ์ดํ„ฐ์™€ ์ผ๋ฐ˜ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ , Controller์—์„œ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€ํ™˜ํ•ด ์ค˜.

  • Data Binding & Validation: ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์ „์†ก๋œ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ Controller์˜ ๋ฉ”์„œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ ๊ฐ์ฒด์— ์ž๋™์œผ๋กœ ๋ฐ”์ธ๋”ฉ(๋งคํ•‘)ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด์•ผ. ๋˜ํ•œ, ๋ฐ”์ธ๋”ฉ๋œ ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•ด์„œ, ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ ์˜ค๋ฅ˜๋ฅผ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค˜. @RequestParam, @ModelAttribute ๋“ฑ์˜ ์–ด๋…ธํ…Œ์ด์…˜์ด ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ ํ™œ์šฉ๋ผ.

  • Flash Attributes: Redirect ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์ด์•ผ. Redirect๋ฅผ ํ•˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ์š”์ฒญ ์Šค์ฝ”ํ”„์˜ ๋ฐ์ดํ„ฐ๋Š” ์‚ฌ๋ผ์ง€๋Š”๋ฐ, Flash Attribute๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Redirect ์ง์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์Œ ์š”์ฒญ๊นŒ์ง€ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์„œ, ์ผํšŒ์„ฑ ๋ฉ”์‹œ์ง€ (์„ฑ๊ณต/์‹คํŒจ ๋ฉ”์‹œ์ง€ ๋“ฑ)๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ด.

์ด ์™ธ์—๋„ DispatcherServlet์€ ๋‹ค์–‘ํ•œ ํ™•์žฅ ํฌ์ธํŠธ๋ฅผ ์ œ๊ณตํ•ด์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ด. Spring MVC์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ด๋Ÿฌํ•œ DispatcherServlet์˜ ๊ธฐ๋Šฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋” ํŽธ๋ฆฌํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ์›น ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋Š” ๊ฑฐ์ง€.


1. ServletContextListener ๊ตฌํ˜„์ฒด (HandlerMapping ์—ญํ• ):

  • HandlerMappingListener ํด๋ž˜์Šค: ServletContextListener ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š” ์ด ํด๋ž˜์Šค๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ (Tomcat ๊ฐ™์€ ์›น ์„œ๋ฒ„)๊ฐ€ ์‹œ์ž‘๋  ๋•Œ (contextInitialized ๋ฉ”์„œ๋“œ)์™€ ์ข…๋ฃŒ๋  ๋•Œ (contextDestroyed ๋ฉ”์„œ๋“œ) ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค˜.
  • ์„œ๋ฒ„ ์‹œ์ž‘ ์‹œ Controller ์ดˆ๊ธฐํ™”: contextInitialized ๋ฉ”์„œ๋“œ ์•ˆ์„ ๋ณด๋ฉด ์ฃผ์„์œผ๋กœ "//ํ•„์š”ํ•œ XxxController๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•œ๋‹ค."๋ผ๊ณ  ๋˜์–ด ์žˆ๊ณ , ๊ทธ ์•„๋ž˜ actionMapping.properties ํŒŒ์ผ์—์„œ ์ •๋ณด๋ฅผ ์ฝ์–ด์™€์„œ Controller๋“ค์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•˜๊ณ  Map<String, Controller>์— ์ €์žฅํ•˜๋Š” ๋กœ์ง์ด ๋‹ด๊ฒจ ์žˆ์„ ๊ฒƒ์œผ๋กœ ์ถ”์ธก๋ผ.
    • actionMapping.properties ํŒŒ์ผ์—๋Š” ์š”์ฒญ ํ‚ค (key)์™€ ๊ทธ ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” Controller ํด๋ž˜์Šค ์ด๋ฆ„ (value)์ด ์Œ์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ์„ ๊ฑฐ์•ผ. ์˜ˆ๋ฅผ ๋“ค์–ด, "select=SelectionController", "insert=InsertController" ์ฒ˜๋Ÿผ ๋ง์ด์ง€.
    • Properties ํŒŒ์ผ์„ ์ฝ์–ด์„œ ๊ฐ ํ‚ค-๊ฐ’ ์Œ์„ ๋ถ„๋ฆฌํ•˜๊ณ , Reflection์ด๋ผ๋Š” Java ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด์„œ ๋ฌธ์ž์—ด๋กœ ๋œ ํด๋ž˜์Šค ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์‹ค์ œ Controller ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฑฐ์•ผ. (์ด๋ฏธ์ง€์— (String--->๊ฐ์ฒด์ƒ์„ฑ=reflection๊ฐœ๋…) ์ด๋ผ๊ณ  ์นœ์ ˆํ•˜๊ฒŒ ์ ํ˜€ ์žˆ๋„ค!)
    • ์ƒ์„ฑ๋œ Controller ๊ฐ์ฒด๋Š” Map<String, Controller>์ธ map์— ํ‚ค์™€ ๊ฐ’์œผ๋กœ ์ €์žฅ๋ผ. ์—ฌ๊ธฐ์„œ ํ‚ค๋Š” actionMapping.properties์— ์ •์˜๋œ ์š”์ฒญ ํ‚ค๊ฐ€ ๋˜๊ณ , ๊ฐ’์€ ์ƒ์„ฑ๋œ Controller ๊ฐ์ฒด๊ฐ€ ๋˜๋Š” ๊ฑฐ์ง€.
  • map์„ Application ์˜์—ญ์— ์ €์žฅ: ๋งˆ์ง€๋ง‰์œผ๋กœ application.setAttribute("map", map); ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ƒ์„ฑ๋œ map ๊ฐ์ฒด๋ฅผ ServletContext (Application ์˜์—ญ)์— ์ €์žฅํ•ด. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด DispatcherServlet์„ ํฌํ•จํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ์„œ๋ธ”๋ฆฟ๊ณผ JSP์—์„œ ์ด map์— ์ ‘๊ทผํ•ด์„œ ํ•„์š”ํ•œ Controller๋ฅผ ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฑฐ์•ผ.

ํ•ต์‹ฌ: ์ด HandlerMappingListener๋Š” ์š”์ฒญ ํ‚ค์™€ ์‹ค์ œ Controller ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์—ฐ๊ฒฐํ•ด๋‘๋Š” ์—ญํ• ์„ ํ•ด. ๋งˆ์น˜ ์ „ํ™”๋ฒˆํ˜ธ๋ถ€์ฒ˜๋Ÿผ, ํŠน์ • ์š”์ฒญ ํ‚ค๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์–ด๋–ค Controller๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ฐ”๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ์ค€๋น„ํ•ด๋‘๋Š” ๊ฑฐ์ง€.

2. DispatcherServlet ํด๋ž˜์Šค:

  • @WebServlet("/front"): ์ด ์–ด๋…ธํ…Œ์ด์…˜์€ /front๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ด DispatcherServlet์ด ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๊ฑฐ์•ผ. ์•ž์„œ ์„ค๋ช…ํ–ˆ๋˜ Front Controller ํŒจํ„ด์˜ ํ•ต์‹ฌ ์—ญํ• ์„ ํ•˜๋Š” ๊ฑฐ์ง€.
  • Map<String, Controller> map = null;: DispatcherServlet ๋‚ด๋ถ€์— Controller๋“ค์„ ์ €์žฅํ•  map ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•ด.
  • init(ServletConfig config) ๋ฉ”์„œ๋“œ: ์„œ๋ธ”๋ฆฟ์ด ์ฒ˜์Œ ์ƒ์„ฑ๋  ๋•Œ ๋”ฑ ํ•œ ๋ฒˆ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์•ผ.
    • map = (Map<String, Controller>) application.getAttribute("map"); ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ HandlerMappingListener๊ฐ€ Application ์˜์—ญ์— ์ €์žฅํ•ด๋‘” map ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์™€์„œ DispatcherServlet์˜ map ๋ณ€์ˆ˜์— ํ• ๋‹นํ•ด. ์ด์ œ DispatcherServlet์€ ์–ด๋–ค ์š”์ฒญ ํ‚ค์— ์–ด๋–ค Controller๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฑฐ์•ผ.
  • service(HttpServletRequest request, HttpServletResponse response) ๋ฉ”์„œ๋“œ: ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์‹ค์ œ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์•ผ. ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ๋กœ์ง์ด ์—ฌ๊ธฐ์— ๋‹ด๊ฒจ ์žˆ์–ด.
    • request.getParameter("key"); ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ ์ค‘์—์„œ "key"๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ๊ฐ’์„ ์ฝ์–ด์™€. ์ด ๊ฐ’์ด ๋ฐ”๋กœ actionMapping.properties์— ์ •์˜๋œ ์š”์ฒญ ํ‚ค๊ฐ€ ๋˜๋Š” ๊ฑฐ์•ผ. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ "๊ฒ€์ƒ‰" ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €๋‹ค๋ฉด "select"๋ผ๋Š” ๊ฐ’์ด ๋„˜์–ด์˜ฌ ์ˆ˜ ์žˆ๊ฒ ์ง€.
    • Controller con = map.get(key); ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด์„œ DispatcherServlet์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” map์—์„œ ์ฝ์–ด์˜จ ์š”์ฒญ ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” Controller ๊ฐ์ฒด๋ฅผ ์ฐพ์•„. ์ „ํ™”๋ฒˆํ˜ธ๋ถ€์—์„œ ์ด๋ฆ„์„ ์ฐพ์•„์„œ ์‹ค์ œ ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์–ป๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด.
    • ModelAndView andView = con.handleRequest(); (์ด๋ฏธ์ง€ 1) ๋˜๋Š” ModelAndView andView = con.process(request, response); (์ด๋ฏธ์ง€ 2) ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ฐพ์€ Controller ๊ฐ์ฒด์˜ ํŠน์ • ๋ฉ”์„œ๋“œ (handleRequest ๋˜๋Š” process)๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์‹ค์ œ ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•ด. ์ด๋•Œ HttpServletRequest์™€ HttpServletResponse ๊ฐ์ฒด๋ฅผ ํ•จ๊ป˜ ๋„˜๊ฒจ์ค˜์„œ Controller๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ์ •๋ณด๋ฅผ ํ™œ์šฉํ•˜๊ณ  ์‘๋‹ต์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฑฐ์•ผ. ์ด ๋ฉ”์„œ๋“œ๋Š” ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ์™€ ๋ณด์—ฌ์ค„ View ์ •๋ณด๋ฅผ ๋‹ด์€ ModelAndView ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ผ.

ํ•ต์‹ฌ: DispatcherServlet์€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด ์š”์ฒญ ํ‚ค๋ฅผ ๋ถ„์„ํ•ด์„œ ๋ฏธ๋ฆฌ ์ค€๋น„๋œ map์—์„œ ํ•ด๋‹น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  Controller๋ฅผ ์ฐพ๊ณ , ๊ทธ Controller์—๊ฒŒ ์‹ค์ œ ์ž‘์—…์„ ๋งก๊ธฐ๋Š” ์—ญํ• ์„ ํ•ด.

์ด๋ฏธ์ง€ 1๊ณผ 2์˜ ์ฐจ์ด์ :

๋‘ ์ด๋ฏธ์ง€์˜ DispatcherServlet ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด Controller์˜ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด. ์ด๋ฏธ์ง€ 1์—์„œ๋Š” con.handleRequest() ๋ผ๊ณ  ๋˜์–ด ์žˆ๊ณ , ์ด๋ฏธ์ง€ 2์—์„œ๋Š” con.process(request, response) ๋ผ๊ณ  ๋˜์–ด ์žˆ์ง€. ์ด๋Š” ๊ฐ•์˜ ๋‚ด์šฉ์ด ์—…๋ฐ์ดํŠธ๋˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ํŒจํ„ด์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•œ ์ฐจ์ด์ผ ์ˆ˜ ์žˆ์–ด. ์ค‘์š”ํ•œ ๊ฑด DispatcherServlet์ด ์š”์ฒญ์— ๋งž๋Š” Controller๋ฅผ ์ฐพ์•„์„œ ํŠน์ • ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‹ค์ œ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๊ฒŒ ํ•œ๋‹ค๋Š” ์ ์€ ๋™์ผํ•ด.

๊ฒฐ๋ก ์ ์œผ๋กœ, ์ด ๊ฐ•์˜ ๋…ธํŠธ๋Š” DispatcherServlet ๊ธฐ๋ฐ˜ MVC ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ•ต์‹ฌ์ ์ธ ๋™์ž‘ ๋ฐฉ์‹์„ ์•„์ฃผ ์ž˜ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์–ด.

  1. ์„œ๋ฒ„ ์‹œ์ž‘ ์‹œ (HandlerMappingListener): ์š”์ฒญ ํ‚ค์™€ Controller ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋งคํ•‘ํ•ด์„œ Application ์˜์—ญ์— ์ €์žฅํ•ด ๋‘”๋‹ค.
  2. ์š”์ฒญ ์ฒ˜๋ฆฌ ์‹œ (DispatcherServlet): ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด ์š”์ฒญ ํ‚ค๋ฅผ ์ด์šฉํ•ด์„œ ๋ฏธ๋ฆฌ ๋งคํ•‘ํ•ด๋‘” Controller๋ฅผ ์ฐพ์•„์„œ ์‹ค์ œ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์„œ ์‘๋‹ต์„ ์ƒ์„ฑํ•œ๋‹ค.

์ด ๊ณผ์ •์„ ํ†ตํ•ด ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ค‘์•™์—์„œ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ๊ฐ ์š”์ฒญ์— ๋งž๋Š” Controller์—๊ฒŒ ์ฑ…์ž„์„ ๋ถ„๋‹ดํ•˜๋Š” ๊น”๋”ํ•œ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์•ผ.

profile
@mgkick

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