Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- kotlin
- pointcut
- 알고리즘
- JPQL
- 스프링 핵심 기능
- http
- JDBC
- Spring Boot
- Servlet
- Greedy
- SpringBoot
- spring
- 자바
- Exception
- jpa
- AOP
- 스프링 핵심 원리
- 스프링
- transaction
- Android
- 김영한
- java
- db
- Thymeleaf
- springdatajpa
- 그리디
- 인프런
- Proxy
- QueryDSL
- 백준
Archives
- Today
- Total
개발자되기 프로젝트
[스프링AOP실무주의사항] 내부호출 - 자기 자신 주입 본문
내부 호출을 해결하는 가장 간단한 방법은 자기 자신을 의존관계 주입 받는 것. 오?
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
'인프런 > [인프런] 스프링 핵심 원리 - 고급' 카테고리의 다른 글
[스프링AOP실무주의사항] 내부호출 - 구조변경 (0) | 2022.01.11 |
---|---|
[스프링AOP실무주의사항] 내부호출 - 지연조회 (0) | 2022.01.11 |
[스프링AOP실무주의사항] 프록시와 내부 호출 (0) | 2022.01.10 |
[스프링AOP실전] 재시도AOP (0) | 2022.01.09 |
[스프링AOP실전] 로그 출력 AOP (0) | 2022.01.09 |
Comments