적용방식
- 컴파일 시점
- 클래스 로딩 시점
- 런타임 시점(프록시)
컴파일 시점 단점 - 컴파일 시점에 부가 기능을 적용하려면 특별한 컴파일러도 필요하고 복잡하다. (AspectJ가 제공하는 특별한 컴파일러를 사용해야 한다.)
클래스 로딩 시점 단점 - 로드 타임 위빙은 자바를 실행할 때 특별한 옵션('java -javaagent')을 통해 클래스 로더 조작기를 지정해야 하는데, 이 부분이 번거롭고 운영하기 어렵다.
특징
- 컴파일 시점: 실제 대상 코드에 애스팩트를 통한 부가 기능 호출 코드가 포함된다. AspectJ를 직접 사용해야 한 다.
- 클래스 로딩 시점: 실제 대상 코드에 애스팩트를 통한 부가 기능 호출 코드가 포함된다. AspectJ를 직접 사용해야 한다.
- 런타임 시점: 실제 대상 코드는 그대로 유지된다. 대신에 프록시를 통해 부가 기능이 적용된다. 따라서 항상 프록 시를 통해야 부가 기능을 사용할 수 있다. 스프링 AOP는 이 방식을 사용한다.
※ 컴파일 시점, 클래스 로딩 시점은 AspectJ로 적용 가능 지점(조인 포인트)가 넓다. 하지만 (런타임 시점)프록시 방식을 사용하는 스프링AOP의 조인 포인트는 메서드 실행으로 제한된다. 스프링 빈에만 AOP를 적용할 수 있다.
※ 스프링은 AspectJ의 문법을 차용하고 프록시 방식의 AOP를 적용한다. AspectJ를 직접 사용하는 것이 아니다.
※ AspectJ는 너무 복잡하다. 실무에서는 스프링 AOP 기능만 사용해도 대부분의 문제를 해결할 수 있다.
AOP 용어 정리
- 조인 포인트(Join point)
- 어드바이스가 적용될 수 있는 위치, 메서드 실행, 생성자 호출, 필드 값 접근, static 메서드 접근 같은 프로그램 실행 중 지점
- 조인 포인트는 추상적인 개념이다. AOP를 적용할 수 있는 모든 지점
- 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메서드 실행 지점으로 제한된다.
- 포인트컷(Pointcut)
- 조인 포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능
- 주로 AspectJ 표현식을 사용해서 지정
- 프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 포인트컷으로 선별 가능
- 타겟(Target)
- 어드바이스를 받는 객체, 포인트컷으로 결정
- 어드 바이스(Advice)
- 부가 기능
- 특정 조인 포인트에서 Aspect에 의해 취해지는 조치
- Around(주변), Before(전), After(후)와 같은 다양한 종류의 어드바이스가 있음
- 에스펙트(Aspect)
- 어드바이스 + 포인트컷을 모듈화 한 것
- @Aspect를 생각하면 됨
- 여러 어드바이스와 포인트컷이 함께 존재
- 어드바이저(Advisor)
- 하나의 어드바이스와 하나의 포인트컷으로 구성
- 스프링 AOP에서만 사용되는 특별한 용어
- 위빙(Weaving)
- 포인트컷으로 결정한 타겟의 조인 포인트에 어드바이스를 적용하는 것
- 위빙을 통해 핵심 기능 코드에 영향을 주지 않고 부가 기능을 추가할 수 있음
- AOP 적용을 위해 에스펙트를 객체에 연결한 상태
- AOP 프록시
- AOP 기능을 구현하기 위해 만든 프록시 객체, 스프링에서 AOP 프록시는 JDK 동적 프록시 또는 CGLIB 프록시이다.
'개발이 좋아서 > Spring이 좋아서' 카테고리의 다른 글
AOP - 포인트컷 (0) | 2025.01.02 |
---|---|
AOP - 구현 (0) | 2024.12.31 |
빈 후처리기 (0) | 2024.12.30 |
포인트컷, 어드바이스, 어드바이저 (0) | 2024.12.30 |
프록시 팩토리 (0) | 2024.12.30 |