Spring/스프링입문
[스프링입문] 섹션7. AOP
LTSGOD
2023. 1. 17. 20:23
AOP(Aspect Oriented Programming)가 필요한 상황
- 모든 메서드의 호출시간을 측정하고 싶다면??
문제
- 시간을 측정하는 기능은 핵심 관심 사항이 아님.
- 시간을 측정하는 로직은 공통 관심 사항
- 시간 측정 로직과 핵심 비즈니스 로직이 섞여 유지보수가 어려움
- 시간을 측정하는 로직을 별도의 로직으로 만들기 어려움.
- 또 변경할 땐 또 모든로직 찾아가면서 변경해야함.
-> 이런 문제를 해결하기 위한게 AOP
공통관심사항과 핵심관심사항을 분리
적용할 곳에 지정 해줌.
@Aspect
@Component
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 키워드
@Component로 빈에 등록
@Around 어노테이션
해결
- 핵심 관심사항과 공통관심 사항 분리 성공
- 시간 측정 로직을 별도의 공통 로직으로 만듦
- 핵심 관심사항을 깔끔 유지
- 변경 필요하면 이로직만 변경
- 원하는 적용대상 변경 가능
Controller가 Service에 의존, Controller가 Service를 호출
1. 스프링이 가짜 프록시 Service를 만듦
2. 가짜 프록시 Service 수행 후 proceed()를 통해 실제 Service 호출
DI를 통해 AOP가 가능.
스프링 -> 프록시 방식 AOP
자바에서 컴파일 타임에 코드를 생성해서 자바코드를 박아주는 기술도 있음.