4 min read

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

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 ์ ์šฉ

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

๋‹ค์–‘ํ•œ DB ์ ‘๊ทผ ๊ธฐ์ˆ 

์ˆœ์ˆ˜ JDBC

JDBC๋Š” ์ž๋ฐ”์—์„œ DB์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ž๋ฐ” API์ด๋‹ค. ์‰ฝ๊ฒŒ ์ด์•ผ๊ธฐํ•ด๋ณด์ž๋ฉด, DBMS ์ฝ˜์†” ์ƒ์—์„œ ์ฟผ๋ฆฌ๋ฅผ ๋˜์ ธ์„œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๋˜ ๊ฒƒ์„ ์ž๋ฐ” ์ฝ”๋“œ ์ƒ์—์„œ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ  ์ •๋„๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

JDBC๋กœ Repository ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๊ฐ ๋ฉ”์†Œ๋“œ๋งˆ๋‹ค ๋Œ€๋žต ๋‹ค์Œ์˜ ๊ณผ์ •์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

  1. ์ฟผ๋ฆฌ ์„ค์ •
  2. ์ปค๋„ฅ์…˜ ๋ฐ›์•„์˜ค๊ธฐ
  3. ์ฟผ๋ฆฌ ์‹คํ–‰ ์ค€๋น„
  4. ์ฟผ๋ฆฌ ์‹คํ–‰
  5. ์ปค๋„ฅ์…˜ ๋‹ซ๊ธฐ

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ๋“ค์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋‹ค ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ฝ”๋“œ๊ฐ€ ๊ธธ๊ณ , ๋กœ์ง์„ ํŒŒ์•…ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.

์‚ฌ์‹ค์ƒ ์ตœ๊ทผ์—๋Š” ์“ฐ์ง€ ์•Š๋Š” ๊ธฐ์ˆ ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

Spring JdbcTemplate

JDBC๋กœ๋งŒ ๊ตฌํ˜„์„ ํ•˜๋ฉด ์œ„์˜ ๋‹จ๊ณ„๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๋‹ค ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ JdbcTemplate๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฐ ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๋Œ€ํญ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฟผ๋ฆฌ๋Š” ๊ธฐ์กด๊ณผ ๊ฐ™์ด ์ž‘์„ฑ์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์ˆœ์ˆ˜ JDBC์—์„œ try ... catch ... ๋กœ ๋„๋ฐฐ๋˜์–ด ์žˆ๋˜ ๋ถ€๋ถ„๋“ค์„ ๋งŽ์ด ์—†์•จ ์ˆ˜ ์žˆ๊ณ , ์ปค๋„ฅ์…˜๊ณผ ๊ด€๋ จํ•ด์„œ ์‹ ๊ฒฝ์„ ๋œ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ๊ทธ ๋•๋ถ„์— ์ฝ”๋“œ ์ƒ์—์„œ ๋กœ์ง์ด ๋ถ„๋ช…ํ•˜๊ฒŒ ๋ณด์ด๊ฒŒ ๋œ๋‹ค.

์ตœ๊ทผ์—๋„ ์‹ค๋ฌด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

JPA

JPA๋Š” ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์—†์• ์ค„ ๋ฟ ์•„๋‹ˆ๋ผ, ๊ทธ๋ƒฅ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ์ž๋ฐ” ์ฝ”๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค. ๋˜ํ•œ ๊ฐœ๋ฐœ์— ์žˆ์–ด์„œ ๊ด€์ ์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ, SQL๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„ํ•˜๊ณ  ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ์ฒด๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„ํ•˜๊ณ  ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค.

SQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ์ „์ฒด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ์ฒด ์ค‘์‹ฌ์œผ๋กœ ๊ทธ๋ฆฌ๊ณ  ์˜ค์ง ์ž๋ฐ” ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋‹ˆ ์ƒ์‚ฐ์„ฑ์ด ํฌ๊ฒŒ ๋†’์•„์ง„๋‹ค.

JDBC ๋ฅ˜์™€ ๋‹ค๋ฅด๊ฒŒ Entity๋ผ๋Š” ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๋ณธ ๊ฐ•์˜์—์„œ๋Š” ์ผ๋‹จ ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ ๋„๋ฉ”์ธ ๊ฐ์ฒด์— @Entity ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์„œ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. Entity๋Š” ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด ์‹ค์ œ DB์˜ ํ…Œ์ด๋ธ”์— ๋งค์นญ์ด ๋˜๋Š” ํด๋ž˜์Šค๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. Entity ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ํ•„๋“œ๋“ค์ด DB ํ…Œ์ด๋ธ”์˜ Column์ด ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  JPA๋ฅผ ํ†ตํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์€ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, JPA๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ Service ํด๋ž˜์Šค์— @Transactional ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐ ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ฒŒ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

Spring Data JPA

๊ฐœ์ธ์ ์œผ๋กœ ์–ด๋– ํ•œ ๋ฐฉ๋ฒ•(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ ๋“ฑ)์„ ํ†ตํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜๋งŒ ์žˆ๋‹ค๋ฉด, ๋‚ด๋ถ€ ๊ตฌํ˜„์—๋Š” ํฌ๊ฒŒ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ์ผ๋‹จ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ธ๋ฐ, ์ด Spring Data JPA๋Š” ์ •๋ง ๊ณต๋ถ€๋ฅผ ํ•ด์„œ ๋™์ž‘ ์›๋ฆฌ์— ๋Œ€ํ•ด ์กฐ๊ธˆ์ด๋ผ๋„ ๊นจ๋‹ซ์ง€ ๋ชปํ•œ๋‹ค๋ฉด ์“ฐ๊ธฐ๊ฐ€ ๋‘๋ ค์šธ ์ •๋„๋กœ ๋„ˆ๋ฌด ๊ฐ„ํŽธํ•˜๊ฒŒ ๋˜์–ด์žˆ๋‹ค.

Repository์— ๊ตฌํ˜„ ํด๋ž˜์Šค๊ฐ€ ์—†์ด ๊ทธ๋ƒฅ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๋„ฃ์–ด๋‘๋ฉด ๊ฐœ๋ฐœ์ด ๋๋‚œ๋‹ค. ์ด๊ฒŒ ๋งž๋Š”๊ฑด์ง€ ์˜๋ฌธ์ด ๋“ค ์ •๋„์˜ ํŽธ์˜์„ฑ์ด๋‹ค. ์–ธ์–ด์™€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ง‰๋ก ํ•˜๊ณ  DB๋ฅผ ๋ฐฑ์—”๋“œ์— ๋ฌผ๋ฆด ๋•Œ ํ•„์ˆ˜์ ์œผ๋กœ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋Š” CRUD ์ฝ”๋“œ๋„ ๊ทธ๋ƒฅ Spring Data JPA๊ฐ€ ์•Œ์•„์„œ ๋‹ค ์งœ์ค€๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

์‹ค๋ฌด์—์„œ๋Š” JPA์™€ Spring Data JPA๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ , ์ฟผ๋ฆฌ๊ฐ€ ๋ณต์žกํ•œ ๋™์  ์ฟผ๋ฆฌ๋Š” Querydsl์ด๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด๋„ ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ค์šด ์ฟผ๋ฆฌ๋Š” JPA๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, JdbcTemplate๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

Spring Data JPA์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ , ์ด๋ฒˆ Spring Boot ์Šคํ„ฐ๋””๋ฅผ ํ•˜๊ณ  ๋‚˜์„œ๋Š” ๋ฌด์กฐ๊ฑด JPA ๊ฐ•์˜๋„ ์ˆ˜๊ฐ•ํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ๋‹ค.

๋‹ค์Œ์€

๋‹ค์Œ์œผ๋กœ AOP์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์•„์ง ์ •๋ฆฌํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์™€๋‹ฟ์งˆ ์•Š์•„์„œ ์กฐ๊ธˆ ๋” ๊ฐœ๋…์ ์œผ๋กœ ์ดํ•ดํ•œ ํ›„์— ๋ณ„๋„๋กœ ์ •๋ฆฌํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. ์ด์ œ ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ ๊ฐ•์˜๋ฅผ ๊ณต๋ถ€ํ•ด์•ผ๊ฒ ๋‹ค.

๋.