동일 Bean에서 @Transactional 사용

Kang JaeHyeon·2025년 4월 16일

@Transactional requirement is incompatible with the one for this method.

트랜잭션 과정

  1. 외부에서 메서드 호출
  2. AOP 대상 메서드는 proxy에서 호출을 가로챔
  3. 트랜잭션 시작
  4. 살제 메서드 실행
  5. 성공 -> 커밋 / 실패 -> 롤백

this를 사용한 메서드 호출

  1. 해당 클래스 내에서 바로 함수를 호출하기 때문에 proxy를 거치지 않음
  2. 트랜잭션이 적용되지 않고 일반 함수처럼 동작

AOP 대상 메서드(@Transactional, @Async 등)가 있는 클래스는

class info = class com.sun.proxy.$Proxy42
// 프록시 bean으로 등록

일반 클래스

class info = class com.example.sample.service
// 일반 bean으로 등록

기존 saveData 함수 구조

@Transactional
public boolean istDataBatch(Param) throws Exception{
	...
}


public boolean saveData(Param param) throws Exception {
  ...
  return this.istDataBatch(Param);
  ...
}

수정된 saveData 함수 구조


@Autowired
@Lazy
private Service self;

...

@Transactional
public boolean istDataBatch(Param) throws Exception{
	...
}

public boolean saveData(Param param) throws Exception {
  ...
  return self.istDataBatch(Param);
  ...
}

@Lazy를 사용하지 않는다면 반복적으로 Service를 참조
-> 순환 참조 발생 오류

@Lazy를 사용해서 깡통 bean(내용 없음)를 먼저 등록한 후 실제 실행 시 최초 1회에 내용 주입
나중에 주입된 bean에서도 깡통 bean이 등록되지만 마찬가지로 내용 주입은 되지 않은 상태이므로 순환참조가 발생하지 않음

0개의 댓글