Skip to content

6.5. 트랜잭션 관리

6.5.1. @Transactional 사용 규칙

  • 트랜잭션은 Service 레이어에서 선언합니다. Repository나 Controller에서 선언하지 않습니다.
  • 조회 전용 메서드에는 readOnly = true를 지정합니다.
java
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {

  private final UserRepository userRepository;

  @Override
  @Transactional
  public UserResponse createUser(CreateUserRequest request) {
    UsersRecord record = userRepository.insert(request.name(), request.email());
    return UserResponse.from(record);
  }

  @Override
  @Transactional(readOnly = true)
  public UserResponse findById(Long id) {
    UsersRecord record = userRepository.findById(id)
        .orElseThrow(() -> new UserNotFoundException(id));
    return UserResponse.from(record);
  }
}

6.5.2. 트랜잭션 전파 규칙

전파 수준사용 기준
REQUIRED (기본값)일반적인 비즈니스 로직
REQUIRES_NEW독립적인 트랜잭션이 필요한 경우 (로깅, 감사)
SUPPORTS사용하지 않습니다
NOT_SUPPORTED사용하지 않습니다

6.5.3. 주의 사항

  • 같은 클래스 내부에서 @Transactional 메서드를 호출하면 AOP가 적용되지 않습니다.
  • 체크 예외(Checked Exception) 발생 시 기본적으로 롤백되지 않습니다. 필요한 경우 rollbackFor를 지정합니다.
java
@Transactional(rollbackFor = Exception.class)
public void processPayment(PaymentRequest request) {
  // ...
}

TIENIPIA QUALIFIED STANDARD