비즈니스 로직마다 트랜잭션 관련 코드를 작성하게 되면 중복 코드 발생, 책임과 원리 분리 못함, 가독성 떨어짐 등의 문제가 있다.
@Transactional은 스프링에서 제공하는 어노테이션으로, AOP 형태로 트랜잭션을 처리할 수 있도록 돕는다.
트랜잭션이 적용되려면 항상 프록시를 거쳐서 호출이 되어야한다. 프록시를 활용하면 실행하려는 비즈니스 로직 전, 후로 추가로 로직을 넣을 수 있다.
@Transactional
public CreateRecipeResponseDto create(CreateRecipeRequestDto dto) {
logic();
}
create(CreateRecipeRequestDto dto)
메서드를 처리하는 동안 예외가 발생하지 않으면 커밋되고, 발생하면 롤백이 된다.
하지만 주의할 점이 있다.
public CreateRecipeResponseDto create(CreateRecipeRequestDto dto) {
logic();
}
@Transactional
public void logic(){
// 비즈니스 로직 처리
// 수정, 삭제 등
}
@Transactional이 걸리지 않은 메서드의 내부에서 @Transactional 걸린 메서드를 호출하면 프록시를 통해 호출되지 않는다.