[Spring] 6. AOP

developer-shkim·2021년 7월 21일
0

Spring 입문 강의

목록 보기
6/6

⌜스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술⌟(김영한, 인프런)
(강의 자료를 요약 및 발췌하였고, 김영한 강사님께 양해를 구하고 작성했습니다.)

AOP 필요한 상황

모든 메소드의 호출 시간을 측정하고 싶다면?
공통 관심사 (cross-cutting concern) vs 핵심 관심사 (core concern)

메소드마다 추가해야 할 코드

public void methodName() {
    long start = System.currentTimeMillis();

    try {
		// 핵심 관심사 로직
    } finally {
        long finish = System.currentTimeMillis();
        long timeMs = finish - start;
        System.out.println("join = " + timeMs + "ms");
    }
}

문제상황

  • 시간을 측정하는 기능은 핵심 관심사가 아니다. 공통 관심사이다.
  • 공통 관심사와 핵심 관심사 로직이 섞여서 유지보수가 어렵다.
  • 시간을 측정하는 로직을 별도 공통으로 분리하기 매우 어렵다.
  • 시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 한다.

AOP

Aspect Oriented Programming

해결

  • 핵심 관심사와 공통 관심사를 분리한다.
  • 시간 측정 로직을 공통 로직으로 만든다.
  • 핵심 관심사를 깔끔하게 유지
  • 변경 필요하면 이 로직만 변경
  • 원하는 적용 대상 선택할 수 있다.

java/hello/hellospring/aop/TimeTraceApp.java

@Aspect
@Component
public class TimeTraceApp {

    //    @Around("execution(* hello.hellospring.service..*(..))")    // service 만
    @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");
        }
    }
}

  • 프록시로 가짜 스프링 빈을 세우고 진짜 스프링 빈이 호출되도록 구성한다.

  • DI 가 가짜를 만들어서 주입한다.
  • 자바에서 컴파일 타임에 코드를 생성해서 위 아래로 넣어주는 기술도 있다.
profile
기록하고 기억하자!

0개의 댓글