
스프링은 프록시 방식의 AOP를 사용한다. 따라서 AOP를 적용하려면 항상 프록시를 통해서 대상객체(Target)를 호출해야 한다. 이렇게 해야 프록시에서 먼저 어드바이스를 호출하여 부가기능을 수행하고, 이후에 대상 객체를 호출하여 핵심기능을 수행한다. 만약 프록시를 거치지 않고 대상 객체를 직접 호출하게 되면 AOP가 적용되지 않고, 어드바이스도 호출되지 않는다. 결론은 AOP를 적용한 객체 중, 대상객체(Target) 안에서 내부 호출하는 경우는 어드바이스가 적용되지 않게된다. 코드로 한번보자! CallLogAspect @Slf4j @Aspect public class CallLogAspect { @Before("execution(* hello.aop.internalcall..*.*(..))") pu..

AOP(Aspect Oriented Programming)는 관점 지향 프로그래밍이라 불린다. 공통 관심사(=횡단 관심사(Cross-Cutting Concerns))를 깔끔하게 처리하기 어려운 OOP를 보완하기 위해 개발되었다. Spring에서 제공하는 Spring AOP는 프록시 기반으로 동작하며, 런타임 시점에 빈 후처리기(Bean Post Processor)를 통하여 기존 Bean 객체를 부가 기능이 더해진 프록시 객체로 바꿔친다. 또 프록시 기반으로 동작하기 때문에 메서드 실행 지점에만 AOP를 적용할 수 있다(프록시는 메서드 오버라딩 개념으로 동작). 마지막으로 Spring AOP는 스프링 컨테이너가 관리할 수 있는 Bean에만 AOP를 적용할 수 있다. 아래의 예제코드를 살펴보자. build...