inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

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

596

임인혁

작성한 질문수 5

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;
}

spring

답변 1

1

David

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

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

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

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

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

감사합니다.

설정 정보 없이 임베디드 데이터베이스 생성

0

15

1

RepositoryTest의 패키지 위치가 domain인 이유

0

38

2

REQUIRES_NEW 해결 방법에 대해서 질문있습니다!!

0

32

1

update()에 사용하는 setter 질문드립니다.

0

49

1

SQL 중심적 개발의 문제점에 대한 질문

0

78

1

혹시 Containing 을 안쓰신 이유가 있을까요?

0

89

2

[공유] 스프링부트 4.x 버전 mybatis 연동

0

184

1

@repository 어노테이션

0

94

3

ItemService

0

59

1

논리 커밋, 물리 커밋 질문드립니다.

0

54

1

내부 트랜잭션 커밋은 필수인가요?

0

57

1

프록시 커넥션 객체를 반환할 때 생성하는건가요?

0

55

1

Transaction readOnly 성능 개선 (김영한님의 대한 감사인사)

2

180

2

JPQL 대신 네이티브 쿼리를 사용해야 하는 경우

0

81

1

@EventListener(ApplicationReadyEvent.class) 관련

0

90

1

트랜잭션 동기화 매니저와 데이터 소스

0

77

1

DB 관련 강의 개설 계획은 없으신건가요?

0

133

2

물리 트랜잭션 과 논리트랜잭션 용어를 맞게 이해한걸까요

0

96

1

스프링 3 버전 이상 rollbackFor 변경된듯요

1

114

1

트랜잭션 전파 질문.

0

87

1

프로젝트 오픈 에러

0

126

1

외부 트랜잭션에서 isNewTransaction이 false로 나오는거에 대해 질문드립니다

0

84

2

같은 스레드를 사용하면 트랜잭션 동기화 매니저는 같은 커넥션을 반환

0

74

1

h2 인메모리 테스트중 예약어 충돌날 경우 대처방법

0

105

1