AOP는 메서드 실행 위치 뿐만 아니라 다음과 같은 다양한 위치에 적용할 수 있다.
조인 포인트는 추상적인 개념이고, AOP를 적용할 수 있는 지점을 의미한다.
어드바이스가 적용될 수 있는 위치, 메서드 실행, 생성자 호출, 필드 값 접근, static 메서드 접근 같은 프로그램 실행 중 지점을 나타낸다.
AspectJ를 사용해서 컴파일 시점과 클래스 로딩 시점에 적용하는 AOP는 바이트코드를 실제 조작하기 때문에 해당 기능을 모든 지점에 다 적용할 수 있다.
프록시 방식을 사용하는 스프링 AOP는 메서드 실행 지점에만 AOP를 적용할 수 있다.
프록시는 메서드 오버라이딩 개념으로 동작한다.
생성자나 static 메서드, 필드 값 접근에는 프록시 개념이 적용될 수 없다.
프록시를 사용하는 스프링 AOP의 조인 포인트는 메서드 실행으로 제한된다.
프록시 방식을 사용하는 스프링 AOP는 스프링 컨테이너가 관리할 수 있는 스프링 빈에만 AOP를 적용할수 있다.
JoinPoint 메서드는 어드바이스의 종류에 따라 사용방법이 다소 다르지만 기본적으로 어드바이스 메서드에 매개변수로 선언만 하면 된다.
JoinPoint.getArgs()
: JoinPoint에 전달된 인자를 배열로 반환한다.
JoinPoint.getThis()
: AOP 프록시 객체를 반환한다.
JoinPoint.getTarget()
: AOP가 적용된 대상 객체를 반환한다.
JoinPoint.getSignature()
: 조인되는 메서드에 대한 설명을 반환한다.
클라이언트가 호출한 메서드의 시그니처(리턴타입, 이름, 매개변수) 정보가 저장된 Signature 객체를 반환한다
Signature
객체가 선언하는 모든 연산은 연산의 이름, 매개변수로 받아들이는 객체들을 시그니처라고 한다.
Signature가 제공하는 메서드
String getName()
: 클라이언트가 호출한 메서드의 이름을 반환한다.
String toLongString()
: 클라리언트가 호출한 메서드의 리턴타입, 이름, 매개변수를 패키지 경로까지 포함해서 반환한다.
String toShortString()
: 클라이언트가 호출한 메서드 시그니처를 축약한 문자열로 반환한다.
JoinPoint.toString()
: 조언되는 방법에 대한 유용한 설명을 인쇄한다.
proceed()
: 다음 어드바이스나 타겟을 호출한다.