Node기반의 Nest.js 로 개발할때도 느꼈고 Django로 개발할때도 느꼈던 사항인데 생각없이? 개발하다보면
개발의 핵심 코드와 부연코드가 같이 뒹굴어 파악이 힘든 코드가 되는경우를 많이 본것 같다.
부연 코드의 경우 한번 작성하면 중복해서 사용할 일들이 많은데.
해당 메서드 마다 일일히 달아줘야 한다고 생각해보면 번거롭기 마련이다.
위 그림처럼 핵심코드를 제외하고 메서드 마다 로그를 남긴다던가.. 메서드의 시간 측정을한다던가? 핵심코드를 제외하고 추가로 달아줘야하는 부연 코드들이 존재한다.
이런 주요 코드와 부연코드를 분리하기 위해 나온 개념이 AOP(Aspect-Oriented Programming) 즉 관점 지향 프로그래밍이라 할수 있다.
핵심코드와 관련이 크지 않은 부연 코드를 분리하여 재사용이 가능하게 하는것이 핵심 목표라고 할수 있다.
이러한 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
'Java > Spring-boot' 카테고리의 다른 글
Spring boot AOP를 활용한 로그 추적하기, 메서드 시간 측정하기 (0) | 2023.07.07 |
---|---|
Spring-boot(mysql-mybatis-aws s3(cloudFront) + Vue.js 를 활용한 파일 업로드 하기 - 백엔드 구성 (0) | 2020.04.12 |
Spring-boot(mysql-mybatis-aws s3(cloudFront) + Vue.js 를 활용한 파일 업로드 하기 - 기초 셋팅 (0) | 2020.04.12 |
이클립스(스프링 sts)에서 Spring-boot, Jpa 사용 하기 (2) (0) | 2020.03.15 |
이클립스(스프링 sts)에서 Spring-boot, Jpa 사용 하기 (1) (0) | 2020.03.15 |