쏭의 개발 블로그

Spring AOP 본문

Back-end/Spring

Spring AOP

songu1 2023. 10. 7. 16:32

[1] AOP란?

로직에 관점을 부여하는 프로그래밍 (Aspect Oriented Programming)
  • 어떤 로직이 핵심 기능을 수행하며, 어떤 로직은 부가적인 기능을 수행하는지 관점을 부여해 분리

 

1. 필요성

  • 기존 시간 측정 방식 : System.currentTimeMillis() 이용하여 시작과 종료 시점의 차이를 이용
    • 시간 측정 기능은 핵심 관심 사항이 아니라 공통 관심사항
    • 시간 측정 로직과 핵심 비즈니스 로직이 섞여 유지보수가 어려움
    • 시간을 측정하는 로직을 별도의 공통로직으로 만들기 어려움

 

2. AOP 적용하기

공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern)

  • 시간 측정 로직을 한군데에 모으고 원하는 곳에 적용

 

시간 측정 AOP 등록

1. AOP 패키지를 생성하여 TimeTraceAop 클래스를 생성

package weather.weatherspring.aop;

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

@Component      // 스프링 빈으로 등록
@Aspect
public class TimeTraceAop {
    /* 공통 관심 사항을 타겟팅 */
    @Around("execution(* weather.weatherspring..*(..))")    // 패키지 하위의 모든 것을 적용
    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");
        }
    }
}
  • 핵심 관심사항과 공통 관심사항을 분리
  • 시간 측정 로직을 별도의 공통 로직으로 생성
  • 원하는 적용 대상을 선택 가능

 

3. AOP 동작 방식

의존 관계

  • 호출하는 것은 프록시 기술로 발생하는 가짜 멤버 서비스
  • 프록시라고 하는 가자 멤버 서비스를 생성
  1. 컨테이너에 스프링빈을 등록할 때 진짜 스프링빈이 아닌 가짜 스프링빈을 앞에 세워놓음
  2. joinPoint.proceed()가 호출되면 그때 실제를 호출해줌

'Back-end > Spring' 카테고리의 다른 글

Spring Boot와 Redis 연동 (+연동 시 고민사항)  (0) 2025.04.27
WebFlux에 대해서  (0) 2023.11.07
DAO, DTO, VO, Domain 차이  (0) 2023.10.07
@Controller와 @RestController 차이  (0) 2023.10.07
[Spring] Spring이란?  (0) 2023.02.07