본문 바로가기
Java/[스프링 핵심 원리]

[스프링] 관점 지향 프로그래밍 AOP란 무엇일까

2024. 3. 14.

관점 지향 프로그래밍 AOP는 부가 기능인 횡단 관심사를 핵심 로직으로부터 분리하여 공통적으로 처리하기 위한 방법론이다. AOP의 기본적인 개념과 관련 용어에 대해 알아보자.

 

AOP의 기본 개념

애플리케이션 로직은 핵심 기능과 부가 기능으로 나눌 수 있다.

  • 핵심 기능 - 해당 객체가 제공하는 고유의 기능이다.
  • 부가 기능 - 핵심 기능을 보조하기 위해 핵심 기능과 함께 사용되는 기능이다.

부가 기능은 보통 여러 클래스에 걸쳐서 동일하게 사용된다. 예를 들어 모든 애플리케이션 호출을 로깅하는 요구사항이 있다면 각 클래스마다 로그 추적 로직을 넣게 될 것이다.

  • 이렇게 하나의 부가 기능이 여러 곳에 동일하게 사용되는 경우 cross-cuttion concerns(횡단 관심사)라고 한다.
  • 부가 기능을 적용하기 위해서는 아주 많은 반복과 중복 코드가 생기고, 수정 시 많은 수정이 필요하다. 이는 일반적인 OOP 방식으로는 해결이 어렵다.

 

Aspect (애스팩트 - 관점)

  • 부가 기능 + 부가 기능을 어디에 적용할지를 정의한 것
    • 스프링이 제공하는 Advisor도 개념상 하나의 애스팩트이다.
  • 애플리케이션을 바라보는 관점을 하나하나의 기능 → 횡단 관심사 관점으로 달리 보는 것이 AOP이다.
  • OOP를 대체하기 위한 것이 아니라 OOP에서 부족한 횡단 관심사 처리를 보조하는 목적으로 개발되었다.

 

AspectJ 프레임워크

  • AOP의 대표적인 구현 프레임워크이다.
  • 스프링은 AspectJ의 문법을 차용해서 기능의 일부를 제공하며, AspectJ를 사용하는 것은 아니다.
  • AspectJ는 공부할 내용도 많고, 자바 관련 설정이 복잡하다. 스프링 AOP를 사용하면 스프링만 있어도 별도의 추가 설정 없이 실무에서 필요한 대부분의 AOP 기능을 사용할 수 있다.

 

AOP 적용 방식

AOP를 사용할 때 부가 기능 로직이 실제 로직에 추가되는 방법은 크게 3가지가 있다.

  1. 컴파일 시점
  2. 클래스 로딩 시점
  3. 런타임 시점 (→ 프록시)

* Weaving(위빙)

  • 원본 로직에 부가 기능 로직이 추가되는 것. 애스펙트와 실제 코드를 연결해서 붙이는 것.

 

컴파일 시점

  • 컴파일 시점(.java 소스 코드를 컴파일러를 사용해서 .class로 만드는 시점)에 부가 기능 로직을 추가할 수 있다.
  • AspectJ 컴파일러가 Aspect를 확인해서, 적용 대상인 경우 부가 기능 코드를 추가한다.
  • 특별한 컴파일러가 필요하고, 설정 등이 복잡하다.

 

클래스 로딩 시점

  • 자바를 실행하면 .class 파일을 JVM 내부의 클래스 로더에 보관하는데, .class를 JVM에 저장하기 전에 조작할 수 있다. 이 때 애스펙트를 적용하는 것이며, 로드 타임 위빙이라 한다.
  • 자바를 실행할 때 특별한 옵션을 통해 클래스 로더 조작기를 지정해야 하는데, 운영하기 어렵다는 단점이 있다.

 

런타임 시점

  • 자바의 메인 메서드가 이미 실행된 이후이기 때문에 자바 언어가 제공하는 범위 안에서 부가 기능을 적용해야 한다. 따라서 스프링 컨테이너의 도움을 받고 DI, 프록시, 빈 후처리기 등의 개념을 이용해서 부가 기능을 적용하게 된다.
  • 항상 프록시를 통해야 부가 기능을 사용할 수 있는데, 프록시를 이용하기 때문에 AOP 기능에 일부 제약이 있다.
  • 복잡한 옵션이나 클래스 로더 조작기 같은 걸 사용하지 않아도 스프링만 있으면 AOP를 적용할 수 있다.

 

AOP 적용 가능 지점

  • AOP를 적용할 수 있는 지점을 Join point라고 한다.
  • AspectJ를 이용해서 컴파일 시점 또는 클래스 로딩 시점에 적용하는 AOP는 바이트 코드를 실제로 조작하기 때문에 모든 지점에 애스펙트를 적용할 수 있다.
  • 런타임 시점에 프록시를 이용하는 스프링 AOP의 방식은 메서드 실행 지점에만 AOP를 적용할 수 있다. 또한 스프링 컨테이너가 관리할 수 있는 스프링 빈에만 AOP를 적용할 수 있다.

 

AOP 관련 용어 정리

Join point (조인 포인트)

  • 어드바이스가 적용될 수 있는 위치. (메서드 실행, 생성자 호출, 필드 값 접근 등)
    • AOP를 적용할 수 있는 모든 지점을 의미하는 추상적인 개념
  • 스프링 AOP의 조인 포인트 → 메서드 실행 지점

Pointcut (포인트컷)

  • 조인 포인트 중에서 어드바이스가 적용될 곳을 선별하는 기능
  • 주로 AspectJ 표현식을 사용해서 지정한다.
  • 스프링 AOP는 메서드 실행 지점만 포인트컷으로 선별할 수 있다.

Target (타겟)

  • 어드바이스를 받는 객체
  • 포인트컷을 통해 결정된다.

Advice (어드바이스)

  • 부가 기능을 의미하며, 특정 조인포인트에서 애스펙트에 의해 취해지는 조치이다.

Aspect (애스펙트)

  • 어드바이스 + 포인트컷을 모듈화한 것이다.
  • 여러 어드바이스와 포인트컷이 함께 존재할 수 있다.

Advisor (어드바이저)

  • 스프링 AOP에서만 사용되는 용어로, 1 어드바이스 + 1 포인트컷으로 구성된다.

Weaving (위빙)

  • 포인트컷으로 결정한 타겟의 조인포인트에 어드바이스를 적용하는 것
  • 컴파일 타임, 클래스 로딩 타임, 런타임에 적용할 수 있다.
728x90

댓글