스프링 부트 AOP
애플리케이션은 일반적으로 여러 레이어로 개발됩니다. 일반적인 Java 애플리케이션에는 다음과 같은 계층이 있습니다.
웹 계층: REST 또는 웹 애플리케이션을 사용하여 서비스를 노출합니다.
비즈니스 계층: 응용프로그램의 비즈니스 로직을 구현합니다.
데이터 계층: 응용프로그램의 지속성 논리를 구현합니다.
각 계층의 책임은 다르지만 모든 계층에 적용되는 몇 가지 공통적인 측면이 있습니다. 로깅, 보안, 유효성 검사, 캐싱 등이 있습니다. 이러한 공통적인 측면을 교차 관심사라고 합니다.
이러한 우려 사항을 각 계층에서 별도로 구현하면 코드를 유지하기가 더 어려워집니다. 이 문제를 극복하기 위해 AOP(Aspect-Oriented Programming)는 교차 관심사를 구현하는 솔루션을 제공합니다.
크로스 커팅 문제를 측면으로 구현합니다.
점을 정의하여 측면을 적용해야 하는 위치를 나타냅니다.
이는 교차 관심을 하나의 응집력 있는 코드 구성요소로 정의하도록 보장합니다.
AOP
AOP(Aspect-Oriented Programming)는 횡단 관심를 분리하여 모듈성을 높이는 프로그래밍 패턴입니다. 이러한 교차 관심사는 주요 비즈니스 논리와 다릅니다. 우리는 코드 자체를 수정하지 않고 기존 코드에 동작을 추가할 수 있습니다.
Spring의 AOP 프레임워크는 이러한 교차 관심사를 구현하는 데 도움이 됩니다.
AOP를 사용하여 공통 기능을 한 곳에서 정의합니다. 새 기능을 적용할 클래스를 수정하지 않고도 이 기능을 적용하는 방법과 위치를 자유롭게 정의할 수 있습니다. 교차 관심사는 이제 측면이라고 하는 특수 클래스로 모듈화할 수 있습니다.
측면에는 두 가지 이점이 있습니다.
첫째, 이제 코드베이스 전체에 흩어져 있는 대신 각 관심사에 대한 논리가 한 곳에 배치됩니다.
둘째, 비즈니스 모듈에는 주요 관심사에 대한 코드만 포함되어 있습니다. 2차 문제가 측면으로 이동되었습니다.
각 측면에는 조언이라고 불리는 구현해야 할 책임이 있습니다. 측면의 기능을 하나 이상의 조인 포인트에 있는 프로그램에 구현할 수 있습니다.
AOP의 이점
순수 Java로 구현됩니다.
특별한 컴파일 프로세스는 필요하지 않습니다.
메서드 실행 조인 포인트만 지원합니다.
런타임 직조만 사용할 수 있습니다.
JDK 동적 프록시 및 CGLIB 프록시라는 두 가지 유형의 AOP 프록시를 사용할 수 있습니다.
교차 우려 사항입니다.
교차 관심사는 애플리케이션의 여러 위치에서 구현하고자 하는 관심사입니다. 전체 응용프로그램에 영향을 미칩니다.
AOP 용어
Aspect: Aspect이란 조언과 포인트 컷을 캡슐화하고 교차 컷을 제공하는 모듈입니다. 응용 프로그램에는 다양한 측면이 있을 수 있습니다. @Aspect 주석이 달린 정규 클래스를 사용하여 측면을 구현할 수 있습니다.
Pointcut: 포인트 컷은 조언이 실행되는 하나 이상의 조인 포인트를 선택하는 표현식입니다. 표현식이나 패턴을 사용하여 포인트 컷을 정의할 수 있습니다. 조인 지점과 일치하는 여러 종류의 식을 사용합니다. Spring Framework에서는 AspectJ 포인트컷 표현 언어를 사용합니다.
Join Point : 조인 포인트는 애플리케이션 내에서 AOP 측면을 적용하는 포인트입니다. 또는 특정 실행 사례의 조언입니다. AOP에서 조인 포인트는 메서드 실행, 예외 처리, 객체 변수 값 변경 등이 될 수 있습니다.
Advice: Advice은 메서드 실행 전이나 후에 수행하는 작업입니다. 액션은 프로그램 실행 중에 호출되는 코드 조각입니다. Spring AOP 프레임워크에는 사전, 사후, 사후, 사후 및 주변 조언의 다섯 가지 유형이 있습니다. 특정 조인 지점에 대한 조언을 받습니다. 이 섹션에서는 이러한 조언에 대해 자세히 설명합니다.
Target Object: 조언이 적용되는 개체를 대상 개체라고 합니다. 대상 객체는 항상 프록시입니다. 이는 런타임에 대상 메서드가 재정의될 때 하위 클래스가 생성되고 해당 구성에 따라 조언이 포함됨을 의미합니다.
Weaving: 다른 응용 프로그램 유형과 측면을 연결하는 프로세스입니다. 런 타임, 로드 타임, 컴파일 타임에 위빙을 수행할 수 있습니다.
Proxy: 대상 객체에 조언을 적용한 후 생성되는 객체를 프록시라고 합니다. Spring AOP는 JDK 동적 프록시를 구현하여 대상 클래스 및 조언 호출이 있는 프록시 클래스를 만듭니다. 이러한 클래스를 AOP 프록시 클래스라고 합니다.
AOP 대 OOP
AOP와 OOP의 차이점은 다음과 같습니다.
AOP | OOP |
Aspect: 포인트 컷, 조언 및 속성을 캡슐화하는 코드 단위입니다. | Class: 메서드 및 속성을 캡슐화하는 코드 단위입니다. |
Poinrtcut: 조언이 실행되는 진입점 집합을 정의합니다. | Method signature: 메서드 본문의 실행을 위한 진입점을 정의합니다. |
Advice: 교차 관심사를 구현한 것입니다. | Method boides: 이것은 비즈니스 로직 문제를 구현한 것입니다. |
Waver: Advice과 함께 코드(소스 또는 객체)를 구성합니다. | Compiler: 소스 코드를 개체 코드로 변환합니다. |
Spring AOP vs AspectJ
AOP와 OOP의 차이점은 다음과 같습니다.
Spring AOP | AspectJ |
별도의 컴파일 프로세스가 필요합니다. | 여기에는 AspectJ 컴파일러가 필요합니다. |
모든 포인트 컷을 지원합니다. | 메서드 실행 지점 잘라내기만 지원합니다. |
스프링 컨테이너에서 관리하는 빈에 구현할 수 있습니다. | 모든 도메인 개체에 구현할 수 있습니다. |
메서드 수준 weaving만 지원합니다. | 파형 필드, 메서드, 생성자, 정적 이니셜라이저, 최종 클래스 등을 사용할 수 있습니다. |
AOP Advice의 유형
다음과 같은 다섯 가지 유형의 AOP 조언이 있습니다.
- Before Advice
- After Advice
- Around Advice
- After Advice
- After Throwing
- After Returning
Before Advice : 지점 전에 실행되는 Advice을 호출합니다. @Before 주석을 사용하여 조언을 Before advisor와 같이 표시합니다.
After Advice : 조인 지점 후에 실행되는 Advice을 호출합니다. @After annotation을 사용하여 조언을 After advestion로 표시합니다.
Around Advice: 조인 지점 앞뒤에서 실행되는 Advice라고 합니다.
After Throwing Advice : 조인 포인트가 예외를 발생시킬 때 실행되는 Advice입니다.
After Returning Advice : 메서드가 성공적으로 실행될 때 실행되는 Advice입니다.
애플리케이션에 AOP를 구현하기 전에 Spring AOP 종속성을 pom.xml 파일에 추가해야 합니다.
스프링 부트 스타터 AOP
스프링 부트 스타터 AOP는 스프링 AOP 및 Aspect J를 제공하는 종속 요소입니다. 여기서 AOP는 기본 AOP 기능을 제공하는 반면, Aspect J는 완전한 AOP 프레임워크를 제공합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
다음 섹션에서는 애플리케이션의 다양한 Advice을 구현할 것입니다.
'SW > Spring Boot' 카테고리의 다른 글
Spring Boot : Spring BOot AOP After Advice 개념, 개요, 예제, 설명 (0) | 2023.03.25 |
---|---|
Spring Boot : Spring Boot AOP Before Advice 개념, 예제, 개요, 설명 (0) | 2023.03.24 |
Spring Boot : Tomcat으로 프로젝트 배포 방법, 예제, 개념, 개요 (0) | 2023.03.22 |
Spring Boot : Hello World 예제, 개념, 설명, 개요 (0) | 2023.03.21 |
Spring Boot : Spring Boot Auto-configuration 설명, 예제, 개요, 방법 (0) | 2023.03.20 |