[Spring in Action] Spring AOP 예제 만들어 적용하기

728x90
반응형
SMALL

Spring in Action (5판)

  • 스프링 5의 강력한 기능과 생산성을 활용한 웹 애플리케이션 개발
  • Walls, Craig 지음
  • 제어펍 출판사
  • 2020.05.14

 

스프링 인 액션 개인 스터디 내용을 정리하자.

 

 

 

 

Spring AOP

Spring AOP는 프록시 패턴으로 AOP 기능을 한다. 프록시 패턴을 사용하면 기능 추가 시 기존 코드를 변경하지 않는 장점이 있다.

 

어떤 클래스가 Spring AOP의 대상이라면 기존 클래스의 빈이 생성될 때 Spring AOP가 프록시를 자동으로 만들고 원본 클래스 대신 프록시를 빈으로 등록한다.

 

그리고 원본 클래스가 사용되는 지점에서 프록시를 대신 사용한다.

 

Spring AOP에 대한 자세한 내용을 아래를 참조하자.

hoooon-s.tistory.com/54?category=961471

 

[Spring in Action] Spring AOP & AspectJ

Spring in Action (5판) 스프링 5의 강력한 기능과 생산성을 활용한 웹 애플리케이션 개발 Walls, Craig 지음 제어펍 출판사 2020.05.14 스프링 인 액션 개인 스터디 내용을 정리하자. AOP Aspect Oriented Progr..

hoooon-s.tistory.com

상황

기존 메서드에 성능 측정을 해달라는 요구 사항이 발생했다.

 

모든 메서드에 성능 측정 로직을 추가하는 것은 비효율적이다.

 
@RestController
public class AopSample {
 
    @GetMapping("/sample01")
    public String sample01() {
        int no = 0;
        for (int a = 0; a < 1; a++) {
            no++;
        }
        return "sample01";
    }
 
    @GetMapping("/sample02")
    public String sample02() {
        int no = 0;
        for (int a = 0; a < 1000000000; a++) {
            no++;
        }
        return "sample02";
    }
}

 

Pointcut 커스텀 애노테이션 추가

 
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
 
}

 

Aspect 클래스 생성

 
@Slf4j
@Component
@Aspect
public class LogAspect {
    @Around("@annotation(LogExecutionTime)")
    public Object logExecutionTime(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
 
        Object proceed = proceedingJoinPoint.proceed();
 
        stopWatch.stop();
        log.info(stopWatch.prettyPrint());
 
        return proceed;
    }
}

@Aspect

  • 클래스가 횡단 관심사 클래스(Aspect)임을 알려주는 애노테이션
  • 자동으로 빈에 등록되는 것이 아니므로 @Component 애노테이션을 통해 빈으로 등록해줘야 한다.

@Around({Pointcut})

  • Advice의 한 종류로 Aspect의 실패 여부와 상관 없이 전, 후로 실행되도록 하는 Advice이다.
  • 파라미터로 Pointcut을 전달해주어야 한다.

@Pointcut

  • Aspect가 적용될 Joinpoint를 정의한 것이다.

 

기존 메서드에 Pointcut 추가

 
@RestController
public class AopSample {
     
    @LogExecutionTime
    @GetMapping("/sample01")
    public String sample01() {
        int no = 0;
        for (int a = 0; a < 1; a++) {
            no++;
        }
        return "sample01";
    }
 
    @LogExecutionTime
    @GetMapping("/sample02")
    public String sample02() {
        int no = 0;
        for (int a = 0; a < 1000000000; a++) {
            no++;
        }
        return "sample02";
    }
}

 

결과

728x90
반응형
LIST