Trudy | ์†ก์—ฐ 2023. 12. 21. 00:43

๐Ÿ“ORM (Object Relational Mapping)

ORM(Object Relational Mapping, ๊ฐ์ฒด ๊ด€๊ณ„ ๋งคํ•‘)์€ ๊ฐ์ฒด์™€ DB์˜ ํ…Œ์ด๋ธ”์„ ๋งคํ•‘ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ  
์ฆ‰, ๊ฐ์ฒด๊ฐ€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”์ด ๋˜๋„๋ก ๋งคํ•‘ ์‹œ์ผœ์ค€๋‹ค. (@Entity๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด ํ…Œ์ด๋ธ” ์ƒ์„ฑ)

 

- ORM์„ ์ด์šฉํ•˜๋ฉด SQL Query๊ฐ€ ์•„๋‹Œ ๋ฉ”์„œ๋“œ๋กœ DB์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ ๊ฐ€๋Šฅ

 

- ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์ด์˜ ๋ถˆ์ผ์น˜๋ฅผ ํ•ด๊ฒฐ(๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„ = ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„)

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

 

์žฅ์ 

  1. ๊ฐ์ฒด-ํ…Œ์ด๋ธ” ๋งคํ•‘(Object-Relational Mapping): ORM์€ Java๋‚˜ ๋‹ค๋ฅธ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด์˜ ํด๋ž˜์Šค์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ” ๊ฐ„์— ๋งคํ•‘์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ ˆ์ฝ”๋“œ๋กœ, ํด๋ž˜์Šค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ด€๊ณ„๋กœ ํˆฌ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. CRUD ์ž‘์—…์˜ ๋‹จ์ˆœํ™”: ORM์€ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ƒ์„ฑ(Create), ์ฝ๊ธฐ(Read), ๊ฐฑ์‹ (Update), ์‚ญ์ œ(Delete)์™€ ๊ฐ™์€ ์ž‘์—…์„ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ORM์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋“ค์€ SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
  4. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋…๋ฆฝ์„ฑ: ORM์€ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ข…์†๋˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์–ด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณ€๊ฒฝ ์‹œ์—๋„ ์ฝ”๋“œ ์ˆ˜์ •์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ORM์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ค‘๊ฐ„ ๊ณ„์ธต์œผ๋กœ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ข…์†์„ฑ์„ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“JPA(Java Persistence API)

Java์—์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ Java ORM(Object-Relational Mapping) ํ”„๋ ˆ์ž„์›Œํฌ

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

ex) Hibernate, TopLink, Eclipselink

 

JPA๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์š” ๊ฐœ๋…๊ณผ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  1. Entity(์—”ํ‹ฐํ‹ฐ): ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. @Entity ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ํด๋ž˜์Šค๋ฅผ ์—”ํ‹ฐํ‹ฐ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. EntityManager(์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €): JPA์—์„œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—”ํ‹ฐํ‹ฐ์˜ CRUD(Create, Read, Update, Delete) ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. Persistence Unit(์˜์†์„ฑ ์œ ๋‹›): ์—”ํ‹ฐํ‹ฐ๋“ค์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. persistence.xml ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด๋‚˜ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ์ •๋ณด ๋“ฑ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  4. JPQL(Java Persistence Query Language): SQL๊ณผ ๋น„์Šทํ•œ ๋ฌธ๋ฒ•์„ ๊ฐ€์ง„ ๊ฐ์ฒด ์ง€ํ–ฅ ์ฟผ๋ฆฌ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ข…์†์„ฑ์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค.

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



 

๐Ÿ“ Spring Data JPA


์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” JPA ์ค‘์—์„œ Hibernate๋ผ๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉ
Spring Data JPA๋Š” ์ด๋Ÿฐ Hibernate๋ฅผ ์ข€ ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€์ ์ธ API๋“ค์„ ์ œ๊ณต

Spring Data JPA๊ฐ€ DB์— ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ณผ์ •
Spring Data JPA <-> Hibernate <-> JDBC <-> DB