💠프로그래밍 언어/Spring
[Spring] AOP 는 무엇일까 ??
튤
2024. 12. 30. 23:07
728x90
AOP가 없던 상황
모든 메서드의 호출 시간을 측정할 때 문제가 발생한다.
기존 방식
- 시간을 측정하는 공통된 로직은 공통 관심 사항이다.
- 핵심 비즈니스 로직과 섞여 유지보수가 어렵다.
기존 방식 코드
public Long join(Member member) {
long start = System.currentTimeMillis();
try {
validateDuplicateMember(member);
memberRepository.save(member);
return member.getId(); // 이 3줄만 핵심 비즈니스 로직이다.
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("join " + timeMs + "ms");
}
}
}
AOP
- 시간 측정 로직을 생성해 놓고, 원하는 곳에 적용시킨다.
- 핵심 비즈니스 로직을 깔끔하게 유지할 수 있다.
- @Aspect 를 추가해야 AOP로 사용할 수 있다.
- @Component 로 스프링 빈을 등록하거나, 직접 등록한다.
@Around : 적용할 범위를 지정한다.
컨트롤러가 가짜 서비스 객체(프록시)를 호출하고,
서비스 객체가 끝난 뒤 joinPoint.proceed( )가 호출되면 그때 진짜 서비스 객체를 실행한다.
예시 코드
@Aspect
@Component
public class TimeTraceAop {
@Around("execution(* hello.hello_spring..*(..))")
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");
}
}
}
(AOP 실행 결과)
출처 | 스프링 입문(김영한) - 인프런
728x90