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

[Spring] Spring MVC

by young-ji 2023. 2. 18.

โ€ป Spring MVC ๋ฐœํ‘œ ์ž๋ฃŒ์ž…๋‹ˆ๋‹ค! 

 

Spring MVC ๋ž€?

ChatGPT - ํ•œ์ค„๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์„๊นŒ ์‹ถ์–ด GPT์—๊ฒŒ ๋ฌผ์–ด๋ดค์Šต๋‹ˆ๋‹คใ…Ž

 

Spring ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘์— ์›น ๊ณ„์ธต์„ ๋‹ด๋‹นํ•˜๋Š” ๋ชจ๋“ˆ ์ค‘ ํ•˜๋‚˜๋กœ ์ •์‹ ๋ช…์นญ์€ Spring Web MVC ์ž…๋‹ˆ๋‹ค.

๐Ÿ’ก Spring MVC๋Š” Servlet API์œ„์—์„œ ๋™์ž‘ํ•˜๋ฉฐ Model, View, Controller ์„ธ๊ฐ€์ง€ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•ด ํด๋ผ์ด์–ธํŠธ์˜ ๋‹ค์–‘ํ•œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‹จ์ˆœ ํ…์ŠคํŠธ ํ˜•์‹๋ถ€ํ„ฐ REST ํ˜•์‹, View ํ˜•์‹์˜ ์‘๋‹ต์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ตฌ์„ฑ๋œ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

 

 

Spring MVC๊ฐ€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœ์ž๋ฅผ ํŽธํ•˜๊ฒŒ ํ•ด์คฌ๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ๊ณผ ๋™์ž‘ ๋ฐฉ์‹์„ ์ค‘์‹ฌ์œผ๋กœ ๋ฐœํ‘œ๋ฅผ ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

 
Spring MVC๊ฐ€ ์žˆ๊ธฐ ์ „์—๋Š” HTML ์ฝ”๋“œ์— JAVA ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด ๋™์  ์›น ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” JSP์™€ ์„œ๋ธ”๋ฆฟ๋งŒ์„ ์ด์šฉํ•˜์—ฌ ์›น์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ–ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
 
 
 

ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ๋ฐ”๋กœ JSP ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ ์ธ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. HTML์ฝ”๋“œ์™€ Java ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•˜๊ฒŒ ์–ฝํ˜€์žˆ์–ด ์–ผํ•๋ด๋„ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๊ต‰์žฅํžˆ ํž˜๋“ค์–ด ๋ณด์ด๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

→ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ์ฝ”๋“œ์™€ ๊ฐ™์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด JSP์— ๋…ธ์ถœ๋˜๋ฉฐ ๋ทฐ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์—ญํ• ์„ ๊ฐ€์ง€๊ฒŒ๋œ๋‹ค.

→ ๋ณ€๊ฒฝ ์ฃผ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ์š”์†Œ (๋ทฐ + ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง)๊ฐ€ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์–ด ํ™”๋ฉด์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋„ ์ˆ˜์ •ํ•ด์•ผํ•˜๋Š” ๋ณ€๊ฒฝ์— ์ทจ์•ฝํ•œ ํ˜•ํƒœ๊ฐ€ ๋œ๋‹ค.

 

 

1. MVC ํŒจํ„ด ์ ์šฉ

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ์œ„ํ•ด ์ถ”๊ฐ€๋œ ๊ฐœ๋…์ด MVC ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

 

์ถœ์ฒ˜ : ๊น€์˜ํ•œ spring web mvc ๊ฐ•์˜

 

MVC๋Š” Model-View-Controller์˜ ์•ฝ์ž๋กœ, ํ•ฉ์ณ์ ธ ์žˆ๋˜ ๋ทฐ ๋กœ์ง๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์„ธ๊ฐ€์ง€ ๋ ˆ์ด์–ด๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

 

ํด๋ผ์ด์–ธํŠธ์˜ ํ˜ธ์ถœ์ด Controller๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜ค๋ฉด ๊ทธ์— ๋Œ€ํ•œ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Model์— ๋‹ด์•„์„œ View๋กœ์ง์œผ๋กœ ์ „๋‹ฌํ•ด์ค๋‹ˆ๋‹ค.

 

์•„๋ž˜ ์ฝ”๋“œ๊ฐ€ Servlet์„ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„ํ•œ Controller ๋ ˆ์ด์–ด๋กœ model ์—ญํ• ์„ ํ•ด์ค„ servletRequest์— ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„ view๋กœ ์ „๋‹ฌํ•ด์ฃผ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

RequestDispatcher์€ forward๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ธ์ž๋กœ ๋ฐ›์€ viewPath ๊ฒฝ๋กœ์˜ jspํŒŒ์ผ๋กœ request์™€ response๋ฅผ ์˜ฎ๊ธฐ๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Controller

 

์ดํ›„ View์—์„œ๋Š” ์ „๋‹ฌ๋ฐ›์€ Model์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™”๋ฉด์„ ๋ Œ๋”๋งํ•œํ›„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•ด์ฃผ๋Š” ํ˜•ํƒœ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

View

โœ… ์ด๋ ‡๊ฒŒ MVC ํŒจํ„ด์œผ๋กœ ๋ ˆ์ด์–ด๋ฅผ ๋‚˜๋ˆˆ ๋•๋ถ„์— ๋น„์ฆˆ๋‹ˆ์Šค ์ฒ˜๋ฆฌ ๋กœ์ง๊ณผ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•˜๊ฒŒ๋˜๋ฉด ๊ฐ์ž๊ฐ€ ๋งก์€ ์ผ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋Š์Šจํ•œ ๊ฒฐํ•ฉ์œผ๋กœ ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ, ๊ทธ๋ฆฌ๊ณ  ์œ ์ง€๋ณด์ˆ˜์˜ ํŽธ๋ฆฌ์„ฑ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

2. Front Controller ํŒจํ„ด ๋“ฑ์žฅ

ํ•˜์ง€๋งŒ ์œ„์˜ ์ฝ”๋“œ์—๋„ ์•„์‰ฌ์šด ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Controller์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ณด๋ฉด ๋ฐ•์Šค ์นœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ถ€๋ถ„์„ ์ œ์™ธํ•˜๊ณ  ์„œ๋ธ”๋ฆฟ์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ช…์‹œํ•ด์•ผํ•˜๋Š” ์ฝ”๋“œ๋“ค์ด ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

Boilderplate ์ฝ”๋“œ๋“ค (์„œ๋ธ”๋ฆฟ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ถœ๋˜๋Š” ์ฝ”๋“œ๋“ค)

  • ํฌ์›Œ๋“œ ๊ด€๋ จ ์ฝ”๋“œ
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);

 

  • ViewPath( prefix, seffix ) ์ฝ”๋“œ
String viewPath = "/WEB-INF/views/new-form.jsp";
// prefix : /WEB-INF/views/
// seffix : .jsp

 

  • ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ํ˜ธ์ถœ
HttpServletRequest request, HttpServletResponse response

๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ ๋งˆ๋‹ค ํ•ด๋‹น ์ฝ”๋“œ๋“ค์ด ์กด์žฌํ•œ๋‹ค๋ฉด ๋ถˆํ•„์š”ํ•œ ์ค‘๋ณต ์ฝ”๋“œ๋“ค์ด ๋Š˜์–ด๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

์ด ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•˜๊ณ ์ž ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ(Front Controller) ํŒจํ„ด์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ์ „์— ๋จผ์ € ํ˜ธ์ถœ๋˜์–ด ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ์œ„ํ•œ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋‘๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ์กด ๊ตฌ์„ฑ
ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ

URL๋งˆ๋‹ค ์„œ๋ธ”๋ฆฟ์„ ์ƒ์„ฑ๋˜์—ˆ๋˜ ๊ธฐ์กด์˜ ๊ตฌ์„ฑ์—์„œ ํ•˜๋‚˜์˜ ์„œ๋ธ”๋ฆฟ์ด ๋ชจ๋“  ์š”์ฒญ์„ ๋ฐ›๊ณ  ํ•„์š”ํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•ด ์ฃผ๋Š” ๊ตฌ์„ฑ์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋ฉฐ ๋‚˜๋จธ์ง€ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์„œ๋ธ”๋ฆฟ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ ์ž๋ฐ” ์ฝ”๋“œ๋กœ๋งŒ ๊ตฌ์„ฑ๋œ ๊ฐ์ฒด(POJO)๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

→ ๋•๋ถ„์— WAS์™€ ์„œ๋ธ”๋ฆฟ๊ณผ์˜ ๊ฒฐํ•ฉ๋ ฅ์„ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์–ด์กŒ์ง€๋งŒ Spring ํ”„๋ ˆ์ž„์›Œํฌ์™€์˜ ๊ฒฐํ•ฉ๋ ฅ์ด ๋†’์•„์ง€๊ฒ ์ฃ 

 

 

โœ… Spring MVC์—์„œ ์ด ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ•ต์‹ฌ์ธ Dispatcher Servlet์ž…๋‹ˆ๋‹ค.

 

Dispatcher Servlet์ด ๋‹จ์ˆœํžˆ ์ค‘๊ฐ„ ๋งค๊ฐœ ์—ญํ• ๋งŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋„๋ก ๊ฐ€๊ณตํ•˜๊ณ  ๊ณตํ†ต์„ ๋กœ์ง๋“ค์„ ์ฒ˜๋ฆฌํ•ด์ฃผ์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์„ ๋•Œ ์š”์ฒญ์„ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๋„ ํ”„๋ŸฐํŠธ ์ปจํŠธ๋กค๋Ÿฌ์ธ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด ๋‹ด๋‹นํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

๊ทธ๋ ‡๋‹ค๋ฉด Dispatcher Servlet์€ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด๋‘” ์ปจํŠธ๋กค๋Ÿฌ ์ค‘ ์–ด๋–ป๊ฒŒ ์ ํ•ฉํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ์•„ ์œ„์ž„ํ•ด ์ฃผ๋Š” ๊ฒƒ์ผ๊นŒ์š”? Dispatcher Servlet์— ๋™์ž‘์— ๋Œ€ํ•ด ์ข€ ๋” ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

Dispatcher Servlet

์„œ๋ธ”๋ฆฟ์„ ์ƒ์†๋ฐ›์€ ๊ตฌํ˜„์ฒด์ด๋ฉฐ ๋ชจ๋“  URL ํŒจํ„ด์— ๋งคํ•‘๋˜์–ด (urlPatterns=”/”), HTTP ํ”„๋กœํ† ์ฝœ๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ œ์ผ ๋จผ์ € ๋ฐ›์•„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์š”์ฒญ(Request)์„ ๋ฐ›์œผ๋ฉด ํ•„์š”ํ•œ ๊ณตํ†ต ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ํ›„, ์•Œ๋งž๋Š” Handler๋กœ ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„(Dispatch) ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ Http Responseํ˜•ํƒœ๋กœ ๋งŒ๋“œ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ Handler๋Š” ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ตฌํ˜„ํ•œ ๊ฐ๊ฐ์˜ controller ๋ฉ”์†Œ๋“œ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

 

 

์š”์ฒญ์— ์ ํ•ฉํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด Handler MappingHandler AdapterView Resolver ์ธํ„ฐํŽ˜์ด์Šค ์ „๋žต์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ๊ตฌํ˜„์ฒด๋Š” Spring Configuration๋ฅผ ํ†ตํ•ด ๋นˆ์œผ๋กœ ๊ฒƒ์„ ๋ฐ›์•„ ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • Handler Mapping : ํ•ธ๋“ค๋Ÿฌ๋“ค์˜ ๋งคํ•‘ ์ •๋ณด ์ €์žฅ
  • Handler Adapter : ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜
  • View Resolver : ์š”์ฒญ์— ์ ํ•ฉํ•œ View๋กœ ๋ Œ๋”๋ง

 

๊ฐ๊ฐ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋“ค์ด ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋Š” DispatcherServlet์˜ ์ฃผ์š”๋ฉ”์†Œ๋“œ์ธ doDispatch์˜ ์ผ๋ถ€ ์ž…๋‹ˆ๋‹ค.

 

ํด๋ผ์ด์–ธํŠธ๋กœ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด DispatcherServlet์ด ์ ‘์ˆ˜ํ•œ๋’ค ์š”์ฒญ์„ ์œ„์ž„ํ•˜๊ธฐ ์œ„ํ•ด doDispatch ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

1.  getHandler๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ handleMapping๋“ค ์ค‘ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ• (request์˜ URL๊ณผ ๋งค์นญ๋˜๋Š”) handler๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๊บผ๋‚ด์˜ต๋‹ˆ๋‹ค.

: ์ด๋•Œ handleMapping์€ ์ปจํŠธ๋กค๋Ÿฌ ๋นˆ์„ ํŒŒ์‹ฑํ•˜์—ฌ hash map์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

2. ์ ์ ˆํ•œ handler๋ฅผ ์ฐพ์œผ๋ฉด ๊ทธ์— ๋งž๋Š” HandlerAdapter๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ์š”์ฒญ์„ ์œ„์ž„ํ•  ์–ด๋Žํ„ฐ๋ฅผ ๊บผ๋‚ด์˜ต๋‹ˆ๋‹ค.

 

3. HandlerAdapter๊ฐ€ handler์—๊ฒŒ ์š”์ฒญ์„ ์œ„์ž„ํ•˜๊ณ  ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

: ์ด๋•Œ ์š”์ฒญ์˜ ๊ฒฐ๊ณผ๋กœ ModelAndView(model ๊ณผ view๊ฐ€ wrapping๋œ ๊ฐ์ฒด)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด๋Š” ์ ์ ˆํ•œ viewResolver์— ์˜ํ•ด model์ด ๋ Œ๋”๋ง ๋œ view๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ตํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

@Controller๋ฉด ModelAndView๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  @RestController๋ฉด null์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋จ์œผ๋กœ View๊ฐ€ ๋ Œ๋”๋ง๋˜๋Š” ๊ณผ์ •์€ ์ƒ๋žตํ•˜๊ณ  ๋ฐ˜ํ™˜๋œ ResponseEntity๋ฅผ HttpEntityMethodProcessor๊ฐ€ MessageConverter๋ฅผ ์‚ฌ์šฉํ•ด ์‘๋‹ต ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•œ ํ›„ ์‘๋‹ตํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

 

โ—๏ธ ์ธํ„ฐํŽ˜์ด์Šค ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์ปจํŠธ๋กค๋Ÿฌ ๊ตฌํ˜„๋ฐฉ์‹์ด ๋‹ค์–‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์Šคํ”„๋ง์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‹ค์–‘ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜์˜€๊ณ  ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด์„ ์ ์šฉํ•ด ๋‘์—ˆ๊ธฐ๋•Œ๋ฌธ ๊ตฌํ˜„๋ฐฉ์‹์— ์ƒ๊ด€์—†์ด ์š”์ฒญ์— ์œ„์ž„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ฆ‰, DispatcherServlet ์ฝ”๋“œ ๋ณ€๊ฒฝ ์—†์ด ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

handleMapping ๊ตฌํ˜„์ฒด

BeanNameUrlHandlerMapping // ๋นˆ ์ด๋ฆ„์ด URL๊ณผ ๋™์ผํ•œ ํ•ธ๋“ค๋Ÿฌ ์ฐพ๊ธฐ @Component(”/v1/post”)

ControllerBeanNameHandlerMapping // ๋นˆ ์ด๋ฆ„์ด URL ์ด๋ฆ„๊ณผ ๋™์ผํ•œ ํ•ธ๋“ค๋Ÿฌ ์ฐพ๊ธฐ 

SimpleUrlHandlerMapping // ํ”„๋กœํผํ‹ฐ์— ๋“ฑ๋ก๋œ ๋งคํ•‘์ •๋ณด์—์„œ ํ•ธ๋“ค๋Ÿฌ ์ฐพ๊ธฐ

RequestMappingHandlerMapping // @RequestMapping ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ํ•ธ๋“ค๋Ÿฌ ์ฐพ๊ธฐ @Controller

HandlerAdapter ๊ตฌํ˜„์ฒด

RequestMappingHandlerAdapter // @RequestMapping ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉ

HttpRequestHandlerAdapter // HttpRequestHandler ์ธํ„ฐํŽ˜์ด์Šค ์ฒ˜๋ฆฌ

SimpleControllerHandlerAdapter // controller ์–ด๋…ธํ…Œ์ด์…˜ ์ฒ˜๋ฆฌ

 

handle๋Š” ์—ฌ๋Ÿฌ ๊ตฌํ˜„์ฒด๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ์ด์ƒ์ ์ด์ง€๋งŒ 2๊ฐœ ์ด์ƒ์˜ ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘์ด ๋“ฑ๋ก ๋˜์—ˆ URL์ด ์ค‘๋ณต ๋งค์น˜๋  ๊ฒฝ์šฐ order ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์ˆœ์„œ๋Œ€๋กœ ๊ตฌํ˜„์ฒด ์ „๋žต์— ๋”ฐ๋ผ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ตฌํ˜„์ฒด์˜ order ์ถœ๋ ฅ์ฐฝ - ์ถœ์ฒ˜ :  https://bellog.tistory.com/m/219

 

order์ด ๊ฐ€์žฅ ์ž‘์€ RequestMapping ๊ตฌํ˜„์ฒด๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ–๊ฒŒ๋˜๋ฉฐ ํ•ด๋‹น ๋ฐฉ์‹์ด ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜์—ฌ ๋นˆ์„ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

 ์ œ๊ณต๋˜๋Š” ๊ฒƒ ์™ธ์—๋„ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๊ตฌํ˜„ํ•ด์„œ DispatcherServlet์— ๋“ฑ๋กํ•˜๋ฉด ๋‚˜๋งŒ์˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ฑฐ์˜ ์—†๋Š” ์ƒํ™ฉ์ด๋ฉฐ ๋Œ€๋ถ€๋ถ„ ํŽธ๋ฆฌํ•œ ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

 

๋™์ž‘ ํ๋ฆ„์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋„์‹ํ™” ํ•ด๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”. ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์€ ๊ธธ์žก์ด๋ฅผ ํ•ด์ฃผ๋ฉฐ ๋ชจ๋“  ์—ญํ• ์„ ์œ„์ž„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

โœ… DispatcherServlet ์š”์•ฝ

 ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์–ด๋– ํ•œ ์š”์ฒญ์ด ์˜ค๋ฉด Tomcat๊ณผ ๊ฐ™์€ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์š”์ฒญ์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋ชจ๋“  ์š”์ฒญ์„ ๋จผ์ € ํ”„๋ŸฐํŠธ ์ปจํŠธ๋กค๋Ÿฌ์ธ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด ๋ฐ›๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์€ ๊ณตํ†ต์ ์ธ ์ž‘์—…์„ ๋จผ์ € ์ฒ˜๋ฆฌํ•œ ํ›„์— ํ•ด๋‹น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์„ธ๋ถ€ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ getBean()์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ณ , ์ •ํ•ด์ง„ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ ์ž‘์—…์„ ์œ„์ž„ํ•œ๋‹ค.

์•ž์„œ ์„ค๋ช…๋“ค์ธ ๋™์ž‘์ด ๋งค์šฐ ๋ณต์žกํ•ด๋ณด์ด์ง€๋งŒ Spring MVC๊ฐ€ ์—ญํ• ์„ ์ž˜ ๋ถ„๋ฆฌํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๊ทœ๊ฒฉํ™”ํ•ด ๋†“์•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์—ฐํ•˜๊ณ  ํ™•์ •์„ฑ ์žˆ๊ฒŒ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๊ฐœ๋ฐœ์ž๋Š” ์›น์„œ๋น„์Šค๋ฅผ ์œ„ํ•ด ํ•ธ๋“ค๋Ÿฌ(์š”์ฒญ ์ฒ˜๋ฆฌ ๋กœ์ง)๋งŒ ์‹ ๊ฒฝ์“ฐ๋ฉด ๋˜๊ฒŒ ๋œ๊ฒƒ์ž…๋‹ˆ๋‹ค! ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋„์ž…๋ผ์„œ ์ •๋ง ๋‹คํ–‰์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋‹ค์‹œ ํ•œ๋ฒˆ ํ•˜๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.๐Ÿ™ƒ

 

 

 

 

Ref.

https://www.youtube.com/watch?v=9Tmzt6Q9WI8&ab_channel=๋‰ด๋ ‰์ฒ˜

https://bellog.tistory.com/m/219

[๊น€์˜ํ•œ] Spring MVC Part1


๊ทธ ์™ธ

  • ์„œ๋ธ”๋ฆฟ : WAS์•ˆ์— ์š”์ฒญ์˜ ์˜๋ฏธ์žˆ๋Š” ๋กœ์ง์„ ์ถ”์ถœํ•ด์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ
    • WAS์•ˆ์— ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žˆ๊ณ  ์„œ๋ธ”๋ฆฟ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
    • ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋™์‹œ ์š”์ฒญ์— ๋Œ€ํ•œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค.
    • ์„œ๋ธ”๋ฆฟ์€ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. → ๊ณ ๊ฐ์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ๊ณ„์† ์ƒ์„ฑ, ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ . (Request์™€ Response๋Š” ๊ฐ์ฒด๋Š” ๊ณ„์† ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด ๋งž์Œ)
  • MVC ๊ตฌ์„ฑ
    • Model : ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ๊ฐ„
    • View : ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ‘œํ˜„๋˜๋Š” ๊ตฌ๊ฐ„. ๋ชจ๋ธ๋กœ ๋ถ€ํ„ฐ ์ „๋‹ฌ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๊ธฐ๋งŒ ํ• ๋ฟ ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ๋„˜์–ด์™”๋Š”์ง€๋Š” ๊ด€์‹ฌ์„ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค.
    • Controller : Model๊ณผ View๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ตฌ๊ฐ„. View๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด Controller๊ฐ€ ํ•ด๋‹น ์š”์ฒญ์„ Modelํ•œํ…Œ ์•Œ๋ ค ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
  • MVC ํŒจํ„ด์˜ ๋‹จ์ 
    • → ์‹œ์Šคํ…œ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก model๊ณผ view์˜ ์˜์กด๋„๊ฐ€ ๋†’์•„์ ธ์„œ ๊ด€๊ฐ€ ํž˜๋“ค์–ด์ง€๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•œ MVP, MVVM ๊ฐ™์€ ๋””์ž์ธ ํŒจํ„ด๋„ ์กด์žฌ
  • spring ์ปจํ…Œ์ด๋„ˆ
  • DispatcherServlet ์ƒ์„ฑ ์‹œ์  : ํ•˜๋‚˜์˜ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ํ†ฐ์บฃ์ด ์‹คํ–‰๋˜ ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์‹œ์ ์— ์˜ต์…˜์— ๋”ฐ๋ผ lazy load ํ˜น์€ pre loading ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.
  • DispatcherServlet ์‹ฑ๊ธ€ํ†ค

 

 

 

์ž˜๋ชป๋œ ์ •๋ณด๊ฐ€ ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€์„ ํ†ตํ•ด ์•Œ๋ ค์ฃผ์„ธ์š”. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. 

๋Œ“๊ธ€