본문 바로가기

cs(with 매일메일)

[251022수] private 메서드에서 @Transactional 선언하면 트랜잭션이 동작할까요?

@Transactional, @Cacheable, @Async 등의 어노테이션은 런타임에 동작하는 Spring AOP를 기반으로 동작한다. 

 

Spring AOP가 제공하는 JDK Dynamic Proxy, CGLIB방식 모두 타깃이 구현하는 인터페이스가 구체 클래스를 대상으로 프록시를 만들어서 타깃 클래스의 메서드 수행 전후에 횡단 관심사에 대한 처리를 할 수 있다. 

 

Spring은 빈 생성시, 해당 빈에 AOP 어노테이션이 있는지 검사하고, 있다면 프록시 객체를 생성하여 빈을 대체한다. 

AOP적용 대산인 클래스의 경우, 즉, @Transectional과 같은 AOP 어노테이션이 하나라도 선언된 클래스는 프록시로 감싸진다

 

JDK Dynamic Proxy의 경우 타깃 클래스가 구현하는 인터페이스를 기준으로 프록시를 생성하여 public 메서드만 AOP 적용 가능하다. 

 

===

✨ Spring AOP란?

: Aspext-Oriented Prigramming은 특정 기능이나 처리를 메서드의 실행 전후에 적용하는 방식으로, 주로 횡단 관심사를 처리하는데 사용된다.

횡단 관심사란, 주로 어플리케이션의 여러 부분에 걸쳐서 반복되는 기능들이다. 

AOP의 이런 기능들은 비즈니스 로직과 분리하여 코드의 재사용성을 높이고 유지보수를 쉽게 한다.

 

예를 들어, 트랜잭션 관리(@Transactional), 캐싱(@Cacheable), 비동기(@Async) 등이 AOP를 통해 구현된다. 

 

✨ 프록시 객체란?

: 원래 객체(타깃 객체) 앞에 위치하여, 객체에 대한 접근을 제어하거나 추가적인 작업을 할 수 있도록 돕는 객체이다. 

1. JDK Dynamic Proxy : 인터페이스 기반 프록시. public메서드만 적용 가능.

2. CGLIB Proxy : 클래스 기반 프록시. 접근 제한자 관계없이 모든 메서드에 적용 가능.