내부호출
AOP 적용하려면 프록시를 통해서 대상 객체를 호출해야함
프록시에서 먼저 어드바이스를 호출하고 이후에 대상 객체 호출
프록시 안거치고 대상 객체 직접호출하면 AOP 적용 X
스프링에서는 AOP대상은 프록시를 스프링빈으로 등록해서 직접 호출은 거의 안일어남
근데 대상 객체 내부에서 메서드 호출 발생하면 프록시를 안거치고 대상 객체 직접 호출하게 됨
그러니까 프록시가 타겟의 메서드 호출하면 그 타겟이 타겟안에 있는 메서드호출하면 적용이안됨
자바에서 메서드 앞에 별도의 참조가 없으면 this로 자기자신의 인스턴스를 가리킴
결과적으로 자신의 내부 메서드를 호출하게 되는데 여기서 this는 실제 대상 객체의 인스턴스라 AOP가 적용이안되는 것
대안1 자기자신 주입
this가 아니라 자기자신을 주입해서 다시 프록시로 돌아오는 것 이때 생성자를 쓰면 안되고 세터주입을 해야함
대안 2 지연 조회
스프링 빈을 지연해서 조회하는 법
애플리케이션컨텍스트에서 직접 빈을 꺼내옴 근데 애플리컨텍스트는 너무 거대함 오브젝트프로바이더를 이용하는 것
오브젝트프로바이더는 객체를 스프링 컨테이너에서 조회하는 걸 빈 생성 시점이 아니고 실제 사용시점으로 지연함
대안 3 구조 변경
내부호출이 발생하지 않도록 구조 자체를 변경하는 것
클래스를 분리시켜 내부호출을 외부호출로 변경
'Spring > AOP' 카테고리의 다른 글
| 스프링 AOP 주의점2 - 프라이빗 (0) | 2026.01.23 |
|---|---|
| 빈 후처리기와 스프링이 프록시를 등록하는 방법 (0) | 2026.01.23 |
| Aspect (0) | 2026.01.23 |
| 프록시팩토리 (0) | 2026.01.23 |
| 스프링 AOP (0) | 2025.12.13 |