AOP와 프록시

이주희·2022년 8월 5일
0

spring

목록 보기
7/16
post-custom-banner

프록시

프록시란?

핵심 기능은 다른 객체에 위임하고 부가적인 기능을 하는 객체

  • 핵심 기능을 하지 않음
  • 대신 여러 객체에 공통으로 적용될 기능을 구현

AOP

Aspect Oriented Programming

여러 객체에 공통으로 적용될 기능을 분리하는 프로그래밍 기법

기능을 두가지로 나누었을 때

  • 핵심기능
  • 공통기능 (Aspect)

Spring에서는 핵심 기능을 할 인터페이스와 이를 받아 공통기능을 하는 클래스를 따로 구현하지 않고 공통 기능을 할 클래스만 구현하면 됨

AOP 용어

용어의미
Advice언제 공통 기능을 핵심 로직에 적용할 지를 정의
JoinpointAdvice를 적용하능한 지점 ex) 메서드 호출, 필드 값 변경
Pointcut실제 Advice가 적용되는 Joinpoint
WeavingAdvice를 핵심 로직 코드에 적용하는것
Aspect여러 객체에 공통적으로 적용되는 기능

Advice 종류

Before Advice메서드 호출 전 공통기능 실행
After Returning Advice익셉션 없이 실행된 이후
After Throwing Advice메서드 실행 도중 익셉션 발생한 경우에 공통기능 실행
After Advice익셉션 상관없이 대상 객체 메서드 실행후 실행
Around Advice실행 전 후 익셉션 발생 시점에 공통기능 실행

스프링 AOP 구현

순서

  1. Aspect 사용 클래스에 @Aspect 애노테이션 부여
  2. @Pointcut 애노테이션으로 공통기능을 적용할 Pointcut 정의
  3. 공통 기능 구현 메서드에 @Around 적용

코드

package AOP;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.Signature;

@Aspect // 공통 기능을 사용할 클래스
public class ExeTimeAspect {

    @Pointcut("execution(public * AOP..*(..))") // 공통 기능을 적용할 Pointcut
    private void publicTarget(){

    }

    @Around("publicTarget()") // Around Advice 설정
    public Object measure(ProceedingJoinPoint joinPoint) throws Throwable{
        long start = System.nanoTime();
        try{
            Object result = joinPoint.proceed();
            return result;
        }finally{
            long finish = System.nanoTime();
            Signature sig = joinPoint.getSignature();
            System.out.printf("%s.%s(%s) 실행시간 : %d ns\n",
                    joinPoint);
        }

    }
}
post-custom-banner

0개의 댓글