๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

IT

JPA(Java Persistence API)๋ฅผ ์™œ ์“ฐ๋Š”๊ฐ€?

728x90

โ–ถ ๊ฐœ๋…

๐Ÿ’ก ์ž๋ฐ” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์ •์˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค

 

์ž๋ฐ” ์ง„์˜์—์„œ ORM( Object - Relational Mapping ) ๊ธฐ์ˆ  ํ‘œ์ค€์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ชจ์Œ

  • ๊ตฌํ˜„๋œ ํด๋ž˜์Šค์™€ ๋งคํ•‘์„ ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ
  • JPA๋ฅผ ๊ตฌํ˜„ํ•œ ๋Œ€ํ‘œ์ ์ธ ์˜คํ”ˆ์†Œ์Šค๋กœ๋Š” Hibernate๊ฐ€ ์žˆ๋‹ค.

โ–ถ  JPA ๋™์ž‘

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ JDBC ์‚ฌ์ด์—์„œ ๋™์ž‘ํ•œ๋‹ค.
  • JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด JPA ๋‚ด๋ถ€์—์„œ JDBC API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SQL์„ ํ˜ธ์ถœํ•ด์„œ DB์™€ ํ†ต์‹ 

JPA ๋™์ž‘ ๊ณผ์ •

  • ํ•˜๋‚˜์˜ ์•ฑ์—๋Š” ํ•˜๋‚˜์˜ EntityManager Factory๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฐ ์š”์ฒญ์— ๋”ฐ๋ผ EntityManager๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ปค๋„ฅ์…˜ ํ’€์„ ๋งŒ๋“ค๊ณ  DB์— ์š”์ฒญ

๋‚ด๋ถ€ ๋™์ž‘

  • EntityManager๋Š” ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๊ณ , ์‚ฌ์šฉ์ด ๋๋‚˜๋ฉด ๋ฐ˜๋‚ฉ
  • ๊ทธ ์ด์œ ๋Š” ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ EntityManager๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ DB ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”๊ฐ€ ๊นจ์ง€๊ฒŒ ๋œ๋‹ค. ์ปค๋ฐ‹์ด ๋œ ์ดํ›„์—๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ๋ฐ˜๋‚ฉํ–ˆ๋‹ค๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

โ–ถ  JPA ์‚ฌ์šฉ์ด์œ 

๐Ÿ’กSQL์˜ ๋ฌธ์ œ์ ?

  1. ๊ฐ™์€ ์ฝ”๋“œ์˜ ๋ฌดํ•œ ๋ฐ˜๋ณต → sql ์ฝ”๋“œ, ๊ธฐ๋ณธ CRUD์˜ ๋ฐ˜๋ณต
  2. ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜: ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• DB์˜ ์ฐจ์ด → ๊ฐ์ฒด๋ฅผ DB์— ๋„ฃ์„ ๋•Œ ๋ฌธ์ œ ๋ฐœ์ƒ
  3. SQL ์˜์กด์  ๊ฐœ๋ฐœ: ๋งŒ์•ฝ ํ…Œ์ด๋ธ”์— ํ•˜๋‚˜์˜ Column์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋ชจ๋“  SQL์˜ ๋ณ€๊ฒฝ(INSERT, UPDATE, SELECT ๋“ฑ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ฟผ๋ฆฌ์™€ ๋ฉ”์†Œ๋“œ)์ด ํ•„์š”ํ•˜๋‹ค. ๋…ผ๋ฆฌ์ ์ธ ๊ณ„์ธต ๋ถ„ํ• ์ด ์–ด๋ ต๊ฒŒ ๋œ๋‹ค.
  4. **๊ฐ์ฒด -RDB ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜ : ๊ฐ์ฒด๋Š” ์ถ”์ƒํ™”, ์ƒ์†, ๋‹คํ˜•์„ฑ(ํด๋ž˜์Šค, ๋ฉ”์†Œ๋“œ)**์˜ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ , RDB๋Š” ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์œผ๋กœ ์ด๋ค„์ ธ,RDB์— ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•จ
  5. ์ƒ์†: ๊ฐ์ฒด๋ž‘ ๋‹ค๋ฅด๊ฒŒ ํ…Œ์ด๋ธ”์€ ์ƒ์†์ด๋ผ๋Š” ๊ธฐ๋Šฅ์ด ์—†์–ด์„œ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์—ฌ๋Ÿฌ ์„ค์ •/์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•จ
  6. ์—ฐ๊ด€๊ด€๊ณ„: ๊ฐ์ฒด๋Š” ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐ, ํ…Œ์ด๋ธ”์€ ์™ธ๋ž˜ ํ‚ค๋กœ ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๊ณ  ์กฐ์ธ์œผ๋กœ ์—ฐ๊ด€ ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ•จ

๐Ÿ’ก์ด๋ฅผ ๊ทน๋ณตํ•œ JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

  • SQL ์ค‘์‹ฌ์ ์ธ ๊ฐœ๋ฐœ์—์„œ ๊ฐ์ฒด ์ค‘์‹ฌ์ ์ธ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ƒ์‚ฐ์„ฑ์ด ์ฆ๊ฐ€ํ•œ๋‹ค.
    • DDL๋ฌธ ์ž๋™ ์ƒ์„ฑ
    • ๊ฐ„๋‹จํ•œ ๋ฉ”์„œ๋“œ๋กœ CRUD๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.
    • SQL์„ ์ž‘์„ฑํ•˜๊ณ  JDBC API ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ณต์ ์ธ ์ผ์„ ๋Œ€์‹  ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.
  • ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ์‰ฝ๋‹ค.
    • ๊ธฐ์กด : ํ•„๋“œ ๋ณ€๊ฒฝ ์‹œ ๋ชจ๋“  SQL ์ˆ˜์ •
    • JPA : ํ•„๋“œ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค. SQL์€ JPA ๊ฐ€ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • Object์™€ RDB๊ฐ„์˜ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜ ํ•ด๊ฒฐ
    • ์ƒ์† / ์—ฐ๊ด€ ๊ด€๊ณ„ / ๊ฐ์ฒด-RDB ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.
    • JAVA์˜ ์กด์žฌํ•˜๋Š” ์ƒ์† ๊ด€๊ณ„๋ฅผ ๊ฐ์ฒด์˜ ์ƒ์† ๊ด€๊ณ„๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ JPA๋Š” ์•„๋ž˜ ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐ

JPA์˜ DB ์ƒ์† ๊ด€๊ณ„

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

โ–ถ  JPA ์˜ ์žฅ / ๋‹จ์ 

์žฅ์ 

  • SQL๋ฌธ์ด ์•„๋‹Œ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ DB ์กฐ์ž‘์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ๋ฐœ์ž๋Š” ๊ฐ์ฒด ๋ชจ๋ธ์„ ์ด์šฉํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ๋งŒ ์ง‘์ค‘์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.
  • Query์™€ ๊ฐ™์ด ํ•„์š”ํ•œ ์„ ์–ด๋ฌธ / ํ• ๋“ฑ๋“ฑ์˜ ๋ถ€์ˆ˜์ ์ธ ์ฝ”๋“œ๊ฐ€ ์ค„์–ด๋“ค์–ด ๊ฐ์ข… ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๋ณ„๋„๋กœ ์ž‘์„ฑํ•˜์—ฌ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.
  • ์œ ์ง€ ๋ณด์ˆ˜ ๋ฐ ๋ฆฌํŒฉํ† ๋ง์— ์œ ๋ฆฌํ•˜๋‹ค.

 

๋‹จ์ 

  • ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ํฌ๊ณ  ๋ณต์žกํ•˜์—ฌ ์„ค๊ณ„๊ฐ€ ์ž˜๋ชป๋œ ๊ฒฝ์šฐ์—๋Š” ์†๋„ ์ €ํ•˜ ๋ฐ ์ผ๊ด€์„ฑ์„ ๋ฌด๋„ˆ๋œจ๋ฆฌ๋Š” ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ( ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ Query๋กœ ์ธํ•ด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜๊ธฐ๋„ ํ•จ )
  • ๋ณต์žกํ•˜๊ณ  ๋ฌด๊ฑฐ์šด Query๋ฌธ์€ ์†๋„๋ฅผ ์œ„ํ•ด ๋ณ„๋„์˜ ํŠœ๋‹์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ SQL๋ฌธ์„ ์“ฐ๋Š”๊ฒŒ ๋‚˜์€ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • ํ•™์Šต ๋น„์šฉ์ด ๋น„์‹ธ๊ณ  ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค.

 

 

 

**์ถ”๊ฐ€ JPA ๊ด€๋ จ ์šฉ์–ด**

 

โ€ป ORM( Object - Relational Mapping )

  • ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ Mapping( ์—ฐ๊ฒฐ ) ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ⇒ ํด๋ž˜์Šค ์‚ฌ์šฉ / ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ⇒ ํ…Œ์ด๋ธ” ์‚ฌ์šฉ
  • ๊ฐ์ฒด ๋ชจ๋ธ๊ณผ ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ ๊ฐ„์˜ ์กด์žฌํ•˜๋Š” ๋ถˆ์ผ์น˜๋ฅผ ORM์„ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ SQL์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋ถˆ์ผ์น˜ ํ•ด๊ฒฐํ•œ๋‹ค.

 

โ€ป Hibernate

  • : JPA ๊ตฌํ˜„์ฒด์˜ ํ•œ ์ข…๋ฅ˜๋กœ, (DataNucleus, EclipseLink๋“ฑ ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด๋„ ์กด์žฌ): JPA๊ฐ€ DB์™€ ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด๊ณ  Hibernate๋Š” ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

 

๐Ÿ”Ž Spring Data JPARepository๋ฅผ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋” ์‰ฌ์šด ๋ฐฉ๋ฒ•(Repository ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” EntityManager์„ ์‚ฌ์šฉ)

  • JPA๋ฅผ ํŽธํ•˜๊ฒŒ ์“ฐ๊ธฐ ์œ„ํ•œ ๋ชจ๋“ˆ

 

๐Ÿ”Ž JPQL์ด๋ž€JPQL์€ DB SQL์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ๊ฐ์ฒด ์ง€ํ–ฅ SQL์ด๋ผ ๋ณด๋ฉด ๋œ๋‹ค.

  • ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ฟผ๋ฆฌ (๋ฐ˜๋ฉด SQL์€ ํ…Œ์ด๋ธ”์„ ๋Œ€์ƒ์œผ๋กœ ์ฟผ๋ฆฌ)
  • nativeQuery = true → SQL
  • nativeQuery = false (default) → JPQL

 

๐Ÿ”Ž query DSL

query DSL์ •์  ํƒ€์ž…์„ ์ด์šฉํ•ด์„œ SQL, JPQL์„ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์˜คํ”ˆ์†Œ์Šค ๋นŒ๋” API

  • query DSL์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์ ์€ ๋šœ๋ ทํ•˜๋‹ค.๊ธฐ์กด ๋ฐฉ์‹(Mybatis, JPQL, etc..)์€ ๋ชจ๋‘ ๋ฌธ์ž์—ด(=String) ํ˜•ํƒœ๋กœ ์ฟผ๋ฆฌ๊ฐ€ ์ž‘์„ฑ๋˜์—ˆ๊ณ  ์ด๋กœ ์ธํ•ด Compile ๋‹จ๊ณ„์—์„œ Type-Check ๋ถˆ๊ฐ€ํ–ˆ๋‹ค.์ด๋Ÿฌํ•œ risk๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด query DSL์ด ๋“ฑ์žฅํ–ˆ๊ณ  ์ด๋ฅผ ํ†ตํ•ด Compile ๋‹จ๊ณ„์—์„œ Type-check๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„ ๊ฒƒ์ด๋‹ค.
  • JPQL์— ๋Œ€ํ•œ ๋ณด์™„์„ ์œ„ํ•ด ๋‚˜์˜จ ๊ฒƒ์ด query DSL์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.