AOP : 관점 지향 프로그래밍
공통 관심 사항(cross-cutting-concern)과 핵심 관심 사항(core concern)을
분리하여 프로그래밍 하는 것
하나의 메서드의 실행 시간을 알아내라고 하면 쉽다.
그런데 모든 메서드의 실행 시간을 알아내라고 하면 어떨까?
모든 메서드들에
이런식으로 다 작성을 해야 될 것이다.
메서드가 1000개라면 1000개 다 위와 같은 방식으로 해야 될 것이다.
모든 메서드가 있는 곳에는 시간 측정 로직이 있어야 되므로 위와 같은 그림이 될 것이다.
이것을 해결하기 위하여 나온 것이 AOP 이다.
TimeTraceAop라는 클래스를 만든 후 @Aspect
와
스프링 빈 등록을 위한 @Component
혹은 @Bean
으로 SpringConfig에 지정하거나 하고
해당 시간 구하는 로직을 구현하여 이 메서드가 어느 범위에서 사용이 될지를 알려주는 @Around
어노테이션을 사용.
joinPoint.proceed();
를 이용해 기존의 메서드를 실행하면서
실행이 끝난다면 콘솔로 시간이 얼마나 걸렸는지 출력
동작화면
스프링 컨테이너가 AOP를 적용하면 스프링 빈을 불러오기 전에 가짜 프록시 객체를 만들어서 AOP를 실행시키고 AOP가 실행이 다 된다면 proceed를 통해 진짜 스프링 빈을 불러와 실행을 하게 된다.
이 원리는 의존성 주입(DI)이 가능하기 때문에 사용가능한 프로그래밍인 것 같다.
스프링 컨테이너는 스프링 빈으로 등록하면 자동으로 DI를 해준다.
이 과정에서 스프링 컨테이너가 DI의 주체가 되기 때문에 AOP를 적용하는 경우에도 스프링 컨테이너가 DI하기전에 AOP를 먼저 적용 할 수 있는 것이 아닐까 생각해본다.