[AOP? 먹는건가?] AOP 개념 살펴보기

David Lee·2024년 1월 24일
0

AOP? 먹는건가?

목록 보기
1/3
post-thumbnail

관점 지향 프로그래밍(AOP) 은 여러 유형과 객체에 걸쳐 있는 관심사를 분리하여 모듈성을 높이는 것을 목표로 하는 프로그래밍 패러다임으로써 객체 지향 프로그래밍(OOP)를 보완합니다.
AOP를 활용해서 핵심 로직과 부가 기능을 분리함으로써 애플리케이션 전체에 걸쳐 사용되는 부가 기능을 모듈화하여 재사용할 수 있습니다.

OOP에서 모듈화의 핵심 단위는 클래스이지만 AOP에서의 모듈화의 단위는 Aspect입니다.

스프링에서 제공하는 @Transactional은 AOP를 활용해서 제공된다!
관련 포스팅: Spring에서 트랜잭션은 어떻게 동작할까?

AOP 개념 살펴보기

Aspect

애플리케이션의 여러 곳에 흩어져 있으며 일반적으로 실제 비즈니스 로직과 다른 표준 코드 / 기능(교차 관심사(crosscutting))을 이야기하며 이를 모듈화 한것입니다. → AOP에서 핵심적으로 활용하고자 하는 모델!

Join Point

메서드 실행, 예외 처리, 생성자 호출, 필드 할당 등...과 같은 프로그램 실행 중 한 특정 지점을 말한다. → Spring AOP에서 Join Point 는 항상 메서드 실행을 말합니다.

Advice

특정 Join Point에서 Aspect가 수행하는 작업을 이야기합니다. → 많은 AOP 프레임워크는 Advice를 인터셉터로 모델링하고 Join Point 주위에 chain of interceptors를 유지합니다.

Spring AOP에서 Advice 유형

  • Before Advice
    - Join Point 앞에서 실행되지만 예외를 발생시키지 않는 한 Join Point로 진행되는 흐름을 막을 수 없는 Advice
  • After returning Advice
    - Join Point가 정상적으로 완료된 후에 실행되는 Advice
  • After throwing Advice
    - 메서드가 예외를 발생시켜 종료될 때 실행하는 Advice
  • After (finally) Advice
    - Join Point가 종료되는 수단(정상적인 반환 or 예외 반환)에 관련 없이 실행되는 Advice
  • Around Advice
    - 메서드 호출과 같이 Join Point를 둘러싸는(Around) Advice로 메서드 호출 전후에 대한 사용자 지정 동작을 수행할 수 있고, Join Point의 실행 여부 및 자체 반환 값을 반환하거나 예외를 호출할지도 결정 할 수 있는 가장 강력한 Advice

Pointcut

Join point와 일치하는 정규식 표현으로 Pointcut과 일치하는 모든 Join point에서 Advice가 실행됩니다. → Spring에서는 AspectJ 표현을 사용합니다.

Weaving

Aspect를 대상 객체와 연결함으로써 Adviced Object(핵심 로직 코드에 Advice가 포함된 객체)를 생성하는 작업을 이야기합니다. → Spring AOP는 런타임 과정에서 수행합니다.

Introduction

클래스나 인터페이스를 대표해서 추가적으로 메서드나 필드를 선언할 수 있는 것을 이야기하며 여기서 추가 메서드나 필드 선언은 기존 클래스의 소스 코드를 수정하지 않고 해당 클래스나 인터페이스에 세로운 메서드나 필드를 추가하는 방식을 이야기합니다. → Spring AOP 에서는 새로운 인터페이스와 인터페이스 구현을 도입할 수 있도록 해줍니다.

Target object

하나 이상의 Aspects로부터 Advise를 받는 객체를 이야기합니다. → Spring AOP에서는 런타임 Proxy를 사용하여 구현되므로 위 객체는 항상 프록시화 된 객체입니다.

AOP Proxy

AOP 프레임워크에서 Aspect 문맥을 구현하기 위해 생성한 객체입니다. → Spring Framework에서는 JDK 동적 프록시 또는 CGLIB 프록시를 사용합니다.

  • JDK 동적 프록시
    - Spring AOP에서 선호하는 방식으로 대상이 되는 객체가 인터페이스를 하나라도 구현하는 방식을 사용할 때 JDK 동적 프록시를 사용한다.
  • CGLib 프록시
    - 대상이 되는 객체가 인터페이스를 구현하지 않은 경우 CGLib 프록시를 사용할 수 있다.

Spring Framework의 경우 JDK 동적 프록시를 기본으로 사용하고 CGLib 프록시 사용을 위한 가이드를 제공합니다. 하지만 Spring Boot에서는 CGLib 프록시를 기본으로 사용합니다.

AOP의 장점

  • 부가 기능에 대한 모듈화와 재사용이 가능하다.
    - 부가 기능에 대한 Aspect를 분리함으로써 재사용이 가능한 부가 기능을 구현하고 활용할 수 있다.
  • 코드 중복이 감소한다.
    - OOP에서 발생했던 교차 관심사에 대한 코드 중복을 해소할 수 있다.
  • 테스트가 용이하다.
    - 교차 관심사를 격리함으로써 핵심 비즈니스 로직에 대해 더 중점적인 단위 테스트가 가능하다.

AOP의 단점

  • 시스템의 복잡도가 올라간다.
    - 부가 기능에 대한 구현이 따로 이루어짐으로써 시스템의 복잡도가 상승한다.
  • 디버깅의 어려움을 겪을 수 있다.
    - 일반적인 OOP 코드를 디버깅하는 것보다 AOP코드를 디버깅하는데 어려움이 존재한다.

참고문헌

profile
쌓아가기

0개의 댓글

관련 채용 정보