Spring/스프링입문

[스프링입문] 섹션7. AOP

LTSGOD 2023. 1. 17. 20:23

AOP(Aspect Oriented Programming)가 필요한 상황

- 모든 메서드의 호출시간을 측정하고 싶다면??

 

 

문제

  • 시간을 측정하는 기능은 핵심 관심 사항이 아님.
  • 시간을 측정하는 로직은 공통 관심 사항
  • 시간 측정 로직과 핵심 비즈니스 로직이 섞여 유지보수가 어려움
  • 시간을 측정하는 로직을 별도의 로직으로 만들기 어려움.
  • 또 변경할 땐 또 모든로직 찾아가면서 변경해야함.

-> 이런 문제를 해결하기 위한게 AOP

공통관심사항핵심관심사항을 분리

적용할 곳에 지정 해줌.

 

@Aspect
@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");
      }

   }
}

@Aspect 키워드

@Component로 빈에 등록

@Around 어노테이션

 

해결

  • 핵심 관심사항과 공통관심 사항 분리 성공
  • 시간 측정 로직을 별도의 공통 로직으로 만듦
  • 핵심 관심사항을 깔끔 유지
  • 변경 필요하면 이로직만 변경
  • 원하는 적용대상 변경 가능

AOP 적용 전 의존관계

Controller가 Service에 의존, Controller가 Service를 호출

 

1. 스프링이 가짜 프록시 Service를 만듦

2. 가짜 프록시 Service 수행 후 proceed()를 통해 실제 Service 호출

 

AOP적용전 전체그림

DI를 통해 AOP가 가능.

 

스프링 -> 프록시 방식 AOP

자바에서 컴파일 타임에 코드를 생성해서 자바코드를 박아주는 기술도 있음.