728x90
반응형
728x90
AOP - Aspect-Oriented Programming
- 관점 지향 프로그래밍을 의미
- 프로그램의 핵심 로직과는 별개로 공통적으로 적용되는 기능들을 모듈화하여 관리하는 방법론
- 코드의 관심사 분리를 중점으로 다른 기능들이 서로 영향을 주지 않도록 함
주요 개념
Aspect
- 여러 모듈에 반복적으로 적용되는 공통 기능
- 로깅, 트랜잭션 관리, 보안 등의 기능 등등
- @Aspect
Join Point
- 프로그램 실행 중에 AOP 기능을 삽입할 수 있는 지점
- Advice가 적용될 수 있는 모든 지점
- 메서드 실행, 생성자 호출, 필드 값 접근, static 메서드 접근 등 프로그램 실행 중 지점
- 스프링 AOP의 경우 프록시 방식을 사용해 메서드 실행 지점으로 제한
Advice
- 조인 포인트에서 수행될 실제 코드
- Before Advice
- 조인 포인트 이전에 실행되는 Advice
- 작업의 흐름 변경 불가능
- 메서드가 종료되면 자동으로 다음 타겟 호출 -> 사용자가 호출할 필요 X
- After Advice
- AfterReturning: 메서드 실행이 정상적으로 반환될 때 실행되는 Advice
- AfterThrowing: 메서드 실행에 예외가 발생할 경우 실행되는 Advice
- After: 메서드 실행이 종료되면 실행되는 Advice, 정상 및 예외 반환 조건을 모두 처리
- Around Advice
- 메서드 실행 전후를 감싸는 Advice
- 조인 포인트 실행 여부 선택, 반환 값 변환, 예외 값 변환 등 모든 조작 가능
- 사용자가 실제 메서드를 호출해줘야 함
Pointcut
- 어드바이스가 적용될 조인 포인트의 조건을 정의하는 표현식
- 프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 선별 가능
Weaving
- 실제 코드에 어드바이스를 삽입하는 과정
- 포인트컷으로 결정한 타켓의 조인 포인트에 어드바이스를 적용
- 핵심 기능 코드에 영향을 주지 않고 부가 기능을 추가 할 수 있음
- 컴파일, 클래스 로드, 런타임 시 발생 가능
- 스프링 AOP의 경우 프록시를 통한 런타임 발생
Target
- Advice를 받는 객체
- Pointcut을 통해 결정됨
Advisor
- 하나의 Advice와 Pointcut으로 구성
- 스프링 AOP에서만 사용
컴파일 시점 Weaving
- AOP 위빙이 컴파일 과정 중에 이루어지는 방식
- AspectJ와 같은 AOP 프레임워크에서 사용
- AOP 기능을 지원하는 AspectJ의 별도의 컴파일러를 통해 자바 소스 파일을 컴파일할 때 AOP 관련 코드를 직접 클래스 파일에 삽입
- 실제 클래스의 바이트 코드 조작으로 변경 됨
장점
- 컴파일 타임에 이루어져 런타임 성능에 영향을 미치지 않음
- 추가적인 런타임 라이브러리나 프록시 객체가 필요하지 않음 -> 최종 생성 객체는 위빙된 객체
단점
- 컴파일 타임에 위빙으로 디버깅이 어려울 수 있음
- 별도의 특별한 컴파일러가 필요
클래스 로드 시점 Weaving
- 클래스가 JVM에 로드될 때 AOP 위빙이 적용되는 방식
- 클래스가 메모리에 로드되는 시점에서 동적으로 AOP 기능을 적용
장점
- 실행 시 클래스가 로드될 때 AOP 기능이 추가되어 컴파일 타임에 별도의 위빙 작업을 하지 않아도 됨
- JVM 수준에서 AOP를 적용하여 기존 클래스를 변경하지 않고도 AOP 기능을 적용할 수 있음
단점
- 클래스가 로드될 때마다 위빙이 적용되므로 로딩 성능에 영향을 미칠 수 있음
- 별도의 특별한 옵션을 통해 클래스 로더 조작기를 지정해야 함
런타임 시점 Weaving
- JVM 실행 중에 AOP 위빙을 수행하는 방식
- 프록시 기반 AOP를 사용하는 방식으로 Spring AOP에서 사용
- 프록시 객체를 사용한 핵심 로직과 AOP 기능 결합
장점
- 프록시 객체를 사용하여 동적으로 AOP를 적용하여 코드 수정 없이 실행 중에 AOP를 적용할 수 있음
- 메소드 호출 시점에 AOP 기능을 삽입하기 때문에 실행 중에 변경이 가능
- Spring과 같은 프레임워크에서 빈에 AOP를 자동으로 적용할 수 있음
단점
- 프록시 객체가 핵심 로직을 감싸는 구조를 사용해 오버헤드와 프록시를 사용하지 않는 다른 기술과의 호환성 문제가 발생할 수 있음
- 프록시를 통한 메서드 실행 시점에 적용 되므로 생성자, 필드 값 호출 등 다른 기능에 사용은 제한 됨
스프링 핵심 원리 - 고급편 강의 | 김영한 - 인프런 강의 내용 참고
728x90
'백엔드 > Spring' 카테고리의 다른 글
[Spring] Spring AOP 주의 사항 정리 (1) | 2024.11.12 |
---|---|
[Spring] Spring AOP - Pointcut (2) | 2024.11.10 |
[Spring] 빈 후처리기 - BeanPostProcessor (0) | 2024.11.07 |
[Spring] ProxyFactory (1) | 2024.11.06 |
[Spring] 동적 프록시 (0) | 2024.11.05 |