Spring AOP

김재민·2022년 4월 8일
0

개요

1. 모든 메소드의 호출 시간을 측정하고 싶다면?
2. 공통 관심 사항 vs 핵심 관심 사항
3. 회원가입시간, 회원 조회 시간을 측정하고 싶다면?


이런식으로 start와 finish 변수를 설정하여 호출 시간을 측정하지만, 모든 메소드에 이런 과정을 반복해서 적용한다면...?

문제

1. 회원가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심 사항이 아니다.
2. 시간을 측정하는 로직은 공통 관심 사항이다.
3. 시간을 측정하는 로직과 핵심 비즈니스 로직이 섞여서 유지보수가 어렵다.
4. 시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어렵다.
4. 시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 한다.

AOP가 필요한 상황

구현과 관련된 설명

  1. @Aspect
@Aspect
public class LogAop{
	...
}

@Aspect : 해당 Class가 부가기능 Class임을 알려주는 Annotation, Annotation이 부여되었다고해서 자동으로 Bean등록되는 것이 아니므로 따로 Bean으로 등록을 해주는 작업이 필요,
또한 @Component등을 사용해도됨

  1. @Around("Pointcut")
    @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");
        }
    }

@Around("PointCut"): Around어노테이션은 advice한 종류로 핵심관심사의 실패여부와 상관없이 전후로 실행되도록하는 Advice
@Around의 속성값으로 PointCut을 전달해주어야함.

3.@Pointcut
@Pointcut은 부가기능이 적용될 JoinPoint들을 정의한 것. @Pointcut어노테이션의 경우 조금 복잡한 표현식을 가지고 있음

1 . execution(접근제어자, 반환형 패키지를 포함한 클래스 경로 메소드 파라미터) 

    @Pointcut("execution(public void get*())")

퍼블릭형의 반환형이 없는 (public void)형태의 메소드 중 get으로 시작하는(get*)모든 메소드중 파라미터가 존재하지 않는(()) 메소드들에게 적용

@Pointcut("execution(* *(..))")

첫번째 *기호는 접근제어자, 반환형을 상관하지 않는다는 의미
com.java.ex.Car.accelerate()는 해당 Class의 accelerate() (파라미터가 없는) 메소드가 호출될 때 실행하는 경우를 의미

@Pointcut("execution(* com.java..*.*())")

위와 비슷하지만 com.java..내의 ..부분은 해당 패키지를 포함한 모든 하위패키지에 적용을 한다는 의미. 해석한다면 접근제어자, 반환형을 상관하지 않고 com.java 패키지를 포함한 모든 하위디렉토리의 모든 Class의 모든 파라미터가 존재하지 않는 메소드에 적용한다

해결

  1. 회원가입, 회원 조회 등 핵심 관심사항과 시간을 측정하는 공통 관심사항을 분리한다.
  2. 시간을 측정하는 로직을 별도의 공통 로직으로 만들었다.
  3. 핵심 관심 사항을 깔끔하게 유지할 수 있다.
  4. 변경이 필요하면 이 로직만 변경하면된다.
  5. 원하는 적용 대상을 선택할 수 있다.
profile
어제의 나보다 나은 오늘의 내가 되자!🧗‍♂️

0개의 댓글

관련 채용 정보