μ΅œλŒ€ 1 λΆ„ μ†Œμš”

@Transactional

@Transactional μ• λ…Έν…Œμ΄μ…˜μ€ λ©”μ„œλ“œ λ‚΄μ—μ„œ μ‹€ν–‰λ˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ„ ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μœΌλ‘œ λ¬ΆλŠ” 역할을 ν•œλ‹€.
νŠΈλžœμž­μ…˜μ€ λ°μ΄ν„°λ² μ΄μŠ€μ˜ μž‘μ—…μ˜ μ›μžμ„±(Atomicity), 일관성(Consistency), 독립성(Isolation), 지속성(Durability)의 4가지 속성을 보μž₯ν•˜λŠ” κ°œλ…μ΄λ‹€.

νŠΈλžœμž­μ…˜μ—μ„œ λ‘€λ°±(Rollback)은 μž‘μ—… 쀑에 μ˜ˆμ™Έκ°€ λ°œμƒν•˜κ±°λ‚˜ λͺ…μ‹œμ μœΌλ‘œ 둀백을 μ§€μ •ν•œ κ²½μš°μ— μˆ˜ν–‰λœλ‹€.
둀백은 νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ 이전 μƒνƒœλ‘œ λ˜λŒλ¦¬λŠ” μž‘μ—…μ΄λ‹€.
μ΄λŠ” 데이터 일관성을 μœ μ§€ν•˜κ³ , λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μΌκ΄€λœ μƒνƒœλ‘œ μœ μ§€ν•˜λŠ”λ°μ— μžˆμ–΄ μ€‘μš”ν•œ μž‘μ—…μ΄λ‹€.

μΆ”κ°€λ‘œ, 둀백은 λ°μ΄ν„°λ² μ΄μŠ€μ˜ μž‘μ—…μ΄ λͺ¨λ‘ μ„±κ³΅ν•œ κ²½μš°μ—λ„ μˆ˜ν–‰λœλ‹€.
λ°μ΄ν„°λ² μ΄μŠ€μ˜ μž‘μ—…μ΄ λͺ¨λ‘ μ„±κ³΅ν–ˆλ‹€ ν•˜λ”λΌλ„, νŠΈλžœμž­μ…˜μ€ μ—¬μ „νžˆ μœ μš©ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.
μ—¬λŸ¬ 개의 μž‘μ—…μ΄ ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μœΌλ‘œ λ¬Άμ—¬μžˆλŠ” 경우, λͺ¨λ“  μž‘μ—…μ΄ μ„±κ³΅ν–ˆμ„ λ•Œλ§Œ μ΅œμ’…μ μΈ 컀밋(Commit)이 μˆ˜ν–‰λ˜μ–΄ λ°μ΄ν„°λ² μ΄μŠ€μ— λ³€κ²½ λ‚΄μš©μ΄ 영ꡬ적으둜 반영되기 λ•Œλ¬Έμ΄λ‹€.

이처럼 둀백을 μˆ˜ν–‰ν•˜λŠ” μ΄μœ λŠ” λ°μ΄ν„°μ˜ 일관성과 μ•ˆμ •μ„±μ„ μœ μ§€ν•˜κΈ° μœ„ν•΄μ„œμ΄λ‹€.
@Transactional μ• λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄ 둀백을 톡해 λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ˜ μ›μžμ„±κ³Ό 일관성을 보μž₯ν•˜κ³ , μ˜ˆμ™Έ λ°œμƒ μ‹œμ— λ°μ΄ν„°μ˜ 무결성을 μœ μ§€ν•  수 μžˆλ‹€.

예제

UserServiceλŠ” νšŒμ› 정보λ₯Ό μˆ˜μ •ν•˜λŠ” λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•œ ν΄λž˜μŠ€μ΄λ‹€.
Userν΄λž˜μŠ€μ— idκ°€ Long으둜 μ§€μ •λ˜μ–΄ μžˆμ–΄ μˆ˜μ •μ΄ μ™„λ£Œλ˜λ©΄ μˆ˜μ •ν•œ λ°μ΄ν„°μ˜ idλ₯Ό λ„˜κ²¨μ£ΌκΈ° λ•Œλ¬Έμ— λ°˜ν™˜ν•˜λŠ” μžλ£Œν˜•μ΄ Long으둜 μ§€μ •λ˜μ–΄μžˆλ‹€.

[UserService]

@Transactional
public Long update(Long id, UserUpdateRequestDto requestDto) {
    User user = userRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("not found"));

    user.update(requestDto.getName(), requestDto.getPhone(), requestDto.getAddress());

    return id;
}

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ:

λŒ“κΈ€λ‚¨κΈ°κΈ°