관점 지향 프로그래밍으로서 공통된 로직을 추출하여 메소드의 다양한 시점에 실행할 수 있게 해줄수 있으며, 코드를 줄여주고, 개발자가 공통 로직을 배제하고 핵심 관심사에 집중할 수 있도록 해준다.
- 좋은 개발환경의 주요 원칙은
개발자가 비즈니스 로직에만 집중할 수 있게 한다
는 것이다- 이 목표를 위해 몇가지 중요한 원칙이 있지만, 가장 쉽게 생각할 수 있는 것은
반복적인 코드의 제거
라고 할 수 있다 - 스프링 프레임워크는 이러한 반복적인 코드를 줄이고, 핵심 비즈니스 로직에만 집중할 수 있는 방법을 제공한다
- 이 목표를 위해 몇가지 중요한 원칙이 있지만, 가장 쉽게 생각할 수 있는 것은
- 대부분의 시스템이 공통적으로 가지고 있는 보안, 로그, 트랜잭션과 같이 비즈니스 로직은 아니지만, 반드시 처리가 필요한 부분을 스프링에서는
횡단 관심사 (cross-concern)
이라고 한다- 스프링은 이러한 횡단 관심사를 분리해서 제작하는 것이 가능하다
AOP
는 이러한횡단 관심사를 모듈로 분리
하는 프로그래밍의 패러다임이다
- AOP 기법에서는
핵심 로직을 구현한 코드
에서공통 기능
을 직접적으로 호출하지 않는다- 핵심 로직을 구현한 코드를
컴파일
하거나, 컴파일 된 클래스를로딩
하거나, 로딩한 클래스의객체를 생성
할 때 AOP가 적용되어 핵심 로직 구현 코드안에 공통 기능이 삽입된다- 공통 기능이 변경되더라도 핵심 로직을 구현한 코드를 변경할 필요가 없다
- 핵심 로직을 구현한 코드를
- 개발자는 핵심 비즈니스 로직에만 집중해서 코드를 개발할 수 있게 되었고,
- 각 프로젝트마다 다른 관심사를 적용할 때 코드의 수정을 최소화 시킬 수 있고,
- 원하는 관심사의 유지보수가 수월한 코드를 구성할 수 있다
-
Target
- 핵심 기능을 담고 있는 모듈로, 부가 기능을
부여할 대상
이 된다
- 핵심 기능을 담고 있는 모듈로, 부가 기능을
Advice
- 타겟에 제공할
부가기능
을 정의 - Advice의 종류
Around
- Target의 method가 호출되기 이전(before) 시점과 이후(after) 시점에 모두 처리해야 할 필요가 있는 부가기능을 정의한다
- Joinpoint 앞과 뒤에 실행돠는 Advice
Before
- Target의 method가 실행되기 이전(before) 시점에 처리해야 할 필요가 있는 부가기능을 정의
- Joinpoint 앞에서 실행되는 Advice
After Returning
- Target의 method가 정상적으로 실행된 이후(after) 시점에 처리할 필요가 있는 부가기능을 정의
- Jointpoint method 호출이 정상적으로 종료된 뒤에 실행되는 Advice
After Throwing
- Target의 method가 예외를 발생한 이후(after) 시점에 처리해야 할 필요가 있는 부가기능을 정의
- 예외가 throw 될 때 실행되는 Advice
- 타겟에 제공할
JoinPoint
- 어드바이스가
적용
될 수 있는 위치 - 타겟 객체가 구현한 인터페이스의 모든 method는 조인 포인트가 된다
- 어드바이스가
Pointcut
- 어드바이스를
적용할 타겟
의메서드를 선별
하는 정규표현식- Advice를
어디에 적용할지
를 결정!
- Advice를
- 포인트컷 표현식은
execution
으로 시작하고, method의signature
를 비교하는 방법이 주요 사용된다
- 어드바이스를
Weaving
- Pointcut에 의해서 결정된 target의
jointpoint
에 부가기능 (advice
)를삽입
하는 과정을 뜻한다 - Weaving은 AOP가
핵심기능 (target)
의 코드에영향
을 주지 않으면서 필요한 부가기능 (advice
)를추가
할 수 있도록 해주는 핵심적인 처리과정이다
- Pointcut에 의해서 결정된 target의
Aspect
- AOP의 기본 module
Aspect = Advice + Pointcut
- Aspect는 singleton의 형태의 객체로 존재한다
- AOP 개념을 적용하면 핵심기능 코드 사이에 침투된 부가기능을
독립적인 aspect
로 구분해 낼 수 있다- 구분된 부가기능 aspect를 runtime 시에 필요한 위치에 동적으로 참여하게 할 수 있다
Advisor
- Advisor = Advice + Pointcut
- Advisor는 Spring AOP에서만 사용되는 특별한 용어이다