김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 보면서 공부한 내용입니다.
→ 변경시에는? (e.g. s → ms) 모든 로직을 찾아들어가서 수정해야됨
핵심 관심 사항 : 핵심 비즈니스 로직
→ 이의 모듈화? OOP
공통 관심 사항 : 인프라/부가 기능 → 주 목적 외 필요한 부가기능들
e.g. 로깅, 트랜잭션
→ 이의 모듈화? AOP
Aspect Oriented Programming
→ 공통 관심 사항과 핵심 관심 사항의 분리!
→ 어플리케이션 전체에 걸쳐 사용되는 공통 관심사항을 재사용하도록 지원
→ 원하는 곳에 공통 관심 사항을 적용한다.
/aop/TimeTraceAOP
@Aspect
@Component
public class TimeTraceAOP {
//이 공통 관심사항을 어디에 타겟팅할건지???
@Around("execution(* hello.hellospirng..*(..))")
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");
}
}
}
@Aspect : 핵심기능에 부가되어 의미를 갖는 특별 모듈
@Component : AOP를 스프링 빈에 등록하기 → spring config에 등록도 가능
@Aruond : 이 공통 관심사항을 어디에 타겟팅할 것인지 지정하기
→ @Around("**execution**(* hello.hellospirng..*(..))")
에서
execution
: 포인트컷 지정자 (부가 기능이 적용될 대상 메소드 선정)*
: 리턴 타입 → 현재는 모든 타입 리턴hello.hellospirng..*
: 타겟이 되는 메소드 지정(..)
: 인자 타입proceed()
: 타겟 메소드 지칭 → 이를 실행 시켜야 타겟 메소드가 수행됨
→ 어디에 병목이 있는지 확인 가능 !!
: 프록시 기술의 사용
프록시 ? 타겟을 감싸서 타겟의 요청을 대신 받아주는 Wrapping Object
클라이언트에서 타겟 호출시 타겟이 아닌 프록시가 호출
→ 호출을 가로챈 후 @Advicde에 등록된 기능 수행 → 타겟 메소드 호출
가짜 스프링빈을 등록 → 끝나면 joinPoint.proceed()호출 후 실제 memberServie 실행
김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
조졸두님의 AOP 정리 (1)