์ผ๋‹จ ํ•˜๊ณ  ๋ณด๋Š” ์‚ฌ๋žŒ

๋‚˜์ค‘๋ณด๋‹จ ์ง€๊ธˆ์— ์ง‘์ค‘ํ•˜๋˜, ์ง€๊ธˆ๋ณด๋‹จ ๋‚˜์ค‘์— ์™„๋ฒฝํ•ด์ง€์ž๐Ÿ’ช๐Ÿป

๐ŸŒฟSpring, SpringBoot

JPA Repository? DAO, VO?

JanginTech 2025. 2. 4. 22:28

๊ทธ๋™์•ˆ ๋‚˜๋Š” JPA๋งŒ ๊น”์ง์˜€์—ˆ๋Š”๋ฐ(?) ํšŒ์‚ฌ ์˜ค๋‹ˆ MyBatis๋ฅผ ํ•˜๊ฒŒ ๋˜์–ด์„œ(?) ์œ ๊ฐ์ด๋‹ค.

STS ์“ด๋‹ค๋Š” ๋ง๋งŒ ๋“ค์—ˆ์„ ๋•Œ๋Š” ๋‚˜๋Š” JPA๋งŒ ๊ณต๋ถ€ํ•ด ๋ดค์œผ๋‹ˆ ๋‚˜๋ฆ„ ๋‹น์—ฐํ•˜๋‹ค๋Š” ๋“ฏ์ด 'QueryDSL๋„ ๋นจ๋ฆฌ ๊ณต๋ถ€ํ•ด์•ผ๊ฒ ๋‹ค!'๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ๊ฒฝ๊ธฐ๋„ ์˜ค์‚ฐ์ด์—ˆ๋‹ค ใ…Ž.ใ…Ž

 

์•”ํŠผ, ์ด ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ๋Š” DAO, VO์™€ Repository ํŒจํ„ด์˜ ์ฐจ์ด๊ฐ€ ๊ถ๊ธˆํ•ด์„œ๋‹ค.

 

์ฟผ๋ฆฌ๋„ ํ•˜๋‚˜ํ•˜๋‚˜ ์ง์ ‘ ์งœ์„œ ๋งคํ•‘ํ•ด์ค˜์•ผ ํ•˜๋‹ˆ, ๋๋‚  ์ƒ๊ฐ ์—†๋Š” ๊ธด๊ธด ์ฟผ๋ฆฌ๋ฌธ๋“ค์„ ๋ณด๋ฉฐ ์ด๊ฑธ ๋‚ด๊ฐ€ ์–ด๋–ป๊ฒŒ ์ดํ•ดํ•˜์ง€ ์ƒ๊ฐํ–ˆ์—ˆ๋Š”๋ฐ..

์•„์ง๋„ ์—ด์‹ฌํžˆ ๋ณด๊ณ  ๋˜ ๋ณด๊ณ  ์‹คํ–‰์‹œ์ผœ ๋ณด๋Š” ๋‹จ๊ณ„์ง€๋งŒ ๊ทธ๋ž˜๋„ ๋‚ด๊ฐ€ ๋ฐฐ์› ๋˜ ๊ฑฐ๋ž‘ ๋น„๊ตํ•ด์„œ ์•Œ์•„๊ฐ€๋ฉด ์ดํ•ด๊ฐ€ ๋” ์‰ฝ์ง€ ์•Š์„๊นŒ ํ•˜๋Š” ๊ธฐ๋Œ€๊ฐ์— ๋‘˜์ด ๋น„๊ตํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

 

๋ฌผ๋ก  ๋ถ€์กฑํ•˜๊ณ  ํ‹€๋ฆฐ ๋ถ€๋ถ„๋„ ์žˆ๊ฒ ์ง€๋งŒ ๊ทธ๊ฑด ๋ฏธ๋ž˜์˜ ๋‚ด๊ฐ€ ์—…์„œํŠธ ํ•ด๋‚˜๊ฐˆ ๊ฑฐ๋‹ค ใ…Žใ…Ž!

 

 

 

 

[1] JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ(Repository)

๋œฌ๊ธˆ์—†์ด Repository๋ฅผ ์–ธ๊ธ‰ํ•˜๋ƒ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ์œผ๋‚˜, ์ฐพ์•„๋ณด๋‹ˆ ์ด๊ฑธ ์•Œ์•„์•ผ๊ฒ ๋”๋ผ.

 

JPA(Java Persistence API)

  • ์ž๋ฐ” ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์˜ ๋งคํ•‘์„ ์ž๋™ํ™”ํ•˜๋Š” ํ‘œ์ค€ ORM(Object-Relational Mapping) ๊ธฐ์ˆ 
  • ์ฆ‰, ์ž๋ฐ” Class ๋ž‘ RDB ํ…Œ์ด๋ธ”์„ ๋งคํ•‘ํ•ด ์ฃผ์–ด ์ฟผ๋ฆฌ๋ฌธ์ด ์•„๋‹Œ ๋ฉ”์„œ๋“œ๋กœ DB๋ฅผ ๋งŒ์งˆ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด, ๊ฐœ๋ฐœ์ž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋” ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ!
  • ๋ฐ˜๋ณต๋˜๋Š” ์ฟผ๋ฆฌ๋ฌธ์„ ์ฒ˜๋ฆฌํ•ด ์ฃผ๋‹ˆ ๊ฐ„ํŽธํ•˜๊ณ , ๋ฌด์—‡๋ณด๋‹ค ๊ฐ์ฒด์ค‘์‹ฌ์œผ๋กœ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์–ด ์œ ์ง€๋ณด์ˆ˜์— ์šฉ์ดํ•˜๋‹ค.

์ด๋Ÿฌํ•œ JPA๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ CRUD ๋ฐ ๊ธฐํƒ€ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์ž‘์—…์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ์ œ๊ณตํ•ด ์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ฐ”๋กœ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋‹ค.

JPA๊ฐ€ ์ œ๊ณตํ•˜๋Š” Repository๋ฅผ ํ†ตํ•ด DAO ํŒจํ„ด์„ ์ž๋™์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‹ˆ, JPA๋ฅผ ์“ฐ๋ฉด Repository๊ฐ€ DAO ์—ญํ• ์„ ๋Œ€์‹ ํ•ด ์ฃผ๋ฏ€๋กœ ๋ณ„๋„์˜ DAO ํด๋ž˜์Šค๊ฐ€ ํ•„์š” ์—†๊ฒŒ ๋œ๋‹ค.

 

 

 

๋ฐ˜๋Œ€๋กœ JPA๋ฅผ ์“ฐ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๊ตฌํ˜„ ํŒจํ„ด์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด์ž.

 

 

[2] JPA๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ (JDBC Template, MyBatis)

JPA๋Š” ๊ฐ์ฒด ์ค‘์‹ฌ ๊ฐœ๋ฐœ๋กœ ํด๋ž˜์Šค๋ž‘ ํ…Œ์ด๋ธ”์„ ์ž๋™ ๋งคํ•‘ํ•ด ์ค€๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ, JPA๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ธฐ์ˆ ์— ๋งž๊ฒŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๋กœ์ง์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. 

 

JPA๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์ด ํ•„์š”ํ•˜์—ฌ ์ง์ ‘ DAO ํŒจํ„ด์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค(์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ Repository ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค).

DAO๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ๋ชจ๋“  CRUD ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ „๋‹ด ๊ณ„์ธต์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

โž•DAO, VO?

DAO๋ž‘ VO๊ฐ€ ๋ญ ํ•˜๋Š” ์• ์ธ์ง€๋„ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ๋‹ค.

 

DAO(Data Access Object)

  • ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด
  • DB ์ ‘๊ทผ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๊ณ ์ž ์‚ฌ์šฉ
  • DB์— ์ง์ ‘ ์ ‘๊ทผํ•˜์—ฌ CRUD ๋“ฑ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰

VO(Value Object)

  • ๊ฐ’ ํƒ€์ž…์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด
  • Read-Only
  • @Getter ๊ธฐ๋Šฅ๋งŒ ์กด์žฌํ•จ
  • ๊ฐ’ ์ž์ฒด์˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„ ๋ถˆ๋ณ€ ํด๋ž˜์Šค

 

DAO์˜ ์—ญํ• 

DAO๋Š” ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP), ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ(SoC), ์บก์Аํ™” ์›์น™์— ๋”ฐ๋ผ DB์™€์˜ ๋ชจ๋“  CRUD ์ž‘์—…์„ ์บก์Аํ™”ํ•˜๋Š” ์ „๋‹ด ๊ฐ์ฒด๋กœ ์„ค๊ณ„๋˜์–ด์•ผ ํ•œ๋‹ค.DAO๋Š” ๋‹จ์ˆœํžˆ "ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ"์œ„ํ•œ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๊ฒƒ์ด๋‹ค.๋ฐ์ดํ„ฐ ์ ‘๊ทผ๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ž‘์—…์„ ๋‹ด๋‹นํ•˜๋Š” ๊ณ„์ธต์ด๋‹ค.

 

 

 

[๊ฒฐ๋ก ] DAO/VO์™€ JPA, Repository ๊ด€๊ณ„

JPA๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, Spring Data JPA์˜ Repository ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ DAO ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.JPA๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ DAO๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๊ณ  ์ด๋•Œ Repository ๊ณ„์ธต์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค(๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†๋‹ค).