AOP(Aspect-Oriented Programming)
AOP는 관점(Aspect) 지향 프로그래밍으로, 관점을 기준으로 다양한 기능을 분리하여 보는 프로그래밍.
관점(Aspect)이란, 부가 기능과 그 적용처를 정의하고 합쳐서 모듈로 만든 것
AOP의 목적
관점지향 프로그래밍은 객체지향 프로그래밍을 보완하기 위해 쓰임, 기존 객체(Object) 지향은 목적에 따라 클래스를 만들고 객체를 만들었다.
따라서 핵심 비즈니스 로직이든, 부가 기능의 로직이든 하나의 객체로 분리하는데 그치고, 이 기능들을 어떻게 바라보고 나눠 쓸지에 대한 정의가 부족하다는 단점이 있음
보통 비즈니스 웹 애플리케이션이라면 사업에 핵심적인 핵심 비즈니스 로직이 있고, 애플리케이션 전체를 관통하는 부가 기능 로직이 있으며 이를 횡단 관심사(cross-cutting concerns)라고 한다(종류는 로깅, 보안, 트랜잭션이 있다).
횡단 관심사의 코드를 핵심 비즈니스 로직의 코드와 분리하여, 코드의 간결성을 높이고 변경에 유연함과 무한한 확장이 가능하도록 하는 것이 AOP의 목적이다.
다양한 AOP 적용 방식
컴파일 시점 적용
컴파일 시점 적용 방식은 AspectJ 컴파일러가 일반 .java 파일을 컴파일할 때 부가기능을 넣어서 .class 파일로 컴파일해주는 것을 의미함, 이 동작을 Aspect와 실제 코드를 연결하는 위빙(weaving)이라고 부른다.
클래스 로딩 시점 적용
JVM 내 클래스로더에 .class 파일을 올리는 시점에 바이트 코드를 조작해 부가기능 로직을 추가하는 방식
런타임 시점 적용
컴파일, 클래스 로딩, main() 메서드의 실행 이후에 자바가 제공하는 범위 내에 부가 기능을 적용하는 방식, 이미 런타임 중이라 코드를 조작하기 어려워 스프링, 컨테이너, DI, 빈 등 여러 개념과 기능을 총동원하여 프록시를 통해 부가 기능을 적용하는 방식
프록시는 메서드 실행 시점에서만 다음 타켓을 호출할 수 있기 때문에, 런타임 시점에 부가기능을 적용하는 방식은 메서드의 실행 지점으로 제한된다.
Spring AOP
Spring AOP는 런타임 시점에 적용하는 방식을 사용한다. 그 이유는 컴파일 시점과 클래스 로딩 시점에 적용하려면 별도의 컴파일러와 클래스로더 조작기를 써야 하는데, 이것을 정희하고 사용 및 유지하는 과정이 매우 어렵고 복잡하기 때문이다.
AOP 용어 및 개념
- Aspect
- 공통 기능
- 어드바이스 + 포인트컷을 모듈화한 애플리케이션의 횡단 기능
- Join Point
- 애플리케이션 실행 흐름에서의 특정 포인트 (ex. 클래스 초기화, 메서드 호출, 예외 발생 등)
- 한 마디로 AOP를 적용할 수 있는 모든 지점 (스프링에서는 메서드 실행 지점으로 제한)
- Advice
- 조인포인트에서 실행되는 코드, 부가기능 그 자체
- Aspect를 언제 핵심 코드에 적용할지 정의
- Pointcut
- 조인포인트 중 어드바이스가 적용될 지점을 선별하는 기능
- 주로 AspectJ 표현식으로 지정
- Target
- 핵심 기능을 담은 모듈 (=부가 기능 부여 대상)
- 어드바이스를 받는 객체이고, 포인트컷으로 결정된다
- Advisor
- 스프링 AOP에서만 쓰는 용어로, 하나의 어드바이스와 하나의 포인트컷으로 구성된 Aspect를 특별하게 지칭하는 말
- Introducation
- 유형을 대신하여 추가 메소드 또는 필드 선언, Spring AOP를 사용하면 조언된 객체에 새로운 인터페이스(및 해당 구현)를 도입할 수 있음.
- 소개를 사용하여 Bean이 인터페이스를 구현하도록 하고 IsModified 캐싱을 단순화할 수 있음(AspectJ 커뮤니티에서는 소개를 유형 간 선언이라고 함)
- AOP Proxy
- Aspect 계약(조언 메서드 실행 등)을 구현하기 위해 AOP 프레임워크에서 생성된 객체
- Spring Framework에서 AOP 프록시는 JDK 동적 프록시 도는 CGUB 프록시
- Weaving
- Aspect를 다른 애플리케이션 유형 도는 객체와 연결하여 조언된 객체를 생성
- 컴파일 타임(AspectJ 컴파일러 사용), 로드 타임 또는 런타임에 수행될 수 있음(Spring AOP는 런타임에 위빙을 수행함)
참고 : Spring 공식 문서
'항해 99 > Spring' 카테고리의 다른 글
Spring MVC, IoC/DI (0) | 2024.04.11 |
---|---|
Spring Context (0) | 2024.04.10 |
Override, Overload / JPA 더티체킹 / JVM (0) | 2024.04.04 |
Call by Reference (0) | 2024.04.04 |
WebSocket 활용 웹 게임 구현 (0) | 2024.04.03 |