HJW's IT Blog

AOP 기본 개념 정리 본문

SPRING

AOP 기본 개념 정리

kiki1875 2024. 11. 27. 11:32

 

AOP란 무엇인가?

AOP(Aspect Oriented Programming) 은 관점 지향 프로그래밍이다. 쉽게 말해, 어플리케이션의 핵심 비즈니스 로직에서 부가적인 기능을 분리하여 모듈화하는 패러다임이다. 각 기능을 모듈화 함으로써 공통 모듈을 분리하여 코드의 가독성과 유지 보수성을 향상 시키는데에 목적이 있다.

 

OOP랑 뭐가 다를까?

OOP(Object Oriented Programming) 의 경우, 클래스를 중심으로 모듈화를 하는 반면, AOP 는 관점에 집중한다. 여기서 관점이란 **여러 객체와 모듈에서 공통적으로 나타나는 Cross-Cutting Concern 을 의미한다.

 

AOP vs OOP

1️⃣ 모듈화의 기준

  • OOP : 객체와 클래스 중심의 모듈화가 이루어 진다.
  • AOP : 어플리케이션 전반에 걸쳐 발생하는 공통 관심사 를 기반으로 모듈화 가 이루어 진다

2️⃣ 문제 해결 방식

  • OOP : 상속과 다형성을 통해 코드의 중복을 줄이고 재사용성을 높인다
  • AOP : 중복을 피하기 위해 공통 기능을 Aspect 로 정의하고, 필요에 따라 Join Point 에 적용한다

3️⃣ 관심사의 분리

  • OOP : 핵심 비즈니스 로직과 함께 공통 관심사가 클래스 내부에 포함된다
  • AOP : 공통 관심사를 핵심 비즈니스 로직에서 완전히 분리해 코드의 단순성과 가독성을 유지한다

OOP 의 한계

기본적으로 AOP 의 목적은, 관심사의 분리, 중복 감소, 유지보수성 및 가독성 향상에 있다. OOP 에선 무엇이 부족했을까?

  1. 보안, 로깅, 트랜잭션 등 과 같이 어플리케이션의 여러부분에 걸쳐있는 Cross-Cutting Concern을 효과적으로 처리하지 못했다.
  2. 변화에 대한 유연성이 부족했다. 황단 관심사가 여러 클래스에 분산되어 있어, 해당 로직에 대한 수정 혹은 추가가 발생할때, 관련된 모든 클래스를 찾아 고쳐야 했다.
  3. 핵심 비즈니스 로직과 부가 로직이 혼재되어 있었다.

 

AOP 핵심 개념

Aspect ( 관점 )

Aspect 란, 여러 클래스를 횡단하는 관심사를 모듈화 한 것이다. 공통기능을 정의하며, 스프링 프레임워크에서 Bean 으로 등록 된다.

예를 들어 “모든 메서드 호출시 로그를 남긴다” 라는 로깅 기능을 Aspect 로 정의할 수 있으며, Advice 와 Pointcut 을 조합하여 특정 로직을 적용할 지점을 결정하고 실행할 수 있다.

Join Point

Aspect 가 적용될 수 있는 프로그램의 특정 지점을 의미한다. 주로 메서드 호출, 객체 초기화, 예외 처리, 필드 접근 등과 같은 실행 지점을 포함하는데, 예를 들어 특정 클래스의 메서드가 실행 되기 전후로 로깅을 남기고 싶다면, 메서드 호출 자체가 Join Point 가 되는 것이다.

Pointcut

Pointcut 은 Join Point 들의 집합으로, 어떤 Join Point 에서 Aspect 가 적용될지를 결정하는 표현식이다. 이러한 표현식은, 클래스 이름, 메서드 이름, 매개변수 패턴 등을 기준으로 작성된다.

예시:

  • execution(* com.example.service.*.*(..)): com.example.service 패키지의 모든 메서드 호출.
  • @annotation(org.springframework.transaction.annotation.Transactional): @Transactional이 붙은 메서드.

Advice

Advice 는 특정 Join Point 에서 Aspect 가 취하는 실제 행동 을 정의한다. 공통 기능의 구현체로, 언제, 어떤 공통 관심 기능을 핵심 로직에 적용할 지를 정의한다.

@Before : 메서드 실행전

@After : 메서드 실행 후

@AfterReturning : 메서드 정상 반환 후

@AfterThrowing : 메서드 예외 후

@Around : 메서드 실행 전후로, 실행 여부 제어

Weaving

Weaving 은 Pointcut 과 Advice 를 적용하여, Aspect 를 대상 객체에 연결하는 과정이다. Weaving 은 컴파일 타임, 클래스 로드 타임, 런타임 등에 이루어 질 수 있다.

 

 

AOP 동작 방식

앞서 Weaving은 Aspect 를 객체에 연결하는 과정이라 했다. 우선 용어를 간단히 설명하고 가겠다.

AspectJ : JAVA 기반의 AOP 구현체로, AOP를 지원하기 위해 설계된 확장 언어

Proxy : 디자인 패턴중 하나로 대리인 역할을 하는 객체이다. client 와 target object 사이에 위치하여, 클라이언트의 요청을 가로채어 실제 객체로 전달 / 추가 작업을 수행한다.

Proxy Pattern : 어떤 객체에 대한 대리 객체(Proxy) 를 만들어 원래 객체에 대한 접근을 제어 혹은 추가 기능을 제공하는 디자인 패턴

Spring AOP vs AspectJ

Spring AOP 와 AspectJ 는 모두 AOP를 지원하는 프레임워크이다. 둘의 차이점을 간략하게 설명하겠다.

1️⃣ 적용 방식

  • Spring AOP : Proxy 기반 AOP 를 사용하며, Spring 의 Proxy 객체를 통해 메서드 호출을 가로채어 부가 기능을 적용하며, Run-Time 에 적용된다. 또한 Spring context 에서 관리하는 Bean 에만 AOP 의 적용이 가능하다
  • AspectJ : Bytecode Manipulation 기반으로 동작하며, compile, run, load-time 에 모두 독작 가능하다. Bean 뿐만 아니라, 일반 클래스에도 적용이 가능하다

2️⃣ 기능 범위

  • Spring AOP : Spring 에 최적화된 간단하고 제한적인 AOP 기능 제공. 주로 메서드 수준에서 동작하며, 필드 수준의 조작은 지원하지 않는다
  • AspectJ : 메서드 호출 뿐만 아니라, 필드, 생성자, 객체 생성 등 다양한 조작을 지원한다.

3️⃣ 성능

  • Spring AOP : Proxy 기반 동작이기에, 비교적 느리다.
  • AspectJ : 컴파일 타임 / 로드 타임 byte code manipulation 기반이기에, 더 빠르다.

 

Spring AOP 동작 과정

Spring AOP 는 Proxy Pattern 을 기반으로 동작하며, Run-Time에 Dynamic proxy 를 생성한다. Spring AOP 는 target object 를 proxy 로 감싸, 클라이언트가 target object 호출시, 실제로는 proxy 객체가 호출되어 부가 기능(Advice) 를 실행한다.

Spring AOP는 Run-Time 에 동적으로 Proxy 를 생성하는데, 두가지 방식으로 이루어 진다.

  1. JDK Dynamic Proxy : 타겟 객체가 하나 이상의 인터페이스를 구현하고 있을 때 사용되며, 인테페이스를 구현한 메서드들만 프록시가 적용된다.
  2. CGLIB Proxy : 타겟 객체가 인터페이스를 구현하지 않았을 경우 사용되며, 타겟 객체의 모든 메서드에 프록시가 적용된다.

AOP 적용 과정

  1. Spring Container 는 Bean 객체를 생성할 때, AOP 적용 대상인지 확인한다.
  2. AOP 적용 대상이라면, 해당 Bean 에 대한 Proxy 객체를 생성한다.
    1. Advisor 를 생성한다 (Pointcut + Advise)
    2. ProxyFactory 를 사용한다 (어떤 방식으로 프록시를 생성해야 하는지 결정)
  3. Client의 요청이 들어오면, Proxy 객체가 요청을 가로채고 Advice 를 실행한다
  4. Advice 전후로 타겟 메소드를 호출한다.