https://www.javatpoint.com/spring-boot-aop
애플리케이션은 일반적으로 여러 레이어를 사용해서 개발 합니다. 일반적인 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>
'프로그래밍' 카테고리의 다른 글
JGroups-Spring In Action (0) | 2024.02.26 |
---|---|
JDBC_PING을 사용하여 클러스터 노드를 검색하는 방법 (0) | 2024.02.23 |
신뢰성 있는 메시지 교환을 위한 JGroups (0) | 2024.02.22 |
Spring MVC 내 HandlerInterceptors vs. Filters (0) | 2024.02.16 |
Maven과 AspectJ - 완벽 환경설정 관련 (0) | 2024.02.15 |