본문 바로가기
Spring 입문

스프링MVC 입문25

by danny-j 2022. 11. 14.

AOP

  • AOP -- Aspect Oriented Programming(관점 지향 프로그래밍)
  • 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 분리

 

aop / TimeTraceAop

package com.danny.learningspring.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

@Slf4j
@Aspect
public class TimeTraceAop {

    @Around("execution(* com.danny.learningspring..*(..)) && !target(com.danny.learningspring.SpringConfig)")
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        log.error("MethodName===>{}", joinPoint.getSignature().getName());
        try {
            return joinPoint.proceed();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            log.error("END=====>{}", timeMs +"ms");
        }
    }
}
  • @Aspect -- AOP를 가능하게 하는 AspectJ 프로젝트에서 제공하는 어노테이션
  • @Around("execution(* com.danny.learningspring.service..*(..))") -- 적용 범위 설정
  • !target -- Been생성 중복이 되므로 Aspect를 적용하지 않음
  • ProceedingJoinPoint -- 호출되는 객체들의 정보에 접근할 수 있는 인터페이스

 

SpringConfig / 빈 등록

@Bean
public TimeTraceAop timeTraceAop() { return new TimeTraceAop();}
  • @Component를 사용하여 컴포넌트 스캔을 이용해 스프링 빈에 등록을 하기도 하지만 AOP는 정형화된 것이라고 보기에 애매하기도 하고 AOP라는 인지가 필요함으로 설정 파일로 따로 관리하는 것을 권장

 

AOP 적용 후 의존관계

  • 실제 스프링빈들 앞에 proxy빈(가짜)을 만들어주고 스프링 컨테이너는 의존성 주입때 proxy빈을 넣어줌
  • 실제 빈을 실행할 때도 proxy빈이 수행되고 joinPoint가 각각의 메서드들이 실행될 때 개입해 시간체크를 해주는 방식
  • 여기서 joinpoint의 proceed()가 실행될 때, 진짜 memberService를 호출

 

실행 결과

Success

 

 

 

 

이미지 출처 - https://www.inflearn.com/course/스프링-입문-스프링부트

 

'Spring 입문' 카테고리의 다른 글

스프링MVC 입문24  (0) 2022.11.14
스프링MVC 입문23  (0) 2022.11.14
스프링MVC 입문22  (0) 2022.11.14
스프링MVC 입문21  (0) 2022.11.14
스프링MVC 입문20  (0) 2022.11.14

댓글