๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐‘†๐‘ข๐‘›๐‘ โ„Ž๐‘–๐‘›๐‘’ ๐‘Ž๐‘“๐‘ก๐‘’๐‘Ÿ ๐‘Ÿ๐‘Ž๐‘–๐‘›โœง

[Spring] JPA, ORM ๋ณธ๋ฌธ

JPA(Java Persistence API)

  • Java ์ง„์˜์—์„œ ORM(Object-Relational Mapping) ๊ธฐ์ˆ  ํ‘œ์ค€์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ชจ์Œ
  • ์ธํ„ฐํŽ˜์ด์Šค ์ด๊ธฐ ๋•Œ๋ฌธ์— Hibernate, OpenJPA ๋“ฑ์ด JPA๋ฅผ ๊ตฌํ˜„ํ•จ

 

ORM(Object-Relational Mapping)

  • Object Relational Mapping = ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํ•‘
  • ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋งคํ•‘(์—ฐ๊ฒฐ)
  • ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ฐจ์ด๋กœ ๋ฐœ์ƒํ•˜๋Š” ์ œ์•ฝ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•ด์ฃผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰
  • persistent API๋ผ๊ณ ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

     

 

์œ„์˜ ์‚ฌ์ง„์„ ๋ณด๋ฉด ๋ฉค๋ฒ„ ํ…Œ์ด๋ธ”์˜ ๋„ค์ž„์€ ๋ฉค๋ฒ„ ๊ฐ์ฒด์˜ ๋„ค์ž„ ํ•„๋“œ์— ๋งคํ•‘๋˜๋ฉด ๋  ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒ์„ ORM์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ์ฒด ๋ชจ๋ธ๊ณผ ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ ๊ฐ„์— ๋ถˆ์ผ์น˜๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ ์ปดํ“จํ„ฐ๋Š” ORM์„ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ SQL์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋ถˆ์ผ์น˜๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ์ดํ„ฐ <—๋งคํ•‘—> Object ํ•„๋“œ ํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ• ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ORM์ด ์—†๋‹ค๋ฉด select ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ฐ›์€ ๊ฒฐ๊ณผ๊ฐ’๋“ค์„ ์ผ์ผ์ด ์–ด๋–ค ์ •๋ณด์ธ์ง€ ๋งคํ•‘ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

ORM ์žฅ์ 

 

  • SQL ์ฟผ๋ฆฌ๊ฐ€ ์•„๋‹Œ ์ง๊ด€์ ์ธ ์ฝ”๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.(๋ง ๊ทธ๋Œ€๋กœ ์ฟผ๋ฆฌ๋ฅผ ์งœ์ง€ ์•Š์•„์„œ)
    • ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณด๋‹ค ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Œ.
  • ์žฌ์‚ฌ์šฉ ๋ฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํŽธ๋ฆฌ
    • ORM์€ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ (ORM์ž์ฒด๊ฐ€ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋กœ ์ž‘์„ฑ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฑธ ๋‹ค๋ฅธ ๋ฐ์„œ ๊ฐ€์ ธ๋‹ค ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)
    • ๋งคํ•‘ ์ •๋ณด๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๊ณ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ณผ ํ•„์š”๊ฐ€ ์—†์Œ
  • DBMS์— ๋Œ€ํ•œ ์ข…์†์„ฑ์ด ์ค„์–ด๋“ฆ
    • DBMS๋ฅผ ๊ต์ฒดํ•˜๋Š” ์ž‘์—…์„ ๋น„๊ต์  ์ ์€ ๋ฆฌ์Šคํฌ๋กœ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ

 

 

โ€‹ORM์ด ์ „์ฒด์ ์ธ ๊ฐœ๋…์ด๋ผ๋ฉด JPA๋Š” ๊ทธ ๊ธฐ๋Šฅ์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์ •์˜ํ•œ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ORM(Object Relational Mapping)์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ง€์†์ ์œผ๋กœ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ API๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

 

 

JPA Provider


๊ฐœ๋ฐœ์ž๋“ค์€ Relational Object๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์“ฐ๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์„ ๊ฐ์†Œํ•˜๊ณ ์ž, JPA Provider ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

JPA Provider๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค ๊ฐ„ ์ƒํ˜ธ๊ด€๊ณ„๋ฅผ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•ด์ค๋‹ˆ๋‹ค.

 

  • Hibernate
    • ORM framework ์ค‘ ํ•˜๋‚˜
    • JPA์˜ ์‹ค์ œ ๊ตฌํ˜„์ฒด ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, ํ˜„์žฌ JPA ๊ตฌํ˜„์ฒด ์ค‘ ๋งŽ์ด ์‚ฌ์šฉ๋จ
    • JPA ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ, ๋‚ด๋ถ€์ ์œผ๋กœ JDBC API๋ฅผ ์‚ฌ์šฉ

 

JPA Provider


Spring Data JPA

 

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

 

JPA๋ฅผ ๊ตฌ์ฒดํ™”ํ•œ ๊ฒŒ Hibernate์ด๊ณ  ์ด hibernate๊ธฐ๋Šฅ ์ค‘ ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์„ ์ข€ ๋” ์‰ฝ๊ณ  ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ์ง€์›ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ spring data JPA์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” spring data JPA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—”ํ‹ฐํ‹ฐ์— ์ง์ ‘ ์ ‘๊ทผํ•˜์ง€ ์•Š์•„๋„ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ์„ ์ข€ ๋” ์‰ฝ๊ณ  ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

 

JPA/Hibernate์˜ ์žฅ์ 

 

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

 

 

์ •๋ฆฌ๋ฅผ ํ•˜์ž๋ฉด 
1. ORM์€ Application ๊ณผ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•ด์ค๋‹ˆ๋‹ค.
2. ์ž๋ฐ” ์ง„์˜์—์„œ๋Š” ORM์˜ ํ‘œ์ค€ ์ŠคํŽ™์œผ๋กœ JPA๋ผ๋Š” ๊ฒƒ์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •์˜ํ•˜์—ฌ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.
3. ํ•ด๋‹น JPA์˜ ์‹ค์ œ ๊ตฌํ˜„ ํด๋ž˜์Šค๋“ค์„ ๋ชจ์•„๋†“์€ ๊ฒƒ์„ Hibernate์ด๋‹ค.
4. ์ด ์ค‘์— ์ž์ฃผ ์“ฐ์ด๋Š” ๊ฒƒ์„ ์กฐ๊ธˆ ๋” ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋ฌถ์Œ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด Spring Data Jpa ์ด๋‹ค.

 

 

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

 

 

JPA๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ JDBC ์‚ฌ์ด์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๊ฐ€ JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, JPA ๋‚ด๋ถ€์—์„œ JDBC API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SQL์„ ํ˜ธ์ถœํ•˜์—ฌ DB์™€ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.

 

  • JDBC๋ž€?
    • JDBC๋Š” DB์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” API์ž…๋‹ˆ๋‹ค.
    • ๋ชจ๋“  JAVA Data Access ๊ธฐ์ˆ ์˜ ๊ทผ๊ฐ„์ž…๋‹ˆ๋‹ค.
    • ๋ชจ๋“  Persistance Framework๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ JDBC API๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

โ€‹

โ€‹

 

์ €์žฅ๊ณผ์ •

 

 

MemberDAO์—์„œ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ• ๋•Œ๋Š” ๊ฐœ๋ฐœ์ž๋Š” JPA์— Member ๊ฐ์ฒด๋ฅผ ๋„˜๊น๋‹ˆ๋‹ค.

JPA๋Š”

1. Member ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.

2. INSERT SQL์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

3. JDBC API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SQL์„ DB์— ๋‚ ๋ฆฝ๋‹ˆ๋‹ค.

โ€‹

 

์กฐํšŒ ๊ณผ์ •

Member ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•  ๋•Œ๋Š”๊ฐœ๋ฐœ์ž๋Š” Member์˜ pk ๊ฐ’์„ JPA์— ๋„˜๊น๋‹ˆ๋‹ค.

JPA๋Š”

1. ์—”ํ‹ฐํ‹ฐ์˜ ๋งคํ•‘ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ ์ ˆํ•œ SELECT SQL์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

2. JDBC API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SQL์„ DB์— ๋‚ ๋ฆฝ๋‹ˆ๋‹ค.

3. DB๋กœ๋ถ€ํ„ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์˜ต๋‹ˆ๋‹ค.

4. ๊ฒฐ๊ณผ(ResultSet)๋ฅผ ๊ฐ์ฒด์— ๋ชจ๋‘ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ๋ฅผ JPA๊ฐ€ ๋งŒ๋“ค์–ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— Object์™€ RMB ๊ฐ„์˜ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ€‹

 

โ€‹

 

 

 

 

[์ฐธ์กฐ]

https://www.youtube.com/watch?v=OiAYmtq4Av8 

https://beconstant.tistory.com/5

https://blog.naver.com/etnersrd/222484342478