Home > Spring > πŸƒ[Spring] JPAλ₯Ό μ‚¬μš©ν•˜λŠ” 이유.

πŸƒ[Spring] JPAλ₯Ό μ‚¬μš©ν•˜λŠ” 이유.
Spring Framework

πŸƒ[Spring] JPAλ₯Ό μ‚¬μš©ν•˜λŠ” 이유.

  • JPA(Java Persistence API) λ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” 주둜 λ°μ΄ν„°λ² μ΄μŠ€μ™€ 객체 κ°„μ˜ μƒν˜Έμž‘μš©μ„ 효율적으둜 μ²˜λ¦¬ν•˜κ³ , 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP) 을 λ°μ΄ν„°λ² μ΄μŠ€μ— μ‰½κ²Œ μ μš©ν•˜κΈ° μœ„ν•΄μ„œ μž…λ‹ˆλ‹€.
  • JPAλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ„ λ‹¨μˆœν™”ν•˜κ³ , κ°œλ°œμžκ°€ λ°μ΄ν„°λ² μ΄μŠ€μ— 의쑴적인 SQL 쿼리λ₯Ό 직접 μž‘μ„±ν•˜λŠ” λŒ€μ‹ , 객체 λͺ¨λ“€μ„ 톡해 데이터λ₯Ό 관리할 수 있게 ν•΄μ€λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈ μ†Œν”„νŠΈμ›¨μ–΄ κ³΅ν•™μ—μ„œμ˜ λͺ¨λ“ˆ
πŸ™‹β€β™‚οΈ λͺ¨λ“ˆκ³Ό μ»΄ν¬λ„ŒνŠΈλ₯Ό 레고 블둝에 λΉ„μœ ν•΄λ³΄λ©΄?!

1️⃣ JPAλ₯Ό μ‚¬μš©ν•˜λŠ” μ£Όμš” 이유.

1. 객체-관계 λ§€ν•‘(ORM, Object-Relational Mapping) 지원.

  • JPAλŠ” ORM(Object-Relational Mapping) ν‘œμ€€μ„ μ œκ³΅ν•©λ‹ˆλ‹€.
  • ORM을 μ‚¬μš©ν•˜λ©΄ 객체와 λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ” κ°„μ˜ λ³€ν™˜μ„ μžλ™ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 즉, λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν–‰(row)을 객체둜 λ§€ν•‘ν•˜κ³ , 객체의 속성을 λ°μ΄ν„°λ² μ΄μŠ€μ˜ μ—΄(column)κ³Ό μ—°κ²°ν•©λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 κ°œλ°œμžλŠ” SQL 쿼리 μž‘μ„±μ— μ‹ κ²½ μ“°μ§€ μ•Šκ³ , 객체 μ§€ν–₯적으둜 데이터λ₯Ό μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2. λ°μ΄ν„°λ² μ΄μŠ€ 독립성.

  • JPAλŠ” λ°μ΄ν„°λ² μ΄μŠ€ 밴더에 쒅속적이지 μ•Šμ€ 좔상화 계측을 μ œκ³΅ν•©λ‹ˆλ‹€.
  • JPAλ₯Ό μ‚¬μš©ν•˜λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ νŠΉμ • λ°μ΄ν„°λ² μ΄μŠ€μ— μ˜μ‘΄ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ, λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό κ΅μ²΄ν•˜κ±°λ‚˜ 닀쀑 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•  λ•Œλ„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œλ₯Ό 크게 λ³€κ²½ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, MySQLμ—μ„œ PostgreSQL둜 μ „ν™˜ν•΄λ„ JPA의 μ„€μ •λ§Œ λ³€κ²½ν•˜λ©΄ λŒ€λΆ€λΆ„μ˜ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³  μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈ DIP의 μ •μ˜μ—μ„œ λ§ν•˜λŠ” β€˜μΆ”μƒν™”λœ 것’과 β€˜μΆ”μƒν™”β€™μ˜ κ°œλ…μ˜ 차이점.

3. SQL μž‘μ„± λΆ€λ‹΄ κ°μ†Œ.

  • JPAλŠ” 데이터λ₯Ό 쑰회, μ €μž₯, μˆ˜μ •, μ‚­μ œν•˜λŠ” 데 ν•„μš”ν•œ SQL 쿼리λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•΄μ€λ‹ˆλ‹€.
  • κ°œλ°œμžκ°€ 직접 SQL을 μž‘μ„±ν•˜μ§€ μ•Šμ•„λ„ 되고, 객체 μ§€ν–₯적으둜 데이터 처리λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 κ°œλ°œμžλŠ” λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ— 집쀑할 수 있으며, λ³΅μž‘ν•œ SQL μž‘μ„±μ˜ 뢀담을 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

4. λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ 관리.

  • JPAλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•˜κ±°λ‚˜ μ—…λ°μ΄νŠΈν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 κ°œλ°œμžλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œλ§ŒμœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ„ μžλ™μœΌλ‘œ μƒμ„±ν•˜κ±°λ‚˜ κ°±μ‹ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹œμž‘λ  λ•Œ λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ„ μžλ™μœΌλ‘œ μƒμ„±ν•˜κ³ , μƒˆλ‘œμš΄ μ—”ν‹°ν‹°(객체)λ₯Ό μΆ”κ°€ν•˜λ©΄ 그에 따라 λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό μžλ™μœΌλ‘œ μ—…λ°μ΄νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€.

5. 캐싱 지원.

  • JPAλŠ” 1μ°¨ μΊμ‹œμ™€ 2μ°¨ μΊμ‹œλ₯Ό μ œκ³΅ν•˜μ—¬ μ„±λŠ₯을 μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 1μ°¨ μΊμ‹œλŠ” μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ(Entity Manager)κ°€ κ΄€λ¦¬ν•˜λŠ” μΊμ‹œλ‘œ, λ™μΌν•œ νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ 이미 쑰회된 μ—”ν‹°ν‹°λŠ” λ‹€μ‹œ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ‘°νšŒν•˜μ§€ μ•Šκ³  μΊμ‹œμ—μ„œ κ°€μ Έμ˜΅λ‹ˆλ‹€.
  • 2μ°¨ μΊμ‹œλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „μ²΄μ—μ„œ κ³΅μœ λ˜λŠ” μΊμ‹œλ‘œ, μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„±λŠ₯을 λ†’μ΄λŠ” 데 도움을 μ€λ‹ˆλ‹€.

6. νŠΈλžœμž­μ…˜ 관리.

  • JPAλŠ” νŠΈλžœμž­μ…˜ 관리λ₯Ό λ‹¨μˆœν™”ν•©λ‹ˆλ‹€.
  • JPAλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ„ νŠΈλžœμž­μ…˜μœΌλ‘œ λ¬Άμ–΄μ£ΌκΈ° λ•Œλ¬Έμ—, νŠΈλžœμž­μ…˜μ΄ μ™„λ£Œλ˜λ©΄ λͺ¨λ“  λ³€κ²½ 사항이 μ›μžμ μœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€μ— λ°˜μ˜λ˜κ±°λ‚˜ λ‘€λ°±λ©λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 데이터 일관성과 무결성을 보μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

7. Lazy Loadingκ³Ό Eager Loading.

  • JPAλŠ” μ—°κ΄€λœ μ—”ν‹°ν‹°λ₯Ό μ§€μ—° λ‘œλ”©(Lazy Loading) ν•˜κ±°λ‚˜ μ¦‰μ‹œ λ‘œλ”©(Eager Loading) ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • Lazy Loading은 μ—°κ΄€λœ 데이터λ₯Ό ν•„μš”ν•  λ•Œλ§Œ κ°€μ Έμ˜€κ³ , Eager Loading은 μ¦‰μ‹œ λͺ¨λ“  μ—°κ΄€ 데이터λ₯Ό ν•œκΊΌλ²ˆμ— κ°€μ Έμ˜΅λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„±λŠ₯을 μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

8. JPQL(Java Persistence Query Language).

  • JPAλŠ” JPQL(Java Persistence Query Language) μ΄λΌλŠ” 객체 μ§€ν–₯ μ–Έμ–΄λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  • JPQL은 λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ” λŒ€μ‹  μ—”ν‹°ν‹° 객체 λ₯Ό λŒ€μƒμœΌλ‘œ 쿼리λ₯Ό μž‘μ„±ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 SQL처럼 λ°μ΄ν„°λ² μ΄μŠ€ 쒅속적인 쿼리 λŒ€μ‹ , 객체λ₯Ό λŒ€μƒμœΌλ‘œ ν•œ 쿼리λ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, SQL이 μ•„λ‹Œ 객체 기반으둜 μž‘μ„±λœ JPQL 쿼리

SELECT u FROM User u WHERE u.age > 20
  • μœ„ μΏΌλ¦¬λŠ” User 객체λ₯Ό λŒ€μƒμœΌλ‘œ ν•˜λ©°, λ°μ΄ν„°λ² μ΄μŠ€μ— μ˜μ‘΄ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

9. μœ μ—°ν•œ 관계 λ§€ν•‘.

  • JPAλŠ” λ‹€μ–‘ν•œ λ°μ΄ν„°λ² μ΄μŠ€ 관계λ₯Ό 객체둜 λ§€ν•‘ν•˜λŠ” 방법을 μ§€μ›ν•©λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, 1λŒ€1, 1λŒ€λ‹€, λ‹€λŒ€μΌ, λ‹€λŒ€λ‹€ 관계λ₯Ό 객체 μ§€ν–₯적으둜 ν‘œν˜„ν•  수 있으며, μ™Έλž˜ ν‚€(foreign key)와 같은 λ°μ΄ν„°λ² μ΄μŠ€ 관계λ₯Ό 객체 κ°„μ˜ 참쑰둜 μžμ—°μŠ€λŸ½κ²Œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

10. ν‘œμ€€ν™”λœ API.

  • JPAλŠ” μžλ°” EE의 ν‘œμ€€ API이기 λ•Œλ¬Έμ—, μ—¬λŸ¬ κ΅¬ν˜„μ²΄λ“€(Hibernate, EclipseLink λ“±)μ—μ„œ λ™μΌν•œ API둜 λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ΄λŠ” κ°œλ°œμžλ“€μ΄ νŠΉμ • κ΅¬ν˜„μ²΄μ— μ’…μ†λ˜μ§€ μ•Šκ³  μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ„λ‘ ν•΄μ€λ‹ˆλ‹€.

2️⃣ κ²°λ‘ .

  • JPAλ₯Ό μ‚¬μš©ν•˜λ©΄ 객체 μ§€ν–₯적으둜 λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έμž‘μš©ν•  수 μžˆμ–΄, κ°œλ°œμžλŠ” SQL μž‘μ„± 및 λ°μ΄ν„°λ² μ΄μŠ€ 쒅속성을 쀄이고, λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ— 집쀑할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ˜ν•œ λ°μ΄ν„°λ² μ΄μŠ€ 독립성, νŠΈλžœμž­μ…˜ 관리, 캐싱과 같은 κΈ°λŠ₯을 톡해 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„±λŠ₯κ³Ό μœ μ§€λ³΄μˆ˜μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.
  • JPQLκ³Ό 같은 쿼리 μ–Έμ–΄λ₯Ό 톡해 객체 μ€‘μ‹¬μœΌλ‘œ 데이터 쑰회 및 관리λ₯Ό ν•  수 있으며, λ‹€μ–‘ν•œ λ°μ΄ν„°λ² μ΄μŠ€ 관계λ₯Ό μ‰½κ²Œ λ§€ν•‘ν•  수 μžˆλŠ” μž₯점도 μ œκ³΅ν•©λ‹ˆλ‹€.

JPAλŠ” 좔상화 계측을 μ œκ³΅ν•˜μ—¬ 객체 μ§€ν–₯ 섀계와 λ°μ΄ν„°λ² μ΄μŠ€ κ°„μ˜ 간극을 쀄이고, 개발 생산성을 크게 높일 수 μžˆλŠ” λ„κ΅¬μž…λ‹ˆλ‹€.