본문 바로가기

Programming/Java & Spring 관련 내용 정리

[Spring] @Transactional이 내부적으로 어떻게 동작하나요?

🎈@Transactional 의 작동원리, 흐름

 

Spring에서는 클래스, 인터페이스, 메소드에 부여할 수 있는 @Transactional이라는 어노테이션을 제공하고 있다.

 

@Transactional이 붙은 메소드를 호출하면,

Spring은 해당 메소드에 대한 프록시를 만든다.

 

트랜잭션은 트랜잭션의 시작과 연산 종료시의 커밋 과정이 필요하므로

프록시를 생성해 해당 메서드의 앞뒤에 트랜잭션의 시작과 끝을 추가하는 것이다.

 

 

프록시 객체는 @Transactional이 포함된 메서드가 호출될 경우, 

트랜잭션을 시작하고 Commit 또는 Rollback을 수행한다.

 

CheckedException이 발생하거나 예외가 없을 때는 Commit을 진행하고,
UncheckedException이 발생하면 Rollback을 진행한다.

 

 

이러한 로직은 AOP에 바탕을 두고 설계되었다.

 

AOP를 이용해 코드 외부에서 트랜잭션의 기능을 부여해주고 속성을 지정할 수 있게 해주는 것을 

선언적 트랜잭션(declarative transaction)이라고 한다.

 

 


🎈주의점

 

1) 우선순위

@Transactional은 우선순위를 가지고 있다. 우선순위는 다음과 같다.

 

클래스 메소드 > 클래스 > 인터페이스 메소드 > 인터페이스

 

클래스 메소드에 선언된 트랜잭션의 우선순위가 가장 높고, 인터페이스에 선언된 트랜잭션의 우선순위가 가장 낮다.

따라서 공통적인 트랜잭션 규칙은 클래스에, 특별한 규칙은 메소드에 선언하는 식으로 구성할 수 있다.

 

 

2) 트랜잭션의 모드

@Transactional은 Proxy Mode와 AspectJ Mode가 있는데 

Proxy Mode가 Default로 설정되어있다.

 

Proxy Mode는 다음과 같은 경우 동작하지 않는다.

  • 반드시 public 메서드에 적용되어야한다.
    • Protected, Private Method에서는 선언되어도 에러가 발생하지는 않지만, 동작하지도 않는다.
    • Non-Public 메서드에 적용하고 싶으면 AspectJ Mode를 고려해야한다.
  • @Transactional이 적용되지 않은 Public Method에서 @Transactional이 적용된 Public Method를 호출할 경우, 트랜잭션이 동작하지 않는다.

🎈AOP가 뭔가요?

 

Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 한다.

여기서 Aspect(관점)이란 흩어진 관심사들을 하나로 모듈화 하는것을 의미한다.

객체 지항 프로그래밍에서는 주요 관심사에 따라 클래스를 분할한다. 

이 클래스들은 보통 SRP(Single Responsibility Principle)에 따라 하나의 책임만을 갖게 설계된다. 

하지만 클래스를 설계하다보면 로깅, 보안, 트랜잭션 등 여러 클래스에서 공통적으로 사용하는 부가 기능들이 생긴다. 

이를 흩어진 관심사(Cross Cutting Concerns)라고 한다.

AOP 없이 흩어진 관심사를 처리하면 다음과 같은 문제가 발생한다.

- 여러 곳에서 반복적인 코드를 작성해야 한다.
- 코드가 변경될 경우 여러 곳에 가서 수정이 필요하다.
- 주요 비즈니스 로직과 부가 기능이 한 곳에 섞여 가독성이 떨어진다.


따라서 흩어진 관심사를 별도의 클래스로 모듈화하여 위의 문제들을 해결하고, 

결과적으로 OOP를 더욱 잘 지킬 수 있도록 도움을 주는 것이 AOP이다.

 


🎈AOP 주요 개념

 

  • Aspect: Advice + PointCut로 AOP의 기본 모듈
  • Advice: Target에 제공할 부가 기능을 담고 있는 모듈
  • Target: Advice가 적용될 비즈니스 로직
  • JointPoint: Advice가 적용될 위치
    • 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용 가능
  • PointCut: Target을 지정하는 정규 표현식

 


🎈Proxy 형태로 동작하는 @Transactional

 

  1. target에 대한 호출이 들어오면 AOP proxy가 이를 가로채서 가져온다.
  2. AOP proxy에서 Transaction Advisor가 commit 또는 rollback 등의 트랜잭션 처리를 한다.
  3. 트랜잭션 처리 외에 다른 부가 기능이 있을 경우 해당 Custom Advisor에서 그 처리를 한다.
  4. 각 Advisor에서 부가 기능 처리를 마치면 Target Method를 수행한다.
  5. interceptor chain을 따라 caller에게 결과를 다시 전달한다.