728x90
AOP
- Aspect-Oriented Programming
- 관점지향 프로그래밍은 객체지향 프로그래밍을 보완하기 위해 쓰임
- 핵심 로직과 부가 기능을 분리하여 애플리케이션 전체에 걸쳐 사용되는 부가 기능을 모듈화하여 재사용할 수 있도록 지원하는 것
- 보통 비즈니스 웹 애플리케이션이라면 사업에 핵심적인 핵심 비즈니스 로직
- 횡단 관심사(cross-cutting concerns): 애플리케이션 전체를 관통하는 부가 기능 로직 (로깅, 보안, 트랜젝션)
관점 == 관심사( 개발에 필요한 고민이나 염두에 두어야 하는 일)
- 파라미터가 올바르게 들어왔을까?
- 이 작업을 하는 사용자가 적절한 권한을 가진 사용자인가?
- 이 작업에 발생할 수 있는 모든 예외는 어떻게 처리해야 하는가?
핵심 로직은 아니지만, 코드를 온전하게 만들기 위해서 필요한 고민들 ( 반복적으로 코드에 반영)
나눗셈
- 핵심로직 : 두 개의 숫자를 나누는 것
- 주변로직 : 0을 나누는 것이 아닌지 체크 ('관심사' == '주변로직')
- AOP가 추구하는 것은 '관심사의 분리'
- AOP는 과거에 개발자가 작성했던 '관심사 + 비즈니스 로직'을 분리해서 별도의 코드로 작성하고, 실행할 때 이를 결합하는 방식으로 접근
- AOP는 개발자가 염두에 두어야 하는 일들은 별도의 '관심사'로 분리하고, 핵심 비즈니스 로직만 작성할 것을 권장
- 횡단 관심사의 코드를 핵심 비즈니스 로직의 코드와 분리하여, 코드의 간결성을 높이고 변경에 유연함과 무한한 확장이 가능하도록 하는 것이 AOP의 목적
OOP : 비즈니스 로직의 모듈화
- 모듈화의 핵심 단위는 비즈니스 로직
AOP : 인프라 혹은 부가기능의 모듈화
- 대표적인 예 : 모니터링 및 로깅, 동기화, 오류 검사 및 처리, 성능 최적화(캐싱) 등
- 각각의 모듈들의 주 목적 외에 필요한 부가적인 기능들
AOP 적용 방식
컴파일 시점
- .java 파일을 컴파일러를 통해 .class를 만드는 시점에 부가 기능 로직을 추가하는 방식
- 모든 지점에 적용 가능
- AspectJ가 제공하는 특별한 컴파일러를 사용해야 하기 때문에 특별할 컴파일러가 필요한 점과 복잡하다는 단점
클래스 로딩 시점
- .class 파일을 JVM 내부의 클래스 로더에 보관하기 전에 조작하여 부가 기능 로직 추가하는 방식
- 모든 지점에 적용 가능
- 특별한 옵션과 클래스 로더 조작기를 지정해야하므로 운영하기 어려움
런타임 시점
- 스프링이 사용하는 방식
- 컴파일이 끝나고 클래스 로더에 이미 다 올라가 자바가 실행된 다음에 동작하는 런타임 방식
- 실제 대상 코드는 그대로 유지되고 프록시를 통해 부가 기능이 적용
- 프록시는 메서드 오버라이딩 개념으로 동작하기 때문에 메서드에만 적용 가능 → 스프링 빈에만 AOP를 적용 가능
- 특별한 컴파일러나, 복잡한 옵션, 클래스 로더 조작기를 사용하지 않아도 스프링만 있으면 AOP를 적용할 수 있기 때문에 스프링 AOP는 런타임 방식을 사용
AOP 용어 및 개념
Target
- 개발자가 작성한 해심 비즈니스 로직을 가지는 객체
- advice의 대상이 되는 객체
- Pointcut으로 결정
advice
- 실질적인 부가 기능 로직을 정의하는 곳
- 특정 조인 포인트에서 Aspect에 의해 취해지는 조치
- 그 동작 위치에 따라 구분
Type | 설명 |
Before | 조인포인트 실행 이전에 실행, 일반적으로 리턴타입 void |
After returning | 조인포인트 완료후 실행 (ex. 메서드가 예외없이 실행될 때) |
After Throwing | 메서드가 예외를 던지는 경우 실행 |
After (finally) | 조인포인트의 동작과 관계없이 실행 |
Around | 메서드 호출 전후에 수행(조인포인트 실행 여부 선택, 반환 값 변환, 예외 변환, try~catch~finally 구문 처리 가능 등) 가장 강력한 어드바이스 |
Join point
- advice가 적용될 수 있는 모든 위치
- Target 객체가 가진 메서드
- ex) 메서드 실행 시점, 생성자 호출 시점, 필드 값 접근 시점
- 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메서드 실행 지점
Pointcut
- 조인 포인트 중에서 advice가 적용될 위치를 선별하는 기능
- 스프링 AOP는 프록시 기반이기 때문에 조인 포인트가 메서드 실행 시점 뿐이 없고 포인트컷도 메서드 실행 시점만 가능
- 관심사와 비즈니스 로직이 결합되는 지점을 결정하는 것
Aspect
- 추상적인 개념
- advice + pointcut을 모듈화 한 애플리케이션의 횡단 기능
Advisor
- 스프링 AOP에서만 쓰는 용어로, 하나의 어드바이스와 하나의 포인트컷으로 구성된 에스팩트를 특별하게 지칭하는 말
Proxy
- Target을 전체적으로 감싸고 있는 존재
- AOP 기능을 구현하기 위해 만든 프록시 객체
- 스프링에서 AOP 프록시는 JDK 동적 프록시 또는 CGLIB 프록시
- 스프링 AOP의 기본값은 CGLIB 프록시
728x90