AOP - AOP가 필요한 상황
2022. 8. 6. 10:13ㆍ2022/Spring
AOP가 필요한 상황
- 모든 메소드와 호출 시간을 측정하고 싶은 경우
- 공통 관심 사항(cross-cutting concern) VS 핵심 관심 사항(core concern)
- 회원 가입 시간, 회원 조회 시간 측정하고 싶은 경우
예시
만약 각 메서드의 실행 소요 시간을 알고싶다고 하면, 여러가지 문제점이 생긴다.
- 회원가입, 회원조회 등의 메소드는 핵심 관심 사항인데 비해, 시간을 측정하는 로직은 공통관심사항이다.
- 핵심 비즈니스 로직과 시간측정 로직이 섞이면 유지보수 및 변경이 어렵다.
- 시간을 측정하는 로직을 별도의 공통 로직으로 만들기는 어렵다.
따라서 이렇게 시간 측정 로직을 핵심 비즈니스 로직에 붙여서 사용하는 것이 아니라,
시간 측정 로직을 한 곳에 모두 모아 내가 원하는 곳에 적용하는 방법을 사용한다.
이를 AOP : Aspect Oriented Programming (관점 지향 프로그래밍) 라고 한다.
소스코드 작성
@Aspect //AOP
//빈으로 등록
public class TimeTraceAop {
//execution(* hello.hellospring..*(..)) : hello.hellospring 하위에 모두 적용
@Around("execution(* hello.hellospring..*(..))")
//메소드에 의해 호출이 될 때마다 ProceedingJoinPoint에 intercepter가 걸리는 것
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");
}
}
}
빈 등록
@Bean
public TimeTraceAop timeTraceAop(){
return new TimeTraceAop();
}
또는
@Component
를 해준다. 그런데 이런 특별한 경우에는 전자의 경우로 스프링 빈에 직접 등록하는 것이 더 좋다.
AOP 동작 방식
< AOP 적용 전 의존관계 >
< AOP 적용 후 의존관계 >
스프링 컨테이너에 빈을 등록할 때 가짜 memberService를 만들어서 앞세워서 끝나면 내부적 로직을 타는 joinPoint.proceed() 거쳐 실제 memberService를 호출한다.
'2022 > Spring' 카테고리의 다른 글
스프링 DB 접근 기술- 스프링 데이터 JPA (0) | 2022.08.06 |
---|---|
스프링 DB 접근 기술- JPA (1) | 2022.08.05 |
스프링 DB 접근 기술 - 스프링 JDBC Template (0) | 2022.08.05 |
스프링 DB 접근 기술 - 스프링 통합 테스트 (0) | 2022.07.31 |
스프링 DB 접근 기술 - 순수 JDBC (0) | 2022.07.31 |