@Transactional을 한번 사용해보도록 하겠습니다.
1. @Transactional이란?
@Transactional은 스프링 프레임워크에서 제공하는 어노테이션 중 하나로, 트랜잭션 처리를 위해 사용됩니다. 일반적으로 데이터베이스와 같은 영속적인 데이터 저장소에서 데이터를 조회, 수정, 삭제하는 작업을 수행할 때 트랜잭션 처리를 해야합니다. 트랜잭션은 하나의 논리적인 작업 단위를 의미하며, 해당 작업 단위가 모두 성공적으로 수행되어야만 영속적인 데이터 저장소에 데이터가 반영되도록 보장합니다.
@Transactional 어노테이션을 사용하면 메소드에 적용된 트랜잭션을 자동으로 생성하고, 메소드 수행 중 예외가 발생하면 롤백하고, 예외가 발생하지 않으면 커밋합니다. 롤백이란, 트랜잭션을 수행하는 도중에 예외가 발생하여 해당 트랜잭션의 모든 작업이 취소되는 것을 의미합니다.
2. @Transactional 주요 옵션
@Transactional 어노테이션에는 여러 속성이 존재하며, 이를 이용하여 트랜잭션의 동작을 제어할 수 있습니다. 주요 속성으로는 isolation, propagation, readOnly, rollbackFor, noRollbackFor 등이 있습니다.
2-1. isolation
isolation은 트랜잭션에서 데이터를 격리하는 방식을 말합니다. 데이터를 격리하는 방식에 따라 여러가지 isolation level이 있으며, isolation level이 높을수록 데이터의 일관성은 유지되지만, 성능이 저하될 수 있습니다.
2-2. propagation
propagation은 트랜잭션을 어떻게 전파할지를 결정하는 옵션입니다. 스프링에서는 @Transactional 어노테이션을 사용하여 propagation 설정이 가능합니다. 새로운 트랜잭션을 생성하거나, 기존의 트랜잭션을 사용하는 등의 방법을 정할 수 있습니다.
2-3. readOnly
@Transactional의 readOnly 속성은 트랜잭션을 읽기 전용으로 설정하는 데 사용됩니다. 이 속성은 트랜잭션을 시작할 때 데이터베이스 락을 설정하지 않으므로 성능을 향상시킬 수 있습니다.
만약 메서드에서 단순히 읽기 작업만 수행하고 데이터를 수정하지 않는 경우, readOnly를 true로 설정하여 읽기 전용 트랜잭션을 만드는 것이 좋습니다.
readOnly의 기본값은 false이며, 다음과 같이 사용할 수 있습니다.
@Transactional(readOnly = true)
public void readDataOnly() {
// 메소드 로직
}
2-4. rollbackFor
rollbackFor는 트랜잭션 처리 중 발생한 예외를 처리하기 위한 속성입니다. 트랜잭션 처리 중 지정한 예외가 발생하면 롤백하도록 설정할 수 있습니다.
예를 들어, rollbackFor = {Exception.class}로 설정하면 모든 예외가 발생했을 때 롤백하도록 지정할 수 있습니다. 반면, rollbackFor = {CustomException.class}로 설정하면 CustomException이 발생할 때만 롤백하도록 지정할 수 있습니다.
@Transactional(rollbackFor = {CustomException.class})
public void myMethod() throws CustomException {
// 코드 실행 중 CustomException이 발생하면 롤백
}
2-5. noRollbackFor
noRollbackFor는 @Transactional 어노테이션에서 롤백을 하지 않을 예외 클래스를 설정하는 속성입니다. 롤백을 하지 않을 예외가 정해져 있을 경우에 사용할 수 있습니다.
noRollbackFor 속성은 배열 형태로 여러 예외 클래스를 포함할 수 있습니다. 아래는 noRollbackFor 속성을 사용하는 예시입니다.
@Transactional(noRollbackFor = {MyException.class})
public void myMethod() throws MyException {
// 코드 실행 중 MyException이 발생하더라도 롤백하지 않음
}
주의할 점은 noRollbackFor 속성을 사용하는 것은 보안 문제가 발생할 수 있으므로 신중하게 사용해야 합니다. 롤백되어야 할 예외가 noRollbackFor에 명시된 예외와 같은 경우, 예상치 못한 결과가 발생할 수 있습니다. 따라서 예외 처리에 대한 신중한 검토가 필요합니다.
참고
https://steady-coding.tistory.com/610
https://mangkyu.tistory.com/170
https://insight-bgh.tistory.com/493
https://data-make.tistory.com/738
'Spring' 카테고리의 다른 글
[SpringBoot] SendGrid 사용법 (0) | 2023.03.07 |
---|---|
[Spring] Springboot 프로젝트 생성 (0) | 2023.01.23 |
스프링 시큐리티 인증/인가 처리 (0) | 2022.12.09 |
[SpringBoot] yml 파일 여러개 사용하기 (0) | 2022.12.05 |
[SpringBoot] SQS 의존성 에러 (0) | 2022.12.04 |