4 min read

[Spring ๊ณต๋ถ€] ๊น€์˜ํ•œ๋‹˜์˜ ์ž…๋ฌธ ๊ฐ•์˜ - 3

Table of Contents

Spring Boot๋ฅผ ์ฒ˜์Œ ๊ณต๋ถ€ํ•˜๋Š” ์‚ฌ๋žŒ์ด ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด์„œ ์ž‘์„ฑํ•œ ํฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์˜ค๊ฐœ๋… ๋ฐ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ, ๋ฐœ๊ฒฌํ•˜์‹ ๋‹ค๋ฉด ๊ฐ€๊ฐ์—†์ด ๋Œ“๊ธ€์„ ํ†ตํ•ด์„œ ์•Œ๋ ค์ฃผ์„ธ์š”! ํ™•์ธํ•˜๋Š” ๋Œ€๋กœ ์ •ํ™•ํ•œ ์ •๋ณด๋ฅผ ํ™•์ธํ•ด์„œ ๊ณ ์น˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐœ์š”

์ด๋ฒˆ Spring Boot ์Šคํ„ฐ๋””๋Š” ๋ฐฐ๋‹ฌ์˜ ๋ฏผ์กฑ์˜ ๊น€์˜ํ•œ๋‹˜๊ป˜์„œ ์ธํ”„๋Ÿฐ์— ์˜ฌ๋ ค์ฃผ์‹œ๋Š” ์ž๋ฐ” ์Šคํ”„๋ง ์™„์ „ ์ •๋ณต ์‹œ๋ฆฌ์ฆˆ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค. ๊ทธ ์‹œ๋ฆฌ์ฆˆ์˜ ๊ฐ€์žฅ ์ฒซ ๊ฐ•์˜์ธ ์Šคํ”„๋ง ์ž…๋ฌธ - ์ฝ”๋“œ๋กœ ๋ฐฐ์šฐ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ, ์›น MVC, DB ์ ‘๊ทผ ๊ธฐ์ˆ ์„ ๋“ค์–ด๋ณด๊ณ  ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

ํ•ด๋‹น ๊ฐ•์˜๋Š” ๋‚ด๊ฐ€ ๋А๋ผ๊ธฐ์— ํฌ๊ฒŒ ๋‹ค์Œ์˜ ์ปจํ…์ธ ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค.

  • Spring ๊ธฐ์ดˆ ๊ธฐ๋Šฅ ์จ๋ณด๊ธฐ
  • Spring Bean๊ณผ ์˜์กด ๊ด€๊ณ„
  • ํšŒ์› ๊ด€๋ฆฌ ์˜ˆ์ œ ๊ตฌํ˜„ํ•˜๊ธฐ
    • Controller - Service - Repository ํŒจํ„ด ์ ์šฉ
    • Spring MVC ์ ์šฉ
  • ์œ„์˜ ์˜ˆ์ œ์— ๋‹ค์–‘ํ•œ DB ์ ‘๊ทผ ๊ธฐ์ˆ  ์ ์šฉ
    • JDBC
    • JDBC Template
    • JPA
    • Spring Data JPA
  • ์œ„์˜ ์˜ˆ์ œ์— ๊ฐ„๋‹จํ•œ AOP ์ ์šฉ

์ด ํฌ์ŠคํŠธ์—์„œ๋Š” ํšŒ์› ๊ด€๋ฆฌ ์˜ˆ์ œ ๊ตฌํ˜„ํ•˜๊ธฐ์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

ํšŒ์› ๊ด€๋ฆฌ ์˜ˆ์ œ ๊ตฌํ˜„ํ•˜๊ธฐ

๊ฐ•์˜์—์„œ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ๋‹ค๋ค„๋ณธ ํ›„ ๊ณง์žฅ ํšŒ์› ๊ด€๋ฆฌ ์˜ˆ์ œ ๊ตฌํ˜„์— ๋Œ์ž…ํ•œ๋‹ค. ์ด ์ฑ•ํ„ฐ์˜ ํ•ต์‹ฌ์€ ์Šคํ”„๋ง์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด์ธ Controller - Service - Repository ํŒจํ„ด์— ๋Œ€ํ•ด์„œ ๊ฐ€๋ณ๊ฒŒ ์‚ดํŽด๋ณด๊ณ , ์ด๋ฅผ ์•ž์„œ ๋ฐฐ์šด MVC์— ์ ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์— ๊ด€๋ จ๋œ ๋กœ์ง๊ณผ ๋ทฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ ๋กœ์ง์„ ์—ฐ๊ฒฐํ•ด ํšŒ์› ๊ด€๋ฆฌ ์˜ˆ์ œ๋ฅผ ๊ตฌํ˜„ํ•ด๋‚ด๋Š” ๊ฒƒ์— ์žˆ๋‹ค. ๋‚˜๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ถ€๋ถ„๋ณด๋‹ค ๊ฐœ๋… ์ž์ฒด์— ์กฐ๊ธˆ ๋” ์ง‘์ค‘ํ•ด์„œ ๊ธ€์„ ์จ๋‚ด๋ ค๊ฐ€๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

Controller - Service - Repository ํŒจํ„ด ์ ์šฉ

์ผ๋ฐ˜์ ์œผ๋กœ Spring Boot ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ๋‹ค์Œ์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

spring-layered-architecture.png

๊ตฌ์กฐ์— ๋Œ€ํ•œ ์„ค๋ช…

์—ฌ๊ธฐ์„œ, ํ™”์‚ดํ‘œ๋Š” โ€œ์ถœ๋ฐœํ•˜๋Š” ๊ณณ์ด ๋„์ฐฉํ•˜๋Š” ๊ณณ์„ ์‚ฌ์šฉํ•œ๋‹คโ€ ์ •๋„๋กœ ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•  ๊ฒƒ ๊ฐ™๋‹ค. ์ฆ‰, โ€œController๊ฐ€ Service๋ฅผ ์‚ฌ์šฉํ•œ๋‹คโ€ ์™€ ๊ฐ™์€ ๋А๋‚Œ์ด๋‹ค.

๊ฐ๊ฐ์˜ ์š”์†Œ๋“ค์˜ ์—ญํ• ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • Domain : ์œ ์ €์—๊ฒŒ ์ œ๊ณต ํ˜น์€ ๊ด€๋ฆฌํ•˜๊ณ ์ž ํ•˜๋Š” ํŠน์ • ์ •๋ณด์— ๋Œ€ํ•œ ๊ฐ์ฒด์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํšŒ์›, ๊ฒŒ์‹œ๊ธ€, ๋Œ“๊ธ€ ๋“ฑ์œผ๋กœ ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌํ•œ๋‹ค.
  • Controller : ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ๊ป ์ž‘์„ฑํ•œ Controller์ด๋‹ค. ์›น MVC์˜ Controller์ด๊ธฐ๋„ ํ•˜๋‹ค.
  • Service : ์šฐ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ œํ’ˆ์— ์žˆ์–ด ํ•ต์‹ฌ์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.
  • Repository : ์ €์žฅ์†Œ๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , DB์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. ์—ฌ๊ธฐ์„œ Domain ๊ฐ์ฒด๋ฅผ DB์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์–ด๋–ค ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์น˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

  1. Tomcat์— ์˜ํ•ด ํŠน์ • Controller๋กœ ์š”์ฒญ์ด ๋“ค์–ด์˜จ๋‹ค.
  2. ํ•ด๋‹น Controller๊ฐ€ ํŠน์ • Service์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ˆ˜ํ–‰์„ ์š”์ฒญํ•œ๋‹ค.
  3. ํ•ด๋‹น Service๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ, DB์— ์ ‘๊ทผํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค Repository์— ์š”์ฒญํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

๊ตฌํ˜„์— ๋Œ€ํ•œ ํŠน์ง•

๋ณดํ†ต Repository๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ, Service๋Š” ์ง์ ‘์ ์œผ๋กœ๋Š” Repository์˜ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กด ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋„๋ก ์„ค๊ณ„ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด DB์˜ ์ข…๋ฅ˜๊ฐ€ ๋ฐ”๋€Œ๊ฑฐ๋‚˜, DB์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ฐ”๋€Œ๋”๋ผ๋„ Service์˜ ๊ตฌํ˜„์„ ๋ฐ”๊พธ์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์žฅ์ ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ, Service์™€ Repository๋ฅผ ๊ตฌํ˜„ํ•˜๋‹ค ๋ณด๋ฉด (ํŠนํžˆ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ์ผ์ˆ˜๋ก ๋”) Service์™€ Repository์˜ ๊ตฌํ˜„์ด ๊ฑฐ์˜ ๋น„์Šทํ•˜๊ฑฐ๋‚˜ ํ•˜๋Š” ์ผ์ด ๊ฑฐ์˜ ๊ฐ™๋‹ค๊ณ  ๋А๋‚„ ์ˆ˜ ์žˆ๋Š”๋ฐ , ์ด ๋ถ€๋ถ„์„ ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค. ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ ๊ตณ์ด ์œ„์˜ ํŒจํ„ด์„ ์ ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๊ทธ๋ ‡๊ฒŒ ๋А๋‚„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€๋ฐ Repository๋Š” DB ์ ‘๊ทผ์„ ๋Œ€ํ–‰ํ•˜๋Š” ์—ญํ• ์˜ ๋А๋‚Œ์ด๊ณ  Service๋Š” ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋กœ ์š”๋ฆฌํ‚น์กฐ๋ฆฌํ‚น์„ ํ•ด์„œ ํ•„์š”ํ•œ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด Controller์—๊ฒŒ ๋‹ค์‹œ ๊ฑด๋„ค์ฃผ๋Š” ์—ญํ• ์˜ ๋А๋‚Œ์ด๋‹ค.

Spring MVC ์ ์šฉ

๊ทธ๋Ÿฌ๋ฉด Controller - Service - Repository๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ๋‚˜๋ฉด MVC์—์„œ ์–ด๋””๊ฐ€ M, ์–ด๋””๊ฐ€ V, ๊ทธ๋ฆฌ๊ณ  ์–ด๋””๊ฐ€ C๊ฐ€ ๋˜๋Š” ๊ฒƒ์ผ๊นŒ? ์•„๋ฌด๋ž˜๋„ View๋Š” ThymeLeaf Template Engine์„ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์ด ๋  ๊ฒƒ ๊ฐ™๊ณ , Controller๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ˜„ํ•œ Controller, ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋จธ์ง€ Service์™€ Repository๊ฐ€ Model์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

์—ฌ๊ธฐ์„œ ๋‚˜๋Š” ์ด Spring MVC๊ฐ€ ์™œ MVC๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์ธ์ง€ ์˜๋ฌธ์„ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด MVC ํŒจํ„ด์—์„œ๋Š” ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์ด Controller๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜ค๊ณ , ์ด๊ฒƒ์œผ๋กœ ์ธํ•ด Model์ด ์—…๋ฐ์ดํŠธ ๋˜๋ฉฐ, ์ด Model์„ ๊ธฐ๋ฐ˜์œผ๋กœ View๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๊ฒŒ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ง€๊ธˆ ๋ฐฐ์šด Spring MVC์˜ ๊ฒฝ์šฐ Model(Service, Repository)๋ฅผ ํ†ตํ•ด ๊ฐ€๊ณตํ•œ ๋ฐ์ดํ„ฐ๋ฅผ Controller์—๊ฒŒ ์ „๋‹ฌํ•˜๊ณ  ์ด๊ฒƒ์ด View Resolver์—๊ฒŒ ์ „๋‹ฌ๋˜์–ด View๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ๋‹ค. ์ฆ‰, Model์ด View๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Controller๊ฐ€ View๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค. ์ด๋Š” MVP ํŒจํ„ด์— ๋” ๊ฐ€๊น์ง€ ์•Š๋‚˜๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๊ณ , Spring MVC๋ผ๋Š” ์ด๋ฆ„์— ์˜๋ฌธ์„ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ ์กฐ๊ธˆ ๋” ์•Œ์•„๋ณด์•„์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

์ด๋Ÿฐ ๋ถ€๋ถ„์„ ์ฐจ์น˜ํ•˜๊ณ , ์ง€๊ธˆ๊นŒ์ง€ ํ•œ ํ๋ฆ„์„ ๊ทธ๋Œ€๋กœ ์ด์šฉํ•˜๋ฉด ํŠน์ • ์ฃผ์†Œ์™€ HTTP method๋ฅผ ๋งคํ•‘ํ•˜์—ฌ Controller๋กœ ์š”์ฒญ์„ ๋ฐ›๊ณ , ๊ทธ์— ์•Œ๋งž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ Service๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•˜๊ณ (๊ทธ๋ฆฌ๊ณ  ์ด Service๋Š” DB์— ์ ‘๊ทผ์ด ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค Repository์— ์š”์ฒญํ•˜๊ณ ) ์ด๊ฒƒ์„ ๋‹ค์‹œ Controller์—์„œ ๋ฐ›์•„์„œ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ return ํ•˜๋ฉด @ResponseBody ๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์–ด์žˆ์ง€ ์•Š๋Š” ์ด์ƒ View Resolver๋ฅผ ํ†ตํ•ด์„œ ํŠน์ • Template์„ ์ฐพ์•„์„œ ๊ทธ๊ฒƒ์„ html๋กœ ๋ Œ๋”๋งํ•˜์—ฌ ์œ ์ €์—๊ฒŒ ๋ณด๋‚ด์ฃผ๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ์€

๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ๋Š” ์ด ์˜ˆ์ œ์— ๋‹ค์–‘ํ•œ DB ์ ‘๊ทผ ๊ธฐ์ˆ ์„ ์ ์šฉํ•˜๋Š” ๋‚ด์šฉ์— ๋Œ€ํ•ด์„œ ๊ฐ„๋žตํžˆ ์ •๋ฆฌํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

๋.