Spring AOP 정리

devdo·2021년 12월 30일
0

Spring

목록 보기
4/11
post-thumbnail

AOP(Aspect Oriented Programming)

: 관점 지향 프로그래밍

스프링 어플리케이션은 대부분 특별한 경우를 제외하고는 MVC 웹 어플리케이션에서는 Web Layer, Business Layer, Data Layer 로 정의.

  • Application Layer : REST API를 제공하며, Client 중심의 로직 적용
  • Business Layer : 내부 정책에 따른 logic를 개발하며, 주로 해당 부분을 개발
  • Data Layer : 데이터 베이스 및 외부와의 연동을 처리

스프링 DI가 의존성(new) 주입이라면,
스프링 AOP는 로직(code) 주입이라고 볼 수 있다.

로깅, 보안, 트랜잭션, validation 등등 공통된 기능을 모아놓아 반복적으로 나타나는 부분이 있는데 이를 횡단관심(cross-cutting concern)이라고 한다.

✨ AOP는 핵심 비즈니스 로직에 영향을 받게 하지 않고 반복적인 공통 부분을 모듈화해 몰아주는 기술이다.


횡단관심(공통 모듈)

횡당관심으로 뭐가 있을까?

ex. 로깅, 시간측정, 보안, 트랜잭션 등


출처: https://expert0226.tistory.com/200 [여름나라겨울이야기]

만약, 모든 메서드의 호출 시간을 측정하고 싶다면?

@Component
@Aspect
public class TimeTraceAop {

    /**
     * AOP 설정
     * @param joinPoint 실행할 메소드
     * @return 실행 결과
     * @throws Throwable 예외 발생 시
     */
    @Around("execution(* com.dsg.mallapi..*(..))")
    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 timeMs = finish - start;
            System.out.println("END: " + joinPoint.toString() + " " + timeMs + "ms");
        }
    }

}


AOP 구성요소

/**
 * 시간 측정 AOP
 * 메서드마다 적용
 */
@Component
@Aspect
public class TimeTraceAop {


    /**
     * AOP 설정
     * @param joinPoint 조인 포인트
     * @return 실행 결과
     * @throws Throwable 예외 발생 시
     */

//    execution(* com.dsg.mallapi..*(..))
    @Pointcut("execution(* com.dsg.mallapi..*(..))")
    private void timeTracePointcut() {}


    @Around("timeTracePointcut()")
    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 timeMs = finish - start;
            System.out.println("END: " + joinPoint.toString() + " " + timeMs + "ms");
        }
    }

}
  • Aspect : 모듈
    - Advice와 Pointcut의 조합

    • 애플리케이션이 가지고 있어야 할 로직과 그것을 실행해야 하는 지점을 정의한 것, Aspect는 핵심로직과 떨어진 부가기능을 의미하는 데 쓰인다.
    • @Aspect : 클래스에 AOP 설정을 붙여주는 어노테이션
  • JointPoint : 합류 지점, 메소드 실행시점
    - 횡단 공통(Crosscutting Concerns) 모듈이 삽입되어 동작할 수 있는 실행 가능한 특정 위치
    - 메소드 호출, 메소드 실행 자체, 클래스 초기화, 객체 생성 시점 등

  • Pointcut: 어떤 포인트(Point)에 기능을 적용할지 하지 않을지 잘라서(cut) 구분하는 것이다.
    - Pointcut은 어떤 클래스의 어느 JoinPoint를 사용할 것인지를 결정하는 필터 패턴

    • 가장 일반적인 Pointcut은 ‘특정 클래스에 있는 모든 메소드 호출’로 구성
  • Around : 대상 메서드의 실행 전후Aspect가 적용될 수 있게 도와준다.

    • @Around 어드바이스는 대상 메서드의 실행을 감싸서 전/후 처리를 수행할 수 있습니다.
  • Advice : 프록시가 호출하는 조언(부가 기능) 단순하게 프록시 로직이라 생각하면 된다.
    - Advice는 관점(Aspect)의 실제 구현체로 결합점에 삽입되어 동작할 수 있는 코드

    • Advice 는 결합점(JoinPoint)과 결합하여 동작하는 시점에 따라 before advice, after advice, around advice 타입으로 구분
    • 특정 JoinPoint에 실행하는 코드
  • Advisor : 단순하게 하나의 포인트컷과 하나의 어드바이스를 가지고 있는 것이다. 쉽게 이야기해서 Pointcut + Advice이다.

  • Weaving :
    - Pointcut으로 지정한 핵심 관심 메소드가 호출될 때, 어드바이스에 해당하는 횡단 관심 메소드가 삽입되는 과정.
    - Weaving을 통해서 비즈니스 메소드를 수정하지 않고도 횡단 관심에 해당하는 기능을 추가하거나 변경할 수 있다.

즉, AOP

JoinPoint를 실행 → Pointcut으로 지정한 메소드가 호출되는 순간 Advice 메소드가 실행
Advice 메소드 삽입→ Aspect 설정에 따라 Weaving 처리.


주요 어노테이션

@Timer

@Aspect : 자바에서 널리 사용하는 AOP 프레임워크에 포함되며, AOP를 정의하는 class에 해당

@Pointcut : 기능을 어디에 적용시킬지, 메소드? Annotation? 등 AOP를 적용시킬 지점을 결정

@Around : Before / after 모두 제어

@Before : 메소드 실행하기 이전
@After : 메소드가 성공적으로 실행 후, 예외가 발생되더라도 실행
@AfterReturing : 메소드 호출 성공 실행 시 (Not Throws)
@AfterThrowing : 메소드 호출 실패 예외 발생 (Throws)


AOP 동작 과정

1) Before Advice : 포인트컷으로 지정된 메소드를 호출 시 메소드가 실행되기 전에 처리할 내용을 기술하기 위해 사용

2) After Returning Advice : 포인트컷으로 지정된 메소드가 정상적으로 실행되고 나서, 메소드 수행 결과로 생성된 데이터를 리턴하는 시점에 동작. 비지니스 메소드의 결과로 얻은 결과 데이터를 이용하여 사후 로직을 추가할 때 사용된다.

3) After Throwing Advice : 포인트컷으로 지정한 메소드가 실행되다가 예외가 발생하는 시점에 동작. 예외 처리 어드바이스를 설정할 때 사용한다.

4) After Advice : 예외 발생 여부에 상관없이 무조건 수행되는 어드바이스를 등록할 때 사용.

5) Around Advice : 다른 Advice는 실행 전/후의 수행되는 처리를 위해서 설정했다면 Around Advice는 클라이언트의 메소드 호출을 가로챈 뒤 실행 전/후의 처리를 동시에 처리할 수 있다.



참고

profile
배운 것을 기록합니다.

0개의 댓글