[무지목록] aop를 알아보자

🤔 AOP (Aspect Oriented Programming) 란 무엇인가?

🔎 무지 발견

스프링 입문 강의를 듣던 중 AOP가 나왔다. 입문 강의라서 짧게 다루고 넘어갔는데 평소 많이 들어는 봤지만 그래서 AOP가 뭐야? 라는 질문에 답을 할 수 가 없어 무지목록에 집어넣었다.

💡 알아보기

애플리케이션의 핵심적인 기능에서 부가적인 기능을 분리해서 애스펙트라는 독특한 모듈로 만들어서 개발하는 방법을 애스펙트 지향 프로그래밍 ( AOP )라 한다.

애스팩트란?

애플리케이션의 핵심기능을 담고 있지는 않지만, 애플리케이션을 구성하는 중요한 한 가지 요소이고, 핵심기능에 부가되어 의미를 갖는 특별한 모듈을 가리킨다.

애스펙트는 부가될 기능을 정의한 코드인 어드바이스와, 어드바이스를 어디에 적용할지를 결정하는 포인트컷을 함께 갖고 있다.

그래서

부가기능을 분리하지 않으면 핵심기능이 부가기능 코드에 가려 안보일 수 있고 여러 메소드에 흩어져 나타나고 중복되게 된다.

AOP는 애스팩트를 분리함으로써 핵심기능을 설계하고 구현할 때 객체지향적인 가치를 지킬 수 있도록 도와주는 것이다.

결국 애플리케이션을 다양한 측면에서 독립적으로 모델링하고, 설계하고, 개발할 수 있도록 만들어준다. 애플리케이션을 특정한 관점을 기준으로 바라볼 수 있게 해준다는 의미로 관점 지향 프로그래밍라고도 한다.

🎯 실제 적용 사례

AOP 적용 전 📌

    public List<Member> findMembers() {
        long start = System.currentTimeMillis();
        try {
            return memberRepository.findAll();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("findMembers " + timeMs + "ms");
        }
    }

=> 실행 시간을 측정, 핵심기능은 회원 목록을 조회하는 기능이지만 시간 측정을 하는 부가기능에 가려 코드가 잘 보이지 않는다. 또 실행 시간 측정을 모든 기능마다 추가하게 되면 해당 코드가 변경될 때 모든 기능을 찾아서 바꿔야하는 불상사가 일어난다.

AOP 적용 후 📌

@Aspect
@Component
public class TimeTraceAop {
    @Around("execution(* com.hello.hellospring..*(..))")
    public Object excute(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        System.out.println("START :" + joinPoint.toString());
        try {
            return joinPoint.proceed();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("END: " + joinPoint.toString() + " " + timeMs + "ms");
        }
    }
}
  • @Aspect : Aspect declaration
  • @Around : the pointcut expression where to bind the advice
  • @Around("execution(* com.hello.hellospring..*(..))") : 해당 패키지에 들어있는 모든 것에 적용

AOP 동작 방식

=> 프록시가 나타났다!!! 다음 무지 목록에서 알아보자

🎈 마무리

AOP에 대해 가볍게 알아보았다. 조금씩 더 깊이 알아보자

results matching ""

    No results matching ""