Home > Spring > πŸƒ[Spring] JPAλž€ λ¬΄μ—‡μΈκ°€μš”?

πŸƒ[Spring] JPAλž€ λ¬΄μ—‡μΈκ°€μš”?
Spring Framework

πŸƒ[Spring] JPAλž€ λ¬΄μ—‡μΈκ°€μš”?

  • JPA(Java Persistence API) λŠ” μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έμž‘μš©ν•˜κΈ° μœ„ν•œ ORM(Objcet-Relational Mapping) ν‘œμ€€ μž…λ‹ˆλ‹€.
  • JPAλŠ” μžλ°” 객체와 λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ” κ°„μ˜ 맀핑을 μžλ™μœΌλ‘œ μ²˜λ¦¬ν•˜μ—¬, κ°œλ°œμžκ°€ SQL 쿼리λ₯Ό 직접 μž‘μ„±ν•˜μ§€ μ•Šκ³ λ„ λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.
  • JPAλŠ” μžλ°” EE(Enterprise Edition) 의 곡식 슀팩 쀑 ν•˜λ‚˜μ΄λ©°, μ—¬λŸ¬ κ΅¬ν˜„μ²΄(Hibernate, EclipseLink, OpenJPA λ“±)듀이 JPA ν‘œμ€€μ„ λ”°λ¦…λ‹ˆλ‹€.

1️⃣ JPA의 μ£Όμš” κ°œλ….

1. 객체-관계 맀핑(ORM, Object-Relational Mapping).

  • JPAλŠ” ORM(Object-Relational Mapping) 을 톡해 μžλ°” 객체λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ— μžλ™μœΌλ‘œ λ§€ν•‘ν•©λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 μžλ°” 객체와 λ°μ΄ν„°λ² μ΄μŠ€ κ°„μ˜ λ³€ν™˜μ„ μˆ˜λ™μœΌλ‘œ μ²˜λ¦¬ν•  ν•„μš” 없이, 객체 지ν–₯적으둜 λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • ORM은 κ°œλ°œμžκ°€ 직접 SQL을 μž‘μ„±ν•˜μ§€ μ•Šκ³ λ„ μžλ°” 객체λ₯Ό μ‘°μž‘ν•¨μœΌλ‘œμ¨ 데이터λ₯Ό μ²˜λ¦¬ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.

2. μ˜μ†μ„±(Persistence).

  • JPAμ—μ„œ μ˜μ†μ„±μ€ μžλ°” 객체λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 과정을 μ˜λ―Έν•©λ‹ˆλ‹€.
  • JPAλŠ” μ—”ν‹°ν‹°(Entity)λΌλŠ” 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό κ΄€λ¦¬ν•˜λ©°, μ—”ν‹°ν‹° κ°μ²΄λŠ” νŠΉμ • λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ˜ ν–‰(row)에 λ§€ν•‘λ©λ‹ˆλ‹€.
  • μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ(Persistence Context) λŠ” μ—”ν‹°ν‹° 객체λ₯Ό κ΄€λ¦¬ν•˜λŠ” κ³΅κ°„μœΌλ‘œ, 객체의 μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜κ³  λ³€κ²½ 사항을 λ°μ΄ν„°λ² μ΄μŠ€μ— λ°˜μ˜ν•©λ‹ˆλ‹€.

3. μ—”ν‹°ν‹°(Entity).

  • JPAμ—μ„œ μ—”ν‹°ν‹°λŠ” λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν…Œμ΄λΈ”μ— λŒ€μ‘ν•˜λŠ” μžλ°” ν΄λž˜μŠ€μž…λ‹ˆλ‹€.
  • μ—”ν‹°ν‹° ν΄λž˜μŠ€λŠ” λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν…Œμ΄λΈ”μ„ λͺ¨λΈλ§ν•˜λ©°, 각 μΈμŠ€ν„΄μŠ€λŠ” λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ˜ ν•œ ν–‰(row)에 λŒ€μ‘λ©λ‹ˆλ‹€.
  • μ—”ν‹°ν‹° ν΄λž˜μŠ€λŠ” @Entity μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ μ„ μ–Έλ˜λ©°, ν…Œμ΄λΈ”μ˜ μ—΄(column)은 클래슀의 ν•„λ“œλ‘œ λ§€ν•‘λ©λ‹ˆλ‹€.

μ˜ˆμ‹œ

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    private String email;
    
    // Getters, Setters, Constructors
}

4. JPQL(Java Persistence Query Language).

  • JPAλŠ” JPQLμ΄λΌλŠ” 쿼리 μ–Έμ–΄λ₯Ό μ œκ³΅ν•˜λ©°, 이λ₯Ό 톡해 λ°μ΄ν„°λ² μ΄μŠ€μ— 질의λ₯Ό μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • JPQL은 SQLκ³Ό μœ μ‚¬ν•˜μ§€λ§Œ, SQL이 λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ„ λŒ€μƒμœΌλ‘œ ν•˜λŠ” 반면, JPQL은 객체λ₯Ό λŒ€μƒμœΌλ‘œ ꢈ리λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 λ°μ΄ν„°λ² μ΄μŠ€μ— μ’…μ†λ˜μ§€ μ•Šκ³  객체 μ€‘μ‹¬μœΌλ‘œ 데이터 μ‘°μž‘μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ

SELECT u FROM User u WHERE u.name = 'Kobe'
  • μœ„ JPQL μΏΌλ¦¬λŠ” User μ—”ν‹°ν‹° 객체λ₯Ό λŒ€μƒμœΌλ‘œ 데이터λ₯Ό μ‘°νšŒν•˜λŠ” μΏΌλ¦¬μž…λ‹ˆλ‹€.

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

  • JPAλŠ” νŠΈλžœμž­μ…˜μ„ κ΄€λ¦¬ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ˜ 일관성과 μ•ˆμ „μ„±μ„ 보μž₯ν•©λ‹ˆλ‹€.
  • νŠΈλžœμž­μ…˜μ€ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 일련의 μž‘μ—…μ΄ λͺ¨λ‘ μ„±κ³΅ν•˜κ±°λ‚˜ λͺ¨λ‘ μ‹€ν•΄ν•˜λŠ” 것을 보μž₯ν•˜λŠ” λ©”μ»€λ‹ˆμ¦˜μœΌλ‘œ, JPAλŠ” 이λ₯Ό μžλ™μœΌλ‘œ κ΄€λ¦¬ν•΄μ€λ‹ˆλ‹€.
  • νŠΈλžœμž­μ…˜μ΄ μ™„λ£Œλ˜λ©΄ JPAλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ— λͺ¨λ“  λ³€κ²½ 사항을 λ°˜μ˜ν•˜λ©°, λ¬Έμ œκ°€ λ°œμƒν•˜λ©΄ λ‘€λ°±ν•©λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈ νŠΈλžœμž­μ…˜μ˜ μ˜λ―Έμ™€ μ—­ν• 

6. μ˜μ†μ„± μœ λ‹›(Persistence Unit).

  • μ˜μ†μ„± μœ λ‹›μ€ JPAκ°€ λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έμž‘μš©ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ μ„€μ • 정보(λ°μ΄ν„°λ² μ΄μŠ€ URL, μ‚¬μš©μž 정보, λ“œλΌμ΄λ²„ λ“±)λ₯Ό λ‹΄κ³  μžˆλŠ” 논리적 λ‹¨μœ„μž…λ‹ˆλ‹€.
  • JPAλŠ” 이 μ˜μ†μ„± μœ λ‹›μ„ 톡해 λ°μ΄ν„°λ² μ΄μŠ€μ™€ 연결을 λ§Ίκ³ , ν•„μš”ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • μ˜μ†μ„± μœ λ‹›μ€ persistence.xml νŒŒμΌμ„ 톡해 μ„€μ •λ˜λ©°, λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μ—°κ²° 정보가 ν¬ν•¨λ©λ‹ˆλ‹€.

7. 캐싱.

  • JPAλŠ” μ„±λŠ₯ μ΅œμ ν™”λ₯Ό μœ„ν•΄ 1μ°¨ 캐싱(μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ—μ„œ 관리)와 2μ°¨ μΊμ‹œλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  • 1μ°¨ μΊμ‹œλŠ” νŠΈλžœμž­μ…˜ λ²”μœ„ λ‚΄μ—μ„œ λ™μΌν•œ μ—”ν‹°ν‹°λ₯Ό μ‘°νšŒν•  λ•Œ λ‹€μ‹œ λ°μ΄ν„°λ² μ΄μŠ€μ— μ ‘κ·Όν•˜μ§€ μ•Šκ³  μΊμ‹œλœ 값을 μ‚¬μš©ν•©λ‹ˆλ‹€.

2️⃣ JPA의 μž₯점.

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

  • JPAλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ— μ’…μ†λ˜μ§€ μ•ŠλŠ” 좔상화 계측을 μ œκ³΅ν•˜μ—¬, νŠΉμ • λ°μ΄ν„°λ² μ΄μŠ€ 벀더에 μ˜μ‘΄ν•˜μ§€ μ•Šκ³  μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œμ˜ 이식성과 μœ μ§€λ³΄μˆ˜μ„±μ΄ λ†’μ•„μ§‘λ‹ˆλ‹€.

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

  • JPAλŠ” 데이터λ₯Ό μ‘°μž‘ν•˜λŠ” 데 ν•„μš”ν•œ SQL 쿼리λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•©λ‹ˆλ‹€.
  • κ°œλ°œμžλŠ” 객체 지ν–₯적인 λ°©μ‹μœΌλ‘œ 데이터λ₯Ό μ²˜λ¦¬ν•˜λ©°, 직접 SQL을 μž‘μ„±ν•˜λŠ” 뢀담이 μ€„μ–΄λ“­λ‹ˆλ‹€.

3. 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°κ³Ό λ°μ΄ν„°λ² μ΄μŠ€μ˜ κ°„κ·Ή ν•΄μ†Œ.

  • JPAλŠ” μžλ°”μ˜ 객체 지ν–₯ λͺ¨λΈκ³Ό κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ κ°„μ˜ 뢈일치λ₯Ό ν•΄κ²°ν•©λ‹ˆλ‹€.
  • μžλ°” 객체의 ν•„λ“œλ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ˜ μ—΄(Column)κ³Ό λ§€ν•‘ν•˜κ³ , μžλ°” 객체의 μƒνƒœ λ³€ν™”λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ— μžλ™μœΌλ‘œ λ°˜μ˜ν•©λ‹ˆλ‹€.

4. νŠΈλžœμž­μ…˜ 관리 μžλ™ν™”.

  • JPAλŠ” νŠΈλžœμž­μ…˜ 관리λ₯Ό μžλ™ν™”ν•˜μ—¬ κ°œλ°œμžκ°€ νŠΈλžœμž­μ…˜ λ²”μœ„λ₯Ό λͺ…μ‹œν•˜μ§€ μ•Šμ•„λ„, λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ˜ 일관성을 μœ μ§€ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.

5. JPQL을 ν†΅ν•œ 객체 μ€‘μ‹¬μ˜ 쿼리.

  • JPQL은 SQL λŒ€μ‹  객체 λͺ¨λΈμ„ 기반으둜 ν•˜λŠ” 쿼리 μ–Έμ–΄λ‘œ, SQL에 μ’…μ†λ˜μ§€ μ•Šκ³  객체 지ν–₯적으둜 데이터λ₯Ό μ‘°νšŒν•  수 있게 ν•΄μ€λ‹ˆλ‹€.

6. 캐싱을 ν†΅ν•œ μ„±λŠ₯ ν–₯상.

  • JPAλŠ” 1μ°¨ μΊμ‹œμ™€ 2μ°¨ μΊμ‹œλ₯Ό 톡해 λ°μ΄ν„°λ² μ΄μŠ€ μ ‘κ·Ό 횟수λ₯Ό 쀄이고, μ„±λŠ₯을 ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ JPA κ΅¬ν˜„μ²΄.

  • JPAλŠ” μΈν„°νŽ˜μ΄μŠ€μ™€ κ·œμ•½λ§Œμ„ μ •μ˜ν•˜λŠ” ν‘œμ€€μ΄κΈ° λ•Œλ¬Έμ—, μ‹€μ œλ‘œ λ™μž‘ν•˜κΈ° μœ„ν•΄μ„œλŠ” κ΅¬ν˜„μ²΄κ°€ ν•„μš”ν•©λ‹ˆλ‹€.
  • λŒ€ν‘œμ μΈ JPA κ΅¬ν˜„μ²΄λ‘œλŠ” λ‹€μŒκ³Ό 같은 ORM(Object-Relational Mapping) ν”„λ ˆμž„μ›Œν¬λ“€μ΄ μžˆμŠ΅λ‹ˆλ‹€.
    • Hibernate : κ°€μž₯ 널리 μ‚¬μš©λ˜λŠ” JPA κ΅¬ν˜„μ²΄λ‘œ, JPA의 κΈ°λŠ₯을 ν¬ν•¨ν•˜λ©΄μ„œλ„ JPA μ΄μƒμ˜ κΈ°λŠ₯듀을 μ œκ³΅ν•©λ‹ˆλ‹€.
    • EclipseLink : JPA의 레퍼런슀 κ΅¬ν˜„μ²΄λ‘œ, μžλ°” EE ν™˜κ²½μ—μ„œ 많이 μ‚¬μš©λ©λ‹ˆλ‹€.
    • OpenJPA : Apacheμ—μ„œ μ œκ³΅ν•˜λŠ” JPA κ΅¬ν˜„μ²΄μž…λ‹ˆλ‹€.

4️⃣ κ²°λ‘ .

  • JPAλŠ” μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μƒν˜Έμž‘μš©μ„ 더 μ‰½κ²Œ λ§Œλ“€κΈ° μœ„ν•œ ORM(Object-Relational Mapping) ν‘œμ€€μž…λ‹ˆλ‹€.
  • JPAλ₯Ό μ‚¬μš©ν•˜λ©΄ 객체 지ν–₯적인 λ°©μ‹μœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 있으며, λ°μ΄ν„°λ² μ΄μŠ€ 독립적인 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ˜ν•œ, JPAλŠ” νŠΈλžœμž­μ…˜ 관리, 캐싱, λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ μžλ™ 생성 λ“±μ˜ κΈ°λŠ₯을 톡해 κ°œλ°œμžμ—κ²Œ λ§Žμ€ νŽΈμ˜μ„±μ„ μ œκ³΅ν•©λ‹ˆλ‹€.
  • JPAλŠ” κ°œλ°œμžκ°€ 객체 λͺ¨λΈμ— 집쀑할 수 있게 ν•˜λ©΄μ„œλ„ λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μƒν˜Έμž‘μš©μ„ 효율적으둜 μ²˜λ¦¬ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.