- AOP 개념
- AOP 주요 용어
- Aspect Oriented Programming의 개념을 파악한다.
- AOP의 주요용어를 이해하고 스프링 AOP과 AspectJ의 차이점을 이해한다.
- 업무(Biz) 로직을 포함하는 기능을 핵심 기능(Core Concerns)
- 핵심기능을 도와주는 부가적인 기능(로깅, 보안 등)을 부가기능(Cross-cutting Concerns)이라고 부른다.
- 객체지향의 기본 원칙을 적용하여도 핵심기능에서 부가기능을 분리해서 모듈화하는 것은 매우 어렵다.
AOP란 애플리케이션에서의 심사의 분리(기능의 분리) 즉, 핵심적인 기능에서 부가적인 기능을 분리, 분리한 부가기능을 애스팩트(Aspect)라는 독특한 모듈형태로 만들어서 설계하고 개발하는 방법
- OOP를 적용해도 핵심기능에서 부가기능을 쉽게 분리한 모듈로 작성하기 어려운 문제점을 AOP가 해결해 준다고 볼 수 있음
- AOP는 부가기능을 애스팩트(Aspect)로 정의하여, 핵심기능에서 부가기능을 분리함으로써 핵심기능을 설계하고 구현할 때 객체지향적인 가치를 지킬 수 있도록 도와주는 개념임
- 애스펙트는 부가기능을 정의한 코드인 어드바이스(Advice)와 어드바이스를 어디에 적용할지를 결정하는 포인트컷(PointCut)을 합친 개념임
Advice + PointCut = Aspect- AOP 개념을 적용하면 핵심기능 코드 사이에 침투된 부가기능을 독립적인 애스펙트로 구분해 낼 수 있음
- 구분된 부가기능 애스펙트를 런타임 시에 필요한 위치에 동적으로 참여하게 할 수 있음
어드바이스는 부가기능 그 자체 입니다. 그 어드바이스를 핵심 기능 어디에 끼워넣을지 위치 정보를 결정하는 것을 포인트컷이라고 합니다.
- 핵심기능을 담고 있는 모듈로, 타겟은 부가기능을 부여할 대상이 됨
- 어드바이스는 타겟에 제공할 부가기능을 담고 있는 모듈임
- 어드바이스가 적용될 수 있는 위치를 말함
- 즉, 타겟 객체가 구현한 인터페이스의 모든 메서드는 조인 포인트가 됨
- 어드바이스를 적용할 타겟의 메서드를 선별하는 정규표현식
- 포인트컷 표현식은 execution으로 시작하고, 메서드의 Signature를 비교하는 방법을 주로 이용함
조인 포인트는 위치 그 자체이고,
포인트 컷은 위치를 지정하는 표현방식입니다.
- 애스펙트는 AOP의 기본 모듈임
- 애스펙트 = 어드바이스+포인트컷
- 애스펙트는 싱글톤 형태의 객체로 존재함
- 어드바이저 = 어드바이스+포인트컷
- 어드바이저는 Spring AOP에서만 사용되는 특별한 용어이다.
- 위빙은 포인트컷에 의해서 결정된 타겟의 조인 포인트에 부가기능(어드바이스)을 삽입하는 과정을 뜻함
- 위빙은 AOP가 핵심기능(타겟)의 코드에 영향을 주지 않으면서 필요한 부가기능(어드바이스)을 추가할 수 있도록 해주는 핵심적인 처리과정임
- Spring은 프록시(Proxy) 기반 AOP를 지원함
Spring은 타겟(Target) 객체에 대한 프록시를 만들어 제공함
타겟을 감싸는 프록시는 실행시간(Runtime)에 생성됨
* 프록시는 어드바이스를 타깃 객체에 적용하면서 생성되는 객체임
일반적인 AOP와는 차이점이 있습니다.
일단 Spring은 프록시 기반의 AOP 입니다.
Taget 객체를 대신 핸들링 해주는 프록시가 있구요.
Caller가 Target 객체에 요청할 때, 그 요청을 프록시가 가로채서 프록시가 대신 핸들링을 합니다.
- 프록시(Proxy)가 호출을 가로챈다(Intercept)
- 프록시는 타겟 객체에 대한 호출을 가로챈 다음 어드바이스의 부가기능 로직을 수행하고 난 후에 타겟의 핵심기능 로직을 호출함(전처리 어드바이스)
- 타겟의 핵심기능 로직 메서드를 호출한 후에 부가기능(어드바이스)을 수행하는 경우도 있음(후처리 어드바이스)
- Spring AOP는 메서드 조인 포인트만 지원한다.
- Spring은 동적 프록시를 기반으로 AOP를 구현하므로 메서드 조인 포인트만 지원함.
- 즉, 핵심기능(타겟)의 메서드가 호출되는 런타임 시점에만 부가기능(어드바이스)을 적용할 수 있음
- 반면에 AspectJ 같은 고급 AOP프레임워크를 사용하면 객체의 생성, 필드값의 조회와 조작, static 메서드 호출 및 초기화 등의 다양한 작업에 부가기능을 적용할 수 있음