트랜잭션은 데이터베이스의 상태를 변화시키는 일련의 작업들을 하나의 논리적 작업 단위로 묶은 것입니다.
특성은 ACID로 간단히 정리할 수 있습니다.
원자성 (Atomicity)
일관성 (Consistency)
격리성 (Isolation)
지속성 (Durability)
@Transactional은 스프링에서 트랜잭션 전반을 선언적으로 관리하는 역할을 합니다.
주로 서비스 레이어에서 클래스나 메서드에 정의합니다.
@Transactional이 적용되면 해당 메서드는 스프링의 AOP를 통해 프록시 객체로 감쌉니다.
연결된 프록시 객체가 트랜잭션 전반을 순서대로 제어합니다.
@Transactional → Transaction Proxy → Begin → Commit or Rollback
전파 (propagation) 트랜잭션이 실행 중일 때 다음 트랜잭션 처리 방식을 정의합니다. - REQUIRED (기본값) 실행 중인 트랜잭션이 있는 경우 참여하고, 없으면 새로운 트랜잭션을 시작합니다. - REQUIRES_NEW 항상 새 트랜잭션을 시작하고, 기존 트랜잭션을 일시중지합니다. - SUPPORTS 실행 중인 트랜잭션이 있으면 참여하고, 없으면 트랜잭션 없이 실행합니다. - NOT_SUPPORTED 실행 중인 트랜잭션이 있으면 일시중지하고, 트랜잭션 없이 실행합니다. - MANDATORY 반드시 실행 중인 트랜잭션이 있어야 하며, 없으면 예외를 발생합니다. - NEVER 트랜잭션을 지원하지 않고, 실행 중인 트랜잭션이 있으면 예외를 발생합니다. - NESTED 부모 트랜잭션 내에서 자식 트랜잭션을 시작합니다.
격리 수준 (isolation) 트랜잭션 간에 상호 작용을 정의합니다. - DEFAULT (기본값) 기본 데이터베이스 설정을 따릅니다. - READ UNCOMMITTED 가장 낮은 격리 수준입니다. 커밋되지 않은 데이터를 읽을 수 있지만, 데이터 무결성이 깨질 위험이 높습니다. - READ COMMITED 다른 트랜잭션이 커밋한 데이터만 읽을 수 있습니다. 커밋 전후로 데이터가 다른 동시성 문제가 발생할 수 있습니다. - REPEATABLE READ 트랜잭션 실행 중에 다른 트랜잭션이 데이터를 변경해도 동일한 데이터 조회를 보장합니다. - SERIALIZABLE 가장 높은 격리 수준입니다. 조회와 쓰기와 완전히 분리되어 동시성 문제 가능성이 낮습니다. 다른 트랜잭션과 완전히 격리되어 실행되지만, 성능 저하 발생 가능성이 있습니다.
읽기 전용 (readOnly) 트랜잭션을 읽기 전용으로 동작하며, 쓰기 작업이 발생하지 않도록 합니다.
타임아웃 (timeout) 트랜잭션이 일정 시간 내에 완료되지 않으면 자동으로 롤백됩니다. 기본 값은 무제한입니다.
롤백 롤백 관련 추가 설정 옵션입니다. - rollbackFor 롤백을 발생 시켜야 하는 예외 클래스를 지정합니다. - noRollbackFor 롤백을 발생 시키지 않아야 하는 예외 클래스를 지정합니다.
@Service public class BookService { //커밋된 데이터만 조회 가능 @Transactional(isolation = Isolation.READ_COMMITTED) public Book readBook() {} //읽기 전용 @Transasctional(readOnly = true) public List<Book> readBooks() {} //항상 새 트랜잭션 시작 @Transactional(propagation = Propagation.REQUIRES_NEW) public void updateBooks() {} //RutimeException 롤백 미적용 @Transactional(noRollbackFor = {RuntimeException.class}) public void deleteBook() {} }
RuntimeException을 제외한 모든 Exception을 Checked Exception이라고 합니다.
반드시 예외 처리를 해야하는 Exception입니다.
반대로 Unchecked Exception은 RuntimeException과 그 하위 Exception입니다.
애플리케이션 실행 중에 발생할 수 있는 Exception으로 필수 예외 처리 대상은 아닙니다.
하지만 많은 애플리케이션 장애는 Unchecked Exception에서 발생하기 때문에 주의가 필요합니다.