Spring Boot AOP

2024. 2. 27. 20:32프로그래밍

728x90

https://www.javatpoint.com/spring-boot-aop

 

Spring Boot AOP - javatpoint

Spring Boot AOP with Introduction, Features, Project, Starter Project Wizard, CLI, Application, Annotations, DM, Properties, Actuator, Thymeleaf View, JPA, JDBC etc

www.javatpoint.com

 

애플리케이션은 일반적으로 여러 레이어를 사용해서 개발 합니다. 일반적인 Java 애플리케이션은 다음과 같은 레이어가 있습니다:

  • 웹 레이어: REST 또는 웹 애플리케이션을 사용하여 서비스를 노출합니다.
  • 비즈니스 레이어: 애플리케이션의 비즈니스 로직을 구현합니다.
  • 데이터 레이어: 애플리케이션의 영속성 로직을 구현합니다.

각 레이어마다 책임은 다르지만, 모든 레이어들에 적용되는 몇 가지 공통 측면은 로깅, 보안, 유효성 검사, 캐싱 등입니다. 이러한 공통 측면을 횡단관심사( cross-cutting concerns )라고 합니다.

각 레이어에서 이러한 문제를 개별적으로 구현하려고 한다면, 코드를 유지 관리하기가 더 어려워집니다. 이 문제를 극복하기 위해 AOP(Aspect-Oriented 프로그래밍)는 횡단관심사( cross-cutting concerns -이하 크로스커팅) 를 구현한 솔루션을 제공합니다.

 

  • 크로스커팅 문제를 에스펙트로 구현합니다.
  • 에스펙트가 적용되야 하는 위치를 나타내기 위해 포인트컷을 정의합니다.

이는 크로스커팅 문제가 하나의 응집력 있는 코드 컴포넌트에 정의되도록 보장 해 줍니다.

AOP

AOP( Aspect-Oriented Programming )는해당 크로스커팅 문제를 분리하여 모듈성을 높이는 프로그래밍 패턴입니다. 이러한 크로스커팅 문제는 주요 비즈니스 논리와 다릅니다. 코드 자체를 수정하지 않고도 기존 코드에 추가 동작을 정의할 수 있습니다.

Spring의 AOP 프레임워크는 우리가 이러한 크로스커팅 문제를 구현하는 데 도움이 됩니다.

AOP를 사용하여 공통 기능을 한곳에서 정의합니다. 새 기능을 적용할 클래스를 수정하지 않고도 이 기능을 적용하는 방법과 위치를 자유롭게 정의할 수 있습니다. 이제 크로스커팅 문제를   aspect(이하 에스펙트)라는 특수 클래스로 모듈화할 수 있습니다.

이 에스펙트는 두 가지 이점이 있습니다.

  • 첫째, 각 문제에 대한 로직이 이제 코드베이스 전체에 분산되어 있지 않고 한 곳에 존재하게 됩니다.
  • 둘째, 비즈니스 모듈에는 주요 관심사에 대한 코드만 포함되어 있습니다. 두 번째 관심사는 에스펙트로 옮겨집니다.

이 에스펙트는 소위  advice(이하 어드바이스)라고 불리는 것을 구현할 책임이 있습니다. 우리는 하나 이상의 Join Point(이하 조인 포인트)에서 프로그램에 에스펙트의 기능을 구현할 수 있습니다.

AOP의 장점

  • 순수 Java로 구현되었습니다.
  • 특별한 컴파일 프로세스에 대한 요구 사항은 없습니다.
  • 메소드 실행 조인 포인트만 지원합니다.
  • 런타임 위빙만 가능합니다.
  • JDK 동적 프록시와 CGLIB 프록시라는 두 가지 유형의 AOP 프록시를 사용할 수 있습니다.

Cross-cutting concern - 크로스 커팅 문제

크로스 커팅 문제는 애플리케이션의 여러 위치에서 구현하려는 에스펙트입니다. 이는 전체 애플리케이션에 영향을 미칩니다.

AOP 용어

  • Aspect: 에스펙트는 어드바이스와 ( pointcut 이하 포인트컷)을 캡슐화하고 크로스커팅을 제공하는 모듈입니다. 애플리케이션은 여러 가지 에스펙트를 가질 수 있습니다. @Aspect 주석이 달린 규격 클래스를 사용하여 에스펙트를 구현할 수 있습니다.
  • 포인트컷: 포인트컷은 에스펙트가 실행되는 하나 이상의 조인 포인트를 선택하는 표현식입니다. 표현식이나 패턴을 사용하여 포인트컷을 정의할 수 있습니다. 조인 포인트와 일치하는 다양한 종류의 표현식을 사용합니다. Spring Framework에서는 AspectJ Pointcut 표현식 언어가 사용 됩니다.
  • 조인 포인트: 조인 포인트는 AOP 에스펙트를 적용하는 애플리케이션의 위치입니다. 또는 에스펙트의 특정 실행 인스턴스라고 합니다. AOP에서 조인 포인트는 메소드 실행, 예외 처리, 객체 변수 값 변경 등이 될 수 있습니다.
  • 어드바이스: 어드바이스는 메소드 실행 전후에 취하는 조치입니다. 이것은 프로그램 실행 중에 호출되는 코드 조각으로 동작합니다. Spring AOP 프레임워크에는 5가지 유형의 어드바이스( before, after, after-returning, after-throwing, 및 around 어드바이스)가 있습니다. 어드바이스는 특정 조인 포인트에 적용됩니다. 이 섹션에서 이러한 어드바이스들에 대해 더 자세히 알아 볼 것입니다.
  • 대상 객체: 어드바이스가 적용되는 객체를 대상 객체라고 합니다. 대상 객체는 항상 프록시가 되며, 이는 대상 메서드가 재정의되는 하위 클래스가 런타임에 생성되고 해당 구성에 따라 어드바이스가 포함된다는 것을 의미합니다.
  • 위빙(Weaving): 에스펙트를 다른 애플리케이션 타입들과 연결하는 프로세스입니다. 런타임, 로드 타임, 컴파일 타임에 위빙을 수행할 수 있습니다.
  • Proxy: 대상 객체에 어드바이스를 적용한 후 생성되는 객체를 Proxy(이하 프록시)라고 합니다. Spring AOP는 대상 클래스 및 어드바이스 호출을 사용하여 프록시 클래스를 생성하기 위해 JDK 다이나믹 프록시를 구현합니다. 이 들을 모두 AOP 프록시 클래스라고 합니다.

AOP vs. OOP

AOP와 OOP의 차이점은 다음과 같습니다:

AOP vs. OOP

Aspect: 포인트컷, 어드바이스, 그리고 속성을 캡슐화 하는 코드 조각. Class: 메서드와 속성을 캡슐화 하는 코드 조각.
Pointcut: 어드바이스가 실행 되는 엔트리 포인트의 집합을 정의 함. Method signature:  메소드 구현부 실행을 위한 엔트리 포인트를 정의 함.
Advice: 크로스 커팅 문제의 구현물. Method bodies: 비즈니스 로직의 구현물
Waver: 어드바이스로 코드를 구성함(소스와 객체). Compiler: 소스코드를 객체 코드로 변환.

 

Spring AOP vs. AspectJ

AOP와 AspectJ 의 차이점은 다음과 같습니다:

분리된 컴파일 과정이 필요 함. AspectJ 컴파일러가 필요.
오직 메소드 실행 포인트 컷만 지원 함. 모든 포인트 컷을 지원 함.
스프링 컨테이너에 의해 관리되는 빈 상에 구현 될 수 있음. 모든 도메인 객체들 상에 구현 될 수 있음.
오직 위빙 메소드 단위만 지원 함. 필드, 메서드, 생성자, 정적 초기화들, final 클래스 등.

 

AOP 어드바이스들의 타입

AOP 조언에는 다음 5가지 유형이 있습니다:

  • Before Advice
  • After Advice
  • Around Advice
  • After Throwing
  • After Returning

Before Advice: 조인 포인트 이전에 실행되는 어드바이스를 before advice 라고 합니다.

@Before 주석을 사용하여 해당 어드바이스가 Before 어드바이스로 지정합니다.
After Advice: 조인 포인트 이후에 실행되는 어드바이스를 after advice 라고 합니다.@ After  주석을 사용하여 해당 어드바이스가 After  어드바이스로 지정합니다.
Around Advice: 조인 포인트 전후에 실행되는 Advice를 around advice라고 합니다.
After Throwing Advice: 조인 포인트가 예외를 던질 때 실행되는 어드바이스입니다.
After Returning Advice: 메소드가 성공적으로 실행될 때 실행되는 어드바이스입니다.

애플리케이션에서 AOP를 구현하기 전에 pom.xml 파일에 Spring AOP 종속성을 추가해야 합니다:

스프링부트 스타터 AOP

Spring Boot Starter AOP는 Spring AOP와 AspectJ를 제공하는 종속성입니다. AOP는 기본 AOP 기능을 제공하는 반면 AspectJ는 완전한 AOP 프레임워크를 제공합니다.

<dependency>  
<groupId>org.springframework.boot</groupId>  
<artifactId>spring-boot-starter-aop</artifactId>  
<version>2.2.2.RELEASE</version>  
</dependency>
728x90