김지팡의 저장소
Published 2024. 5. 31. 01:18
@Transactional Spring Boot
728x90

 

 

 

🧑‍💻

이번 포스팅에서는 Transactional 어노테이션에 대해 다루어보고자 한다.

Service 코드에서 @Transactional이 붙은 메서드를 보았다.

@Service
public class ProjectService {

    private final ProjectRepository projectRepository;

    public ProjectService(ProjectRepository projectRepository) {
        this.projectRepository = projectRepository;
    }

    @Transactional
    public Project createProject(ProjectRequestDto projectRequestDto) {
        Project project = new Project(projectRequestDto.getTitle(), projectRequestDto.getContent());
        return projectRepository.save(project);
    }
}

 

📚 @Transactional

네이밍에서 알 수 있듯이 해당 어노테이션은 트랜잭션에 관한 어노테이션이다.

 

createProject 메서드에 이를 사용함으로써 트랜잭션이 가지는 이점들을 얻을 수 있다.

 

트랜잭션에 대해서는 해당 포스팅에서 확인할 수 있으니 궁금하면 읽어보시길(읽어봐주세요...🥹)

 

Transaction(트랜잭션) - 모 아니면 도

🧑‍💻이번 포스팅에서는 트랜잭션에 대해 이야기해보고자 한다.   📚 트랜잭션트랜잭션은 데이터베이스에 발생하는 하나의 작업이라고 생각하면 된다. 예시로 다시 말하면 이렇다. 데이

happygimy97.tistory.com

 

🚨 그렇다면 Transactional 어노테이션이 없다면 어떤 것에서 문제가 발생할까?

 

@Transactional 어노테이션이 없을 때는 createProject() 메서드가 실행되다가 중간에 실패하면, 실패하기 전까지의 데이터베이스 작업이 커밋되어 데이터베이스에 반영될 수 있다.

 

예시로 보면 이렇다.

 

🙋🏻‍♂️ @Transactional 어노테이션이 없는 경우

public class ProjectService {

    private final ProjectRepository projectRepository;

    public ProjectService(ProjectRepository projectRepository) {
        this.projectRepository = projectRepository;
    }

    public Project createProject(ProjectRequestDto projectRequestDto) {
        Project project = new Project(projectRequestDto.getTitle(), projectRequestDto.getContent());
        // 첫 번째 DB 작업
        Project savedProject = projectRepository.save(project);

        // 두 번째 DB 작업이 실패하는 경우
        if (someConditionFails()) {
            throw new RuntimeException("Something went wrong");
        }
        /*
        해당 주석 내에 또 다른 DB 작업이 있다고 가정

        */
        return savedProject;
    }

 

위의 코드에서 첫 번째 DB 작업이 성공한 후, 두 번째 작업에서 예외가 발생하면 첫 번째 작업은 이미 커밋되었기 때문에 DB에 반영된 상태로 남아 있게 된다.

 

메서드가 정상적으로 수행된 것이 아니기에 첫 번째 DB 작업에 대해서 롤백이 되어야 하는데, @Transactional 어노테이션이 없으면 롤백이 되지 않는다.

 

때문에, DB의 일관성을 유지하기 위해서는 @Transactional 어노테이션을 붙여주는 것을 권장한다고 한다.

 

 

 

🧑‍💻

오늘은 @Transactional 어노테이션에 대해 다루었다. 해당 어노테이션을 사용하지 않고 수동으로 트랜잭션을 관리하는 방법이 궁금해 찾아보았는데, PlatformTransactionManage를 활용하는 방법이 있었다.

이를 활용하면 트랜잭션을 세밀하게 제어가 가능한 이점은 있지만, 코드가 복잡해진다는 단점이 있어 보였다.

 

@Transactional을 사용하는 것으로 ㅎㅎ.. 😲

728x90
profile

김지팡의 저장소

@김지팡

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!