AOP

김민석·2021년 2월 7일
0
post-custom-banner

AOP(Aspect Oriented Programming)

AOP는 관점 지향 프로그래밍으로 어떤 로직을 핵심적 관점, 부가적 관점으로 나누어 보고 그 관점을 기준으로 각각 모듈화 하는 것을 의미한다.
예를 들어 핵심적 관점은 실행해야할 비즈니스 로직이고 부가적 관점은 핵심 로직을 실행하기 위해 선수되어야 하는 데이터베이스 연결, 입출력 등이 된다.
애플리케이션 전체에 걸쳐 반복 사용되는 기능을 재사용 할 수 있게 해 준다.

예를 들어 모든 메소드의 호출 시간을 측정하고 싶을 때 AOP가 유용하게 쓰인다.

AOP를 사용하지 않고 시간 측정


위와 같이 시간 측정 해주는 코드를 모든 부분에 적용해 줘야 한다. 만약 적용할 메서드가 늘어나면 그만큼 반복되는 코드 역시 엄청나게 길어질 것이다.
또한 비즈니스 로직과 시간 측정 로직이 섞여서 유지보수 역시 어렵다.
추가적으로 시간 측정 로직을 변경할 때 역시 모든 로직을 찾아내면서 변경해야 한다.
위와 같이 모든 메소드에 시간측정 로직을 적용하면 아래와 같은 양상을 보일 것이다.

AOP를 사용하여 시간 측정

공통 관심 사항(부가적 관점)과 핵심 관심 사항(핵심적 관점)으로 분리한다. 시간 측정 로직이 공통 관심 사항이기 때문에 원하는 곳에 공통 관심 사항을 적용하면 된다.

새로 패키지와 클래스를 생성하여 다음과 같이 코드를 작성해 준다.

package hello.helloSpring.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class TimeTraceAop {
    @Around("execution(* hello.helloSpring..*(..))")
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable{
        long start = System.currentTimeMillis();

        System.out.println("Start : " + joinPoint.toString());

        try{
            return joinPoint.proceed();
        }finally {
            long finish = System.currentTimeMillis();
            long timMs = finish - start;

            System.out.println("END : " + joinPoint.toString() + " " + timMs + "ms");
        }
    }
}

@Aspect 어노테이션과 @Component 어노테이션을 달아준다. @Component 어노테이션 대신 config 파일에서 @Bean을 통해 등록을 해도 된다.
@Around 어노테이션을 통해 어디에 타겟팅 할 지 설정해 준다. 예시에서 사용한 것은 helloSpring 패키지 내부 전체에 타겟팅을 해 준 것이다.
jointPoint를 통해 모든 부분에 aop를 걸어준 것이다.

테스트 코드를 통해 수행해 보면 결과가 잘 나오는 것을 확인할 수 있다.

AOP를 적용하면 다음과 같은 양상을 보일 것이다.

AOP 동작 과정
AOP를 적용하기 전에는 그냥 호출하는 방식이다.

AOP를 적용한 후에는 프록시를 생성하여 프록시를 호출한 후 프록시가 끝나면 타겟이 비로소 호출되는 것이다.
(프록시란 타겟을 감싸서 호출을 대신 받는 Wrapping Object이다)

출처 : 인프런 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
https://www.inflearn.com/course/스프링-입문-스프링부트/lecture/49601?tab=curriculum

profile
김민석의 학습 정리 블로그
post-custom-banner

0개의 댓글