AOP

초보개발·2022년 4월 22일
0

Spring

목록 보기
33/37

김영한님의 스프링 강의를 보고 작성한 내용입니다.

AOP(Aspect Oriented Programming)

AOP는 메서드 안의 핵심 기능과 부가 기능을 분리한 후 선택적으로 메서드에 적용해 사용한다는 개념임

AOP 용어

  • aspect: 구현하고자 하는 보조 기능
  • advice: aspect의 실제 구현체, 메서드 호출 기준으로 여러 지점에서 실행됨
  • joinpoint: advice를 적용하는 지점
  • pointcut: advice가 적용되는 대상 지정, 패키지이름/클래스이름/메서드이름을 정규식으로 지정하여 사용
  • target: advice가 적용되는 클래스
  • weaving: advice를 주기능에 적용하는 것

AOP가 필요한 상황

  • 모든 메소드의 호출 시간을 측정하고 싶은 경우
  • 공통 관심 사항(Cross-cutting concern) vs 핵심 관리 사항(Core concern)
  • 회원 가입 시간, 회원 조회 시간을 측정하고 싶은 경우

문제

🌼 메소드마다 시간 측정 기능을 만들어 놓을 경우

  • 회원가입, 회원 조회에 시간을 측정하는 기능은 공통 관심 사항
  • 시간을 측정하는 로직과 핵심 비즈니스의 로직이 섞여 유지보수가 어려움
  • 시간을 측정하는 로직을 별도의 공통 로직으로 만들기 어려움
  • 시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가며 변경해야함

AOP 적용

  • 공통 관심사항 vs 핵심 관심사항 분리
@Aspect // aop
@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");
        }
    }
}

TimeTraceAop를 작성하고 @Component 애노테이션을 사용하거나 Config 파일에 @Bean으로 직접 등록해주면 된다.

AOP 동작 방식

  • AOP 적용 전 의존 관계
  • AOP 적용 후 의존 관계

    Controller는 실제 memberService를 상속받은 Proxy 객체를 호출한다. joinPoint.proceed()가 되고나서 실제 memberService가 호출이 된다.

0개의 댓글