@Transactional

진기·2024년 1월 23일

Springboot

목록 보기
8/9

📌트랜잭션(Transaction)이란?

  • 모든 작업들이 성공적으로 완료되어야 작업 묶음의 결과를 적용하고, 어떤 작업에서 오류가 발생했을 때는 이전에 있던 모든 작업들이 성공적이었더라도 없었던 일처럼 완전히 되돌리는것이 트랜잭션의 개념이다.

  • 데이터베이스를 다룰 때 트랜잭션을 적용하면 데이터 추가, 갱신, 삭제 등으로 이루어진 작업을 처리하던 중 오류가 발생했을 때 모든 작업들을 원상태로 되돌릴 수 있다.
    모든 작업들이 성공해야만 최종적으로 데이터베이스에 반영하도록 한다.

스프링에서 @Transactional을 이용하여 트랜잭션 처리 하는 방법

  • DB와 관련된, 트랜잭션이 필요한 서비스 클래스 혹은 메서드에 @Transactional 어노테이션을 달아주면 된다.
  • 클래스, 메서드 모두에 @Transactional 어노테이션을 붙이면 메서드 레벨의 @Transactional 선언이 우선 적용된다.
  • @Transactional이 붙은 메서드는 메서드가 포함하고 있는 작업 중에 하나라도 실패할 경우 전체 작업을 취소한다.

⚠️주의할점!

1) 메소드가 private으로 돼있으면 @Transactional 어노테이션을 사용할 수 없다.

  • 프록시 객체는 타겟 객체/인터페이스를 상속 받아서 구현하는데, private으로 되어 있으면 자식인 프록시 객체에서 호출할 수 없다. 따라서 @Transactional 이 붙는 메소드, 클래스는프록시 객체에서 접근 가능한 레벨로 지정해야 한다.

2) 트랜잭션은 객체 외부에서 처음 진입하는 메소드를 기준으로 동작한다.

  • @transactional 어노테이션이 붙은 메소드 안에 어떤 메소드를 호출하는데 그 메소드에도 @Transactional 어노테이션이 붙어있을 수 있다.
  • 하지만 AOP proxy는 호출시점에 target을 가로채기때문에 처음 진입하는 메소드를 기준으로만 동작한다.
profile
개발 성장 이야기

0개의 댓글