본문 바로가기

Java/Spring-boot

AOP정의 및 Advice, Pointcut 작성 정리

반응형

Node기반의 Nest.js 로 개발할때도 느꼈고 Django로 개발할때도 느꼈던 사항인데 생각없이? 개발하다보면

개발의 핵심 코드와 부연코드가 같이 뒹굴어 파악이 힘든 코드가 되는경우를 많이 본것 같다. 

 

혼돈스러운? 코드

부연 코드의 경우 한번 작성하면 중복해서 사용할 일들이 많은데. 

해당 메서드 마다 일일히 달아줘야 한다고 생각해보면 번거롭기 마련이다. 

 

위 그림처럼  핵심코드를 제외하고 메서드 마다 로그를 남긴다던가.. 메서드의 시간 측정을한다던가? 핵심코드를 제외하고 추가로 달아줘야하는 부연 코드들이 존재한다. 

 

이런 주요 코드와 부연코드를 분리하기 위해 나온 개념이   AOP(Aspect-Oriented  Programming) 즉 관점 지향 프로그래밍이라 할수 있다. 

 

 

스프링이 AOP를 통해 넣어주는 부연코드

핵심코드와 관련이 크지 않은 부연 코드를  분리하여 재사용이 가능하게 하는것이 핵심 목표라고 할수 있다. 

 

이러한 AOP를 활용하기 위해 간단한 개념부터 정리하고 진행한다.

 

  •  Advice
    • 타겟을 호출할때 적용되는 부가적인 동작을 정의하는 객체 
    • Around, Before, After, AfterReturing, AfterThrowing 등 활용
  • 타겟 (Target)
    • AOP가 적용되는 대상으로써 어드바이스를 받는 객체
  • 포인트컷
    • Advice가 적용되는 기준을 정의하는 객체
  • Aspect
    • 어드바이스 + 포인트컷을 결합해 모듈화 한것

 

 

Advice 정리 

 

@Around("pointcut ")

Target 객체의 메서드가 호출되는 전체 과정을 모두 담을수 있으며 타깃 메서드를 직접 호출하고 반환한다.

제어등 추가 작업이 가능하다.

 

@Before("pointcut ")

Target 객체의 메서드 호출 이전에 실행되는 Advice

 

@AfterReturning(pointcut ="", returning ="") 

Target 객체의 메서드가 정상적으로 실행을 마친 후에 호출되는 Advice이다.

리턴값을 참조할 때는 returning 속성에 리턴값을 저장할 변수 이름을 지정해야한다. 

 

@AfterThrowing(pointcut ="", Throwing="")

Target 객체의 메서드가 예외가 발생하면 호출되는 Advice이다.

리턴값을 참조할 때는 returning 속성에 리턴값을 저장할 변수 이름을 지정해야한다. 

 

@After("pointcut ")

 Target 객체의 메서드가 정상, 예외 발생에 관계없이 모두 호출되는 Advice 

 

 

 

포인트컷 작성 요령 

포인트컷 작성 요령 ([]는 생략 가능하다)

execution( [접근제어자] 반환타입 [선언타입] 메서드이름(파라미터) [예외] ) 

  • ex) execution(public java.lang.String hello.aop.member.MemberService.hello(java.lang.String))
    • public -> 접근제어자로써 접근자를 지정한다. (생략가능)
    • java.lang.String -> 반환타입을 명시한다. (*로 대체 가능)
    • hello.aop.member.MemberSerivce ->  선언타입을 명시한다. (생략가능)
    • hello -> 메서드 이름 (*로 대체 가능)
    • java.lang.String (..으로 대체 가능 )
    • 예외파트는 생략
      • *는 아무값이나 들어와도 된다는 뜻
      • ..은 파라미터 타입및 갯수가 모두 상관없다는 뜻이다.

@annotation(annotationType)

 

 

 

 

https://loy124.tistory.com/398

 

Spring boot AOP를 활용한 로그 추적하기, 메서드 시간 측정하기

https://loy124.tistory.com/397 AOP정의 및 Advice, Pointcut 작성 정리 Node기반의 Nest.js 로 개발할때도 느꼈고 Django로 개발할때도 느꼈던 사항인데 생각없이? 개발하다보면 개발의 핵심 코드와 부연코드가 같

loy124.tistory.com

 

 

반응형