목적은 비즈니스 로직(핵심 기능)과 인프라 로직(부가 기능)의 분리!
인프라 로직은 애플리케이션의 전 영역에서 나타난다.
-
코드 중복이 횡단으로 나타나기 때문에 cross-cutting concern(횡단 관심사)이라고 한다.
-
예시
권한체크, 성능검사, 로깅, 보안, 트랜젝션 등
-
문제점
중복 코드 발생 가능성이 있어서 유지보수의 어려움이 있다.
비즈니스 로직과 함께 있으면 비즈니스 로직을 이해하기 어렵다.
-
해결책
인프라 로직과 비즈니스 로직의 분리
핵심 애플리케이션은 인프라 로직의 존재도 알지 못한다. 즉, 인프라 로직이 핵심 코드에 나타나지 않도록 캡슐화 하는 것이다.
AOP(Aspect-Oriented Programming)
'관점 지향 프로그래밍' 이란 횡단 관심사에 따라 프로그래밍 하는 것
AOP는 부가 기능이기 때문에 '어떤 부가기능'을 '어디'에 적용할 것인가? 가 중요하다.
용어
- Target
부가 기능의 부여 대상
- Advice
어떤 부가 기능? 언제? Before, AfterReturning(정상 종료), AfterThrowing(비정상 종료), After, Around
- Join point
어디에 적용할 것인가? 스프링 AOP에서는 메서드 실행 될 때만으로 한정
- Point cut
advice가 적용될 지점, 스프링 AOP에서는 어떤 메서드(execution 시점)
정규표현식 을 사용할 수 있다.
- Aspect
advice와 pointcut을 합친 것, advisor라고도 한다.
- Proxy
advice를 타겟 객체에 적용하면 생성되는 객체이다.
클라이언트 객체 관점에서 보면 타겟 객체와 프록시 객체의 차이는 없다.
- Weaving
타겟 객체에 aspect를 적용해서 새로운 프록시 객체를 생성하는 절차
구현 방법
- 프록시 패턴
부가기능을 제공하는 프록시로 감싼다. 스프링이 IOC/DI 기반이기 때문에 가능하다.