728x90
AOP(Aspect-Oriented Programming)는 핵심 비즈니스 로직과 분리되는 부가적인 기능, 즉 '횡단 관심사'를 분리해 코드의 가독성과 유지 보수성을 높여줍니다. 대표적인 예로 로깅, 트랜잭션 관리, 보안 등이 있는데, 이 중에서도 메서드 호출에 대한 로깅은 애플리케이션의 동작을 추적하고 디버깅하는 데 큰 도움이 됩니다. 이번 포스팅에서는 Spring Boot의 AOP를 활용해 프로젝트 내 모든 메서드 호출 시마다 자동으로 로그를 남기는 방법을 알아보겠습니다.
Spring logback 설정은 블로그 포스팅 을 참고해주세요.
1. 라이브러리 추가
// AOP
implementation 'org.springframework.boot:spring-boot-starter-aop'
2. LogAop.java
package com.criteria.criteriaexample.config;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Slf4j
@Aspect
@Component
public class LogAop {
@Before("execution(* com.criteria..*(..))")
public void methodCall(JoinPoint joinPoint) {
String methodName = joinPoint.getSignature().getName();
String className = joinPoint.getSignature().getDeclaringTypeName();
log.info("Entering method: " + className + "." + methodName + "()");
}
@AfterReturning(pointcut = "execution(* com.criteria..*(..))", returning = "result")
public void logMethodExit(JoinPoint joinPoint, Object result) {
String methodName = joinPoint.getSignature().getName();
String className = joinPoint.getSignature().getDeclaringTypeName();
log.info("Exiting method: " + className + "." + methodName + "() with result: " + result);
}
}
- @Slf4j: Lombok을 통해 log라는 Logger 객체를 자동으로 생성해주는 어노테이션입니다. 이를 통해 log.info()와 같은 메서드를 사용하여 간편하게 로그를 남길 수 있습니다.
- @Aspect: 이 클래스가 AOP의 핵심인 Aspect임을 나타냅니다. Aspect는 여러 곳에서 적용될 공통 기능을 모아놓은 모듈입니다.
- @Component: Spring의 Bean으로 등록되어 자동으로 관리되도록 하는 어노테이션입니다. 이를 통해 Spring IoC 컨테이너가 이 클래스를 인식하고 AOP 기능을 적용할 수 있게 됩니다.
- @Before("execution(* com.criteria..*(..))")
- 이 어노테이션은 com.criteria 패키지와 그 하위 패키지에 있는 모든 클래스의 모든 메서드가 호출되기 전에 이 methodCall 메서드가 실행된다는 것을 의미합니다.
- @AfterReturning(pointcut = "execution(* com.criteria..*(..))", returning = "result")
- 이 어노테이션은 com.criteria 패키지와 그 하위 패키지의 모든 메서드가 실행된 후에, 즉 정상적으로 반환된 경우에 logMethodExit 메서드가 실행된다는 것을 의미합니다.
감사합니다.
728x90
'프레임워크 > SpringBoot' 카테고리의 다른 글
[SpringBoot] MongoDB 윈도우 설치방법과 간단한 예제 (1) | 2024.10.22 |
---|---|
[SpringBoot] 캐릭터 맞히기 게임 사이트 구현하기 (1) | 2024.10.10 |
[SpringBoot] JPA 쿼리 메서드 키워드 정리 및 예제 (2) | 2024.09.24 |
[SpringBoot] JPA + Criteria를 이용한 Join 예제 (2) | 2024.09.23 |
[SpringBoot] Apache Kafka 간단한 예제만들기 (0) | 2024.09.19 |