Pink Spider/Spring Boot JPA에서 @Transactional 옵션 정리

Created Wed, 26 Mar 2025 11:15:45 +0900 Modified Mon, 08 Dec 2025 08:41:47 +0900
570 Words 3 min

Spring Boot JPA에서 @Transactional 옵션 정리

Spring Boot JPA에서 @Transactional은 트랜잭션 처리를 위해 사용하는 매우 중요한 어노테이션이에요. 데이터베이스의 일관성과 무결성을 유지하기 위해 여러 작업을 하나의 트랜잭션으로 묶어 실행할 때 사용하죠. 아래에 사용법을 정리해볼게요.


📌 기본 사용법

import org.springframework.transaction.annotation.Transactional;

@Service
public class MemberService {

    @Transactional
    public void joinMember(Member member) {
        memberRepository.save(member);
        // 예외 발생 시 전체 트랜잭션 롤백
    }
}
  • @Transactional을 메서드에 붙이면 해당 메서드 안의 작업이 하나의 트랜잭션으로 처리돼요.
  • 런타임 중 예외가 발생하면 자동으로 롤백돼요. (기본적으로 unchecked exception일 때만 롤백)

📌 클래스 레벨에 사용

@Transactional
@Service
public class MemberService {
    public void method1() {
        // 트랜잭션 적용됨
    }

    public void method2() {
        // 트랜잭션 적용됨
    }
}
  • 클래스 전체에 트랜잭션을 걸 수 있어요. 단, 메서드에 개별적으로 설정된 게 우선 적용됩니다.

📌 rollbackFor 옵션

기본적으로 RuntimeException과 그 하위 클래스만 롤백 대상으로 간주돼요. 만약 체크 예외(Exception)도 롤백하고 싶다면:

@Transactional(rollbackFor = Exception.class)
public void updateMember() throws Exception {
    // 체크 예외 발생 시에도 롤백됨
}

📌 readOnly 옵션

읽기 전용 트랜잭션일 경우 성능 최적화를 위해 readOnly = true를 지정할 수 있어요.

@Transactional(readOnly = true)
public Member findMember(Long id) {
    return memberRepository.findById(id).orElse(null);
}

📌 Propagation 옵션

트랜잭션 전파 방식도 지정할 수 있어요. 대표적으로:

  • REQUIRED (기본값): 기존 트랜잭션이 있으면 참여, 없으면 새로 생성
  • REQUIRES_NEW: 항상 새 트랜잭션 생성
  • NESTED: 현재 트랜잭션 안에 중첩 트랜잭션 생성
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void sendEmail() {
    // 별도 트랜잭션으로 실행됨
}