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) {
// ...
}