AOP란
Aspect-Oriented Programming , 관점 지향 프로그래밍이란 뜻으로 어떤 로직을 핵심적인 관점과 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하는 것이다.
부가 기능과 부가 기능을 어디에 적용할 지 선택하는 기능을 합해서 하나의 모듈로 만든 것을 Aspect라고 한다.
이 Aspect 를 사용한 프로그래밍 방식을 AOP 라고 한다.
AOP는 OOP를 대체하기 위한 것이 아닌 횡단 관심사(하나의 부가 기능이 여러 곳에 동일하게 사용됨)를 깔끔하게 처리하기 어려운 OOP의 부족한 부분을 보조하는 목적으로 개발되었다.
AOP 의 대표적인 구현으로는 AspectJ 프레임워크가 있다.
AOP 적용 방식
적용 방식에는 크게 3가지 방식이 있다.
- 컴파일 시점
- 클래스 로딩 시점
- 런타임 시점(프록시)
컴파일 시점과 클래스 로딩 시점 방식은 AspectJ 프레임워크를 직접 사용해야 하고 이 AspectJ를 학습하기 위해선 엄청난 분량과 설정의 번거로움이 있어 주로 런타임 시점 적용 방식을 사용하는 스프링 AOP 를 사용한다.
런타임 시점은 컴파일도 다 끝나고 클래스 로더에 클래스도 다 올라가서 이미 자바가 실행되고 난 다음을 말한다. (main 메서드가 실행된 다음)
프록시를 사용하기 때문에 AOP 기능에 일부 제약이 있지만 특별한 컴파일러나 자바를 실행할 때 복잡한 옵션과 클래스 로더 조작기를 설정하지 않아도 스프링이 알아서 자동으로 설정해주기 때문에 훨씬 편리하다.
AOP 적용 위치
AOP 는 메서드 실행 위치 뿐만 아니라 다양한 위치에 적용할 수 있다.
- 조인포인트 지점 : 생성자, 필드 값 접근, static 메서드 접근, 메서드 실행
- AspectJ를 사용해서 컴파일 시점과 클래스 로딩 시점에 적용하는 모든 시점
- 스프링 AOP의 조인포인트는 메서드 실행 지점
- 프록시 방식을 사용하는 스프링 AOP는 @Aspect를 빈 등록한 시점
AOP 용어 정리
- 조인 포인트(Join point)
어드바이스가 적용될 수 있는 위치, 메소드 실행, 생성자 호출, 필드 값 접근, static 메서드 접근 같은 프로그램 실행 중 지점들은 대부분 조인 포인트이다.
추상적인 개념으로 AOP를 적용할 수 있는 모든 지점이라 생각하면 된다.
스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메소드 실행 지점으로 제한된다. - 포인트컷(Pointcut)
조인 포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능으로 주로 AspectJ 표현식을 사용해서 지정한다.
프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 포인트컷으로 선별이 가능하다. - 타켓(Target)
어드바이스(부가 기능)를 받는 객체, 포인트컷으로 결정한다. - 어드바이스(Advice)
부가 기능으로 특정 조인 포인트에서 Aspect에 의해 취해지는 조치로 Around(주변), Before(전), After(후)와 같은 다양한 종류의 어드바이스가 있다. - 애스펙트(Aspect)
어드바이스 + 포인트컷을 모듈화 한 것으로 @Aspect 를 생각하면 된다.
여러 어드바이스와 포인트 컷이 함께 존재한다. - 어드바이저(Advisor)
하나의 어드바이스와 하나의 포인트 컷으로 구성된 스프링 AOP에서만 사용되는 특별한 용어이다. - 위빙(Weaving)
AOP 적용을 위해 Aspect를 객체에 연결한 상태이다.
포인트컷으로 결정한 타켓의 조인 포인트에 어드바이스를 적용하는 것으로 위빙을 통해 핵심 기능 코드에 영향을 주지 않고 부가 기능을 추가 할 수 있다.
- 컴파일 타임(AspectJ compiler)
- 로드 타임
- 런타임, 스프링 AOP는 런타임, 프록시 방식
- AOP 프록시
AOP 기능을 구현하기 위해 만든 프록시 객체, 스프링에서 AOP 프록시는 JDK 동적 프록시 또는 CGLIB 프록시이다.
반응형
'백엔드 > Spring' 카테고리의 다른 글
[Spring] 스프링 AOP 포인트컷 (0) | 2024.05.21 |
---|---|
[Spring] Spring AOP 구현 예제 (0) | 2024.05.17 |
[Spring] @Aspect란, 생성 과정 설명 (0) | 2024.05.12 |
[Spring] 빈 후처리기 (0) | 2024.05.08 |
[Gradle] Gradlew 빌드 시 gradle 다운로드 속도가 느릴 때 (0) | 2024.04.03 |