애플리케이션 로직은 크게 핵심기능과 부가기능으로 나뉜다.
AOP는 그 중 부가기능으로 핵심기능을 보조하기위해 사용된다.
AOP가 필요한 이유
- 소프트웨어 개발에서 변경 지점은 하나가 될 수 있도록 잘 모듈화 되야 함.
- 일반적인 OOP 방식으로는 해결이 어렵기 때문에 핵심 기능과 부가 기능을 분리하는 AOP 방식이 필요함.
애스펙트 = 포인트 컷 + 어드바이스
조인포인트
- 애플리케이션의 실행흐름에서의 특정 포인트
- 새로운 동작의 추가를위해 조인포인트에 관심코드 추가 가능.
- 스프링 AOP는 프록시 방식을 사용하므로 조인포인트는 항상 메소드 실행시점으로 제한
- 어드바이스 적용이 필요한 곳은 애플리케이션 내에 메서드를 갖는다.
- 적용 가능 지점 : 생성자, 필드 값 접근, static 메서드 접근, 메서드 실행
- 생성자, 필드값 접근, static 메서드 접근에는 프록시 개념이 적용될 수 없다.
joinpoint 인터페이스의 주요 기능
- JoinPoint.getArgs() : JoinPoint에 전달된 인자를 배열로 반환합니다.
- JoinPoint.getThis() : AOP 프록시 객체를 반환합니다.
- JoinPoint.getTarget() : AOP가 적용된 대상 객체를 반환합니다.
- JoinPoint.getSignature() : 조언되는 메서드에 대한 설명을 반환합니다.
- JoinPoint.toString() : 조언되는 방법에 대한 유용한 설명을 인쇄합니다.
@Slf4j
@Aspect
public class Aspect1 {
@Around("execution(* start.aop.order..*(..))")
public Object logging(ProceedingJoinPoint joinPoint) throws Throwable { <----------
log.info("log -> {}", joinPoint.getSignature());
return joinPoint.proceed();
}
}
@Around를 썼으니까 이 메서드는 어드바이스임
그리고 @Around를 썼기 때문에 첫 파라미더는 ProceedingJoinPoint이어야함!
joinpoint는 인자로써 설정해준다.
![](https://velog.velcdn.com/images/dlwjddus16/post/73bd8f85-3888-4f05-868b-20db73ce0592/image.png)
어드바이스
- 조인포인트에서 수행되는 코드
- Aspect를 언제 핵심 코드에 적용할 지를 정의함
- 시스템 전체 에스펙트에 API호출을 제공함
- 모든 메소드를 로그로 남기기 위해서 메소드를 호출하기전 메소드 시작전을 조인포인트로 설정함
- 부가기능
포인트 컷
- 조인포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능
- AspectJ 표현식 사용
- 프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 포인트컷으로 선별
- 메서드 반환 타입은 void여야 한다.
위빙
- 포인트컷으로 결정한 타겟의 조인 포인트에 어드바이스를 적용하는 것
- 핵심기능 코드에 영향을 주지 않고 부가기능을 추가할 수 있음
RTW(Run-Time Weaving)
- spring AOP의 기본 설정임, proxy사용 방법으로 Runtime시 핵심코드와 Advice를 호출한다.
CTW(Compile-Time Weaving)
- AspectJ 모듈에서 지원되는 방식으로 핵심코드와 Advice를 Compile시에 병합(Merge)한다.
LTW(Load-Time Weaving)
- AspectJ 모듈에서 지원되는 방식으로 프로세스가 시작될 때 핵심코드와 Advice를 조합한다.
![](https://velog.velcdn.com/images/dlwjddus16/post/41d1d3cb-d517-4bf2-9df3-a13041f42681/image.png)
AOP 프록시
- AOP기능을 구현하기 위해 만든 프록시 객체
- 스프링에서 AOp 프록시는 JDK 동적 프록시 또는 CGLIB프록시입니다.
타겟
- 핵심기능을 담고 있는 모듈로 타겟은 부가기능을 부여할 대상이 된다.
- Advice를 받는 객체이고 포인트컷으로 결정
어드바이저(Advisor)
- 하나의 어드바이스와 하나의 포인트 컷으로 구성됨.
- 스프링 AOP에서만 사용되는 특별한 용어임