빙응의 공부 블로그
[Spring] Spring AOP로 성능 측정하기 본문
📝 AOP(Aspect Oriented Programming)
AOP는 프로그램의 관심사를 분리하여 코드의 모듈성을 높이고 재사용성을 향상시키는
프로그래밍 패러다임이다.
📌 이 패러다임이 왜 필요해?
예를 들어, 비즈니스 로직의 실행 속도를 측정하는 경우를 생각해봅시다. 각 메서드에 currentTimeMillis()를 추가해야 한다면, 코드의 중복이 발생할 수 있습니다.
AOP의 아이디어는 관점에 따라 분류 가능한 로직을 모듈화하여 따로 관리하며, 공통적으로 사용 가능한 로직은 재사용 가능한 형태로 만드는 것입니다. 이렇게 하면 공통 관심 사항(예: 시간 측정)을 분리하여 처리할 수 있습니다.
해당 사진처럼 공통으로 처리하는 시간 측정 로직을 공통 관심 사항으로 분리하여 처리할 수 있게 해준다.
📝 AOP로 Spring 성능 측정하기
이번에는 AOP로 Spring 성능 측정을 하는 공통 관심사를 만들어보겠습니다.
📌@Component 방식
@Aspect
@Component
public class PerformanceAspect {
private static final Logger logger = LoggerFactory.getLogger(PerformanceAspect.class);
@Around("execution(* com.yourpackage..*(..))") // AOP 적용할 패키지 및 메서드 지정
public Object measureExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object proceed = joinPoint.proceed(); // 타겟 메서드 실행
long executionTime = System.currentTimeMillis() - start;
logger.info("Method {} executed in {} ms", joinPoint.getSignature(), executionTime);
return proceed;
}
}
설명
- @Aspect: 이 클래스가 AOP의 Aspect임을 나타낸다.
- @Around: 지정한 Join Point(여기서는 패키지 내의 모든 메서드)에 대해 전후에 수행될 로직을 정의한다.
- measureExecutionTime: 타겟 메서드의 실행 시간을 측정하고 로그로 기록합니다. joinPoint.proceed()를 호출하여 실제 메서드를 실행한다.
- Logger: 로그를 기록합니다. 로그는 메서드의 이름과 실행 시간을 포함한다.
📌config 설정
@Aspect가 실행되기 위해서는 Config에 등록해줘야한다.
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
// 기타 빈 설정
}
@EnableAspectJAutoProxy만 넣어주면 된다
📝 AOP의 동작원리는 무엇일까요?
📌 @EnableAspectJAutoProxy
AOP의 동작원리를 이해하려면 해당 어노테이션을 자세히 알아보아야 합니다.
해당 어노테이션은 AspectJ의 프록시 기반 AOP 활성화 어노테이션으로 Aspect를 사용하여 정의된 로직을 비즈니스 로직에 적용할 수 있게 합니다.
주요 특징은 다음과 같습니다.
프록시 기반 AOP 활성화
- 해당 어노테이션을 선언하면 Spring이 Aspect를 인식하고 이를 사용하여 가상의 프록시 객체를 생성한다.
- 이 프록시 객체는 실제 비즈니스 로직을 감싸고, 해당 로직의 전후에 AOP로 정의된 기능을 추가한다.
즉 해당 어노테이션을 선언하면 Spring이 로직 진행 전에 프록시 가상 객체를 만들어 AOP 설정된 기능을 사용합니다.
AspectJ 지원
- 이 어노테이션은 AspectJ를 사용하여 정의된 Join Point와 Pointcut을 사용할 수 있게 해줍니다.
- 예를 들어, 특정 패키지 내의 메서드 호출에 대해 로깅을 추가할 수 있습니다.
정리하면 다음과 같습니다.
AOP 어노테이션을 사용하면 객체 호출 전 프록시 객체(Proxy Serivce)를 만들고 먼저 실행하여 앞서 필요한 기능을 수행하고 내부 로직에 따라 joinPoint.proceed()가 실행되면, 그 때 실제 Service가 동작합니다.
🧷참고
[번역] Spring 공식문서 - Aspect Oriented Programming (velog.io)
[번역] Spring 공식문서 - Aspect Oriented Programming
Ref. Spring Framework Documentation v.5.3.16 📌 이 글에서는 공식문서의 Aspect Oriented Programming 부분만 다룹니다.
velog.io
'Spring > 개인공부_실습' 카테고리의 다른 글
[Spring]Chat GPT API 주소 기반 코스 추천 만들기 (3) | 2024.10.21 |
---|---|
[Spring]WebSocket과 STOMP을 이용한 실시간 채팅 및 채팅방 생성 (2) | 2024.10.11 |
[Spring]API 문서화 - Swagger (0) | 2024.10.04 |
[Spring]OAuth2.0 - 구현하기 (0) | 2024.07.30 |
[Spring]OAuth2.0 - 필수 변수와 네이버 요청하기 (0) | 2024.07.30 |