인프런 커뮤니티 질문&답변

임인혁님의 프로필 이미지
임인혁

작성한 질문수

스프링 DB 2편 - 데이터 접근 활용 기술

트랜잭션 AOP 주의 사항 - 프록시 내부 호출2

트랜잭션 적용 내부 메서드를 다른 서비스로 분리시에 서비스간 순환 참조 문제 해결 방안

작성

·

498

·

수정됨

0

트랜잭션 AOP 주의 사항 - 프록시 내부 호출2 강의 관련 서비스 계층에서 서비스 계층을 주입 받는 부분 관련해서 문의 드립니다. 실무에서는 서비스간 순환 참조에 어떻게 대응하는지 문의 드립니다.

실무 중에 서비스에서 서비스를 주입 받다보면 순환 참조가 발생하는 문제가 생길 수 있다고 알고 있습니다. 그런데 트랜잭션 적용 메서드 내부 호출(this.{트랜잭션 적용 메서드})일 경우에 트랜잭션이 안걸리는 문제를 해결하기 위해 트랜잭션 적용 메서드를 다른 서비스로 분리하고 분리된 서비스를 주입 받아서 프록시가 호출되도록 하셨습니다. 보통은 스프링이 순환 참조일 때 run 시점에 에러를 발생 시키기는 합니다. 그런데 이런 문제를 실무에서 실행 시점이 아닌 코드 작성 시점에 어떤식으로 해결 하나요? 개발팀간에 약속을 하고 분리된 서비스에 다른 서비스를 주입하지 못하게 하는지 아니면 다른 방법이 있는지 궁금합니다.

 

아래는 예시 코드와 실제 자바 run 시점에 발생한 에러 코드 입니다.

Description:

The dependencies of some of the beans in the application context form a cycle:

┌─────┐
|  externalService defined in file [/Users/inor/Desktop/Projects/study/db2/springtx/build/classes/java/main/hello/springtx/service/ExternalService.class]
↑     ↓
|  internalService defined in file [/Users/inor/Desktop/Projects/study/db2/springtx/build/classes/java/main/hello/springtx/service/InternalService.class]
↑     ↓
|  otherService defined in file [/Users/inor/Desktop/Projects/study/db2/springtx/build/classes/java/main/hello/springtx/service/OtherService.class]
└─────┘

 

class ExternalService {
 private final InternalService internalService ;

 public void external() {
  internalService.internalTx();
 }
}
class InternalService {
 private final OtherService otherService;

 @Transactional
 public void internal() {...}
}
class OtherService {
 private final ExternalService externalService;
}

답변 1

1

안녕하세요. 임인혁님, 공식 서포터즈 David입니다.

생성자 주입을 사용하다보면 간혹 순환참조를 피할 수 없는 상황이 발생합니다.

사실, 생성시 주입해주는 것만 피하면 되는 문제이기 때문에 해결방법은 단순합니다. 하나를 먼저 생성하고 나서 필요한 의존을 주입하면 됩니다.

여러 방법이 있는데, 아래 글을 참고해 주세요.

https://www.baeldung.com/circular-dependencies-in-spring

감사합니다.

임인혁님의 프로필 이미지
임인혁

작성한 질문수

질문하기