관점 지향 프로그래밍 AOP는 부가 기능인 횡단 관심사를 핵심 로직으로부터 분리하여 공통적으로 처리하기 위한 방법론이다. AOP의 기본적인 개념과 관련 용어에 대해 알아보자.
AOP의 기본 개념
애플리케이션 로직은 핵심 기능과 부가 기능으로 나눌 수 있다.
- 핵심 기능 - 해당 객체가 제공하는 고유의 기능이다.
- 부가 기능 - 핵심 기능을 보조하기 위해 핵심 기능과 함께 사용되는 기능이다.
부가 기능은 보통 여러 클래스에 걸쳐서 동일하게 사용된다. 예를 들어 모든 애플리케이션 호출을 로깅하는 요구사항이 있다면 각 클래스마다 로그 추적 로직을 넣게 될 것이다.
- 이렇게 하나의 부가 기능이 여러 곳에 동일하게 사용되는 경우 cross-cuttion concerns(횡단 관심사)라고 한다.
- 부가 기능을 적용하기 위해서는 아주 많은 반복과 중복 코드가 생기고, 수정 시 많은 수정이 필요하다. 이는 일반적인 OOP 방식으로는 해결이 어렵다.
Aspect (애스팩트 - 관점)
- 부가 기능 + 부가 기능을 어디에 적용할지를 정의한 것
- 스프링이 제공하는 Advisor도 개념상 하나의 애스팩트이다.
- 애플리케이션을 바라보는 관점을 하나하나의 기능 → 횡단 관심사 관점으로 달리 보는 것이 AOP이다.
- OOP를 대체하기 위한 것이 아니라 OOP에서 부족한 횡단 관심사 처리를 보조하는 목적으로 개발되었다.
AspectJ 프레임워크
- AOP의 대표적인 구현 프레임워크이다.
- 스프링은 AspectJ의 문법을 차용해서 기능의 일부를 제공하며, AspectJ를 사용하는 것은 아니다.
- AspectJ는 공부할 내용도 많고, 자바 관련 설정이 복잡하다. 스프링 AOP를 사용하면 스프링만 있어도 별도의 추가 설정 없이 실무에서 필요한 대부분의 AOP 기능을 사용할 수 있다.
AOP 적용 방식
AOP를 사용할 때 부가 기능 로직이 실제 로직에 추가되는 방법은 크게 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
'Java > [스프링 핵심 원리]' 카테고리의 다른 글
[스프링] AOP 적용을 위해 @Aspect를 사용해보자 (0) | 2024.03.14 |
---|---|
[스프링 핵심 원리] 컴포넌트 스캔(@ComponentScan) (0) | 2021.12.12 |
[스프링 핵심 원리] 싱글톤 컨테이너와 @Configuration (0) | 2021.12.11 |
[스프링 핵심 원리] 스프링 설정 파일 알아보기 - BeanFactory와 ApplicationContext, BeanDefinition (0) | 2021.12.08 |
[스프링 핵심 원리] 스프링 컨테이너와 스프링 빈 (0) | 2021.12.07 |
댓글