Spring Boot

Spring AOP 란?

작은별._. 2024. 9. 23. 14:16
728x90

Spring AOP 는 이름 그대로 Spring에서 제공하는 AOP 기능을 의미합니다. 그렇다면 AOP가 무엇인지 알아보겠습니다.

 

AOP란

AOP는 Apsect-Oriented Programming의 약자로, 관점 지향 프로그래밍이라고 합니다. AOP가 등장한 이유는 부가 기능을 핵심 기능에서 분리하고 한 곳에서 관리하도록 하기 위해서였습니다. 아래 핵심 기능과 부가 기능이 무엇인지 살펴보겠습니다.


핵심 기능과 부가 기능

 

어플리케이션은 크게 핵심 기능과 부가 기능으로 나눌 수 있습니다.

핵심 기능은 각 객체가 제공하는 고유의 구별되는 기능입니다. 부가 기능은 핵심 기능을 보조하기 위해 제공되는 기능입니다.

예를 들어 `OrderService`라는 클래스는 주문 관련 로직을 핵심 기능으로 제공하고, `OrderRepository` 라는 클래스는 주문 관련 데이터를 관리하는 것을 핵심 기능으로 제공합니다. 각 핵심 기능들은 관심사가 다르기 때문에 각 클래스에서 구현하고 그 기능을 제공하도록 되어 있습니다.

하지만, 이런 핵심 기능 이외에 로그를 남기기 위한 로직이나 트랜잭션 기능 핵심 기능을 보조하는 기능들도 필요합니다. 이런 기능을 부가 기능이라고 하는데 보통 부가 기능은 여러 클래스에 걸쳐서 함께 사용됩니다. 즉, 하나의 부가 기능이 여러 곳에서 동일하게 사용됩니다.


 

 

 

 

따라서 부가 기능을 각 클래스 파일마다 모두 구현하게 하면 문제가 발생하게 됩니다. 먼저, 부가 기능을 적용할 때 아주 많은 반복과 중복 코드가 발생합니다. 그리고 부가 기능을 변경할 때 중복 때문에 많은 수정이 필요하게 됩니다. 이러한 부가 기능 도입의 문제점들을 해결하기 위해 AOP라는 개념이 등장하게 된 것입니다.

 

 

Aspect

이렇게 AOP를 통해 부가 기능을 핵심 기능에서 분리하고 한 곳에서 관리하도록 하고, 해당 부가 기능을 어디에 적용할 지 선택하는 기능을 만들 수 있습니다. AOP (Aspect-Oriented Programming)의 Aspect 가 바로 이렇게 부가 기능과 부가 기능을 어디에 적용할지 선택하는 기능을 합해서 하나의 모듈로 만들어 주는 역할을 합니다. 즉, Aspect는 부가 기능과, 해당 부가 기능을 어디에 적용할 지 정의한 것입니다.

 

Aspect는 번역하면 관점이라는 의미인데, 이름 그대로 어플리케이션을 바라보는 관점을 횡단 관심사 관점(cross-cutting concerns)으로 달리 보는 것입니다.


 

참고로 AOP는 OOP를 대체하기 위한 것이 아니라 횡단 관심사를 깔끔하게 처리하기 어려운 OOP의 부족한 부분을 보조하는 목적으로 개발되었습니다.


 

 

 

 


 

 

Advice, Pointcut와 같이 AOP 에서 사용되는 용어들이 있는데 해당 용어들을 아래에 정리하였습니다.

Join Point (조인 포인트)

  • 부가 기능(Advice)이 적용될 수 있는 위치
    • 메소드 실행 지점, 생성자 호출 지점, 필드값 접근 지점, static 메서드 접근 지점과 같이 프로그램 실행 중 지점
  • 추상적인 개념으로, AOP를 적용할 수 있는 모든 지점이라고 생각하자.
  • 스프링 AOP는 항상 메서드 실행 지점으로만 제한 (AspectJ와 같은 다른 AOP 구현 프레임워크는 다른 지점에도 적용 가능)

Advice (어드바이스)

  • 부가 기능
  • 특정 Join Point에서 Aspect에 의해 취해지는 조치
  • Around(주변), Before(전), After(후)와 같은 다양한 종류의 어드바이스 존재

Pointcut (포인트 컷)

  • Join point 중에서 Advice가 적용될 위치를 선별하는 기능
  • 주로 AspectJ 표현식을 사용해 지정
  • 프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 Pointcut으로 선별 가능

Aspect (애스펙트)

  • Advice + Pointcut을 모듈화 한 것 (@Aspect)
  • 여러 Advice와 Pointcut이 함께 존재

Advisor (어드바이저)

  • 하나의 Advice와 하나의 Pointcut으로 구성
  • 스프링 AOP에서만 사용되는 특별한 용어

Target (타겟)

  • Advice를 받는 객체, Pointcut으로 결정된다.

Weaving (위빙)

  • Pointcut으로 결정한 Target의 Join Point에 Advice를 적용하는 것
  • Weaving을 통해 핵심 기능 코드에 영향을 주지 않고 부가 기능을 추가
  • AOP 적용을 위해 Aspect을 객체에 연결한 상태
    • 컴파일 타임 (AspectJ compiler)
    • 로드 타임
    • 런타임 (스프링 AOP는 런타임에 연결하는 방식)

AOP 프록시

  • AOP 기능을 구현하기 위해 만든 프록시 객체
  • 스프링에서 AOP 프록시는 JDK 동적 프록시 또는 CGLIB 프록시

[참고자료]

김영한, "스프링 핵심 원리 - 고급편 ", 인프런

 

728x90
반응형