티스토리 뷰

스프링은 프록시 방식의 AOP를 사용한다.

따라서 AOP를 적용하려면 항상 프록시를 통해서 대상객체(Target)를 호출해야 한다.

이렇게 해야 프록시에서 먼저 어드바이스를 호출하여 부가기능을 수행하고, 이후에 대상 객체를 호출하여 핵심기능을 수행한다.

만약 프록시를 거치지 않고 대상 객체를 직접 호출하게 되면 AOP가 적용되지 않고, 어드바이스도 호출되지 않는다.

 

결론은 AOP를 적용한 객체 중, 대상객체(Target) 안에서 내부 호출하는  경우는 어드바이스가 적용되지 않게된다.

 

코드로 한번보자!


CallLogAspect

@Slf4j
@Aspect
public class CallLogAspect {

    @Before("execution(* hello.aop.internalcall..*.*(..))")
    public void doLog(JoinPoint joinPoint) {
        log.info("aop={}", joinPoint.getSignature());
    }
}

 

CallService

@Slf4j
@Component
public class CallService {

    public void external() {
        log.info("call external");
        internal(); //내부 메서드 호출(this.internal())
    }

    public void internal() {
        log.info("call internal");
    }
}

 

CallServiceTest

(테스트 코드로 작성)

@Slf4j
@Import(CallLogAspect.class)

@SpringBootTest
class CallServiceTest {

    @Autowired
    CallService callService;

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

    @Test
    void internal() {
        callService.internal();
    }
}

 

테스트 코드 실행결과

callService.external() 호출 시, 내부 호출한 internal()에는 aop 로그가 안 찍힌 것을 볼 수 있다.

 

callService.internal() 호출 시, 프록시를 통해 호출되기 때문에 aop 로그가 찍힌다.

 

AOP가 잘 적용되지 않는다면, 내부 호출을 의심해보자!

링크
최근에 올라온 글
글 보관함
«   2025/10   »
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