๊ด€๋ฆฌ ๋ฉ”๋‰ด

Coding Planet

[์Šคํ”„๋ง ์ž…๋ฌธ] ์Šคํ”„๋ง ์›น ๊ฐœ๋ฐœ ๊ธฐ์ดˆ- ์ •์  ์ปจํ…์ธ , MVC2 ํŒจํ„ด๊ณผ ํ…œํ”Œ๋ฆฟ ์—”์ง„, API ๋ณธ๋ฌธ

๐ŸŒฑSPRING

[์Šคํ”„๋ง ์ž…๋ฌธ] ์Šคํ”„๋ง ์›น ๊ฐœ๋ฐœ ๊ธฐ์ดˆ- ์ •์  ์ปจํ…์ธ , MVC2 ํŒจํ„ด๊ณผ ํ…œํ”Œ๋ฆฟ ์—”์ง„, API

jhj.sharon 2023. 7. 28. 00:00
๋ฐ˜์‘ํ˜•

[ ์ •์  ์ปจํ…์ธ  ]

 

์Šคํ”„๋ง(Spring)์—์„œ ์ •์  ์ปจํ…์ธ (static content)๋ž€, ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋˜์ง€ ์•Š๊ณ  ๊ณ ์ •๋œ ํŒŒ์ผ๋กœ์„œ ์„œ๋ฒ„์—์„œ ๊ทธ๋Œ€๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ์›น ๋ฆฌ์†Œ์Šค๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ •์  ์ปจํ…์ธ ๋Š” ๋ณดํ†ต HTML, CSS, JavaScript, ์ด๋ฏธ์ง€ ํŒŒ์ผ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ •์  ์ปจํ…์ธ ๋Š” ์„œ๋ฒ„ ์ธก์—์„œ ๋”ฐ๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์›น ์„œ๋ฒ„(์˜ˆ: Apache, Nginx)๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์ œ๊ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ •์  ์ปจํ…์ธ ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์Šคํ”„๋ง์€ ๋‚ด์žฅ ์›น ์„œ๋ฒ„(์˜ˆ: Tomcat, Jetty)๋ฅผ ํ†ตํ•ด ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šคํ”„๋ง์—์„œ ์ •์  ์ปจํ…์ธ ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ •์  ๋ฆฌ์†Œ์Šค ๋””๋ ‰ํ† ๋ฆฌ์— ํ•ด๋‹น ํŒŒ์ผ๋“ค์„ ์ €์žฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์Šคํ”„๋ง ๋ถ€ํŠธ(Spring Boot)์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ `src/main/resources/static` ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ •์  ์ปจํ…์ธ ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— `index.html`, `style.css`, `logo.png`์™€ ๊ฐ™์€ ์ •์  ํŒŒ์ผ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. ์ด๋Ÿฌํ•œ ํŒŒ์ผ๋“ค์€ ์ •์  ์ปจํ…์ธ ๋กœ ๋ถ„๋ฅ˜๋˜๋ฉฐ, ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ •์  ๋ฆฌ์†Œ์Šค ๋””๋ ‰ํ† ๋ฆฌ์— ํ•ด๋‹น ํŒŒ์ผ๋“ค์„ ์œ„์น˜์‹œํ‚ค๋ฉด ์Šคํ”„๋ง์ด ์ž๋™์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ •์  ์ปจํ…์ธ ๋Š” ์ฃผ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ UI๋ฅผ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋™์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„œ๋ฒ„ ์ธก ๋กœ์ง์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

 

controller์— ์šฐ์„ ๊ถŒ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— hello-static ๊ด€๋ จ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋จผ์ € ์ฐพ๊ณ  ์—†๋Š” ๊ฒฝ์šฐ static์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

 

 

[  MVC2 ํŒจํ„ด๊ณผ ํ…œํ”Œ๋ฆฟ ์—”์ง„ ]

  • MVC(Mode-View-Controller) ํŒจํ„ด์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์กฐ๋ฅผ ์กฐ์งํ™”ํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Model, View, Controller ์„ธ ๊ฐ€์ง€ ์š”์†Œ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  •  ๋ชจ๋ธ(Model)์€ ๋ฐ์ดํ„ฐ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๊ณ , ๋ทฐ(View)๋Š” UI๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ปจํŠธ๋กค๋Ÿฌ(Controller)๋Š” ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ…œํ”Œ๋ฆฟ ์—”์ง„์€ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋„๊ตฌ๋กœ, ๋™์ ์ธ ์ปจํ…์ธ ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ…œํ”Œ๋ฆฟ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์‹ค์ œ HTML ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ์„œ๋ฒ„์—์„œ ํŽ˜์ด์ง€์˜ ๋žœ๋”๋ง์„ ์ผ๋ถ€ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • JSP, Thymeleaf, Freemarker, Velocity ๋“ฑ์ด ๋Œ€ํ‘œ์ ์ธ ํ…œํ”Œ๋ฆฟ ์—”์ง„์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

 

๐ŸŽˆ MVC(Model View Controller) ํŒจํ„ด

  • Model: ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ์—ญํ• , ํ˜น์€ DB์— ์ ‘๊ทผํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…์ถœ๋ ฅํ•˜๋Š” ๊ฐ์ฒด๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋™์ž‘ํ•˜๋Š”       ๋กœ์ง์„ ์˜๋ฏธํ•œ๋‹ค.
  • View: ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๊ฒŒ๋˜๋Š” ํ™”๋ฉด, ๋ฐ์ดํ„ฐ์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ๋‹ด๋‹นํ•œ๋‹ค.
  • Controller: ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์ฒ˜๋ฆฌ์™€ ํ๋ฆ„ ์ œ์–ด๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•œ ํ›„ ์‘๋‹ต ํ™”๋ฉด์„ ์ง€์ •ํ•œ๋‹ค.

 

์ •์ ์ปจํ…์ธ ์—์„œ๋Š” viewResolver์—†์ด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ–ˆ์ง€๋งŒ mvc, ํ…œํ”Œ๋ฆฟ ์—”์ง„์—์„œ๋Š” ์ถœ๋ ฅ ๋‚ด์šฉ์ด ๋™์ ์ด๊ธฐ ๋•Œ๋ฌธ์— vewResolver๋ฅผ ๊ฑฐ์นœ๋‹ค.

 

 

 

 

[ API(Application Programming Interface) ]

  • API๋Š” ๋‹ค๋ฅธ ์†Œํ”„ํŠธ์›จ์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•˜๋Š” ๊ทœ์น™๋“ค์˜ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.
  • ์›น ๊ฐœ๋ฐœ์—์„œ API๋Š” ์›น ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ๋กœ RESTful API๊ฐ€ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋ฉฐ, JSON, XML ๋“ฑ์˜ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ์Šคํ”„๋ง์—์„œ๋Š” ์ฃผ๋กœ ๊ฐ์ฒด๋ฐ˜ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ JSON์œผ๋กœ ๋ณ€ํ™˜๋˜๋ฉฐ HTTP์˜ BODY์— ์ง์ ‘ ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค.

  • ResponseBody๋Š” HTTP์˜ BODY์— ๋‚ด์šฉ์„ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • 'viewResolver' ๋Œ€์‹ ์— 'HttpMessageConverter'๊ฐ€ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ๋ฌธ์ž์ฒ˜๋ฆฌ : StringHttpMessageConverter
  • ๊ธฐ๋ณธ๊ฐ์ฒด์ฒ˜๋ฆฌ : MappingJacson2HttpMessageConverter
  • byte ๋“ฑ ๊ธฐํƒ€ ์—ฌ๋Ÿฌ HttpMessageConverter๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ๋“ฑ๋ก๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฐธ๊ณ ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ HTTP Accept ํ—ค๋”์™€ ์„œ๋ฒ„์˜ ์ปจํŠธ๋กค๋Ÿฌ ๋ฐ˜ํ™˜ ํƒ€์ž… ์ •๋ณด, ๋‘˜์„ ์กฐํ•ฉํ•ด์„œ 'HttpMessageConverter'๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.

 


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