오늘은 스프링 프레임워크에서 제공하는 @Transactional 어노테이션에 대해 배웠다. 이 어노테이션은 선언적 트랜잭션 관리를 가능하게 해주며, 개발자가 트랜잭션의 경계를 명시적으로 코딩하지 않아도 스프링이 런타임에 트랜잭션을 자동으로 처리해준다. 주요 학습 포인트는 다음과 같다:
자동 롤백과 커밋: @Transactional을 사용하면 메소드가 트랜잭션의 경계가 되며, 예외 발생 시 자동으로 롤백되고 성공적으로 완료될 경우 커밋된다.
선언적 트랜잭션 관리: 코드 내에서 트랜잭션 관리 로직을 직접 작성할 필요 없이 어노테이션을 통해 간단하게 트랜잭션을 관리할 수 있다는 점에서 큰 장점을 발견했다.
트랜잭션의 전파 행위 설정과 격리 수준: @Transactional 어노테이션은 트랜잭션의 전파 방식과 격리 수준을 세밀하게 설정할 수 있도록 도와준다. 이는 데이터베이스 연산의 일관성과 격리를 보장하는 데 중요하다.
읽기 전용 설정: 조회 연산에서 readOnly=true를 설정함으로써 성능을 최적화할 수 있는 방법을 배웠다.
@Service
public class CommentService {
private final CommentRepository commentRepository;
public CommentService(CommentRepository commentRepository) {
this.commentRepository = commentRepository;
}
@Transactional
public Comment createComment(Comment comment) {
// 댓글 생성 로직
return commentRepository.save(comment);
}
@Transactional(readOnly = true)
public Comment getComment(Long id) {
// 댓글 조회 로직
return commentRepository.findById(id).orElseThrow(() -> new CommentNotFoundException(id));
}
@Transactional
public void deleteComment(Long id) {
// 댓글 삭제 로직
commentRepository.deleteById(id);
}
}
이 예제를 통해 실제로 @Transactional 어노테이션을 어떻게 적용하는지 실습해보며, 특히 읽기 전용에서의 성능 최적화 방법에 대해 더 깊이 이해할 수 있었다.