[AOP] ProceedingJoinPoint, JoinPoint

yookyungmin·2023년 8월 30일
0

Aop와 관련하여 공부하던 도중 알게 된것을 간단하게나마 적어보려고 합니다

@Component
@Aspect
public class CustomValidationAdvice {

        @Pointcut("@annotation(org.springframework.web.bind.annotation.PostMapping)")
        public void postMapping(){} //기능 적용할 위치

        @Pointcut("@annotation(org.springframework.web.bind.annotation.PostMapping)")
        public void putMapping(){}

          //postMapping, putMapping 두군데다 하겠따
        @Around("postMapping() || putMapping()") //joinpoint 의 전후 제어, joinpoint = 메서드들
        public Object validationAdvice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
            Object[] args = proceedingJoinPoint.getArgs(); //joinpoint의 매개변수들, joinpoint는 메서드들
            //메서드의 파라미터에 접근이 가능하다 //@Around에서만 지원됨, ProceedingJoinPoint를 사용해야 proceed() 사용 가능

            //joinpoint 매개변수들을 for문돌려서
            for(Object arg : args){
                if(arg instanceof BindingResult){ //BindingResult를 상속받거나 인스턴스면
                    BindingResult bindingResult = (BindingResult) arg; //다운 캐스팅

                    if(bindingResult.hasErrors()){ //bindingresult에 에러가 있으면
                        Map<String, String> errorMap = new HashMap<>();

                        for(FieldError error : bindingResult.getFieldErrors()){
                            errorMap.put(error.getField(), error.getDefaultMessage()); //에러들이 담긴다.
                        }
                      throw new CustomValidationException("유효성 검사 실패", errorMap);
                    }
                }
            }
            return proceedingJoinPoint.proceed();
        }
        /*postmapping, putmapping이 붙어있는 모든 컨트롤러가 동작 할때 BindingResult 매개변수가 있으면 if가 동작
          동작해도 에러가 있을때만 throw new를 날리고 에러가 없으면 proceed() 실행 정상적으로 실행하라는 메서드
        * */
}

저번에 한번 AOP @validate를 통한 유효성 검증 처리 블로그를 올린적이 있는데

간략하게 코드 설명을 하자면,
postmapping, putmapping이 붙어있는 모든 컨트롤러가 동작 할때 BindingResult 매개변수가 있으면 if가 동작 하게 되는데 동작해도 에러가 있을때만 throw new CustomValidationException 를 날리고 에러가 없으면 proceed() 실행 정상적으로 실행하라는 메서드이다.

근데 메서드의 매개변수를 ProceedingJoinPoint를 사용 이유에 대해 간략하게 적어보려고 합니다

JoinPoint 인터페이스

  • JoinPoint 인터페이스는 호출되는 대상 객체, 메서드, 전달 파라미터 목록에 접근 할 수 있는 메소드 제공

  • 제공 메서드

Signature getSignature()호출되는 메서드에 대한 정보
Object getTarget()	대상 객체
Object[] getArgs()	파라미터 목록

ProceedingJoinPoint 인터페이스

  • JoinPoint를 상속받은 객체
  • proceed() 추가 구현
  1. 메서드의 파라미터 접근 하기 위해서 필터나 인터셉터 대신 AOP를 사용.

  2. AOP 를 전후 제어 하기 위해서 @Around를 사용.

  3. @Around를 사용할 땐 JoinPoint 대신ProceedingJoinPoint 를 사용.

  4. ProceedingJoinPoint 의 추가로 구현 되어 있는 proceed() 메서드를 사용하면서 BindingResult에 에러가 담기지 않으면 정상적으로 컨트롤러 메서드를 정상 실행 하기 하면서 AOP 전후 제어가 가능.

0개의 댓글