서비스에서 필요한 내용은 비지니스 로직이라 불리는 핵심 기능만 수행할 수 있으면 됨
그 외의 부가적인 로직은 인프라 로직(ex. 시간 측정, 권한 체크, 트랜잭션)
인프라 로직은 애플리케이션의 전 영역에서 나타날 수 있음
but, 중복코드를 만들어낼 가능성 有 --> 유지보수 힘들어짐
- 인프라 로직은 로깅, 트랜잭션, 권한 검사, 성능 측정 등 하나의 관심사를 가지게 됨
- 인프라 로직이 횡단으로 나타나기 때문에 이것을 cross-cutting concern(횡단 관심사)라고 부름
AOP
- Aspect Oriented Programming (관점 지향 프로그래밍)
- 횡단관심사에 따라 프로그래밍 하는 패러다임
- 더 객체지향적으로 코드 구성할 수 있도록 보완
- OOP에서 모듈화의 주요 단위는 클래스, AOP에서는 관점(Aspect)
- Aspect는 횡단관심사의 모듈화를 가능하게 함
AOP 구현체
- AOP는 OOP와 같은 일종의 패러다임 --> 각 언어마다 AOP 구현체가 있음
- Spring: Spring AOP
- Java: AspectJ
AOP 용어
- Aspect: 횡단관심사의 모듈화
- ex) 트랜젝션 처리
- Spring AOP에서는 일반 클래스나 @Aspect 어노테이션을 가지는 클래스로 구현됨
- Target object (Advised object): 어떤 대상에 부가 기능을 부여할 것인가
- Advice: 어떤 부가기능을 부여할 것인가
- Before, AfterReturning, AfterThrowing, After, Around
- Join point: 어디에 적용할 것인가
- 메서드, 필드, 객체, 생성자 등
- AspectJ에서는 다양하게 join point를 구현해놓음 -> 여러가지 상황에서 부가기능을 실행시킬 수 있음
- Spring AOP에서는 메서드가 실행될 때 만으로 한정
- Pointcut: 실제 advice가 적용될 지점
- Weaving
- Target object를 생성하기 위해 aspect와 다른 application type 또는 객체를 연결하는 것
- AOP를 끼워넣어주는 시점
AOP의 구현 방법
- 컴파일: J.java -> J.class 컴파일 하는 시점에 AOP를 끼워 넣는 것(적용시키는 것)
- 클래스 로드 시: 클래스 로더가 클래스파일을 메모리에 올릴 때 적용
- 프록시 패턴
- Spring AOP에서 사용
- 부가기능을 제공하는 프록시로 타겟 클래스를 감싸서 실행
- Spring이 IOC, DI를 기반으로 하기 때문에 가능한 방식
Spring AOP && AspectJ
|
Spring AOP |
AspectJ |
목표 |
간단한 AOP 기능 제공 |
완벽한 AOP 기능 제공 |
Join point |
메서드 레벨만 지원 |
생성자, 필드, 메서드 등 다양하게 지원 |
Weaving |
런타임 시에만 가능 (스프링 컨테이너가 객체 생성을 관리해주기 때문에) |
런타임은 제공하지 않음 compile-time, post-compile, load-time 제공 |
대상 |
Spring container가 관리하는 bean에만 가능 |
모든 Java object에 가능 |
참고