스프링 | 스프링 부트

[ Spring ] @Transactional과 예시

Adose 2025. 2. 7. 16:32

📘 @Transactional ?

@Transactional 어노테이션을 사용하면, 해당 메소드에서 실행되는 코드가 트랜잭션 단위로 처리된다는 의미이다.

 

✅ 트랜잭션의 큰 특징 ( 롤백 )

  • 트랜잭션의 어노테이션을 사용시 시작될 때부터 끝날 때까지의 모든 데이터베이스 작업을 하나의 묶음으로 간주한다.
  • 묶음의 작업이 모두 성공적이면 커밋하고, 하나라도 실패하면 모두 취소(롤백)해야 한다는 보장을 제공한다.

 

 

⚒️ @Transactional 코드 예시

    @Transactional
    public void createAndUpdateUser(String name, String email, String newEmail){
        userDao.addUser(name, email);
        if(true){
            throw new RuntimeException("error");
        }

        userDao.updateUser(name,newEmail);
    }

  1. addUser가 실행된다.
  2. if(true) 로 예외가 발생하면 동작이 중단된다.
  3. addUser의 실행이 취소 된다 (롤백)
  4. updateUser또한 실행되지 않는다.

 

 

✅ @Transactional을 사용하지 않는다면?

    public void createAndUpdateUser(String name, String email, String newEmail){
        userDao.addUser(name, email);
        if(true){
            throw new RuntimeException("error");
        }

        userDao.updateUser(name,newEmail);
    }
  1. addUser가 실행된다.
  2. if(true) 로 예외가 발생하면 동작이 중단된다.
  3. updateUser는 실행되지 않는다
  4. addUser는 실행됐지만, updateUser는 실행을 실패했다.

 

📌 결론 

결과적으로 결과적으로 @transactional을 사용하면 부분 커밋을 방지할 수 있다.
@transactional를 사용하지 않으면 일부 쿼리는 반영되고, 일부는 실패하여 데이터베이스의 일관성을 유지하기 힘들다.