[스프링 입문] AOP

지현·2021년 11월 2일
0

스프링

목록 보기
6/32

AOP가 필요한 상황

  • 모든 메소드의 호출 시간을 측정하고 싶다면?
  • 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern)
    • 시간을 측정하는 로직은 공통 관심 사항
    • 시간을 측정하는 로직과 핵심 비즈니스의 로직이 섞여서 유지보수가 어려움
    • 시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어려움

AOP 적용

  • AOP Aspect Oriented Programming
  • 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 분리

hello\hellospring\aop\TimeTraceAop.java

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
// @Component 애너테이션을 사용해도 되지만 Aop가 등록해서 쓰이는구나 알 수 있게 직접 @Bean 등록해주는것이 좋음
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{
            Object result = joinPoint.proceed(); // 다음 메소드로 진행
            return result;
        }finally {
            long finish=System.currentTimeMillis();
            long timeMs=finish-start;
            System.out.println("END: * " + joinPoint.toString()+ " "+timeMs+"ms");
        }
    }
}
  • 회원가입, 회원 조회등 핵심 관심사항과 시간을 측정하는 공통 관심 사항을 분리
  • 시간을 측정하는 로직을 별도의 공통 로직으로 생성
  • 핵심 관심 사항을 깔끔하게 유지 가능
  • 변경이 필요하면 이 로직만 변경하면 됨
  • 원하는 적용 대상을 선택할 수 있음

1. Aop를 적용하고 어디에 사용할지 지정하면 가짜 멤버 서비스(프록시)를 만듦
2. 스프링 컨테이너에 등록 할 때 진짜 스프링 빈 말고 가짜 스프링 빈(프록시)를 앞에 세움
3. 가짜 스프링빈(프록시)가 끝나면 joinPoint.proceed()로 진짜 스프링 빈을 호출



출처
[인프런] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

0개의 댓글