728x90
반응형
- 내부 호출을 해결하는 가장 간단한 방법은 자기 자신을 의존관계 주입받는 것이다.
@Autowired
public void setCallServiceV1(CallServiceV1 callServiceV1) {
this.callServiceV1 = callServiceV1;
}
- 수정자를 통해 주입을 받는 것을 확인할 수 있다.
- 스프링에서 AOP가 적용된 대상을 의존관계 주입 받으면 주입 받은 대상은 실제 자신이 아니라 프록시 객체이다.
/**
* 참고: 생성자 주입은 순환 사이클을 만들기 때문에 실패함
*/
@Slf4j
@Component
public class CallServiceV1 {
private CallServiceV1 callServiceV1;
@Autowired
public void setCallServiceV1(CallServiceV1 callServiceV1) {
this.callServiceV1 = callServiceV1;
}
public void external() {
log.info("call external");
callServiceV1.internal();
}
public void internal() {
log.info("call internal");
}
}
- extenal()을 호출하면 callServiceV1.internal()을 호출하게 됨
- 주입받은 callServiceV1은 프록시이기 때문에 이를 통해 AOP를 적용할 수 있다.
@Slf4j
@Component
public class CallServiceV1 {
private CallServiceV1 callServiceV1;
@Autowired
public void setCallServiceV1(CallServiceV1 callServiceV1) {
this.callServiceV1 = callServiceV1;
}
public void external() {
log.info("call external");
callServiceV1.internal(); //외부 메서드 호출
}
public void internal() {
log.info("call internal");
}
}
@Import(CallLogAspect.class)
@SpringBootTest
class CallServiceV1Test {
@Autowired
CallServiceV1 callServiceV1;
@Test
void external() {
callServiceV1.external();
}
}

😵 에러 발생 - 순환 에러
- 스프링부트 2.6 이상이라면 필수 추가

// application.properties
spring.main.allow-circular-references=true
728x90
반응형
댓글