2월 7일-@Transactional

Yullgiii·2024년 2월 7일
0
post-thumbnail

오늘은 스프링 프레임워크에서 제공하는 @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 어노테이션을 어떻게 적용하는지 실습해보며, 특히 읽기 전용에서의 성능 최적화 방법에 대해 더 깊이 이해할 수 있었다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글