📑
Spring AOP
AOP(Aspect-Oriented Programming)
: 스프링 프레임워크에서 제공하는 관점 지향 프로그래밍 기술이다.
로깅, 보안, 트랜잭션 관리와 같은 공통 관심사를 모듈화하여 코드의 중복을 줄이고 재사용성, 유지보수성, 확장성을 향상시킬 수 있게한다. 객체지향프로그래밍(OOP)의 핵심단위가 클래스인 반면, AOP는 Aspect가 모듈화 단위가 되기 때문에 OOP를 보완해준다.
핵심 관심사(원래 각 객체의 기능)와 공통 관심사(여러 객체에서 반복적으로 쓰이는 코드)로 나누어 프로그래밍.
AOP의 주요 개념과 구성요소
Aspect - 공통관심사항을 정의하는 모듈. Advice, PointCut 및 Introduction의 세 가지 주요 구성 요소를 포함함.
Advice - Aspect의 동작을 정의. 스프링
- Aspect: : 공통관심사항을 모듈화한 것. 예를 들어, 트랜잭션 관리는 엔터프라이즈 자바 애플리케이션에서 여러 클래스에 걸쳐 나타나는 공통 관심사이다. 스프링 AOP에서는 aspect를 일반 클래스(스키마 기반 접근 방식) 또는 @Aspect annotation을 사용하여 구현한다.
- Join point: 프로그램 실행 중의 특정 지점, 예를 들어 메서드 실행이나 예외 처리를 의미. 스프링 AOP에서 조인 포인트는 항상 메서드 실행을 나타낸다.
- Advice: 특정 join point에서 관점에 의해 취해지는 행동(Aspect의 동작)이다. advice에는 " around ", " before ", " after "의 타입이 있다. 스프링을 포함하여 많은 AOP 프레임워크들이 advice를 인터셉터로 모델링하고 조인 포인트 주위에 인터셉터 체인을 유지한다.
- Pointcut: 조인 포인트를 매칭하는 조건이다. Advice는 pointcut 표현식과 관련되어 있으며 포인트컷에 매칭되는 모든 join point에서 실행된다. 조인 포인트와 이를 매칭하는 포인트컷 표현식의 개념은 AOP에서 중요한 요소이며, 스프링은 기본적으로 AspectJ 포인트컷 표현식 언어를 사용한다.
- Introduction: 특정 타입을 대신하여 추가적인 메서드나 필드를 선언하는 것. 스프링 AOP는 새로운 인터페이스(및 해당 구현)를 어떤 advised 객체에도 도입할 수 있다. 예를 들어, introduction을 사용하여 캐싱을 간단히 하도록 빈이 IsModified 인터페이스를 구현하게 할 수 있다.
- Target object: 하나 이상의 관점에 의해 advised되는 객체를 의미. " advised object "라고도 한다. 스프링 AOP는 런타임 프록시를 사용하여 구현되기 때문에 이 객체는 항상 프록시 객체이다.
- AOP proxy: 관점 계약(어드바이스 메서드 실행 등)을 구현하기 위해 AOP 프레임워크가 생성한 객체이다. 스프링 프레임워크에서 AOP 프록시는 JDK dynamic 프록시 또는 CGLIB 프록시이다.
- Weaving: aspects와 다른 애플리케이션 타입이나 object를 연결하여 advised object를 생성하는 것. 이는 컴파일 타임, 로드 타임, 또는 런타임에 수행될 수 있다. 스프링 AOP는 다른 순수 자바 AOP 프레임워크와 마찬가지로 런타임에 weaving을 수행한다.
Advice의 종류
- Before advice: 조인 포인트 이전에 실행되지만 예외가 발생하지 않는 한 실행 흐름이 조인 포인트로 진행되는 것을 막을 수 없다.
- After returning advice: 조인 포인트가 정상적으로 완료된 후 실행되는 어드바이스.
- After throwing advice: 예외 발생으로 메서드가 종료되는 경우 실행되는 어드바이스.
- After (finally) advice: 정상적인 종료이든 예외로 인한 종료이든 상관없이 실행되는 어드바이스.
- Around advice: 메서드 호출과 같은 조인 포인트를 둘러싼 어드바이스. 이것은 가장 강력한 종류의 어드바이스. Around advice는 메서드 호출 전후에 사용자 지정 동작을 수행할 수 있다. 또한 어드바이스된 메서드 실행을 조인 포인트로 진행할지 또는 자체 반환 값을 반환하거나 예외를 throw하여 단축할지 여부를 선택하는 역할을 한다.