๐Ÿฃ Spring/Spring ๊ธฐ๋ณธ

[Spring] Dispatcher-Servlet์˜ ๋™์ž‘ ๊ณผ์ •์„ ์•Œ์•„๋ณด์ž.

TIlearn 2024. 2. 5. 17:56

Dispatcher - Servlet์ด๋ž€?

 

 

 

Dispatcher Servlet์— ์•ž์„œ, _Servlet_์ด๋ž€ ์ž๋ฐ”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ํŽ˜์ด์ง€๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์„œ๋ฒ„ ์ธก ํ”„๋กœ๊ทธ๋žจ ํ˜น์€ ๊ทธ ์‚ฌ์–‘์„ ๋œปํ•œ๋‹ค. ์ž๋ฐ”์˜ Servlet์€ ์›น ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ๊ฐ„๋‹จํ•˜๊ฒŒ ์ƒ๊ฐํ•˜์ž๋ฉด ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ ์ด๋‹ค.

 

 

_Dispatcher-Servlet_๋˜ํ•œ _Servlet_์˜ ์ผ์ข…์œผ๋กœ ๊ทธ ์—ญํ• ์„ ์‚ดํŽด๋ณด์ž๋ฉด Dispatcher์˜ ์˜๋ฏธ๋ฅผ ์ฐพ์•„๋ณด๋ฉด ๋œ๋‹ค. ์ด๋Š” "๊ธ‰ํŒŒ์ž"๋ผ๋Š” ๋œป์œผ๋กœ ๊ฐ€์žฅ ๋จผ์ € ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•  ํ•จ์ˆ˜์ธ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ •ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ๊ฐ€์ง„๋‹ค.

 

 

์ฆ‰, _Dispatcher-Servlet_์€ HTTP ํ”„๋กœํ† ์ฝœ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ๊ฐ€์žฅ ๋จผ์ € ๋ฐ›์•„์„œ ์ ํ•ฉํ•œ ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ์œ„์ž„ํ•ด์ฃผ๋Š” ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ์ด๋‹ค. ์ •ํ™•ํžˆ๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก์œผ๋กœ ๋ถ€ํ„ฐ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ๊ฐ€์žฅ ๋จผ์ € Tomcat๊ณผ ๊ฐ™์€ _Servlet Container_์—๊ฒŒ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๊ณ , ์ด๋Ÿฌํ•œ ์š”์ฒญ์„ Dispatcher-Servlet์ด ๊ฐ€์žฅ ๋จผ์ € ๋ฐ›๊ฒŒ๋œ๋‹ค. 

 

 

Dispatcher - Servlet์€ ๋ชจ๋“  ์š”์ฒญ์„ ํ•ธ๋“ค๋งํ•ด์ฃผ๋ฉด์„œ ๊ณตํ†ต์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์ค€๋‹ค๋Š” ์ ์— ์žˆ์–ด ๋งค์šฐ ํŽธ๋ฆฌํ•˜๋‹ค. ํ•˜์ง€๋งŒ, ์ด๋ฏธ์ง€๋‚˜ HTML/CSS/JS์™€ ๊ฐ™์€ ์ •์ ํŒŒ์ผ์— ๋Œ€ํ•œ ์š”์ฒญ ๋˜ํ•œ ๋ชจ๋‘ ๊ฐ€๋กœ์ฑ„๋Š” ๋ฐ”๋žŒ์— ์ •์ ์ž์›์„ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

 

 

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฒซ ๋ฒˆ์งธ๋Š” URL๋กœ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, /apps๋กœ ์ ‘๊ทผํ•˜๋ฉด dispatcher servlet์ด ๋‹ด๋‹นํ•˜๋„๋ก ํ•˜๊ณ , /resources๋กœ ์ ‘๊ทผํ•˜๋ฉด dispatcher servlet์ด ๋‹ด๋‹นํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

 

 

ํ•˜์ง€๋งŒ, ์ฝ”๋“œ๊ฐ€ ๋”๋Ÿฌ์›Œ์ง€๊ณ  ์ง๊ด€์ ์ด์ง€ ๋ชปํ•˜๋‹ค๋Š” ๋‹จ์ ๋•Œ๋ฌธ์— ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ์š”์ฒญ์— ๋Œ€ํ•ด์„œ๋Š” ์ „๋ถ€ Resource ๊ฒฝ๋กœ๋กœ ํƒ์ƒ‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋งŒ๋“ ๋‹ค๋ฉด, ํ™•์žฅ์— ์šฉ์ดํ•  ๋ฟ๋งŒ์ด ์•„๋‹ˆ๋ผ ๊ด€๋ฆฌ๋„ ํŽธํ•ด์ง„๋‹ค.

 

 

 

Dispatcher Servlet์€ ๋‚ด๋ถ€์ ์œผ๋กœ HttpServlet์„ ์ƒ์† ๋ฐ›๊ณ  ์žˆ๋‹ค.
(์ •ํ™•ํžˆ๋Š” DispatcherServlet -> FrameworkServlet -> HttpServletBean -> HttpServlet ์ƒ์† ๊ตฌ์กฐ์ด๋‹ค.)

๐Ÿ”ถ HttpServlet

Http ์„œ๋ธ”๋ฆฟ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ J2EE ์ŠคํŽ™์˜ ์ถ”์ƒ ํด๋ž˜์Šค์ด๋‹ค. ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ํŠน์ • HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” doX ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•ด์•ผ ํ•œ๋‹ค.


๐Ÿ”ถ HttpServletBean

HttpServlet์„ Spring์ด ๊ตฌํ˜„ํ•œ ์ถ”์ƒ ํด๋ž˜์Šค์ด๋‹ค. 


๐Ÿ”ถ FrameworkServlet

Spring ์›น ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ์„œ๋ธ”๋ฆฟ์ด๋‹ค. HttpServlet์˜ doX ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•˜๊ณ  ์žˆ๋‹ค.(์ด๋•Œ, PATCH์š”์ฒญ์€ ๋”ฐ๋กœ ์ฒ˜๋ฆฌ) ๊ฐ doX ๋ฉ”์„œ๋“œ๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ์ธ processRequest๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

processRequest์˜ ์‹ค์ œ ์š”์ฒญ ํ•ธ๋“ค๋ง์€ ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด์ด ์ ์šฉ๋˜์—ˆ๊ธฐ์— doService๋กœ ์œ„์ž„๋œ๋‹ค.


๐Ÿ”ถ DispatcherServlet

์‹ค์ œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” doService๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์€ Servlet WebApplicationContext๋ฅผ ์ƒ์„ฑํ•˜๊ณ , Root WebApplicationContext๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์—ฌ๊ธฐ์•ˆ์— Controller, ViewResolver, HandlerMapping๋“ฑ์ด ์žˆ๋‹ค.

Root WebApplicationContext๋ฅผ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ, Infra Bean์ด ์ƒ์„ฑ๋˜๋Š” ๋ฐ Repository๋‚˜ Service๊ฐ€ ์ด์— ํ•ด๋‹น๋œ๋‹ค.

 

 

 

Dispatcher - Servlet์˜ ๋™์ž‘ ๊ณผ์ •

 

 

1๏ธโƒฃ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด ๋ฐ›๋Š”๋‹ค.

 

ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ์ธ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด ๊ฐ€์žฅ ๋จผ์ € ์š”์ฒญ์„ ๋ฐ›๋Š”๋‹ค. 

 

 

 

 

 

2๏ธโƒฃ ์š”์ฒญ ์ •๋ณด๋ฅผ ํ†ตํ•ด์„œ ์š”์ฒญ์„ ์œ„์ž„ํ•  ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ๋Š”๋‹ค.

 

์ด ๋‹จ๊ณ„ ๋ถ€ํ„ฐ ์•„๋ž˜ ๊ทธ๋ฆผ์˜ _doService_ ๋ฉ”์„œ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค. _DispatcherServlet_์€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ ์ž‘์—…์„ ์œ„์ž„ํ•˜๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ์œ„์ž„๋ฐ›๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ŠคํŽ˜์…œ ๋นˆ(Special Bean)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

l

 

 

๊ทธ ์ค‘์—์„œ๋„ _HandlerMapping_์ด๋ผ๋Š” ์ŠคํŽ˜์…œ ๋นˆ์„ ํ†ตํ•ด์„œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

 

_DispatcherServlet_์—์„œ ์œ„์ž„ํ•˜๋Š” ์ŠคํŽ˜์…œ ๋นˆ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

1. _HandlerMapping_ : ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ๋Š”๋‹ค.
2. _HandlerAdapter_ : ์š”์ฒญ์„ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ „๋‹ฌํ•œ๋‹ค.
3. _handlerExceptionResolver_ : ์š”์ฒญ์— ๋Œ€ํ•œ ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ์ฒ˜๋ฆฌํ•œ๋‹ค.
4. _viewResolver_ : ๋ฆฌํ„ด ๊ฐ’์— ๋Œ€ํ•œ ๋ทฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋•Œ, String์œผ๋กœ ๋ทฐ ์ด๋ฆ„์„ ๋ฐ›๋Š”๋‹ค๋ฉด modelAndView์™€ ๊ฐ™์€ ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
5. _LocalResolver_ : Local์„ ๊ฒฐ์ •ํ•˜๋Š”๋ฐ, ์ด๋Š” ์œ ์ €์˜ ์–ธ์–ด๋‚˜ ์ง€์—ญ์ด๋‚˜ ์ถœ๋ ฅํ˜•์‹์„ ์ง€์ •ํ•˜๋Š” ๋ฌธ์ž์—ด์ด๋‹ค.
6. _MultipartResolver_ : ๋ฉ€ํ‹ฐ ํŒŒํŠธ ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋ฉ€ํ‹ฐ ํŒŒํŠธ๋ž€ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๋ฐ”๋””๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋‚˜๋ˆ„์–ด ๋ณด๋‚ผ ๋•Œ ํŒŒ์ผ ํ˜•์‹์„ ์˜๋ฏธํ•œ๋‹ค.

 

 

 

Spring boot ๊ฐœ๋ฐœ ์‹œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” _@Controller_ ๋ฐฉ์‹์€ _RequestMappingHandlerMapping_์ด ์ฒ˜๋ฆฌํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  HashMap์œผ๋กœ ์š”์ฒญ ์ •๋ณด์™€ ๊ทธ ๋Œ€์ƒ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๊ด€๋ฆฌ ๋Œ€์ƒ์€ _HandlerMethod_ ๊ฐ์ฒด๊ฐ€ ์˜ค๊ฒŒ ๋˜๋Š”๋ฐ ์ด ์•ˆ์—๋Š” ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋ฉ”์„œ๋“œ๊ฐ€ ๋“ค์–ด์žˆ๋‹ค. _HandlerMethod_๋Š” ๊ทธ ์ž์ฒด๋กœ ์ €์žฅ๋˜์ง€ ์•Š๊ณ  _HandlerExceptionChain_์œผ๋กœ ๊ฐ์‹ธ์„œ ๋ณด๊ด€๋œ๋‹ค. ๊ทธ ์ด์œ ๋Š” ์ „/ํ›„ "์ธํ„ฐ์…‰ํ„ฐ"๋ฅผ ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

 

 

 

 

3๏ธโƒฃ ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ฐพ์•„์„œ ์š”์ฒญ์„ ์œ„์ž„ํ•œ๋‹ค.

 

_DispatcherServlet_์€ ์•ž์„œ ์ปจํŠธ๋กค๋Ÿฌ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ €์žฅ๋œ _HandlerExceptionChain_์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹  _HandlerAdapter_๋ผ๋Š” ์–ด๋Œ‘ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ ์‹คํ–‰ํ•œ๋‹ค.

 

 

๊ตณ์ด ๋ฐ”๋กœ ์“ฐ์ง€ ์•Š๊ณ  ์ด๋ ‡๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•˜๋Š” ์ด์œ ๋Š” ํ˜„์žฌ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฒ•์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ํฌ๋งท์ด ๋‹ค๋ฅด๋”๋ผ๋„ _DispatcherServlet_์˜ ์ž…์žฅ์—์„œ๋Š” _HandlerAdapter_๋ฅผ ํ†ตํ•ด ์ž์‹ ์˜ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

 

 

_HandlerAdapter_๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ _getHandlerAdapter()_ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ์–ป์–ด์ง„ _HandlerAdapter_๋ฅผ ํ†ตํ•ด์„œ ์ด์ œ ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๊ฒƒ์ด๋‹ค.

 

 

_HandlerAdapter_๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์š”์ฒญ์„ ์œ„์ž„ํ•œ ์ „/ํ›„์— ๊ณตํ†ต์ ์œผ๋กœ ์ „/ํ›„์ฒ˜๋ฆฌ ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋Œ€ํ‘œ์ ์œผ๋กœ ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ํฌํ•จํ•˜์—ฌ _@RequestParam_๊ณผ _@RequestBody_๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” _ArgumentResolver_์™€ ์ง๋ ฌํ™” ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ _ReturnValueHandler_ ๋“ฑ์ด _HandlerAdapter_์—์„œ ์ฒ˜๋ฆฌ๋œ๋‹ค.

 

 

 

 

 

 

4๏ธโƒฃ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

์ปจํŠธ๋กค๋Ÿฌ๋Š” _Root WebApplicationContext_ ์†์˜ _Service_์™€ _Repository_๋“ฑ์„ ํ˜ธ์ถœํ•ด๊ฐ€๋ฉฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

 

 

 

 

5๏ธโƒฃ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฐ˜ํ™˜๊ฐ’์„ ๋‚ด๋†“๊ณ , _HandlerAdapter_๊ฐ€ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

_HandlerAdapter_๋Š” ๋ฐ˜ํ™˜๊ฐ’์„ ๋ฐ›์•„์„œ _Dispatcher Servlet_์œผ๋กœ ๋Œ๋ ค์ฃผ๋Š”๋ฐ, ์ด๋•Œ ๋ฐ˜ํ™˜ ํ˜•์‹์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํ–‰๋™์„ ํ•œ๋‹ค.

 

 

๋งŒ์•ฝ, ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ _ResponseEntity_๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด _MessageConverter_๋ฅผ ํ†ตํ•ด์„œ ์ง๋ ฌํ™” ์ดํ›„ ์‘๋‹ต ์ƒํƒœ๋ฅผ ์„ค์ •ํ•ด ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ด์ง€๋งŒ, ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ View์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด _ViewResolver_๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ด๋‹ค.

 

 

 

 

 

6๏ธโƒฃ ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

_DispatcherServlet_ ์„ ํ†ตํ•ด์„œ ๋ฐ˜ํ™˜๋˜๋Š” ์‘๋‹ต์€ ํ•„ํ„ฐ๋ฅผ ๊ฑฐ์น˜๊ณ  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ˜ํ™˜๋œ๋‹ค. ์‘๋‹ต์ด ๋งŒ์•ฝ ๋ฐ์ดํ„ฐ๋ผ๋ฉด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜๋  ๊ฒƒ์ด๊ณ , ํ™”๋ฉด์ด๋ผ๋ฉด _ViewResolver_๋ฅผ ํ†ตํ•ด ์ ์ ˆํ•˜๊ฒŒ ํ™”๋ฉด์„ ๋ณด์—ฌ์ค„ ๊ฒƒ์ด๋‹ค.

 

 

 

 

 

References