쏭의 개발 블로그
Spring AOP 본문
[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 동작 방식
의존 관계
- 호출하는 것은 프록시 기술로 발생하는 가짜 멤버 서비스
- 프록시라고 하는 가자 멤버 서비스를 생성
- 컨테이너에 스프링빈을 등록할 때 진짜 스프링빈이 아닌 가짜 스프링빈을 앞에 세워놓음
- 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 |