이미 현업에서 자주 사용하지만 따로 정리하지는 않아서 이번 기회에 공식 레퍼런스를 보며 내용을 정리해보았다.
스프링 트랜잭션 처리
@Transactional
애노테이션은 인터페이스, 클래스, 또는 메서드에 트랜잭션의 의미를 부여하는 메타데이터이다. 예를 들어, "이 메서드가 호출될 때 새로운 읽기 전용 트랜잭션을 시작하고, 기존 트랜잭션은 일시 중지한다"는 의미를 가진다. @Transactional
의 기본 설정은 다음과 같다:
- 전파(Propagation):
PROPAGATION_REQUIRED
- 격리 수준(Isolation Level):
ISOLATION_DEFAULT
- 읽기-쓰기(Read-Write) 모드: 트랜잭션은 기본적으로 읽기-쓰기 모드이다.
- 타임아웃(Timeout): 트랜잭션 타임아웃은 기본 트랜잭션 시스템의 기본값을 따르거나, 타임아웃을 지원하지 않을 경우 설정되지 않는다.
- 롤백 규칙(Rollback Rules):
RuntimeException
이나 그 하위 클래스가 발생하면 롤백이 트리거되며, 체크드 예외는 롤백을 트리거하지 않는다.
스프링 트랜잭션 처리 중 예외가 발생했을 때, 아래의 옵션들을 명시적으로 사용하여 롤백 여부를 결정할 수 있다:
rollbackFor
: 롤백을 실행시키는 예외 클래스 목록rollbackForClassName
: 롤백을 실행시키는 예외 클래스 이름들noRollbackFor
: 롤백을 실행시키지 않는 예외 클래스 목록noRollbackForClassName
: 롤백을 실행시키지 않는 예외 클래스 이름들
예를 들어, 특정 체크드 예외에 대해서도 롤백을 원한다면 rollbackFor
옵션을 사용하여 설정할 수 있다.
자바와 스프링 트랜잭션 처리에 대한 오해
구글에서 "자바 트랜잭션 처리"로 검색해 보면 Checked Exception와 Unchecked Exception 에 대한 비교와 함께, 언체크드 예외에 대해 롤백이 수행된다는 내용을 많이 볼 수 있다.
하지만 이는 정확하지 않다. 자바에서는 기본적으로 트랜잭션에 대한 메커니즘을 제공하지 않으므로, 체크드 예외이든 언체크드 예외이든 트랜잭션의 롤백은 프로그래머가 직접 관리해야 한다. 즉, 언체크드 예외에 롤백하는 메커니즘은 스프링 프레임워크를 사용할 때 적용되는 기본 설정이지, 다른 프레임워크나 순수 자바 SDK만을 사용하여 DB 처리를 할 경우에는 해당되지 않는다.
이러한 오해는 자바와 스프링을 동일시하는 데에서 비롯되며, 자바 개발자들 사이에서 흔히 발생하는 잘못된 인식이라고 생각한다.
추가 설명
- 자바의 예외 처리: 자바는 예외를 체크드 예외와 언체크드 예외로 구분하지만, 이는 컴파일러가 예외 처리를 강제하는지 여부와 관련이 있다. 트랜잭션 롤백과는 직접적인 연관이 없다.
- 트랜잭션 관리: 순수 자바에서는
Connection
객체를 사용하여 수동으로 트랜잭션을 관리하며, 예외 발생 시 롤백을 직접 호출해야 한다. - 스프링의 트랜잭션 관리: 스프링은 AOP를 활용하여 선언적인 트랜잭션 관리를 제공하며, 기본적으로
RuntimeException
발생 시 롤백을 수행한다. 필요에 따라 설정을 변경하여 체크드 예외에도 롤백이 가능하다.
'Java > Spring' 카테고리의 다른 글
Spring 에서 런타임 환경에서 프로퍼티 값을 변경하는 방법 (0) | 2021.12.18 |
---|---|
스프링 프로파일 (Spring profile) 을 통해 환경별로 다른 설정을 해보자 (0) | 2016.11.24 |
Spring 내에서 리소스 불러오기 (0) | 2016.11.18 |
스프링 Properties 파일을 이용해서 설정하기 (0) | 2016.11.18 |
Mybatis + Myabtis Spring 사용시 마이바티스 설정파일 사용법 (0) | 2016.11.14 |