@Transactional requirement is incompatible with the one for this method.
트랜잭션 과정
- 외부에서 메서드 호출
- AOP 대상 메서드는 proxy에서 호출을 가로챔
- 트랜잭션 시작
- 살제 메서드 실행
- 성공 -> 커밋 / 실패 -> 롤백
this를 사용한 메서드 호출
- 해당 클래스 내에서 바로 함수를 호출하기 때문에 proxy를 거치지 않음
- 트랜잭션이 적용되지 않고 일반 함수처럼 동작
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이 등록되지만 마찬가지로 내용 주입은 되지 않은 상태이므로 순환참조가 발생하지 않음