본문 바로가기
Spring

@transactional을 private메서드에 사용하고 싶다

by ernest45 2024. 1. 21.

 

(자세한 @transactional의 글은 예전 글을 보고오자)

@Transactional

 

@Transactional

 

ernest45.tistory.com

일반적으로 흔히들 @Transactional은 public에서만 쓸 수 있는 걸로 알고 있다.

 

대충 프록시 기반의 AOP라서 클래스(CGLIB), 인터페이스(jdk 동적프록시)

둘 다public 메서드에서만 호출을 가로챌 수 있다.

 

 

 

 

먼저 aspectj를 사용한다면 충분히 해결가능하다. spring에서 권장하고 있다.

 

 

 

그렇다면 pubilc으로 선언하고 private한 메서드를 내부에서 호출하면 ?

 

 

1. public 메서드에 @Transactional을 적용

2. public 메서드 내부에서 private 메서드를 호출

 

 

간단하게 호출을 테스트 하기 위해서 만들어봤다.

 

 

"Public method started"
"Saving entity"
"Public method finished"

 

 

트랜잭션은 publicMethod() 전체에 적용됨을 확인

 

따라서 private 메서드인 saveEntity()에서 실행되는

myRepository.save(entity)도 트랜잭션 안에서 실행

 

왜냐하면 saveEntity()는 publicMethod() 안에서 호출되며, 그 자체가 이미 트랜잭션 안이기 때문

 

 

 

 

사실 당연한 결과이고,

 

더 중요한 건 내부에서 호출 시 가능할 경우를 더 중점으로 설명하고 싶었다.

 

 

 

 

public한 메서드가 내부에서 pubilc한 @transactional을 호출한다면 ?

 

 

 

 

프록시의 동작 과정을 보면 프록시를 통해 들어오는 외부 메서드 호출을 인터셉트하여 작동

이런 성격 때문에 내부 빈에서 프록시 호출 시 작동하지 않음!

 

init()이

@Transactional progress()를 내부적으로 부르는 경우에는

동작하지 않음을 알 수 있다.

 

 

 

 

 

 

 

https://tecoble.techcourse.co.kr/post/2022-11-07-transaction-aop-fact-and-misconception/

'Spring' 카테고리의 다른 글

사용자 요청부터 스프링 시큐리티까지 feat)OAuth2  (0) 2025.04.14
JPA 1+N 문제 실습  (0) 2025.04.12
@entity 빨간줄  (0) 2024.01.16