본문 바로가기
Spring

[SpringBoot] @Transactional 사용해보기

by meetyou 2023. 3. 14.

@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