📌 김영한 선생님의 스프링 입문 강의 강의를 들으면서 공부한 내용을 정리한 게시물입니다.
AOP가 무엇인지 알아보기 전에 먼저 AOP가 필요한 상황부터 살펴보자!
👨🏻 : 요즘 우리 시스템이 말이야~ 너무 느린 것 같아.
모든 메소드의 호출 시간을 한 번 측정해서 보고하게.
👩🏻 : 넵..!
가장 간단한 방법은 다음과 같이 모든 메소드의 시작과 끝에 호출 시간을 초 단위로 측정하는 코드를 하나하나 작성하는 방법일 것이다.


조금 번거롭기는 하지만 결과는 잘 나오므로 아래와 같이 모든 코드에 시간 측정 로직을 추가하는 작업을 (메소드가 100개 있으면 100번) 반복하면 될 것이다.

하지만 갑자기 초 단위가 아닌 ms 단위로 바꾸라고 한다면?
👨🏻 : 초 단위로 하니까 잘 안나오네. 초 단위말고
ms단위로 다시 바꿔서 해봐.
👩🏻 : ...😭
100개의 코드를 다시 하나하나 ms 단위로 출력하도록 바꿔야 할 것이다.
이렇게 하나하나 시간 측정 코드를 추가하는 방식의 문제점은
이런 상황에서 필요한 것이 바로
AOP이다!
- 모든 메소드의 호출 시간을 측정하고 싶다면?
- 공통 관심 사항 (
cross-cutting concern) vs 핵심 관심 사항(core concern)- 회원 가입 시간, 회원 조회 시간을 측정하고 싶다면?
- AOP: Aspect Oriented Programming
- 공통 관심 사항과 핵심 관심 사항을 분리하는 것

main/java/hello.hellospring/aop/TimeTraceAop@Component
@Aspect
public class TimeTraceAop {
@Around("execution(* hello.hellospring..*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
System.out.println("START: " + joinPoint.toString());
try {
return joinPoint.proceed();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("END: " + joinPoint.toString()+ " " + timeMs + "ms");
}
}
}
@Aspect를 붙여줘야 AOP를 사용할 수 있다.@Around("execution(* hello.hellospring..*(..))"): hello.hellospring 패키지 하위에 모두 적용한다는 뜻📌 참고 | SpringConfig 파일에 스프링 빈 등록
@Configuration public class SpringConfig { ... @Bean public TimeTraceAop timeTraceAop() { return new TimeTraceAop(); } }AOP 같은 경우는
@Component를 이용하는 방법보다
SpringConfig 파일에서 "이러한 AOP를 걸고 있구나!"를 쉽게 인지할 수 있도록 하는 것이 더 좋다.
HelloSpringApplication을 실행시키고 localhost:8080/members 에 접속해보면

이렇게 START와 END가 여러 개 출력되는 것을 확인할 수 있다.
📌 추가적으로
위에서
main/javajava/hello/hellospring/HelloSpringApplication.java에 추가했던 시간 측정 코드를 없애준다.

프록시(proxy)라는 가짜 회원 서비스를 만든다.joinPoint.proceed()가 호출되면 실제 회원 서비스의 메소드들이 동작한다.


AOP는 공통 관심 사항과 핵심 관심 사항을 분리하는 것이다.공통 로직을 따로 분리하면 핵심 관심 사항을 깔끔하게 유지할 수 있으며, 유지보수도 용이하게 할 수 있다.