AOP를 이해하기 위해서는 횡단 관심사에 대해서 우선 알아야 한다.
횡단 관심사(cross-cutting concerns)
한 애플리케이션의 여러 부분에 영향을 주는 기능
공통 기능을 재사용하기 위해 일반적으로 상속이나 위임을 사용하나, 상속은 객체의 정적 구조에 의존하므로 복잡하고 깨지기 쉬운 구조가 되기 쉽고, 위임은 대상 객체에 대한 복잡한 호출로 인해 번거로움
AOP란?
AOP는 횡단 관심사를 애스팩트(aspect)라는 특별한 클래스로 모듈화한다.
아래 내용을 보다보면 이해가 될 것이다.
AOP가 다른 기법과 차별화되는 장점
1. 전체 코드 기반에 흩어져 있는 관심 사항이 하나의 장소로 응집된다
2. 여타 서비스 모듈이 자신의 주요 관심 사항에 대한 코드만 포함하고 그 외 관심 사항은 모두 애스팩트로 옮겨져 코드가 깔끔해진다.
용어 정의
어드바이스(advice)
애스펙트가 해야하는 작업. 애스펙트가 '무엇'을 '언제' 할 지를 정의한다. 이 '언제'는 아래와 같은 항목으로 정의할 수 있다.
a. 이전(before)
어드바이스 대상 메서드가 호출되기 전에 어드바이스 기능을 수행
b. 이후(after)
결과에 상관없이 어드바이스 대상 메서드가 완료된 후에 어드바이스 기능을 수행
c. 반환 이후(after-returning)
어드바이스 대상 메서드가 성공적으로 완료된 후에 어드바이스 기능을 수행
d. 예외 발생 이후(after-throwing)
어드바이스 대상 메서드가 예외를 던진 후에 어드바이스 기능을 수행
e. 주위(around)
어드바이스가 어드바이스 대상 메서드를 감싸서 어드바이스 대상 메서드 호출 전과 후에 몇가지 기능을 제공
조인 포인트(join point)
어드바이스를 적용할 수 있는 곳. 메서드 호출 지점, 예외 발생, 필드 값 수정 등이 있음.
포인트 커트(point cut)
애스팩트가 어드바이스할 조인 포인트의 영역을 좁힌다. 애스펙트가 '어디서' 할지를 정의한다.
각 포인트 커트는 어드바이스가 위빙되어야 하는 하나 이상의 조인 포인트를 정의한다.
애스펙트(aspect)
어드바이스와 포인트 커트를 합친 것이다.
인트로덕션(introduction)
기존 클래스에 코드 변경 없이도 새 메서드나 멤버 변수를 추가하는 기능
위빙(weaving)
타깃 객체에 애스펙트를 적용해서 새로운 프록시 객체를 생성하는 절차이다.
위빙은 대상 객체의 생애 중 아래와 같은 몇가지 시점에서 수행된다.
a. 컴파일 시간(compile time)
타깃 클래스가 컴파일될 때 애스펙트가 위빙된다.
b. 클래스 로드 시간(classload time)
클래스가 JVM에 로드될 때 애스펙트가 위빙된다.
c. 실행 시간(runtime)
애플리케이션 실행 중에 애스펙트가 위빙된다.
스프링은 다음 네가지 형태로 AOP를 지원한다.
1. 고전적인(classic) 스프링 프록시 기반 AOP
2. Pure-POJO 애스펙트
3. @AspectJ 어노테이션 기반 애스펙트
4. AspectJ 애스펙트에 빈 주입
스프링 AOP 프레임워크의 핵심 사항
1. 스프링 어드바이스는 자바로 작성한다.
2. 스프링 어드바이스는 런타임시 만든다.
스프링은 애플리케이션이 프록시 타깃 빈을 실제 필요로 할 때 까지 프록시 타깃 객체를 생성하지 않는다.
3. 스프링은 메서드 조인 포인트만 지원한다.
스프링에서 필드를 포인트 커트로 지정할 수 없다는 사실은, 객체 필드 값의 수정 등의 세밀한 제어가 불가능하다는 의미이다. 또한 생성자 포인트커트를 지정할 수 없으므로 객체를 인스턴스화 할 때도 별다른 어드바이스를 적용할 방도가 없다.
|
이 포스트는 스프링 인 액션을 읽고 개인적으로 필요하다고 생각되는 내용을 정리한 포스트입니다. 일부 내용, 소스코드는 스프링 인 액션의 내용일 수 있습니다. |
'🌱 SPRING > 스프링 인 액션' 카테고리의 다른 글
애스펙트 정의하기 (0) | 2018.05.26 |
---|---|
포인트 커트를 이용한 조인 포인트 선택 (0) | 2018.05.26 |
조건부 빈 (0) | 2018.05.21 |
XML로 빈 와이어링하기 (0) | 2018.05.07 |
자바로 빈 와이어링하기 (0) | 2018.05.07 |