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

Jin's Dev Story

[Spring Data JPA] ORM & SQL Mapper ๋ณธ๋ฌธ

Web & Android/Spring Data JPA

[Spring Data JPA] ORM & SQL Mapper

woojin._. 2023. 10. 14. 10:02

๐Ÿ’ก ์˜์†์„ฑ์ด๋ž€ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ–ˆ๋˜ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜๋”๋ผ๋„ ๋ฐ์ดํ„ฐ๋Š” ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š” ๊ฒƒ์„ ์˜๋ฏธ

  • ์˜์†์„ฑ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ → Persistene Framework
  • ์ข…๋ฅ˜๋กœ๋Š” SQL Mapper, ORM์ด ์žˆ์Œ

Persistene Framework

  • DB์™€์˜ ์—ฐ๋™๋˜๋Š” ์‹œ์Šคํ…œ์„ ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•˜๊ณ , ์•ˆ์ •์ ์ธ ๊ตฌ๋™์„ ๋ณด์žฅํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ
  • SpringBoot์™€ DB๋ฅผ ์ด์–ด์ฃผ๋Š” ์—ญํ•  (์˜์†์„ฑ ๋ถ€์—ฌ)

์žฅ์ 

1. ์žฌ์‚ฌ์šฉ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์— ์šฉ์ดํ•จ

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์ŠคMySQL, MariaDB ๋“ฑ) ์ข…๋ฅ˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋Š”๋ฐ, ๋งŒ์•ฝ DB๋ฅผ ๊ต์ฒดํ•˜๋”๋ผ๋„ Persistene Framework๋Š” ๊ทธ๋Œ€๋กœ ๋‘๊ณ  DB๋งŒ ๊ต์ฒดํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์žฌ์‚ฌ์šฉ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์— ์šฉ์ดํ•˜๋‹ค.

2. ์ฝ”๋“œ๊ฐ€ ์ง๊ด€์ ์ž„

  • Persistene Framework๊ฐ€ ์—†๋‹ค๋ฉด SpringBoot์™€ DB๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ถ€๋ถ„์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ „๋ถ€ ๊ด€๋ฆฌํ•ด์•ผ ํ•จ
1. if(db์™€ ์—ฐ๊ฒฐ๋˜์—ˆ๋‹ค๋ฉด),else
2. if(query๊ฐ€ ์ด์ƒํ•˜๋‹ค๋ฉด),else
3. db๊ฐ€ ์—ฐ๊ฒฐ ๋˜์–ด์žˆ๋Š”์ง€ ๊ณ„์† ํ™•์ธ       โžก๏ธ    1. Persistence Framework
4. if(db๊ฐ€ ๊ฐ‘์ž๊ธฐ ๋Š๊ฒผ๋‹ค๋ฉด),else
5. db์‚ฌ์šฉ ๋๋‚˜๋ฉด ์—ฐ๊ฒฐ ๋Š๊ธฐ

Persistene Framework ์ข…๋ฅ˜

SQL Mapper

  • SQL์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ž‘์„ฑ (ex. ”SELECT name FROM students”)
  • ๋งคํ•‘ : ์ฟผ๋ฆฌ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ ↔ ๊ฐ์ฒด
  • ๋‹จ์ 
    • DB ์ข…๋ฅ˜ ๋ณ€๊ฒฝ ์‹œ ์ฟผ๋ฆฌ ์ˆ˜์ • ํ•„์š”
    • ๋น„์Šทํ•œ ์ฟผ๋ฆฌ ๋ฐ˜๋ณต ์ž‘์„ฑ

ORM(Object Relation Mapping)

  • ์ฟผ๋ฆฌ ์—†์ด Obeject์™€ DB ํ…Œ์ด๋ธ” ๋งคํ•‘ (ex. student ๊ฐ์ฒด์™€ student ํ…Œ์ด๋ธ”์„ ๋งคํ•‘)
  • Java ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ SQL์ด ๋งŒ๋“ค์–ด์ง
  • ๋งคํ•‘ : DB ํ…Œ์ด๋ธ” ↔ ๊ฐ์ฒด
  • ๋‹จ์ 
    • ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ž๋ฐ” ๋ฉ”์„œ๋“œ ๋งŒ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ๋ถˆํŽธํ•จ

'The Object-Relational Impedance Mismatch’

๊ฐ์ฒด ๋ชจ๋ธ์„ ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ์— ์ €์žฅํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋กœ ์ฆ‰, ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜์—์„œ ์˜ค๋Š” ๋ฌธ์ œ (ํƒ€์ž…, ์—ฐ๊ด€์„ฑ, ์ƒ์† ๋ถˆ์ผ์น˜)

   → ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ๊ตํ™˜ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Œ

   → ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒŒ ORM

JDBC → SQL Mapper ์ค‘ ํ•˜๋‚˜

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐ ๋ฐ ์ž‘์—…์„ ํ•˜๊ธฐ ์œ„ํ•œ ์ž๋ฐ” ํ‘œ์ค€ **์ธํ„ฐํŽ˜์ด์Šค**
  • ์ž๋ฐ”๋Š” DB์˜ ์ข…๋ฅ˜์— ์ƒ๊ด€์—†์ด ํ•˜๋‚˜์˜ JDBC API๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•จ
  • DB์— ์ ‘๊ทผํ•ด์„œ ์‰ฝ๊ณ  ํšจ์œจ์ ์œผ๋กœ CRUD๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ณ ์„ฑ๋Šฅ์—์„œ์˜ ์„ธ๋ จ๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ ์‰ฝ๊ฒŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ
  • SpringBoot์™€ DB๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ (์ฟผ๋ฆฌ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑ)

MyBatis → SQL Mapper ์ค‘ ํ•˜๋‚˜

  • ์ž๋ฐ”์—์„œ SQL Mapper๋ฅผ ์ง€์›ํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ
  • SQL ๋ฌธ์„ ์ด์šฉํ•ด์„œ RDB์— ์ ‘๊ทผ, ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒดํ™” ์‹œ์ผœ์คŒ
  • SQL๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜์—ฌ ์ฟผ๋ฆฌ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฒด์™€ ํŒจ๋ฐ
  • ์ฟผ๋ฆฌ๋ฌธ์„ XML๋กœ ๋ถ„๋ฆฌ ๊ฐ€๋Šฅ

JPA → JAVA ORM ํ‘œ์ค€

  • JAVA ์˜์—ญ์—์„œ์˜ ORM์˜ ํ‘œ์ค€์„ ์ œ์‹œํ•˜๋Š” **์ธํ„ฐํŽ˜์ด์Šค**
  • ๋‚ด๋ถ€์ ์œผ๋กœ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ Entity๋ฅผ ๊ด€๋ฆฌํ•จ
  • ๋ณ€๊ฒฝ ๊ฐ์ง€๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๊ฐ€ Entity๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๊ทธ์— ๋งž๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ์“ฐ๊ธฐ ์ง€์—ฐ ๋ฐฉ์‹์„ ํ†ตํ•ด Query ์ €์žฅ์†Œ์— ์žˆ๋Š” Query๋“ค์„ ํ•œ ๋ฒˆ์— flush ์‹œํ‚ด์œผ๋กœ์จ Connection์„ ์ตœ์†Œํ™”ํ•ด ์„œ๋น„์Šค ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ
  • ์ธํ„ฐํŽ˜์ด์Šค๋ผ์„œ ์ด๋ฅผ ๊ตฌํ˜„ํ•  ๊ตฌํ˜„์ฒด ํ•„์š” → Hibernate

Hibernate → JPA๋ฅผ ๊ตฌํ˜„ํ•œ ORM ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜

  • Java ORM ๊ตฌ์กฐ์—์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋”ฐ๋กœ Query๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ์ด์œ ๋Š” ์ด Hibernate๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ Query๋ฅผ ์ƒ์„ฑํ•˜๊ณ  JDBC API๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ
  • ๋‹ค๋งŒ ์ƒ์„ฑ๋˜๋Š” Query๊ฐ€ ๋ชจ๋“  ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์—†์–ด, ๊ฐœ๋ฐœ์ž ๋ณธ์ธ์ด ๋Šฅ๋™์ ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์žˆ์Œ → Spring Data JPA

Spring Data JPA

  • JPA๋ฅผ ํ•œ๋‹จ๊ณ„ ๋” ์ถ”์ƒํ™” ์‹œํ‚จ Repository ๋ผ๋Š” ๊ฐœ๋…์„ ์ œ์‹œํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ Repository Interface์— JpaRepository๋ฅผ ์ƒ์†ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์‚ฌ์šฉ ์‹œ์ ์— Spring์ด ์•Œ์•„์„œ ๊ตฌํ˜„ํ™” ๋œ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•ด์คŒ
  • Repository Interface ๋‚ด๋ถ€์—์„œ ์ž‘์„ฑ๋œ ๋ฉ”์„œ๋“œ ๋˜ํ•œ Spring์ด ์ ํ•ฉํ•œ Query๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ „์†กํ•˜๋„๋ก ํ•ด์คŒ

JPA์™€ MyBatis์˜ ์ฐจ์ด์ 

  • DB์™€์˜ ์ƒํ˜ธ์ž‘์šฉ ๋ฐฉ์‹
  • MyBatis
    • ๊ฐœ๋ฐœ์ž๊ฐ€ SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•ด์„œ ์‚ฌ์šฉ
    • ๋ฐ์ดํ„ฐ ๋งคํ•‘์„ ์œ„ํ•ด XML ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ
  • JPA
    • ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์˜ ๋งคํ•‘ ์ œ๊ณต
    • JPQL์„ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•จ

⇒ JPA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์„ ๊ฐ„์†Œํ™”ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Œ

 

 

์ฐธ๊ณ 

 

[Spring] SQL Mapper, ORM ๊ฐœ๋… ์ดํ•ดํ•˜๊ธฐ

Persistence(์˜์†์„ฑ)์ด๋ž€ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ–ˆ๋˜ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜๋”๋ผ๋„ ๋ฐ์ดํ„ฐ๋Š” ์‚ฌ๋ผ์ง€์ง€์•Š๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.์˜ˆ๋ฅผ๋“ค์–ด, ์ผ์ •๊ด€๋ฆฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•˜๋‹ค ์ข…๋ฃŒํ•˜๋”๋ผ๋„ ์ €์žฅํ–ˆ๋˜ ์ผ์ •๋“ค์ด ์‚ฌ๋ผ

velog.io

 

'Web & Android > Spring Data JPA' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Spring Data JPA] Querydsl  (0) 2023.10.15
[Spring Data JPA] @Query  (0) 2023.10.14
[Spring Data JPA] JPA  (0) 2023.10.14
[Spring Data JPA] QueryMethod  (0) 2023.10.14
[Spring Data JPA] ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ  (1) 2023.10.14