트랜잭션이 언제 안적용 될까?

존스노우·2024년 6월 8일
0

기타

목록 보기
9/9
post-thumbnail

테스트

  • 트랜잭션이 적용 되었다

  • 왜?

  • @Transactional이 적용된 메서드 내에서 호출되면 해당 트랜잭션에 참여하게 됨

  • 스프링에서 트랜잭션 전파(Transaction Propagation) 타입의 기본값은 REQUIRED

  • REQUIRED 타입은 진행중인 트랜잭션 내부에 새로운 트랜잭션이 들어온다면 기존 트랜잭션에 참여하는 전파 방식

  • private 에는 트랜잭션이 적용 안되는줄알았는대 트랜잭션이 선언된 메서드 내에서 선언하면

  • 트랜잭션이 되는걸 깨달았다

  • 이런 식으로 트랜잭션을 선엏나면 트랜잭션 프록시를 통해 실제 타겟을 호출함.



  • 트랜잭션없는 외부함수에서 트랜잭션이 있는 내부함수 호출시 트랜잭션이 적용이 안됨

  • createUser2에는 트랜잭션 어노테이션이 없으므로
  • 트랜잭션 프록시는 트랜잭션을 적용하지 않는다.
  • 트랜잭션 적용하지 않고, 실제객체 인스턴스의 saveUSer2()을 호출
  • 내가 내껄 직접호출
  • 프록시를 통한 외부 호출이 아니라 직접 호출이기 때문

전파

REQUIRED

  • 가장 많이 사용하는 기본 설정이다. 기존 트랜잭션이 없으면 생성하고, 있으면 참여한다. 트랜잭션이 필수라는 의미로 이해하면 된다. (필수이기 때문에 없으면 만들고, 있으면 참여한다.) 기존 트랜잭션 없음: 새로운 트랜잭션을 생성한다.
  • 기존 트랜잭션 있음: 기존 트랜잭션에 참여한다.

REQUIRES_NEW

  • 항상 새로운 트랜잭션을 생성한다.
    기존 트랜잭션 없음: 새로운 트랜잭션을 생성한다. 기존 트랜잭션 있음: 새로운 트랜잭션을 생성한다.

SUPPORT

  • 트랜잭션을 지원한다는 뜻이다. 기존 트랜잭션이 없으면, 없는대로 진행하고, 있으면 참여한다. 기존 - 트랜잭션 없음: 트랜잭션 없이 진행한다.
  • 기존 트랜잭션 있음: 기존 트랜잭션에 참여한다.

NOT_SUPPORT

  • 트랜잭션을 지원하지 않는다는 의미이다.
  • 기존 트랜잭션 없음: 트랜잭션 없이 진행한다.
  • 기존 트랜잭션 있음: 트랜잭션 없이 진행한다. (기존 트랜잭션은 보류한다)

MANDATORY

  • 의무사항이다. 트랜잭션이 반드시 있어야 한다. 기존 트랜잭션이 없으면 예외가 발생한다. 기존 트랜잭션 없음: IllegalTransactionStateException 예외 발생
  • 기존 트랜잭션 있음: 기존 트랜잭션에 참여한다.

NEVER

  • 트랜잭션을 사용하지 않는다는 의미이다. 기존 트랜잭션이 있으면 예외가 발생한다. 기존 트랜잭션도 허용하지 않는 강한 부정의 의미로 이해하면 된다.
  • 기존 트랜잭션 없음: 트랜잭션 없이 진행한다.
  • 기존 트랜잭션 있음: IllegalTransactionStateException 예외 발생

NESTED

  • 기존 트랜잭션 없음: 새로운 트랜잭션을 생성한다.
  • 기존 트랜잭션 있음: 중첩 트랜잭션을 만든다.
  • 중첩 트랜잭션은 외부 트랜잭션의 영향을 받지만, 중첩 트랜잭션은 외부에 영향을 주지 않는다. 중첩 트랜잭션이 롤백 되어도 외부 트랜잭션은 커밋할 수 있다.
  • 외부 트랜잭션이 롤백 되면 중첩 트랜잭션도 함께 롤백된다.

번외

여기서 이해해야 할 핵심은 Main 클래스의 main(..) 메서드 내부의 클라이언트 코드가 프록시에 대한 참조를 가지고 있다는 점입니다. 이는 해당 객체 참조에 대한 메서드 호출이 프록시에 대한 호출이라는 의미입니다. 결과적으로, 프록시는 특정 메서드 호출과 관련된 모든 인터셉터(어드바이스)에 위임할 수 있습니다.
하지만 호출이 최종적으로 대상 객체(이 경우 SimplePojo 참조)에 도달하면, 그 객체가 자신에 대해 수행하는 메서드 호출(예: this.bar() 또는 this.foo())은 this 참조에 대해 호출되며, 프록시에 대해 호출되지 않습니다. 이는 중요한 의미를 갖습니다. 자기 호출(self-invocation)의 경우, 메서드 호출과 관련된 어드바이스가 실행될 기회를 얻지 못한다는 뜻입니다.

  • 프록시 모드(기본값)에서는 프록시를 통해 호출되는 외부 메서드에만 트랜잭션이 적용
  • 처음 부모메서드에 선언된 트랜잭션만 적용된다는 뜻?
  • 같은 객체 내에서 메서드끼리 호출하는 자기 호출(self-invocation)은 트랜잭션이 적용되지 않는다.
  • 초기화 코드(예: @PostConstruct 메서드)에서는 트랜잭션 기능에 의존하지 않는 것이 좋다
  • 꼬일 수가 있어서.

AOP

  • AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍
  • 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화 하겠다
profile
어제의 나보다 한걸음 더

0개의 댓글