AOP 정의
애플리케이션 로직은 크게 2가지로 나눌 수 있다.
- 핵심 기능
- 해당 객체가 제공하는 고유 기능
- 부가 기능
- 핵심 기능을 보조하기 위해 제공되는 기능으로 단독으로 사용되지 않고 핵심 기능과 사용
여기서 부가 기능은 보통 하나의 클래스가 아닌 여러 곳에서 공통적으로 사용된다.
이렇게 애플리케이션 전반적인 부분에 추가되는 부가 기능을 횡단 관심사라고 한다.
하지만 일반적인 OOP 방식으로는 애플리케이션 전반에 사용되는 부가 기능 로직을 변경 지점이 하나가 되도록 처리하는데 어려움이 있다.따라서 부가 기능과 해당 기능을 어디에 적용할지 선택하는 기능을 합해서 하나의 모듈로 만들었는데 이를 애스펙트(aspect)라고 한다.
Aspect는 이름 그대로 애플리케이션을 바라보는 관점을 하나하나의 기능에서 횡단 관심사(cross-cutting concerns) 관점으로 달리 보는 것을 의미하며, 애스펙트를 사용한 프로그래밍 방식을 관점 지향 프로그래밍 AOP(Aspect-Oriented Programming)라고 한다.
정리하면 AOP는 OOP를 대체하기 위한 것이 아니라 횡단 관심사를 깔끔하게 처리하기 어려운 OOP의 부족한 부분을 보조하는 목적이다.
AOP를 사용하면 핵심 기능과 부가 기능을 코드에서 완전히 분리해서 관리할 수 있다.
그리고 분리된 부가 기능 로직은 실제 원본 로직에 추가되어 동작하는데 이를 위빙이라고 한다.
위빙은 크게 3가지 종류로 구분할 수 있다.
- 컴파일 시점
- .java 코드를 AspectJ가 제공하는 컴파일러를 사용해서 .class를 만드는 시점에 부가 기능 로직을 추가한다. AspectJ 컴파일러는 Aspect를 확인해서 해당 클래스가 적용 대상인지 확인하고, 맞다면 부가 기능 로직을 적용한다.
- 특별한 컴파일러가 필요하고 복잡함
- 클래스 로딩 시점
- 자바를 실행하면 자바 언어는 .class 파일을 JVM 내부의 클래스 로더에 보관한다.
- 이 때 자바 언어는 .class 파일을 JVM에 저장하기 전에 조작할 수 있는데, 애스펙트를 적용하고 JVM에 올리는 것을 로드 타임 위빙이라고 한다.
- 자바를 실행할 때 특별한 옵션(java -javaagent)을 통해 클래스 로더 조작기를 지정해야 하는 번거로움이 있음
- 런타임 시점
- 런타임 시점은 컴파일이 끝나고, 클래스 로더에 클래스도 전부 올라가서 이미 자바가 실행된 다음을 뜻한다. 즉 자바의 메인 메서드가 실행된 이후이므로 자바 언어가 제공하는 범위 내에서 부가 기능을 적용해야 한다.
- 스프링 컨테이너, 프록시, DI, 빈 후처리기 등을 사용하여 최종적으로 프록시를 통해 스프링 빈에 부가 기능을 적용할 수 있다.
- 프록시 방식을 사용하는 스프링 AOP는 메서드 실행 지점에만 AOP를 적용할 수 있다.
- 스프링 AOP의 조인 포인트는 메서드 실행으로 제한
- 프록시는 메서드 오버라이딩 개념으로 동작하므로 생성자나 static 메서드, 필드 값 접근에는 프록시가 적용될 수 없다.
- 스프링 AOP는 스프링 컨테이너가 관리할 수 있는 스프링 빈에만 AOP를 적용 가능하다.
AOP 용어
- 조인 포인트(Join point)
- 어드바이스가 적용될 수 있는 위치
- 메서드 실행, 생성자 호출, 필드 값 접근, static 메서드 접근 같은 프로그램 실행 중인 지점을 뜻함
- 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메서드 실행 지점으로 제한
- 포인트컷(Pointcut)
- 조인 포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능으로 주로 AspectJ 표현식을 사용해서 지정
- 프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 포인트컷으로 선별 가능
- 타켓(Target)
- 어드바이스를 받는 객체, 포인트컷으로 결정됨
- 어드바이스(Advice)
- 부가 기능
- 특정 조인 포인트에서 Aspect에 의해 취해지는 조치
- Around, Before, After와 같은 다양한 종류의 어드바이스가 있음
- 애스펙트(Aspect)
- 어드바이스 + 포인트컷을 모듈화 한 것으로 @Aspect를 생각하면 됨
- 여러 어드바이스와 포인트 컷이 함께 존재
- 어드바이저(Advisor)
- 하나의 어드바이스와 하나의 포인트 컷으로 구성
- 스프링 AOP에서만 사용되는 특별한 용어
- 위빙(Weaving)
- 포인트컷으로 결정한 타켓의 조인 포인트에 어드바이스를 적용하는 것
- 위빙을 통해 핵심 기능 코드에 영향을 주지 않고 부가 기능 추가 가능
- AOP 적용을 위해 애스펙트를 객체에 연결한 상태
- AOP 프록시
- AOP 기능을 구현하기 위해 만든 프록시 객체
- 스프링에서 AOP 프록시는 JDK 동적 프록시 또는 CGLIB 프록시
참고
스프링 핵심 원리 - 고급편 강의 | 김영한 - 인프런
김영한 | 스프링의 핵심 원리와 고급 기술들을 깊이있게 학습하고, 스프링을 자신있게 사용할 수 있습니다., 핵심 디자인 패턴, 쓰레드 로컬, 스프링 AOP스프링의 3가지 핵심 고급 개념 이해하기
www.inflearn.com
'Spring' 카테고리의 다른 글
[Spring-boot] JAR, WAR (0) | 2024.12.28 |
---|---|
[Spring AOP] @Aspect AOP (0) | 2024.12.28 |
[Spring AOP] 빈 후처리기 (0) | 2024.12.28 |
[Spring AOP] 포인트컷, 어드바이스, 어드바이저 (0) | 2024.12.28 |
[Spring AOP] 프록시 팩토리 (0) | 2024.12.28 |