본문 바로가기
프레임워크/Spring

Spring AOP(Aspect Oriented Programming)

by 프로그래밍 공부 2023. 4. 12.

 Spring에는 AOP(Aspect Oriented Programming)이라는 개념이 있다.

말 그대로 관점 지향 프로그래밍이라는 건데, 이건 또 어떤 것일까.

일반적으로 OOP(Object Oriented Programming)은 모듈화의 핵심 단위가 클래스인데,

AOP는 모듈화의 핵심 단위가 바로 Aspect다. 

즉 OOP에서는 객체를 기준으로 모듈화를 한다면 AOP에서는 관점에 따라 모듈화를 진행한다.

Aspect는 여러 타입과 객체에 걸쳐서 사용되는 기능 등의 모듈화라고 생각하면 된다.

A,B,C의 클래스가 있다고 가정해보자.

A에서는 a 코드와 b 코드,

B에서는 b코드와 c 코드,

C에서는 a코드와 c코드가 작성되어 있다면

a코드는 A와 C 클래스 사이의 공통 관심사항(Cross Cutting Concerns)이고

b코드는 A와 B 클래스 사이의 공통 관심사항이다.

c코드는 역시 B와 C 클래스 사이의 공통 관심사항이며,

각 클래스 내부에는 각각의 핵심 관심사항(Core Concern)이 있을 것이다. 

간단하게 생각하면 공통 관심사항은 여러 클래스나 타입에서 사용되는 공통되는 부분,

핵심 관심사항은 각 클래스가 가지는 고유의 중요한 기능을 말할 수 있다.

예금 인출, 송금 기능을 작성한 클래스가 각각 존재한다고 봤을 때,

로그인과 보안 검토, 상호 작용 등은 두 클래스 모두 사용하는 기능들이기에 공통 관심사항일 것이고,

돈을 인출하는 것과 송금하는 것은 두 클래스 각각이 가지는 고유의 기능들일 것이다.

이것이 바로 핵심 관심사항이라고 생각하면 된다.

AOP는 여기서 공통의 관심사항에 대한 모듈화를 실행할 수 있다.

 

AOP와 관련된 용어도 알아보자.

Aspect - 여러 클래스에서 공통적으로 구현되는 관심사의 모듈화하는 것이다. 주로 부가 기능을 모듈화한다.

Join Point - 메서드 실행이나 예외 처리와 같은 프로그램 실행 중의 특정한 지점을 말한다. 

끼어들 수 있는 지점이라는 것인데, 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양하다.

Pointcut - Join Point에 Aspect를 적용하기 위한 조건을 서술하는 것. 

Joint Point의 상세한 조건을 정의한 것이라 볼 수 있다.

Advice - 특정 Join Point에서 Aspect에 의해서 취한 행동을 말한다. 실질적인 부가 기능 로직을 정의하는 것이다.

Around, Before, After 등의 Advice 타입이 존재한다.

Target - 하나 이상의 Advice가 적용될 객체를 말한다.

Spring AOP는 Runtime Proxy를 사용해서 구현되므로 객체는 항상 Proxy 객체가 된다.

AOP Proxy - AOP를 구현하기 위해 AOP 프레임워크에 의해서 생성된 객체다. 

Spring Framework에서 AOP 프록시는 JDK dynamic proxy 또는 CGLIB proxy이다.

Weaving - Aspect를 다른 객체와 연결하여 Advice 객체를 생성, 런타임 또는 로딩 시 수행할 수 있지만

Spring AOP는 런타임에 위빙을 수행한다.

 

라고 이해했다.