728x90
AOP가 필요한 상황
- 모든 메소드와 호출 시간을 측정하고 싶은 겨우
- 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern)
- 회원 가입 시간, 회원 조회 시간을 측정하고 싶은 경우
위와 같이 시간 측정 로직을 각각 추가할 경우의 문제점
- 회원가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심 사항이 아니다
- 시간을 측정하는 로직은 공통 관심 사항이다
- 시간을 측정하는 로직과 핵심 비즈니스의 로직이 섞여서 유지보수가 어렵다
- 시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어렵다
- 시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 한다
AOP 적용
- AOP Aspect Oriented Programming
- 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern)을 분리한다!
[시간 측정 AOP 적용 코드]
package hello.hellospring.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@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");
}
}
}
- 회원가입, 회원 조회등 핵심 관심사항과 시간을 측정하는 공통 관심 사항을 분리한다
- 시간을 측정하는 로직을 별도의 공통 로직으로 만들었다
- 핵심 관심 사항을 깔끔하게 유지할 수 있다
- 변경이 필요하면 이 로직만 변경하면 된다
- 원하는 적용 대상을 선택할 수 있다
스프링의 AOP 동작 방식
AOP를 적용하기 전에는 아래와 같이 컨트롤러가 서비스를 바로 호출한다
AOP를 적용한 후에는 컨트롤러에서 실제 서비스를 바로 호출하는 것이 아닌, 가짜 객체인 proxy 서비스를 호출하고 있다가 joinPoint.proceed()가 실행되면 그 때 진짜 서비스를 호출한다
728x90
'인프런 🍀' 카테고리의 다른 글
[스프링 핵심 원리 - 기본편] 객체 지향 설계와 스프링 (0) | 2022.09.22 |
---|---|
[스프링 핵심 원리 - 기본편] 강의 소개 (0) | 2022.09.18 |
[스프링 입문] 스프링 DB 접근 기술 (0) | 2022.09.11 |
[스프링 입문] 회원 관리 예제 - 웹 MVC 개발 (0) | 2022.09.11 |
[스프링 입문] 스프링 빈과 의존관계 (0) | 2022.09.06 |
댓글