기능을 1. 핵심 관심 사항(Core Concern)과 2. 공통 관심 사항(Cross-Cutting Concern)으로 분리시키고 각각을 모듈화 하는 것을 의미
- 핵심 기능(Core Concern) - 업무 로직을 포함하는 기능
- 부가 기능(Cross-Cutting Concern) - 핵심 기능을 도와주는 부가적인 기능
AOP는 부가 기능을 애스펙트(Aspect)로 정의하여, 핵심 기능에서 부가 기능을 분리함으로써 핵심 기능을 설계하고 구현할 때 객체지향적인 가치를 지킬 수 있게 도와주는 개념이다.
Spring은 타겟(Target) 객체에 대한 프록시를 만들어서 제공한다.
타겟을 감싸는 프록시는 실행시간(RunTime)에 생성된다.
프록시는 어드바이스(Advice)를 타겟 객체에 적용하면서 생성되는 객체
프록시 객체를 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위함이다.
프록시는 타겟 객체에 대한 호출을 가로챈 다음 Advice의 부가기능 로직을 수행하고난 후에 타겟의 핵심기능 로직을 호출한다.
(전처리 어드바이스)
타겟의 핵심기능 로직 메소드를 호출한 후에 부가기능을 수행하는 경우도 있다.
(후처리 어드바이스)
Spring은 동적 프록시를 기반으로 AOP를 구현하므로 메소드 조인 포인트만 지원
핵심기능(타겟)의 메소드가 호출되는 런타임 시점에만 부가기능(어드바이스)를 적용할 수 있음
다양한 작업에 부가기능을 적용할 수 있다.
부가기능 모듈 (핵심기능에 부가되어 의미를 갖는 모듈)
부가될 기능을 정의한 Advice와 Advice를 어디에 적용할지를 결정하는 PointCut을 함께 갖고 있다.
어플리케이션의 핵심적인 기능에서, 부가적인 기능을 분리해서 Aspect라는 모듈로 만들어서 설계하고 개발하는 방법
실질적으로 부가기능을 담은 구현체
타겟 오브젝트에 종속되지 않기 때문에, 부가기능에만 집중할 수 있음
Aspect가 무엇을 언제 할지를 정의
부가기능이 적용될 대상(Method)을 선정하는 방법
Advice를 적용할 JoinPoint를 선별하는 기능을 정의한 모듈
Advice가 적용될 수 있는 위치
Spring에서는 메소드 조인포인트만 제공한다.
타겟 객체가 구현한 모든 메소드는 조인 포인트가 된다.
Target을 감싸서 Target의 요청을 대신 받아주는 랩핑 오브젝트.
클라이언트에서 Target을 호출하게되면, 타겟이 아닌 타겟을 감싸고 있는 Proxy가 호출되어, 타겟메소드 실행 전에 선처리, 후처리를 실행한다.
지정된 객체에 Aspect를 적용해서, 새로운 프록시 객체를 생성하는 과정
Spring AOP는 런타임에서 프록시 객체가 생성된다.