AOP - Advice

귀찮Lee·2022년 6월 20일
0

Spring

목록 보기
12/30
post-custom-banner

◎ Advice

  • Advice

    • 조인 포인트에서 수행되는 코드를 의미 (Aspect를 언제 핵심 코드에 적용할지 정의)
    • 부가 기능에 해당됨
  • Advice 순서

    • Advice는 기본적으로 순서를 보장하지 않음
    • 하나의 Aspect에 여러 어드바이스가 존재하면 순서를 보장 받을 수 없다.
    • 순서를 지정하고 싶으면 @Aspect 적용 단위로 org.springframework.core.annotation.@Order 애너테이션을 적용해야 한다.
      • 애스펙트를 별도의 클래스로 분리해야 함
      • 관련 자료

◎ Advice 종류

  • Before

    • 조인 포인트 실행 이전에 실행됨
    • Before Advice 구현한 메서드는 일반적으로 리턴타입이 void 이다
      • return 값을 갖더라도 실제 Advice 적용 과정에 아무 영향이 없다.
    • 주의점 : 예외를 발생시킬 경우, 대상 객체의 메서드를 호출하지 않음
  • AfterRunning

    • 조인 포인트가 정상 완료 후 실행
    • returning 속성에 사용된 이름은 어드바이스 메서드의 매개변수 이름과 일치해야 함
    • returning 절에 지정된 타입의 값을 반환하는 메서드만 대상을 실행
    @AfterReturning(value = "execution(* com.test.controller.TestController.*(..))", returning = "returnValue")
    public void writeSuccessLog(JoinPoint joinPoint, ResponseObject returnValue) throws RuntimeException {
        //logging
        //returnValue 는 해당 메서드의 리턴객체를 그대로 가져올 수 있다.
    }
  • AfterThrowing

    • 메서드가 예외를 던지는 경우에 실행
    • throwing 속성에 사용된 이름은 어드바이스 메서드의 매개변수 이름과 일치해야 함
    • throwing 절에 지정된 타입과 맞은 예외를 대상으로 실행
    @AfterThrowing(value = "execution(* com.test.controller.TestController.*(..))", throwing = "exception")
    public void writeFailLog(JoinPoint joinPoint, Exception exception) throws RuntimeException {
        //logging
        //exception 으로 해당 메서드에서 발생한 예외를 가져올 수 있다.
    }  
  • After (finally)

    • 조인 포인트의 동작(정상 또는 예외)과는 상관없이 실행 (예외 동작의 finally와 유사)
    • 일반적으로 리소스를 해제하는데 사용
  • Around

    • 메서드 호출 전후에 공통 기능을 수행, 여러가지 기능들이 가능
      • 조인 포인트 실행 여부 선택, 반환 값 변환, 예외 변환 ...
    • Around 사용 방법
      • joinPoint.proceed() 를 통해 대상을 실행함 (여러번 실행 가능)
      • return 문에서 처리된 요청을 반환
      • try, catch, finally를 통해 예외 처리 가능
    @Around("execution(public * com.sparta.springcore.controller..*(..))")
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
        
        // 앞에서 부가 기능 수행
        // 핵심기능 수행
        Object output = joinPoint.proceed(); // 들어온 요청을 controller 로 보냄
        // 뒤에서 부가 기능 수행 가능
        return output; // controller 에서 처리된 요청을 반환
    }
  • 모든 Advice는 Around 만으로도 전부 처리 가능

    • @Before, @After 는 기능은 적지만 코드가 단순하고, 어떤 일을 하는지 명확히 알 수 있다.
    • 제약을 가지더라도 다른 advice를 사용해 실수를 미연에 방지할 수 있다.
profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!
post-custom-banner

0개의 댓글