Home > Spring > πŸƒ[Spring] μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ(Persistence Context)

πŸƒ[Spring] μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ(Persistence Context)
Spring Framework

πŸƒ[Spring] μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ(Persistence Context)

  • μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ(Persistence Context)λŠ” μ—”ν‹°ν‹°(Entity) 객체의 μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜λŠ” ν™˜κ²½μ„ μ˜λ―Έν•˜λ©°, λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μ„Έμ…˜ λ˜λŠ” μ˜μ†μ„± 관리 λ‹¨μœ„λΌκ³ λ„ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 이 κ°œλ…μ€ JPA(Java Persistence API) ν‘œμ€€μ—μ„œ μ •μ˜λ˜λ©°, Spring Data JPA 같은 κ΅¬ν˜„μ²΄λ“€μ΄ 이λ₯Ό λ”°λ¦…λ‹ˆλ‹€.

1️⃣ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ(Persistence Context)의 μ£Όμš” κ°œλ….

1️⃣ μ—”ν‹°ν‹°μ˜ 생λͺ…μ£ΌκΈ° 관리.

  • μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ(Persistence Context)λŠ” μ—”ν‹°ν‹° 객체의 μƒνƒœλ₯Ό 생λͺ…주기에 따라 κ΄€λ¦¬ν•©λ‹ˆλ‹€.
    • μ—”ν‹°ν‹°λŠ” λΉ„μ˜μ†(new/transient), μ˜μ†(persistent), μ€€μ˜μ†(detached), μ‚­μ œ(removed) μƒνƒœ 쀑 ν•˜λ‚˜μΌ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ(Persistence Context)에 μ˜ν•΄ κ΄€λ¦¬λ˜λŠ” μ—”ν‹°ν‹°λŠ” μ˜μ† μƒνƒœκ°€ λ©λ‹ˆλ‹€.
    • μ˜μ† μƒνƒœμΈ μ—”ν‹°ν‹°λŠ” λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ 동기화가 μžλ™μœΌλ‘œ 이루어지며, λ³€κ²½ 사항이 μžλ™μœΌλ‘œ μΆ”μ λ©λ‹ˆλ‹€.

2️⃣ 1μ°¨ μΊμ‹œ μ—­ν• .

  • μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ(Persistence Context)λŠ” μ—”ν‹°ν‹°λ₯Ό λ©”λͺ¨λ¦¬μ— μΊμ‹œν•˜μ—¬ 1타 μΊμ‹œ 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.
    • 즉, λ™μΌν•œ 엔티티에 μ—¬λŸ¬ 번 μ ‘κ·Όν•  λ•Œ, λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‘°νšŒν•˜μ§€ μ•Šκ³  λ©”λͺ¨λ¦¬μ— μžˆλŠ” μ—”ν‹°ν‹°λ₯Ό μž¬μ‚¬μš©ν•©λ‹ˆλ‹€.
      • 이λ₯Ό 톡해 μ„±λŠ₯을 μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ λ³€κ²½ 감지(Dirty Checking)

  • μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ(Persistence Context)λŠ” μ˜μ† μƒνƒœμ˜ μ—”ν‹°ν‹° λ³€κ²½ 사항을 μΆ”μ ν•©λ‹ˆλ‹€.
    • νŠΈλžœμž­μ…˜μ΄ μ’…λ£Œλ  λ•Œ, λ³€κ²½λœ 뢀뢄을 μžλ™μœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€μ— λ°˜μ˜ν•©λ‹ˆλ‹€.
      • 이λ₯Ό λ³€κ²½ 감지라고 ν•©λ‹ˆλ‹€.

4️⃣ 지연 λ‘œλ”©(Lazy Loading)

  • μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ(Persistence Context)λŠ” ν•„μš”ν•  λ•ŒκΉŒμ§€ 데이터λ₯Ό κ°€μ Έμ˜€μ§€ μ•Šκ³ , μ‹€μ œλ‘œ μ‚¬μš©ν•  λ•Œ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 데이터λ₯Ό λΆˆλŸ¬μ˜€λŠ” 지연 λ‘œλ”©(Lazy Loading)을 μ§€μ›ν•©λ‹ˆλ‹€.
    • μ΄λŠ” μ„±λŠ₯ μ΅œμ ν™”μ— μœ λ¦¬ν•©λ‹ˆλ‹€.

2️⃣ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ(Persistence Context)의 이점.

1️⃣ μžλ™ 동기화.

  • μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ(Persistence Context)에 μžˆλŠ” μ—”ν‹°ν‹°λŠ” μžλ™μœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€μ™€ λ™κΈ°ν™”λ˜λ―€λ‘œ, λ°μ΄ν„°λ² μ΄μŠ€μ— 직접 μ €μž₯ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€.

2️⃣ μΊμ‹œ κΈ°λŠ₯.

  • 1μ°¨ μΊμ‹œλ‘œ 인해 λ™μΌν•œ 엔티티에 λŒ€ν•œ 쀑볡 쑰회λ₯Ό λ°©μ§€ν•˜μ—¬ μ„±λŠ₯이 κ°œμ„ λ©λ‹ˆλ‹€.

3️⃣ νŠΈλžœμž­μ…˜ 관리.

  • νŠΈλžœμž­μ…˜ λ‹¨μœ„λ‘œ μ—”ν‹°ν‹° μƒνƒœκ°€ κ΄€λ¦¬λ˜λ―€λ‘œ, μ•ˆμ „ν•˜κ²Œ λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ 일관성을 μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ μ˜ˆμ‹œ.

// 예λ₯Ό λ“€μ–΄, userRepository.findById(id)λ₯Ό ν˜ΈμΆœν•˜λ©΄
// userRepositoryλŠ” μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μ ‘κ·Όν•˜μ—¬ μ—”ν‹°ν‹°λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
User user = userRepository.findById(id).orElseThrow();

// user의 이름을 μˆ˜μ •ν•˜λ©΄, 이 λ³€κ²½ 사항은 μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— 반영되고,
// νŠΈλžœμž­μ…˜μ΄ 끝날 λ•Œ μžλ™μœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€μ— λ°˜μ˜λ©λ‹ˆλ‹€.
user.setName("New Name");
  • μœ„μ™€ 같이, μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλŠ” Spring Data JPA와 같은 JPA κ΅¬ν˜„ν…Œκ°€ μ—”ν‹°ν‹°λ₯Ό κ΄€λ¦¬ν•˜κ³ , λ³€κ²½ 사항을 λ°μ΄ν„°λ² μ΄μŠ€μ— λ°˜μ˜ν•˜λ©°, νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ 효율적으둜 μ—”ν‹°ν‹°λ₯Ό μΊμ‹±ν•˜κ³  λ™κΈ°ν™”ν•˜λ„λ‘ λ•λŠ” μ€‘μš”ν•œ κ°œλ…μž…λ‹ˆλ‹€.