AOP의 목적은 중복된 코드를 줄여 유지보수성과 재사용성을 향상시키는 것이다.
주로 메서드 실행 전후 로그 남기기 위해 사용됨.
| 어노테이션 | 설명 |
|---|---|
| @Aspect | AOP 클래스 선언 (횡단 관심사 모듈) |
| @Around | 메서드 실행 전후 제어 |
| @Before | 메서드 실행 전에 수행 |
| @AfterReturning | 정상 반환 후 수행 |
| @AfterThrowing | 예외 발생 시 수행 |
| @After | 정상/예외 관계없이 메서드 실행 후 수행 |
| @PointCut | 메서드 경로 지정 |
간단하게 실행 메서드 전후 시간을 로깅하여 실행 시간을 구하는 AOP를 만들어볼 것이다.
@Aspect // AOP 클래스 선언
@Componet // Bean 생성
@Slf4j // log 남기기
public class Aop() {
@Around("execution(* org.example.main.user.service..*(..))")
// 메서드 전후 실행, execution을 통해 메서드 기준점 지정
public Object executionTime(ProceedingJoinPoint joinPoint) throws Throwable {
// 메서드명 제외 정규화된 표현
long start = System.currentTimeMillis();
// 밀리세컨으로 시작 시간 표시 (현재)
Object result = joinPoint.proceed();
// 실제 메서드 실행 -> Filter에서 doFilter 와 비슷함.
long end = System.currentTimeMillis();
// 밀리세컨으로 종료 시간 표시 (현재)
log.info("[AOP] {} 실행됨 in {}ms" , joinPoint.getSignature() , end - start);
// 로그 남기기
return result;
// 서비스 로직 반환
}
}
이런 식으로 이뤄지는 매우 간단하고 도움되는 AOP였습니다.
AOP는 다양하게 활용할 수 있게 생겼다.
무엇보다 매력적인 점은 중복 코드를 줄이기 위해 사용된다는 것이다.
이것 하나만으로도 매우 메리트있다고 생각한다.
앞으로 어떻게 활용할 지 계속 탐구해보면 좋을 듯 하다!