AOP 예제
@Aspect
@Slf4j
public class CallLogAspect {
@Before("execution(* hello.aop.internalcall..*.*(..))")
public void log(JoinPoint joinPoint) {
log.info("aop={}", joinPoint.getSignature());
}
}
특정 경로 값 하위에 AOP를 적용하도록 하는 예제이다.
하지만 실제로 사용할 때에는 재사용성이 떨어진다.
따라서 특정 경로(특정 클래스 전체 or 특정 패키지 하위)에 적용 할 때는 위의 방법을 활용하고
메서드 단위에서 PointCut의 재사용성을 높이기 위해서는 커스텀 어노테이션을 활용한다.
어노테이션 방식 적용
커스텀 어노테이션
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyLog {
}
어드바이저
@Slf4j
@Aspect
@Component
public class MyLogAspect {
@Around("@annotation(myLog)")
public Object log(ProceedingJoinPoint joinPoint, MyLog myLog) throws Throwable {
log.info("AOP 시작");
long start = System.currentTimeMillis();
try {
log.info("실행 메서드 = {}", joinPoint.getSignature());
return joinPoint.proceed();
} catch (Exception e) {
log.info("예외 발생 = {}", e.getMessage());
throw e;
} finally {
long end = System.currentTimeMillis();
log.info("소요 시간 = {}ms", end - start);
log.info("AOP 끝");
}
}
}
인자에 MyLog 타입의 어노테이션을 받아오는 형식으로 작성하고
PointCut은 @Around("@annotation(myLog)") 어노테이션 이름으로 지정한다.
이렇게 설정하면 해당 어노테이션이 붙은 메서드에 AOP를 적용 할 수 있다.
컨트롤러단에서 AOP 적용
@MyLog
@PostMapping("/create")
public String createPost(@RequestParam(name = "category") String category
, @Valid PostCreateDto postCreateDto
, RedirectAttributes redirectAttributes
, @AuthenticationPrincipal PrincipalDetail principalDetail) {
postCreateDto.setUrlAddress(category);
postCreateDto.setUserId(principalDetail.getId());
PostResponseDto postResponseDto = postService.savePost(postCreateDto);
redirectAttributes.addAttribute("postId", postResponseDto.getId());
return "redirect:detail/{postId}";
}
AOP 로그
'Spring' 카테고리의 다른 글
Spring MVC 구조 뜯어보기(2) - Spring MVC 사용 (1) | 2024.01.21 |
---|---|
Spring MVC 구조 뜯어보기(1) - Servlet (0) | 2024.01.20 |
프록시의 한계와 해결방안(내부 호출) (0) | 2024.01.13 |
Spring AOP / @Aspect (JoinCut와 Advice) (2) | 2024.01.12 |
AOP의 정의와 프록시/데코레이션 패턴 (1) | 2024.01.04 |