프로젝트의 개발에 있어 공통적인 기능이 여러 클래스들에 반복되면서 코드가 지저분해지고 관리가 어려워질 때가 있습니다. 이번 프로젝트를 진행하면서 AOP를 활용해 이런 문제를 해결하였고, 그 과정을 정리해 보겠습니다.
AOP(Aspect Oriented Programming)는 관심사 분리를 통해 핵심 비즈니스 로직과 별개로, 공통적으로 적용해야 하는 부가 기능(로깅, 트랜잭션, 보안 등)을 분리해서 관리하는 기법입니다.
Spring에서는 @Aspect와 @Around 등을 통해 쉽게 구현할 수 있습니다.
@Aspect: 해당 클래스가 AOP관점(Aspect)의 역할을 한다는 것을 Spring에 알리는 어노테이션
@Around: Advice(실제 수행될 부가기능 코드)를 정의하는 어노테이션
백엔드의 개발에서 API의 응답 속도는 사용자 경험과 직결되는 중요한 요소라고 생각합니다. 그렇기에 현재 작성한 코드보다 더 좋은 방법을 추후 찾게되었을 때, 빠르게 성능 비교가 가능한 구조로 미리 만들어두고 싶었습니다.
하지만 매번 로그로 시작 시간과 끝 시간을 직접 찍는 것은 너무 비효율적인 방법이었습니다.
long start = System.currentTimeMillis();
// 비즈니스 로직
long end = System.currentTimeMillis();
System.out.println("응답 시간: " + (end - start));
이처럼 로직과 무관한 정보로 인해 지저분져 가독성이 떨어지는 것이 싫었습니다.
그래서 생각했습니다.
“핵심 로직 안에서 중복되는 부가 기능들을 따로 빼서 유연하게 변경할 수 있도록 하면 좋지 않을까?”
그렇게 선택한 방식은 AOP였습니다.
핵심 로직과는 분리된 위치에서 API 응답 시간을 자동으로 측정할 수 있고, 나중에 로그 포맷을 바꾸거나, 모니터링 시스템과 연동하는 것도 유연하게 할 수 있습니다.
AIP의 실행 시간을 측정하기 위해 다음과 같이 AOP 클래스를 작성했습니다. Spring AOP에서 제공하는 @Aspect와 @Around 어노테이션을 이용해서, 컨트롤러 메서드들의 실행 시간을 자동으로 로그로 출력하도록 구성했습니다.
@Slf4j
@Aspect
@Component
public class ExecutionTimeLogger {
// com.bucketlist.app.controller 패키지 이하의 모든 메서드 실행 시 동작
@Around("execution(* com.bucketlist.app.controller..*(..))")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
// 메서드 실행 시작 시간 기록
long startTime = System.currentTimeMillis();
// 실제 대상 메서드 실행
Object result = joinPoint.proceed();
// 메서드 실행 종료 시간 기록
long endTime = System.currentTimeMillis();
// 실행 시간 로그 출력
log.info("[{}] 실행 시간: {}ms", joinPoint.getSignature(), (endTime - startTime));
return result;
}
}
[ResponseEntity com.bucketlist.app.controller.AuthController.login(UserLoginRequest)] 실행 시간: 70ms
[ResponseEntity com.bucketlist.app.controller.BucketItemController.getAllBucketItems()] 실행 시간: 6ms
이렇게 API 실행 시간을 자동으로 출력하도록 할 수 있습니다.
이번 포스팅에서는 AOP를 활용할 수 있는 여러 기능 중, 실행 시간 측정 로직을 분리하는 방식으로 적용 사례를 정리해보았습니다.
AOP는 처음엔 생소하게 느껴졌지만, 실제로 적용해보니 비즈니스 로직을 깔끔하게 유지하면서, 부가 기능을 유연하게 관리할 수 있는 유용한 도구라는 것을 느꼈습니다. 이번 경험을 바탕으로 예외 로깅, 트랜잭션 선언 여부 확인 등 다양한 영역에도 AOP를 활용해볼 계획입니다.
"비지니스 로직을 온전히 유지하고싶다" 라는 생각이 들 때, AOP는 구조적이고 깔끔한 해답이 되어줄 수 있다고 생각합니다.