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() {
// 별도 트랜잭션으로 실행됨
}