써먹는 웹개발

[Spring] AOP 개념 및 예제 소스 본문

Server/Spring

[Spring] AOP 개념 및 예제 소스

kmhan 2020. 4. 27. 13:27


728x90
반응형

1. AOP(Advice Target Pointcut / 관점 지향 프로그래밍) 개념

 - 비즈니스 로직 객체와 공통적인 부분 (권한, 트랜잭션, 예외처리, 로깅 등)을 분리하여 처리하는 것

  ex) 모든 서비스에 시간 측정 기능(종료-시작 시간)이 필요할때

 - 시간 측정 기능을 넣을때 개별적으로 해도 되는데 AOP를 쓰는 이유 : 소스 중복제거

 

용어정리

1) Advice : 어떤 부가기능을 언제 사용할지에 대한 정의

2) Target : 부가 기능이 적용될 대상

 ex) 시간 측정하는 A,B 메서드는 Target / 그 외에는 Target이 아님

3) Pointcut : Advice를 적용할 Jointpoint를 선별하는 작업

 - 시간 측정을 원하는 서비스에만 할 수 있게 선별하는 작업 

 ※ JointPoint : Advice가 적용될 수 있는 위치

  - 메서드 호출할 때

  - 변수에 접근할 때

  - 객체를 초기화할 때

  - 객체에 접근할 때

 

참고하면 좋은 강의

 - www.youtube.com/watch?v=WQR_VQnz7Yg&ab_channel=%EC%9A%B0%EC%95%84%ED%95%9CTech

 - www.youtube.com/watch?v=Hm0w_9ngDpM&ab_channel=%EC%9A%B0%EC%95%84%ED%95%9CTech

 

2. 예제 소스

 1) 시간측정 소스 만드는 법

파일명 : LogAspect.java
...

@Component
@Aspect
public class LogAspect {
  Logger logger = LoggerFactory.getLogger(LogAspect.class);
  
  @Around("@annotation(LogExecutionTime)")
  public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();

    Object proceed = joinPoint.proceed();

    stopWatch.stop();
    logger.info(stopWatch.prettyPrint());

    return proceed;
  }
}

 2) 시간측정 어노테이션 사용법

public class xxxService {

  @GetMapping("owners/new")
  @LogExecutionTime
  public String initCreationForm(Map<String, Object> model) {
    Owner owner = new Owner();
    model.put("owner", owner);
    return VIEWS_OWNER_CREATE_OR_UPDATE_FORM;
  }

}

소스 출처 : www.youtube.com/watch?v=3750wh1wNuY&ab_channel=%EB%B0%B1%EA%B8%B0%EC%84%A0

728x90
반응형


Comments