JiwonDev

# Spring MVC๋ฅผ ๋ฐฐ์šฐ๊ธฐ ์ „์—

by JiwonDev

Spring MVC๋Š” ์ž๋ฐ” ๋ฐฑ์—”๋“œ ์‹ค๋ฌด์— ํ•„์š”ํ•œ ๊ธฐ์ˆ ๋“ค์„ ๊ฑฐ์˜ ๋‹ค ์ œ๊ณตํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ๊ทธ๋งŒํผ ๋ฐฉ๋Œ€ํ•˜์ง€๋งŒ, ๋ฐ˜๋Œ€๋กœ ์ด ์ˆ˜๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์„ ๋’ท๋ฐ›์นจํ•˜๋Š” ์Šคํ”„๋ง MVC๊ฐ€ ๊ฐ€์ง„ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋Š” ํฐ ๋ณ€ํ™”๊ฐ€ ์—†๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ์Šคํ”„๋ง MVC์˜ ๋ผˆ๋Œ€์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๊ณ ์žํ•œ๋‹ค.

 

* ํ•ด๋‹น ๊ธ€์€ https://www.inflearn.com/course/์Šคํ”„๋ง-mvc-1 ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๋งŒ๋“  ์ •๋ฆฌ๊ธ€์ž…๋‹ˆ๋‹ค.

 

# ์˜›๋‚ ๋กœ ๋Œ์•„๊ฐ€์ž

์Šคํ”„๋งMVC๋Š” ์ƒ๋‹นํžˆ ์ถ”์ƒํ™”๋œ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. MVC ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์›น์„œ๋ฒ„์˜ ๋™์ž‘๊ณผ์ •๊ณผ ์ž๋ฐ”์˜ ์›น ๊ธฐ๋ฐ˜๊ธฐ์ˆ ์ธ ์„œ๋ธ”๋ฆฟ, JSP๋ฅผ ์•Œ๋ฉด ๋„์›€์ด ๋งŽ์ด ๋œ๋‹ค. ๊ฒฐ๊ตญ ์Šคํ”„๋ง๋„ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์ž๋ฐ”์˜ ์›น ๊ธฐ์ˆ ๋กœ ๋Œ์•„๊ฐ€๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋‹ˆ๊นŒ.

 

 

# ์ง€๊ธˆ์€ HTTP์˜ ์‹œ๋Œ€

๋„คํŠธ์›Œํฌ์—์„œ ํ†ต์‹ ์„ ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์ง€๋งŒ, ํ˜„๋Œ€์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์€ ์›น์„ ์œ„ํ•ด ์„ค๊ณ„๋œ HTTP์ด๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ์›น์—์„œ ์‚ฌ์šฉ๋˜๋Š” [HTML, ์ด๋ฏธ์ง€, ํŒŒ์ผ]๋ฟ๋งŒ ์•„๋‹ˆ๋ผ API(Json, XML)๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ํ•„์š”ํ•œ ๋ชจ๋“  ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ , ๋ฐ›์„ ์ˆ˜ ํ”„๋กœํ† ์ฝœ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค. 


@1. ์›น ์„œ๋ฒ„

ํ”ํžˆ ๋งํ•˜๋Š” ์›น ์„œ๋ฒ„๋ž€, HTTP ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜์—ฌ ์ •์  ๋ฆฌ์†Œ์Šค(HTML, CSS, ๋ฆฌ์†Œ์Šค)๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ์„œ๋ฒ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค.


 

@2. WAS (Web App Server)

์›น ์„œ๋ฒ„๋ฅผ ํฌํ•จํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด Java, Python ๊ฐ™์€ ์–ธ์–ด๋กœ ๋™์ ์ธ HTML์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ API๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ํ”„๋ก ํŠธ์—์„œ ๋™์ ์ธ ์ปจํ…์ธ ๋ฅผ ๋งŒ๋“ ๋‹ค. ์ตœ๊ทผ์—๋Š” ์›น์„œ๋ฒ„์™€ WAS๋ฅผ ๊ตฌ๋ถ„์ง“๊ธฐ์—๋Š” ์• ๋งคํ•˜๊ธด ํ•˜๋‹ค. WAS์ธ๋ฐ ์„œ๋ธ”๋ฆฟ ์—†์ด ์ž๋ฐ”์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋ ˆ์ž„์›Œํฌ๋„ ์žˆ๋‹ค. ์•„๋‹ˆ๋ฉด ์ •์ ์ธ ๋ฆฌ์†Œ์Šค๋ฅผ ์บ์‹œํ•˜์—ฌ ์ œ๊ณตํ•˜๋Š” CDN ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๊ณ  ์š”์ฆ˜์—” ์›น ์„œ๋ฒ„ ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  AWS EC2๊ฐ™์€ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค์— ์•ฑ์„ ๋“ฑ๋กํ•ด Server-lessํ•œ ๊ฐœ๋ฐœ์„ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ๋‹ค.

์ด ๊ธ€์—์„œ ๋งํ•˜๋Š” WAS๋Š” ์„œ๋ธ”๋ฆฟ(Servlet.class)์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค.


@3. ์›น ์‹œ์Šคํ…œ์˜ ๊ตฌ์„ฑ

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

์ด๋ ‡๊ฒŒํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ์ฃฝ์–ด๋„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ ์ ˆํ•œ ์˜ค๋ฅ˜ํ™”๋ฉด์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค.


@4. ์„œ๋ธ”๋ฆฟ(Servlet)

์ž๋ฐ”์˜ ์›น ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ์ด๋‹ค. ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋„ ์ถ”์ƒํ™” ๋˜์—ˆ์„ ๋ฟ ๊ทธ ๋‚ด๋ถ€์—๋Š” ์„œ๋ธ”๋ฆฟ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ์„œ๋ธ”๋ฆฟ์€ ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งค๋ฒˆ ํ•ด์•ผํ•˜๋Š” ์›น ๋ฐ˜๋ณต์ž‘์—…(TCP/IP์„ ์ด์šฉํ•œ ์†Œ์ผ“ ์—ฐ๊ฒฐ, HTTP ๋ฉ”์‹œ์ง€ ํŒŒ์‹ฑ, ์‘๋‹ต๋ฉ”์‹œ์ง€ ์ƒ์„ฑ..)์„ ๋Œ€์‹ ํ•ด์ฃผ๊ณ  ๊ฐœ๋ฐœ์ž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ฐ€์ง„ Servlet Class๋งŒ ๋งŒ๋“ค๋ฉด ๋˜๊ฒŒ ํ•ด์ฃผ๋Š” ์›น ๊ธฐ๋ฐ˜ ์ž๋ฐ” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.

์„œ๋ธ”๋ฆฟ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

 

#16 Servlet ์ดํ•ด

# ์›น ๊ฐœ๋ฐœ์˜ ๊ณผ์ • ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ์ƒํƒœ์—์„œ ์›น ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค๋Š” ๊ฑด, ์•„๋ž˜์˜ ๊ณผ์ •๋“ค์„ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•จ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋Š” ์–ด๋– ํ•œ ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋˜ ๊ณตํ†ต์ ์œผ๋กœ ๋ฐ˜๋ณต๋˜๋Š” ๊ณผ์ •์ด์—ˆ๋‹ค. # J

jiwondev.tistory.com


@5. SPA (Single Page App), CSR (Client Side Rendering)

์˜ˆ์ „์—๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋„ ์žˆ๊ณ , ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ(ex JavaSciprt)์˜ ๊ธฐ๋Šฅ์ด ๋งค์šฐ ๊พธ์กŒ๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ ์ธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋Š” ๊ฑด ์ƒ์ƒํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค. ํ•˜์ง€๋งŒ ๊ตฌ๊ธ€์˜ Chrome์˜ ๋“ฑ์žฅ์œผ๋กœ ํ‘œ์ค€์ด ๋งŒ๋“ค์–ด์ง€๊ธฐ ์‹œ์ž‘ํ•˜๋ฉฐ 2015๋…„ ES6 ์ดํ›„ JS์˜ ๊ธฐ๋Šฅ์ด ๊ฐ•๋ ฅํ•ด์ง€๋ฉฐ ์„œ๋ฒ„์—์„œ HTML์„ ๋งค๋ฒˆ ๋ณด๋‚ด์ฃผ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ API(Json)๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๊ธฐ์กด์˜ ํŽ˜์ด์ง€(HTML)๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ, ์ฆ‰ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ Œ๋”๋งํ•˜๋Š” SPA๊ฐ€ ํฅํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

๋‹ค๋งŒ ํด๋ผ์ด์–ธํŠธ๋Š” ํ”„๋ก ํŠธ์˜ ์˜์—ญ์ด๋ฏ€๋กœ, ์š”์ฆ˜์€ ์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š”๊ตฌ๋‚˜ ์•Œ์•„๋งŒ๋ณด๊ณ  ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜์ž.


@ ์ž๋ฐ” ์›น ๊ธฐ์ˆ ์˜ ์—ญ์‚ฌ

2006๋…„์—๋Š” SSH, ์Šคํ”„๋ง(Spring Core) + ์ŠคํŠธ๋Ÿฟ์ธ (MVC, Strutcs) + ํ•˜์ด๋ฒ„๋„ค์ดํŠธ(DB, Hibernate)๊ฐ€ ๋Œ€์„ธ์˜€๋‹ค๊ณ  ํ•œ๋‹ค. ๋‹น์‹œ์—๋Š” ์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” MVC๊ฐ€ ์ƒ๊ฐ๋ณด๋‹ค ๋ณ„๋กœ์˜€๋Š”๋ฐ ์ดํ›„ 2010๋…„์ฏค @์–ด๋…ธํ…Œ์ด์…˜๊ธฐ๋ฐ˜ ์„ค์ •์ด ๋“ฑ์žฅํ•˜๋ฉฐ Spring MVC๊ฐ€ ์ถ˜์ถ”์ „๊ตญ์‹œ๋Œ€์— ์ •์ ์„ ์ฐ๊ฒŒ๋œ๋‹ค. ์ดํ›„ 2014๋…„์— ์„œ๋ฒ„๋ฅผ ๋‚ด์žฅํ•œ ์Šคํ”„๋ง๋ถ€ํŠธ๊ฐ€ ๋‚˜์˜ค๊ณ , WAR๊ฐ€ ์•„๋‹Œ JAR๋กœ ์„œ๋ฒ„๊นŒ์ง€ ํ•จ๊ป˜ ํŒจํ‚ค์ง•ํ•˜์—ฌ ๋ฐฐํฌํ•˜๊ฒŒ ๋˜๋ฉฐ ์ž๋ฐ”์ง„ํ˜•์˜ ์Šคํ”„๋ง์˜ ์ž…์ง€๊ฐ€ ๋”์šฑ ๊ฒฌ๊ณ ํ•ด์ง€๊ฒŒ ๋˜์—ˆ๋‹ค.

 

์ด์ œ ์Šคํ”„๋งCore + ์Šคํ”„๋งMVC ํ”„๋ ˆ์ž„์›Œํฌ + ์Šคํ”„๋ง๋ถ€ํŠธ๋กœ ์ž๋ฐ” ๊ฐœ๋ฐœ์ž๋“ค์€ ๋„ˆ๋ฌด ํŽธํ•˜๊ฒŒ ์›น์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

JSP Model 2 ์ดํ›„, MVC ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ฃผ๊ตฌ์žฅ์ฐฝ ๋“ฑ์žฅํ•˜์˜€๋‹ค.

 


@ ์ž๋ฐ”์˜ MVC, ๋ทฐ ํ…œํ”Œ๋ฆฟ ์—ญ์‚ฌ

์Šคํ”„๋ง์—์„œ๋Š” ๋ณดํ†ต Thymeleaf๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์Šคํ”„๋ง ์ง„ํ˜•์—์„œ ๋ฐ€์–ด์ฃผ๊ณ  ์žˆ์–ด์„œ ์Šคํ”„๋ง๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•˜๋‹ค. 

์‚ฌ์‹ค View๊ฐ€ ์—„์ฒญ๋‚œ ์†๋„๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋Š” ์ž˜ ์—†๊ธดํ•˜๋‹ค. SPA๋ฐฉ์‹๋„ ์žˆ์œผ๋‹ˆ๊นŒ.

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ