AOP - JoinPoint

귀찮Lee·2022년 6월 21일
0

Spring

목록 보기
13/30

◎ JoinPoint

  • JoinPoint

    • 어플리케이션 실행 흐름에서의 특정 포인트(AOP를 적용할 수 있는 지점)를 의미
      • 어드바이스가 적용될 수 있는 위치, 메소드 실행, 생성자 호출, 필드 값 접근, static 메서드 접근 같은 프로그램 실행 중 지점을 나타냄
    • 어플리케이션에 새로운 동작을 추가하기 위해 관심 코드(aspect code)를 추가할 수 있다.
  • 스프링 AOP

    • 프록시 객체 : 원래 객체를 감싸는 객체 (AOP에 유용)
    • 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메소드 실행 지점으로 제한
      • 생성자나 static 메서드, 필드 값 접근에는 프록시 개념이 적용될 수 없다.
    • 프록시는 메서드 오버라이딩 개념으로 동작
    • 스프링 컨테이너가 관리할 수 있는 스프링 빈에만 AOP를 적용 가능

◎ JoinPoint Interface & Object

  • Joinpoint method는 어드바이스 종류에 따라 사용방법이 다르지만, 기본적으로 어드바이스 메서드에 매개변수만 선언하면 됨

  • JoinPoint 인터페이스 메서드 종류

    • joinPoint.getArgs() : JoinPoint에 전달된 인자를 배열로 반환
    • joinPoint.getThis() : AOP 프록시 객체를 반환
    • joinPoint.toString() : 조언되는 방법에 대한 유용한 설명을 인쇄
    • joinPoint.getSignature() : 조언되는 메서드에 대한 설명(Signature 객체)을 반환
      • signature.getName() : 호출한 메서드 이름 반환
      • signature.toLongString() : 호출한 메서드의 리턴타입, 이름, 매개변수, 패키지 경로를 반환
      • signature.toShortString() : 메서드 시그니쳐를 축약한 문자열로 반환
      • signature.getMethod()
    @Slf4j
    @Aspect
    @Component
    public class SimpleLogAop {
    
        @Before("execution(* com.aop.controller..*.*(..))")
        public void beforeParameterLog(JoinPoint joinPoint) {
            // 메서드 정보 받아오기
            Method method = getMethod(joinPoint);
            log.info("======= method name = {} =======", method.getName());
    
            // 파라미터 받아오기
            Object[] args = joinPoint.getArgs();
            if (args.length <= 0) log.info("no parameter");
            for (Object arg : args) {
                log.info("parameter type = {}", arg.getClass().getSimpleName());
                log.info("parameter value = {}", arg);
            }
        }
    
        @AfterReturning(value = "cut()", returning = "returnObj")
        public void afterReturnLog(JoinPoint joinPoint, Object returnObj) {
            // 메서드 정보 받아오기
            Method method = getMethod(joinPoint);
            log.info("======= method name = {} =======", method.getName());
    
            log.info("return type = {}", returnObj.getClass().getSimpleName());
            log.info("return value = {}", returnObj);
        }
    
        private Method getMethod(JoinPoint joinPoint) {
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            return signature.getMethod();
        }
    }
  • ProceedingJoinPoint 인터페이스

    • proceed() : 다음 어드바이스나 타켓을 호출
    @Around("execution(public * com.sparta.springcore.controller..*(..))")
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
        
        // 앞에서 부가 기능 수행
        // 핵심기능 수행
        Object output = joinPoint.proceed(); // 들어온 요청을 controller 로 보냄
        // 뒤에서 부가 기능 수행 가능
        return output; // controller 에서 처리된 요청을 반환
    }
profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!

0개의 댓글