[Spring Data] Hibernate, JPA ๊ทธ๋ฆฌ๊ณ  Spring Data JPA

๋ฐ˜์‘ํ˜•

์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ ๋‹ค๋ค„ ๋ณธ JDBC์™€ Spring JDBC๋Š” ์ž๋ฐ”์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ดˆ ์ธํ„ฐํŽ˜์ด์Šค์˜€๊ณ , ์ด๋“ค ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ์ž‘์—…๋“ค, ์—ฐ๊ฒฐ ์„ธ์…˜, ๊ทธ๋ฆฌ๊ณ  ๊ด€์‹ฌ์ ์˜ ๋ถ„๋ฆฌ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐœ์ „๋œ ๋ชจ์Šต์„ ๋ณด์˜€๋Š”๋ฐ์š”.

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ๊ทธ์— ์ด์–ด์„œ Hibernate, JPA, Spring Data JPA์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

JPA

JPA๋Š” Java Persistence API์˜ ์•ฝ์ž๋กœ ์ž๋ฐ”์—์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์–‘์‹์„ ์ •์˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ๋ง๊ทธ๋Œ€๋กœ ์ธํ„ฐํŽ˜์ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹จ์ง€, Java ๋ผ๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ์„ค๊ณ„ํ•˜๊ธฐ ์œ„ํ•œ Best Practice๋ฅผ JPA๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฆ‰, ์ž๋ฐ” ์ง„์˜์—์„œ ORM ๊ธฐ์ˆ  ํ‘œ์ค€์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ JDBC ์‚ฌ์ด์—์„œ ๋™์ž‘ํ•˜๋Š” ๋…€์„์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ORM์ด๋ž€, Object RelationShip Mapper์˜ ์•ฝ์ž๋กœ JDBC๋‚˜ Spring JDBC, iBatis์—์„œ๋Š” DB ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๋กœ์ง์„ ๋ณ„๋„๋กœ ์ž‘์„ฑํ•˜๊ณ , ์ด๋ฅผ SQL ์ฟผ๋ฆฌ๋กœ ์งˆ์˜ํ•˜์˜€๋Š”๋ฐ, ORM์€ SQL ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ , ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ DB๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ Hibernate๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Hibernate

Hibernate๋Š” JPA์˜ ๊ตฌํ˜„์ฒด์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ JPA์˜ ํ•ต์‹ฌ์ฒด์ธ EntityManagerFactory, EntityManager, EntityTransaction์„ Hibernate์—์„œ๋Š” SessionFactorySessionTransaction์œผ๋กœ ์ƒ์†๋ฐ›๊ณ  ๊ฐ๊ฐ Impl๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

์œ„ ์‚ฌ์ง„์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ทธ๋ ค์ ธ ์žˆ๋Š” ๊ฒƒ์€ JPA, ํด๋ž˜์Šค๋กœ ๊ทธ๋ ค์ ธ ์žˆ๋Š” ๊ฒƒ์€ Hibernate์˜ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. 

์ค‘๊ฐ„์— ORM์ด JDBC API๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์—ฌ DB์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

์–ด๋– ํ•œ ์ ์ด ์ข‹์„๊นŒ?

์šฐ๋ฆฌ๊ฐ€ iBatis, JDBC๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๋ถˆํŽธํ–ˆ๋˜ ๊ฒƒ์€ ์ปค๋„ฅ์…˜, ์„ธ์…˜ ๋“ฑ ์ˆ˜ ๋งŽ์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ์„ž์—ฌ ์žˆ๋Š” ์ฝ”๋“œ๋“ค์„ DB์— ์ ‘๊ทผํ•  ๋•Œ๋งˆ๋‹ค ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๋ณต๋œ ์ฝ”๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ๊ด€์‹ฌ์  ๋ถ„๋ฆฌ๊ฐ€ ์–ด๋ ค์› ๋˜ ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋“ค์€ iBatis๋ฅผ ํ†ตํ•ด์„œ ์–ด๋Š ์ •๋„ ํ•ด๊ฒฐ์ด ๋˜์—ˆ์ง€๋งŒ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ”๋กœ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งคํ•‘ํ•˜๋Š” ์ž‘์—…์ธ๋ฐ์š”. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ๊ฐ ์—”ํ‹ฐํ‹ฐ๋“ค์„ ๊ด€๊ณ„ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๊ฐœ๋ฐœํ•˜๋ ค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋„๋ฉ”์ธ ๋ชจ๋ธ๋“ค์„ ๊ด€๊ณ„ํ˜•์œผ๋กœ ๋ฌถ๊ธฐ ์œ„ํ•จ์ธ๋ฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์ค‘์— ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ๋„๋งก์•„ํ•˜๋Š” ๊ฒƒ์€ ์‰ฌ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ฐ€๋Šฅํ•œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋Ÿฐ ๋ฒˆ๊ฑฐ๋กœ์šด ์ž‘์—…์„ ์ค„์ด๊ณ , ์•Œ์•„์„œ ๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•ด์ฃผ๋Š” ์ ์€ ์•„์ฃผ ํฐ ๋ฉ”๋ฆฌํŠธ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์ฃ .

๊ทธ ์™ธ์—๋„ ๋‹ค๋ฅธ ์ข‹์€ ์ ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ: ๋ฐ˜๋ณต์ €์ธ SQL ์ฝ”๋“œ ๊ตฌํ˜„, CRUD ์ž‘์—…์„ ์•Œ์•„์„œ ํ•ด์คŒ
  • ์œ ์ง€๋ณด์ˆ˜: ๊ฐ์ฒด ์ˆ˜์ •์— ๋”ฐ๋ฅธ SQL ์ฝ”๋“œ ์ˆ˜์ • ์ž‘์—…์ด ํ•„์š” ์—†์Œ
  • ๋ฐ์ดํ„ฐ ๊ด€๊ณ„ ๋งคํ•‘: ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๋งคํ•‘ํ•˜๋Š” ๊ณผ์ •์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•จ
  • ์„ฑ๋Šฅ: ์บ์‹ฑ์„ ์ง€์›ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋„์ถœ
  • ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์ถ”์ƒํ™” ๋ฐ ๋ฒค๋” ๋…๋ฆฝ: ๋ฐ์ดํ„ฐ์˜ ๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•˜๋Š” ๊ณผ์ •์€ DB๋งˆ๋‹ค ๋‹ค๋ฅธ๋ฐ, ์ด๋Ÿฌํ•œ ์ž‘์—…์˜ ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์—†์Œ

 

ํ•˜์ง€๋งŒ ๋‹ค ์ข‹์€ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค

ORM์ด ๊ธฐ์กด์˜ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ , ๊ฐœ๋ฐœ์ž๊ฐ€ SQL ์ฝ”๋“œ๋ฅผ ๊ฐ€๋Šฅํ•œ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ง€๋งŒ ์ด๊ฒƒ์ด ๋ชจ๋‘ ์ข‹์ง€๋งŒ์€ ์•Š์Šต๋‹ˆ๋‹ค. SQL ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ ์ฏค ์งœ๋ดค๋‹ค๋ฉด ์ดํ•ดํ•˜์‹œ๋Š” ๋ถ€๋ถ„์ด์ง€๋งŒ SQL ์ฝ”๋“œ๋„ ์–ด๋–ป๊ฒŒ ์งœ๊ธฐ์— ๋”ฐ๋ผ์„œ๋Š” ์„ฑ๋Šฅ์ด ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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

๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ORM๊ณผ MyBatis๋ฅผ ํ˜ผ์šฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋Š”๊ฐ€ํ•˜๋ฉด, QueryDSL ์กฐํ•ฉ์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ฃ .

๊ทธ๋ฆฌ๊ณ  JPA๋ฅผ ์ž˜ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ฌด์—‡๋ณด๋‹ค ์ž˜ ์•Œ๊ณ  ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๋Š” ์ ๋„ ํ•œ ๋ชซํ•ฉ๋‹ˆ๋‹ค. JPA๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Entity์˜ ์ƒ๋ช…์ฃผ๊ธฐ, ์บ์‹œ, ์“ฐ๊ธฐ ์ง€์—ฐ, ์ƒ์† ์ „๋žต, ์ปฌ๋ ‰์…˜ ๋งคํผ ๋“ฑ DB๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์˜ต์…˜๋“ค์ด ์กด์žฌํ•˜๋Š”๋ฐ, ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์“ฐ๋Š๋ƒ์— ๋”ฐ๋ผ์„œ ์„ฑ๋Šฅ์ด ๋งŽ์ด ๋‹ฌ๋ผ์ง€๊ณ , ์˜ค๋ฅ˜์˜ ๋ฐœ์ƒ ์˜ํ–ฅ ๋“ฑ์ด ๊ฐˆ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ป๊ฒŒ ๋ณด๋ฉด SQL ์ฝ”๋“œ๋ฅผ ์•ˆ์จ๋„ ๋œ๋‹ค๋Š” ์žฅ์  ํ•˜๋‚˜์— ๋Ÿฌ๋‹ ์ปค๋ธŒ๊ฐ€ ๋‚ฎ์•„๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ๊ณ ๋ คํ•œ๋‹ค๋ฉด, ๊ฒฐ์ฝ” ๋Ÿฌ๋‹ ์ปค๋ธŒ๊ฐ€ ๋‚ฎ์€ ๋””ํŽœ๋˜์‹œ๋Š” ์•„๋‹ˆ๋ผ๋Š” ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

Spring Data JPA

Spring Data JPA๋Š” JPA๋ฅผ Spring Framework์—์„œ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด๋†“์€ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. ์—ฌํƒœ๊นŒ์ง€ REST API ๊ฐœ๋ฐœํ–ˆ์„ ๋•Œ, ์šฐ๋ฆฌ๋Š” @Entity ์–ด๋…ธํ…Œ์ด์…˜, @Column ์–ด๋…ธํ…Œ์ด์…˜ ๋“ฑ ๊ฐ„๋‹จํ•œ ์–ด๋…ธํ…Œ์ด์…˜๋งŒ์„ ๊ฐ€์ง€๊ณ , ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ •์˜ํ•˜๊ณ  DDL์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ํ•˜์˜€์ฃ . ์ด๊ฒƒ์ด ๋ฐ”๋กœ Spring Data JPA์ž…๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ JpaRepository๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JPA์˜ ๊ตฌํ˜„์ฒด์ธ Hibernate๋กœ ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๊ณ , Hibernate๋Š” ์ด์— ๋งž๊ฒŒ JDBC API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DB์— ์ ‘๊ทผํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ๋ ค์ฃผ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์œ„์ฒ˜๋Ÿผ User๋ผ๋Š” ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ, ๊ฐ„๋‹จํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜๊ณ , ํŠธ๋žœ์žญ์…˜ ๊ฐ์ฒด ๋“ฑ์„ ์ด์šฉํ•˜์ง€ ์•Š๋Š” ์ ์€ ๊ต‰์žฅํžˆ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ๋งŒ์•ฝ ์ด๊ฑด ์–ด๋–จ๊นŒ์š”? ์œ„์—์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ตฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. Role ์—”ํ‹ฐํ‹ฐ์—์„œ ํ•ด๋‹น ์—ญํ• ์ด ์–ด๋–ค ์—ญํ• ์ธ์ง€๋ฅผ ์ €์žฅํ•˜๋Š” ํ…Œ์ด๋ธ”์ด๊ณ , Role_Permisssion์€ ํ•ด๋‹น ์—ญํ• ์ด ์–ด๋–ค ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ๊ถŒํ•œ์„ ์ €์žฅํ•˜๋Š” ํ…Œ์ด๋ธ”์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ ์—ญํ• ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ถŒํ•œ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ, ๋‘ ๋ฐ์ดํ„ฐ์˜ ๊ด€๊ณ„๋Š” 1:N์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ Batis, JDBC๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ด๋ฅผ SQL ์ฝ”๋“œ๋กœ ์ง์ ‘ ๋ชจ๋“  ๊ฑธ ์ •์˜ํ•ด์•ผ ํ•˜์ง€๋งŒ, JPA์—์„œ๋Š” ์œ„์™€ ๊ฐ™์ด ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ •์˜ํ•ด์ฃผ๊ณ  ์žˆ์ฃ .

ํ•˜์ง€๋งŒ ๋ณด๋‹ค์‹œํ”ผ ์ด ๋ถ€๋ถ„๋„ ์‰ฝ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. SQL ์ฝ”๋“œ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์„ ๋ฟ, Fetch๋‚˜ Cascade ๋“ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋”ฐ๋ผ์„œ ๋กœ๋”ฉ ๊ธฐ๋ฒ•์ด๋‚˜ ์—”ํ‹ฐํ‹ฐ ๋ณ€๊ฒฝ ์ „๋žต์„ ์žก์•„์ค˜์•ผ ํ•˜๊ณ , ๋””๋ฒ„๊น… ๋ชจ๋“œ๋ฅผ ํ†ตํ•ด SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ๋ด„์œผ๋กœ์จ ์ด๋ฅผ ํŒ๋‹จํ•˜๊ณ , ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ ๋””ํŽœ๋˜์‹œ๊ฐ€ ๋ณ€๊ฒฝ๋จ์— ๋”ฐ๋ผ์„œ ์‹ค์ œ SQL ์ฝ”๋“œ๊ฐ€ ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ๋Š” ๋ถ€๋ถ„์€ ๋‹จ์ ์ผ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋งŒ์•ฝ ์ด๋Ÿฌํ•œ ์ž‘์—…์ด ๋ถˆํ™•์‹คํ•˜๋‹ค๊ณ  ๋Š๊ปด์ง„๋‹ค๋ฉด, JPA๋Š” ๊ทธ๋‹ค์ง€ ์ข‹์€ ๊ฒƒ๋งŒ์€ ์•„๋‹ˆ์ง€์š”.

 

 

๋งˆ์น˜๋ฉฐ...

์—ฌ๊ธฐ๊นŒ์ง€ ๊ฐ„๋‹จํ•˜๊ฒŒ JPA์™€ Hibernate, Spring Data JPA๋ฅผ ์‚ดํŽด๋ดค์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋“  DB๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์–ธ์ œ๋“ ์ง€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๊ณ , ์ด๋Ÿฌํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋””ํŽœ๋˜์‹œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ, ์ ์ ˆํ•œ ์„ ํƒ์€ ๊ฐœ๋ฐœ์ž์˜ ๋ชซ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ข‹์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ์›ํ™œํžˆ ๋™์ž‘ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋””ํŽœ๋˜์‹œ์˜ ํŠน์ง•์„ ์ž˜ ์•Œ๊ณ  ์“ฐ๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•œ ๋•๋ชฉ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ €๋Š” JPA๋ฅผ ์ด๋ ‡๊ฒŒ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

JPA๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‰ฝ๊ฒŒ ์งœ๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ์ผ ๋ฟ์ด๋‹ค.

๋‚ด๋ถ€์—์„œ๋Š” JDBC API๊ฐ€ ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ SQL ์ฝ”๋“œ๋งŒ ์ž‘์„ฑํ•˜์ง€ ์•Š์„ ๋ฟ์ด์ง€, ๋™์ž‘ํ•˜๋Š” ๋‚ด๋ถ€๋Š” ๋˜‘๊ฐ™๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ์ด์Šˆ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ ๋“ฑ ์žฅ๋‹จ์ ์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ . ๋ฐ˜๋“œ์‹œ ์ด ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์“ฐ๋Š” ๊ฒŒ ์ •๋‹ต์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ์•Œ๋ ค๋“œ๋ฆฌ๊ณ  ์‹ถ๋„ค์š”.

์ตœ๊ทผ ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ์—์„œ JPA๊ฐ€ ๋Ÿฌ๋‹ ์ปค๋ธŒ๊ฐ€ ๋†’๊ณ , ์˜คํžˆ๋ ค SQL ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์“ฐ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ๋งŽ์•„์ง€๋ฉด์„œ Spring Data JDBC๋ผ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์ง„ํ–‰๋˜๊ณ  ์žˆ๋Š”๋ฐ์š”. ์–ด๋–ป๊ฒŒ ๋‚˜์˜ฌ์ง€ ๊ธฐ๋Œ€๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments