SH380 Logo
2025-03-30

@Transactional 이해와 활용

#CS

csgal-logo

1. 이론

propagation트랜잭션 전파 방식 (기본: REQUIRED)
isolation격리 수준 (READ_COMMITTED 등)
timeout트랜잭션 수행 시간 제한
readOnly읽기 전용 트랜잭션 설정
rollbackFor특정 예외 발생 시 롤백 지정

2. 활용

@Service
public class UserService {
    @Transactional
    public void registerUser(UserDto dto) {
        userRepository.save(dto.toEntity());
        emailService.sendWelcomeEmail(dto.getEmail());
    }
}

3. 트랜잭션 심화

3-1. 전파(Propagation)

REQUIRED기존 트랜잭션 있으면 참여, 없으면 새 생성 (기본)
REQUIRES_NEW항상 새 트랜잭션 생성, 기존 트랜잭션 일시 중단
NESTED기존 트랜잭션 안에서 savepoint 활용

*Tip: 외부 트랜잭션과 독립적으로 처리하고 싶으면 REQUIRES_NEW 사용

3-2. 격리(Isolation)

READ_UNCOMMITTED다른 트랜잭션 커밋 전 데이터도 읽음 (Dirty Read 가능)로그성 조회
READ_COMMITTED커밋된 데이터만 읽음 (Default)대부분 실무
REPEATABLE_READ같은 트랜잭션 내 동일 쿼리 결과 보장재고 처리 등
SERIALIZABLE가장 엄격, 동시에 처리 불가금융 트랜잭션

3-3. 롤백 규칙

@Transactional(rollbackFor = Exception.class)

3-4. self-invocation & 프록시

transactional-graph

4. 면접 대비 핵심 포인트

5. 면접 연습

Q1. @Transactional을 Service 계층에 적용하는 이유?
A: Repository는 단일 DB 작업만 수행 → 트랜잭션 필요성이 낮음. Service 계층에서 여러 Repository 호출 시 하나의 논리적 단위로 묶어 데이터 일관성을 보장.

Q2. 트랜잭션 전파(propagation)란?
A: 이미 존재하는 트랜잭션 안에서 새 메서드가 호출될 때 트랜잭션 처리 방식을 지정. 예: REQUIRED, REQUIRES_NEW, NESTED

Q3. 롤백이 자동으로 되지 않는 경우가 있나요?
A: 체크 예외(`Exception`) 발생 시 기본 롤백 안 됨. 필요 시 `rollbackFor` 속성 사용

Q4. self-invocation 문제란?
A: 같은 클래스 내부에서 트랜잭션 메서드를 호출하면 프록시가 적용되지 않아 트랜잭션이 동작하지 않는 현상

Q5. readOnly 옵션은 언제 사용하는가?
A: 조회 전용 트랜잭션 시 성능 최적화를 위해 사용. 쓰기 작업 수행 시 예외 발생 가능

6. 마무리

목록으로 돌아가기