Skip to content

Latest commit

Β 

History

History
61 lines (41 loc) Β· 5.55 KB

File metadata and controls

61 lines (41 loc) Β· 5.55 KB

Transactional

"νŠΈλžœμž­μ…”λ„μ΄ λΉ μ Έμžˆλ‹€ => 정확성은 μ–΄λ–‘ν•˜λƒ"λΌλŠ” 말은 주둜 νŠΈλžœμž­μ…˜(@Transactional) μ²˜λ¦¬κ°€ λΉ μ‘Œμ„ λ•Œ λ°μ΄ν„°μ˜ 일관성과 무결성에 λŒ€ν•œ 우렀λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν‘œν˜„μž…λ‹ˆλ‹€. 이λ₯Ό μ΄ν•΄ν•˜λ €λ©΄, νŠΈλžœμž­μ…˜μ˜ κ°œλ…κ³Ό μ™œ 이λ₯Ό μ‚¬μš©ν•˜λŠ”μ§€μ— λŒ€ν•œ 배경을 μ•„λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

1. νŠΈλžœμž­μ…˜(@Transactional)μ΄λž€?

  • νŠΈλžœμž­μ…˜μ€ λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ„ ν•˜λ‚˜μ˜ 논리적인 μž‘μ—… λ‹¨μœ„λ‘œ λ¬ΆλŠ” κ°œλ…μž…λ‹ˆλ‹€. μ—¬λŸ¬ 개의 μž‘μ—…μ΄ ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜ μ•ˆμ—μ„œ 처리되며, λͺ¨λ“  μž‘μ—…μ΄ μ„±κ³΅ν•΄μ•Όλ§Œ μ΅œμ’…μ μœΌλ‘œ 컀밋(commit)되고, ν•˜λ‚˜λΌλ„ μ‹€νŒ¨ν•˜λ©΄ λ‘€λ°±(rollback)λ˜μ–΄ μž‘μ—…μ΄ μ·¨μ†Œλ©λ‹ˆλ‹€.
  • νŠΈλžœμž­μ…˜μ΄ μ€‘μš”ν•œ μ΄μœ λŠ” **λ°μ΄ν„°μ˜ 무결성(integrity)**κ³Ό **일관성(consistency)**을 보μž₯ν•˜κΈ° μœ„ν•¨μž…λ‹ˆλ‹€.

2. νŠΈλžœμž­μ…˜μ˜ μ£Όμš” νŠΉμ§• (ACID)

νŠΈλžœμž­μ…˜μ€ λ°μ΄ν„°λ² μ΄μŠ€μ˜ ACID 속성을 톡해 데이터 μ •ν™•μ„±κ³Ό 무결성을 보μž₯ν•©λ‹ˆλ‹€:

  • Atomicity (μ›μžμ„±): νŠΈλžœμž­μ…˜ λ‚΄μ˜ λͺ¨λ“  μž‘μ—…μ€ μ „λΆ€ μ„±κ³΅ν•˜κ±°λ‚˜, ν•˜λ‚˜λΌλ„ μ‹€νŒ¨ν•˜λ©΄ μ „λΆ€ μ·¨μ†Œλ©λ‹ˆλ‹€. 즉, νŠΈλžœμž­μ…˜μ˜ μž‘μ—…μ€ ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ μ²˜λ¦¬λ©λ‹ˆλ‹€.
  • Consistency (일관성): νŠΈλžœμž­μ…˜μ΄ μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλ˜λ©΄, λ°μ΄ν„°λ² μ΄μŠ€λŠ” μΌκ΄€λœ μƒνƒœλ‘œ μœ μ§€λ©λ‹ˆλ‹€. 즉, νŠΈλžœμž­μ…˜ μ „ν›„μ˜ 데이터 μƒνƒœλŠ” 항상 일관성을 κ°€μ§‘λ‹ˆλ‹€.
  • Isolation (고립성): λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” νŠΈλžœμž­μ…˜μ΄ μ„œλ‘œ κ°„μ„­ν•˜μ§€ μ•Šλ„λ‘ 보μž₯ν•©λ‹ˆλ‹€.
  • Durability (지속성): νŠΈλžœμž­μ…˜μ΄ μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλ˜λ©΄ κ·Έ κ²°κ³ΌλŠ” 영ꡬ적으둜 μ €μž₯λ©λ‹ˆλ‹€.

3. @Transactional의 μ—­ν• 

μŠ€ν”„λ§μ—μ„œλŠ” λ°μ΄ν„°λ² μ΄μŠ€ νŠΈλžœμž­μ…˜μ„ κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ @Transactional μ–΄λ…Έν…Œμ΄μ…˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€. 이 μ–΄λ…Έν…Œμ΄μ…˜μ€ λ©”μ„œλ“œλ‚˜ ν΄λž˜μŠ€μ— μ μš©λ˜μ–΄ ν•΄λ‹Ή λ²”μœ„μ—μ„œ νŠΈλžœμž­μ…˜μ΄ ν™œμ„±ν™”λ˜κ³ , λͺ¨λ“  λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ΄ μ„±κ³΅ν•˜λ©΄ μ»€λ°‹λ˜λ©°, μ‹€νŒ¨ μ‹œ λ‘€λ°±λ©λ‹ˆλ‹€.

4. "νŠΈλžœμž­μ…”λ„μ΄ λΉ μ Έμžˆλ‹€ => 정확성은 μ–΄λ–‘ν•˜λƒ"의 의미

이 말은 μ½”λ“œμ—μ„œ νŠΈλžœμž­μ…˜μ„ μ²˜λ¦¬ν•˜λŠ” @Transactional μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ μš©λ˜μ§€ μ•Šμ•˜μ„ λ•Œ, λ‹€μŒκ³Ό 같은 λ¬Έμ œλ“€μ΄ λ°œμƒν•  수 μžˆμŒμ„ μš°λ €ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€:

  1. μ›μžμ„± 보μž₯이 어렀움: νŠΈλžœμž­μ…˜μ΄ μ μš©λ˜μ§€ μ•ŠμœΌλ©΄ μ—¬λŸ¬ 개의 λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ΄ ν•˜λ‚˜μ˜ μž‘μ—… λ‹¨μœ„λ‘œ μ²˜λ¦¬λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·Έ κ²°κ³Ό, 쀑간에 였λ₯˜κ°€ λ°œμƒν•΄λ„ 이전에 μ™„λ£Œλœ μž‘μ—…μ€ λ˜λŒμ•„κ°€μ§€ μ•Šκ³  데이터가 λΆˆμ™„μ „ν•œ μƒνƒœλ‘œ 남을 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 은행 μ†‘κΈˆ 쀑에 μ†‘κΈˆμ€ λ˜μ—ˆμ§€λ§Œ 인좜이 μ‹€νŒ¨ν•˜λŠ” 상황이 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  2. 데이터 일관성 문제: μ—¬λŸ¬ 개의 μž‘μ—…μ΄ ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ μ²˜λ¦¬λ˜μ§€ μ•ŠμœΌλ©΄, 일뢀 μž‘μ—…μ΄ μ™„λ£Œλœ μƒνƒœμ—μ„œ λ‹€λ₯Έ μž‘μ—…μ΄ μ‹€νŒ¨ν•˜λ©΄ λ°μ΄ν„°λ² μ΄μŠ€μ— 일관성이 깨질 수 μžˆμŠ΅λ‹ˆλ‹€. νŠΈλžœμž­μ…˜ 없이 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‘°μž‘ν•˜λ©΄ μ‹œμŠ€ν…œ λ‚΄μ—μ„œ λ°μ΄ν„°μ˜ λΆˆμΌμΉ˜κ°€ 생길 수 μžˆμŠ΅λ‹ˆλ‹€.
  3. λ‘€λ°± λΆˆκ°€: νŠΈλžœμž­μ…˜ 없이 μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ μ‹€νŒ¨ν•œ λΆ€λΆ„λ§Œ 볡ꡬ될 수 μ—†κ³ , 쀑간 μƒνƒœμ—μ„œ μž‘μ—…μ΄ 멈좜 수 μžˆμŠ΅λ‹ˆλ‹€. νŠΈλžœμž­μ…˜μ€ μ‹€νŒ¨ μ‹œ 전체 μž‘μ—…μ„ 되돌렀 무결성을 μœ μ§€ν•˜μ§€λ§Œ, νŠΈλžœμž­μ…˜μ΄ μ—†λ‹€λ©΄ 이λ₯Ό 보μž₯ν•  방법이 μ—†μŠ΅λ‹ˆλ‹€.
  4. λ™μ‹œμ„± 문제: νŠΈλžœμž­μ…˜μ΄ μ—†λ‹€λ©΄ μ—¬λŸ¬ μ‚¬μš©μžκ°€ λ™μ‹œμ— 같은 데이터λ₯Ό μ‘°μž‘ν•  λ•Œ, 좩돌이 λ°œμƒν•˜κ±°λ‚˜ 데이터가 손상될 수 μžˆμŠ΅λ‹ˆλ‹€. νŠΈλžœμž­μ…˜μ€ λ™μ‹œμ„± 문제λ₯Ό ν•΄κ²°ν•˜λŠ”λ° ν•„μˆ˜μ μΈ 역할을 ν•©λ‹ˆλ‹€.

5. μ˜ˆμ‹œ: νŠΈλžœμž­μ…˜μ΄ λΉ μ‘Œμ„ λ•Œμ˜ 문제

public void transferMoney(Long fromAccountId, Long toAccountId, BigDecimal amount) {
    // 좜금
    accountRepository.debit(fromAccountId, amount);
    // μž…κΈˆ
    accountRepository.credit(toAccountId, amount);
}

μœ„μ™€ 같은 λ©”μ„œλ“œκ°€ μžˆλ‹€κ³  κ°€μ •ν•΄ λ΄…μ‹œλ‹€. μ—¬κΈ°μ„œ debit은 μΆœκΈˆμ„, credit은 μž…κΈˆμ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€. νŠΈλžœμž­μ…˜μ΄ μ—†λ‹€λ©΄ λ‹€μŒκ³Ό 같은 상황이 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€:

  • 좜금(debit)이 μ„±κ³΅ν–ˆμ§€λ§Œ μž…κΈˆ(credit)이 μ‹€νŒ¨ν–ˆμ„ λ•Œ, 돈이 ν•œ κ³„μ’Œμ—μ„œλ§Œ λΉ μ Έλ‚˜κ°€κ³  λ‹€λ₯Έ κ³„μ’Œλ‘œλŠ” 듀어가지 μ•ŠλŠ” λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. νŠΈλžœμž­μ…˜μ΄ μ—†λ‹€λ©΄ μ‹€νŒ¨ν•œ μž‘μ—…μ„ 되돌릴 방법이 μ—†κΈ° λ•Œλ¬Έμ— 데이터가 λΆˆμ™„μ „ν•œ μƒνƒœλ‘œ λ‚¨κ²Œ λ©λ‹ˆλ‹€.

이λ₯Ό νŠΈλžœμž­μ…˜μ„ μ μš©ν•˜μ—¬ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

@Transactional
public void transferMoney(Long fromAccountId, Long toAccountId, BigDecimal amount) {
    accountRepository.debit(fromAccountId, amount);
    accountRepository.credit(toAccountId, amount);
}

이제 νŠΈλžœμž­μ…˜μ΄ 적용된 경우, debit λ˜λŠ” credit 쀑 ν•˜λ‚˜λΌλ„ μ‹€νŒ¨ν•˜λ©΄ 전체 μž‘μ—…μ΄ 둀백되고, λ°μ΄ν„°μ˜ 무결성과 일관성이 보μž₯λ©λ‹ˆλ‹€.

6. κ²°λ‘ 

"νŠΈλžœμž­μ…”λ„μ΄ λΉ μ Έμžˆλ‹€ => 정확성은 μ–΄λ–‘ν•˜λƒ"λŠ” 말은 νŠΈλžœμž­μ…˜μ΄ μ—†λŠ” μƒν™©μ—μ„œ 데이터 μ •ν™•μ„±κ³Ό 무결성에 λŒ€ν•œ 우렀λ₯Ό ν‘œν˜„ν•œ κ²ƒμž…λ‹ˆλ‹€. @Transactional이 μ—†λ‹€λ©΄, μ—¬λŸ¬ λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—… 쀑 ν•˜λ‚˜κ°€ μ‹€νŒ¨ν•  λ•Œ 둀백이 이루어지지 μ•Šμ•„ 데이터가 λΆˆμ™„μ „ν•˜κ±°λ‚˜ 일관성이 깨질 μœ„ν—˜μ΄ μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ νŠΈλžœμž­μ…˜μ€ 데이터 처리의 정확성을 보μž₯ν•˜κΈ° μœ„ν•΄ 맀우 μ€‘μš”ν•œ 역할을 ν•˜λ©°, 특히 μ€‘μš”ν•œ λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ—μ„œλŠ” ν•„μˆ˜μ μœΌλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.