AOP(Aspect Oriented Programming)
- AOP : 어떤 로직을 기준을 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것이다.
- 관심을 분리해서 횡단 관심과 핵심 관심으로 나눈다.
- 횡단 관심 : 비즈니스 메소드마다 실행될 공통의 로직을 뜻한다.
- 핵심 관심 : 비즈니스 메소드를 핵심 관심이라고 한다.
AOP 용어 정리
- JoinPoint : 클라이언트가 호출하는 모든 비즈니스 메소드를 뜻한다.
- Pointcut : 필터링된 비즈니스 메소드를 뜻한다.
@Pointcut("execution(* com.jeongsu.biz..*Impl.*(..)")
- Advice : 횡단 관심에 해당하는 공통 기능의 메소드이다.
- 5가지 Advice 동작 시점이 있다.
- Before : 비즈니스 메소드 실행 전에 동작한다.
- After : 비즈니스 메소드 실행 후에 동작한다.
- After Returning : 비즈니스 메소드가 성공적으로 반환되면 동작한다.
- After Throwing : 비즈니스 메소드가 실행 중 예외가 발생하면 동작한다.
- Around : 클라이언트가 호출한 메소드를 가로채 비즈니스 메소드 실행 전후에 처리할 로직을 삽입할 수 있다.
- Around로 동작하는 어드바이스 메소드는 반드시 ProceedingJoinPoint를 매개 변수로 받아야 한다.
- Aspect or Advisor
- 포인트컷과 어드바이스의 결합이다.
- 애스팩트 설정에 따라 AOP의 동작 방식이 결정된다.
- 어드바이저는 DB 트랜잭션을 관리할 때 사용한다.
Pointcut 설정 예시
- 리턴 타입과 패키지 경로 사이에만 띄어쓰기가 있다.
- 리턴 타입 필터링
*
: 모든 리턴 타입을 허용한다.
- void : 리턴 타입이 void인 메소드만 필터링한다.
- !void : 리턴 타입이 void가 아닌 메소드만 필터링한다.
- 패키지 경로 필터링
- com.jeongsu.biz.board : com.jeongsu.biz.board인 패키지를 필터링한다.
- com.jeongsu.biz.. : com.jeongsu.biz로 시작하는 모든 패키지를 필터링한다.
- com.jeongsu..board : com.jeongsu 시작하는 모든 패키지 중에서 패키지 마지막이 board인 패키지를 필터링한다.
- 클래스 이름 필터링
- BoardServiceImpl : BoardServiceImpl 클래스를 필터링한다.
- *Impl : 클래스 이름이 Impl로 끝나는 모든 클래스를 필터링한다.
- 메소드 이름 필터링
- getBoardList : 이름이 정확하게 getBoardList인 메소드를 필터링한다.
- get* : 이름이 get으로 시작하는 모든 메소드(get()도 포함)를 필터링한다.
- 매개변수 필터링
- (..) : 모든 경우의 매개변수의 개수와 타입을 허용한다.