AOP 개념
AOP의 대해 학습을 하긴 했지만 프로젝트에서 어떻게 활용해야 하는지 전혀 모르겠어서 그냥 이런게 있다~ 하고 넘어갔다.그러지 말았어야..
implementation 'org.springframework.boot:spring-boot-starter-aop'
@Aspect
@Component
@Slf4j
public class LogAop {}
해당 클래스를 Spring Bean으로 등록하기 위해 @Component
를 추가해주었다.
@Aspect
애너테이션은 해당 클래스가 공통 기능을 제공하는 Aspect 클래스를임을 선언하기 위해 사용된다.
@Pointcut("execution(* com.server.domain..*.*(..))")
private void cut() {}
@Pointcut
애너테이션은 AOP가 적용될 JoinPoint들을 정의한다. AspectJ 표현식을 사용하여 @Pointcut
가 지정한 메서드를 실행하는데 execution(* com.server.domain..*.*(..))
는 패키지 이름을 정의한 것이다.
🚨주의할 점
처음에는 전체 코드에 AOP를 사용하기 위해com.server
로 설정하였다. 이렇게 넓은 범위를 지정할 경우 JWT의 SecretKey와 같은 유출되지 않아야 할 정보들이 유출될 수 있으니 주의해야 한다!
execution(접근제어자
,반환타입
, 패키지를 포함한 클래스 경로
, 메소드파라미터
)
AspectJ 표현식은 다양한 방식으로 표현할 수 있다!
@Before("cut()")
public void beforeLog(JoinPoint joinPoint) {...}
cut()
이 실행되지 이전에 실행되는 메서드를 지정한다.
@AfterReturning(value = "cut()", returning = "returnObj")
public void afterReturning(JoinPoint joinPoint, Object returnObj) {...}
메서드가 예외 없이 정상 완료 후 실행된다.
returning
속성에 지정된 타입을 반환하는 메서드만 해당 메서드를 실행한다.
참고 블로그
AspectJ표현식