시작이 반

[Spring] 11. AOP 본문

Programming/Spring

[Spring] 11. AOP

G_Gi 2021. 1. 22. 00:57
SMALL

강의 참고 : www.inflearn.com/roadmaps/373

 

[초급~중급] 우아한형제들 개발팀장 김영한의 스프링 완전 정복 | 더 나은 학습을 위한 가이드

대세를 따르세요! 자바 스프링 베스트셀러 우형 개발팀장에게 배우는 스프링 완전 정복 🚩 오픈 3개월 만에 수강생 7000+명의 극찬 릴레이 ✨원리와 실무를 한방에, 김영한의 스프링 학습 1O1! 입

www.inflearn.com

AOP : Aspect Oriented Programming

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

 

AOP가 필요한 상황

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

모든 메소드마다 시간측정 로직을 설정해줘야한다...

 

문제

  • 회원가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심 사항이 아니다.
  • 시간을 측정하는 로직은 공통 관심 사항이다.
  • 시간을 측정하는 로직과 핵심 비지니스의 로직이 섞여서 유지보수가 어렵다.
  • 시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어렵다.
  • 시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 한다.

-> 비효율

 

AOP 적용

package hello.hellospring.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class TimeTraceAop { //스프링 빈 등록해야함 or @Cmponent를 해줘야함

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

        }
    }
}

 

AOP가 적용되야 하는 곳에 프록시라는 가짜를 만들어서 가짜 스프링 빈을 실제 앞에 세워놓고 가짜가 끝나면 진짜가 실행된다...?

LIST