Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

[스프링AOP실무주의사항] 내부호출 - 자기 자신 주입 본문

인프런/[인프런] 스프링 핵심 원리 - 고급

[스프링AOP실무주의사항] 내부호출 - 자기 자신 주입

Seung__ 2022. 1. 11. 00:03

내부 호출을 해결하는 가장 간단한 방법은 자기 자신을 의존관계 주입 받는 것. 오?

 

 

1. 자기 자신 주입


@Slf4j
@Component
public class CallServiceV1 {

    private CallServiceV1 callServiceV1;

    /**
     * 생성자 주입은 순환 사이클을 만들기 때문에 실패한다.
     * 수정자(setter) 주입도 스프링 부트 2.6붙 막힘 --> 순환참조 금지
     * 순환참조를 해결하기 위해 application.properties에 아래 파일 추가
     * spring.main.allow-circular-references=true
     */
    @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");
    }
}
  • callServiceV1 를 수정자를 통해서 주입 받는 것을 확인할 수 있다. 
  • 스프링에서 AOP가 적용된 대상을 의존관계 주입 받으면 주입 받은 대상은 실제 자신이 아니라 프록시 객체이다.
  • external() 을 호출하면 callServiceV1.internal() 를 호출하게 된다. 
  • 주입받은 callServiceV1 은 프록시이다. 
  • 따라서 프록시를 통해서 AOP를 적용할 수 있다.
  • 참고로 이 경우 생성자 주입시 오류가 발생한다. 
  • 본인을 생성하면서 주입해야 하기 때문에 순환 사이클이 만들어진다. 
  • 반면에 수정자 주입은 스프링이 생성된 이후에 주입할 수 있기 때문에 오류가 발생하지 않는다.
  • 하지만 스프링부트 2.6부터 순환참조가 기본적으로 금지됨.
  • 위와 같이 수정자를 통해 자기 자신을 주입하기 위해서는 application.properties에 아래 파일 추가
spring.main.allow-circular-references=true

 

2. Test


@Slf4j
@Import(CallLogAspect.class)
@SpringBootTest
class CallServiceV1Test {

    @Autowired CallServiceV1 callServiceV1;

    @Test
    void external() {
        callServiceV1.external();
    }

    @Test
    void internal() {
        callServiceV1.internal();
    }
}
aop=void hello.aop.internalcall.CallServiceV1.external()
call external
aop=void hello.aop.internalcall.CallServiceV1.internal()
call internal

 

  • 실행 결과를 보면 이제는 internal() 을 호출할 때 자기 자신의 인스턴스를 호출하는 것이 아니라 프록시
    인스턴스를 통해서 호출하는 것을 확인할 수 있다. 
  • 당연히 AOP도 잘 적용된다.

 

3.GitHub: 220110 aop & internal call 2


 

GitHub - bsh6463/SpringAOP

Contribute to bsh6463/SpringAOP development by creating an account on GitHub.

github.com

 

Comments