코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 by 김영한
gradle 추가
implementation 'org.springframework.boot:spring-boot-starter-aop'
AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍
이라고 불린다. 관점 지향은 어떤 로직을 기준으로 핵심 관심 관점
, 공통 관심 관점
으로 나누어서 보고 그 관점을 기준으로 모듈화( 분리 ) 하겠다는 것이다.
공통 관심 사항( cross-cutting concern ) vs 핵심 관심 사항( core concern )
공통 관심 사항 : 기능 수행 시
공통
으로 수행되어야 하는 로직
핵심 관심 사항 : 실제비지니스 기능
로직
aop 적용 전 무모하고 유지 보수가 어려운 로직 그림
모든 메소드의 호출 시간을 측정하고 싶다면?
모든 메소드 앞 뒤에 해당 로직을 추가해서 할 것인가?
적용하고 싶은 코어 로직을 건들기 때문에 무모하고 유지보수관리 어려움!
회원 가입 시간, 회원 조회 시간을 측정하고 싶다면
: AOP를 적용하자!
- 회원가입, 회원 조회등 핵심 관심사항과 시간을 측정하는 고통 관심 사항을 분리한다.
- 시간을 측정하는 로직을 별도의 공통 로직으로 만들었다.
- 핵심 관심 사항을 깔끔하게 유할 수 있다.
- 변경이 필요하면 이 로직만 변경하면 된다.
- 원하는 적용 대상을 선택할 수 있다.
프록시 패턴의 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 {
/**
* 메소드 시간 측정 APO 메소드
*/
// 어디에 적용할지 범위 타겟팅 ( 아래 경로의 범위만 적용하겠다. )
@Around("execution(* com.karim.restApiServer..*(..))")
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" );
}
}
}
📌 여담
📚 참고
정리가 진짜 깔끔하시고 보기 좋네요 저는 언제쯤 이렇게 정리를 할지..