Spring Framework

[Spring Framework] Aspect Oriented Programming with Spring

깊게 생각하고 최선을 다하자 2024. 12. 15. 21:52

 

1) 개요


- 관점 지향 프로그래밍(AOP)은  객체 지향 프로그래밍(OOP)을 보완하여 프로그램 구조에 대해 

  다른 방식으로 생각할 수 있게 해줍니다. 

  클래스 외에도 AOP는 관점(aspect)을 제공합니다. 

  관점은 여러 유형과 객체에 걸쳐서 발생하는 트랜잭션 관리와 같은 관심사를 모듈화할 수 있게 해줍니다.

  (이러한 관심사는 보통 교차 관심사(crosscutting concerns)라고 불립니다)

 

- Spring의 핵심 요소 중 하나는 AOP 프레임워크입니다.

  Spring IoC 컨테이너는 AOP에 의존하지 않기 때문에, AOP를 사용하지 않아도 괜찮지만,

  AOP는 Spring IoC와 결합하여 매우 강력한 미들웨어 솔루션을 제공합니다. 

 

2) Spring 2.0 AOP

-  Spring 2.0은 스키마 기반 접근 방식 또는 @AspectJ 애노테이션 스타일을 사용하여 

   사용자 정의 관점을 작성하는 더 간단하고 강력한 방법을 제공합니다. 

   이 두 가지 스타일은 모두 완전히 타입이 지정된 어드바이스(advice)와 AspectJ 포인트컷(pointcut) 언어를 사용하면서도

   Spring AOP를 사용하여 연결됩니다. 

 

-  Spring 2.0 AOP는 Spring 1.2 AOP와 완전히 호환됩니다.

 

3) Spring Framework에서 AOP 사용

- 선언적 엔터프라이즈 서비스를 제공하기 위해, 특히 EJB의 선언적 서비스를 대체하는 방식으로 사용됩니다.

  가장 중요한 서비스 중 하나는 Spring Framework의 트랜젹션 추상화에 기반한 선언적 트랜잭션 관리입니다.

 

- 사용자가 객체 지향 프로그래밍(OOP)을 보완하기 위해 사용자 정의 관점을 구현할 수 있도록 합니다.

  만약 제너릭 선언적 서비스나 풀링 같은 다른 미리 패키징된 선언적 미들웨어 서비스에만 관심이 있다면

  Spring AOP와 직접 작업할 필요는 없습니다. 

 

 

4) AOP 개념

- AOP의 몇 가지 핵심 개념을 정의해보겠습니다. 이러한 용어는 Spring 고유의 것이 아닙니다. 

  

(1) 관점(Aspect)

- 여러 객체에 걸쳐 발생하는 관심사를 모듈화한 것입니다.

  트랜잭션 관리가 J2EE 애플리케이션에서 교차 관심사의 좋은 예입니다.

  Spring AOP에서 관점은 일반적인 클래스를 사용하여 구현되며(스키마 기반 접근 방식)

  @Aspect 애노테이션이 있는 클래스를 사용하여 구현됩니다(@AspectJ 스타일)

 

(2) 조인 포인트(Join Point)

- 프로그램 실행 중의 특정 시점으로, 예를 들어 메서드 실행 또는 예외 처리와 같은 시점을 의미합니다.

  Spring AOP에서는 조인 포인트가 항상 메서드 실행을 나타냅니다.

  조인 포인트 정보는 advice 본문에서 org.aspectj.lang.JoinPoint 타입의 매개변수를 선언함으로써

  접근할 수 있습니다. 

 

(3) 어드바이스(Advice)

- 특정 조인 포인트에서 관점이 수행하는 동작입니다.

  어드바이스의 종류는 "before", "after", "around" 등이 있습니다.

  많은 AOP 프레임워크에서는 어드바이스를 인터셉터로 모델링하여,

  조인 포인트 주위에 인터셉터 체인을 유지합니다. 

 

(4) 포인트컷(PointCut)

- 조인 포인트를 일치시키는 조건식입니다.

   어드바이스는 포인트컷 표현식과 연결되어,

   포인트컷에 의해 일치되는 모든 조인 포은테어서 실행됩니다.

   (ex) 특정 이름을 가진 메서드의 실행)

 

(5) 도입(Introduction)

- 타입을 대신하여 추가적인 메서드나 필드를 선언하는 것입니다.

   Spring AOP는 프록시된 객체에 새로운 인터페이스(및 해당 구현)를 도입할 수 있습니다.

   예를 들어, IsModified 인터페이스를 도입하여 캐싱을 단순화할 수 있습니다. 

 

(6) 타겟 객체(Target Object)

- 하나 이상의 관점에 의해 조언을 받는 객체입니다.  

  보통 "advised object"라고도 불립니다.

  Spring AOP는 런타임 프록시를 사용하여 구현되므로,

  이 객체는 항상 프록시된 객체입니다. 

 

(7) AOP 프록시(AOP Proxy)

- AOP 프레임워크가 관점 계약을 구현하기 위해 생성하는 객체입니다.

  (ex) 메서드 실행에 대한 조언)

  Spring Framework에서 AOP 프록시는 JDK 동적 프록시 또는 CGLIB 프록시일 수 있습니다.

  프록시 생성은 Spring 2.0에서 스키마 기반과 @AspectJ 스타일의 관점 선언 모두에서 투명하게 이루어집니다.

  

(8) 위빙(Weaving)

- 관점을 다른 애플리케이션 타입이나 객체와 연결하여 조언된 객체를 만드는 과정입니다.

  이는 컴파일 시간(ex) AspectJ 컴파일러 사용), 로드 시간 또는 런타임에 수행될 수 있습니다.

  Spring AOP는 다른 순수 Java AOP 프레임워크처럼 런타임에 위빙을 수행합니다. 

 

 

5) 어드바이스의 종류

(1) Before Advice

- 조인 포인트 전에 실행되는 어드바이스입니다. 이 어드바이스는 실행 흐름이 조인 포인트로 진행되는 것을 막을 수 없습니다

  (예외를 던지지 않는 한)

 

(2) After returning advice:

- 조인 포인트가 정상적으로 완료된 후 실행되는 어드바이스입니다. 

  예를 들어, 메서드가 예외 없이 반환된 경우입니다. 

 

(3) After throwing advice:

- 메서드가 예외를 던지며 종료될 때 실행되는 어드바이스입니다. 


(4) After (finally) advice:

- 조인 포인트가 정상 또는 예외적인 방법으로 종료되었는지 관계없이 항상 실행되는 어드바이스입니다. 


(5) Around advice:

- 조인 포인트를 둘러싼 어드바이스로, 가장 강력한 종류의 어드바이스입니다. 

  Around Advice는 메서드 호출 전후에  사용자 정의 동작을 수행할 수 있습니다.

  또한, 조인 포인트로 진행할지, 자체 반환값을 반환하거나 예외를 던져서 메서드 실행을 단축할지

  선택할 수 있습니다. 

 

- Around advice는 가장 일반적인 어드바이스 종류입니다.

  Spring 2.0에서는 모든 어드바이스 매개변수가 정적으로 타입 지정되어,

  적절한 타입의 매개변수(ex) 메서드 실행에서 반환되는 값의 타입)와 함께 작업할 수 있습니다. 

 

- 조인 포인트와 이를 일치시키는 포인트컷 개념은 AOP에서 중요한 핵심으로,

  이를 통해 OOP 계층 구조와 독립적으로 어드바이스를 적용할 수 있습니다.

  예를 들어, 선언적 트랜잭션 관리를 제공하는 Around Advice는 여러 객체에 걸쳐 있는 메서드 집합에 적용될 수 있습니다.