본문 바로가기
  • _^**_
무근본 IT 지식 공유/무근본 스프링(Spring Framework)

[무근본 스프링] @transactional 어노테이션에 대해 (예시코드 포함)

by 크리드로얄워터 2023. 4. 15.
반응형

Spring의 @Transactional 어노테이션

 

Spring의 @Transactional 어노테이션은 메서드 레벨이나 클래스 레벨에서 사용할 수 있으며, 데이터베이스 트랜잭션 관리를 간편하게 할 수 있게 해줍니다.

@Transactional 어노테이션을 사용하면, 해당 메서드가 실행될 때 Spring은 트랜잭션을 시작하고, 메서드 실행이 완료될 때 트랜잭션을 종료합니다. 만약 메서드 실행 중에 예외가 발생하면, Spring은 자동으로 트랜잭션 롤백을 수행하여 이전 상태로 되돌립니다.

예를 들어, 다음은 @Transactional 어노테이션을 사용하여 간단한 서비스 계층의 메서드를 구현한 예입니다:

 

@Service
public class UserService {
  
  @Autowired
  private UserRepository userRepository;
  
  @Transactional
  public void updateUser(User user) {
    userRepository.update(user);
  }
  
  @Transactional(readOnly = true)
  public User getUser(Long id) {
    return userRepository.findById(id);
  }
  
}

위 예제에서 updateUser() 메서드와 getUser() 메서드는 모두 @Transactional 어노테이션을 사용하고 있습니다. updateUser() 메서드는 트랜잭션을 시작하고, 사용자 정보를 업데이트한 후 트랜잭션을 종료합니다. getUser() 메서드는 읽기 전용 트랜잭션을 시작하고, 사용자 정보를 조회한 후 트랜잭션을 종료합니다.

또 다른 예로, 스프링 MVC 컨트롤러에서도 @Transactional 어노테이션을 사용할 수 있습니다. 이를 통해 컨트롤러 메서드에서 트랜잭션을 시작하고, 서비스 계층의 메서드를 호출하여 데이터베이스 작업을 수행할 수 있습니다. 이때, 컨트롤러 메서드 실행 중에 예외가 발생하면, Spring은 자동으로 트랜잭션 롤백을 수행합니다.

 

@Controller
public class UserController {
  
  @Autowired
  private UserService userService;
  
  @Transactional
  @PostMapping("/users")
  public String createUser(@RequestBody User user) {
    userService.createUser(user);
    return "redirect:/users/" + user.getId();
  }
  
}

 

 

위 예제에서 createUser() 메서드는 @Transactional 어노테이션을 사용하여 트랜잭션을 시작하고, userService.createUser() 메서드를 호출합니다. 만약 createUser() 메서드 실행 중에 예외가 발생하면, Spring은 자동으로 트랜잭션 롤백을 수행합니다.

 

그렇다면 해당 DB에 실제 rollback 명령이 날아간다는 것인가?

 

Spring에서 트랜잭션 롤백이 수행될 때, 실제 데이터베이스에 어떤 명령이 전송되는지는 사용하는 데이터베이스나 JDBC 드라이버에 따라 다릅니다.

Oracle 데이터베이스를 사용하는 경우, Spring은 JDBC 드라이버를 통해 Oracle 데이터베이스에 접속하고, 트랜잭션 매니저를 통해 트랜잭션을 관리합니다. 트랜잭션 롤백이 수행되면, Oracle 데이터베이스에서는 롤백 명령이 수행됩니다. Spring에서는 이를 위해 JDBC 드라이버에서 제공하는 java.sql.Connection.rollback() 메서드를 호출하게 됩니다.

따라서, Spring이 해당 예외를 catch하여 자동으로 트랜잭션 롤백을 수행할 때, 실제로 데이터베이스에 전송되는 명령은 JDBC 드라이버에서 제공하는 롤백 명령이 됩니다. 이때, Oracle 데이터베이스의 경우에는 JDBC 드라이버가 제공하는 롤백 명령을 수행하여 데이터베이스의 롤백이 수행됩니다.

반응형

댓글