AOP - AOP가 필요한 상황

2022. 8. 6. 10:132022/Spring

AOP가 필요한 상황
  • 모든 메소드와 호출 시간을 측정하고 싶은 경우
  • 공통 관심 사항(cross-cutting concern) VS 핵심 관심 사항(core concern)
  • 회원 가입 시간, 회원 조회 시간 측정하고 싶은 경우
예시

만약 각 메서드의 실행 소요 시간을 알고싶다고 하면, 여러가지 문제점이 생긴다.

  1. 회원가입, 회원조회 등의 메소드는 핵심 관심 사항인데 비해, 시간을 측정하는 로직은 공통관심사항이다.
  2. 핵심 비즈니스 로직과 시간측정 로직이 섞이면 유지보수 및 변경이 어렵다.
  3. 시간을 측정하는 로직을 별도의 공통 로직으로 만들기는 어렵다.

 

따라서 이렇게 시간 측정 로직을 핵심 비즈니스 로직에 붙여서 사용하는 것이 아니라,

시간 측정 로직을 한 곳에 모두 모아 내가 원하는 곳에 적용하는 방법을 사용한다.

 

 

이를 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 적용 전 의존관계 >

Controller가 Service를 의존하고 있는 관계

 

< AOP 적용 후 의존관계 >

스프링 컨테이너에 빈을 등록할 때 가짜 memberService를 만들어서 앞세워서 끝나면 내부적 로직을 타는  joinPoint.proceed() 거쳐 실제 memberService를 호출한다.

MemberService 복제 클래스 콘솔로 조회