Aspect-Oriented Programming
0. 개요
1. proxy
2. Dynamic proxy
3. AOP 구현 절차(1)
4. AOP 구현 절차(2)
5. AOP 구현 절차(3)
6. AOP 구현 절차(4)
0. 개요
0) Aspect: 관점1) core concern(핵심 관심): 시스템이 추구하는 핵심적인 가치, 기능
2) cross cutting concern(횡단 관심): core concern에 공통적으로 적용되는 공통 모듈
- 즉, AOP란 프로그래밍의 관점을 바꿔 보자는 의미로 애플리케이션 전반에 걸쳐 사용되는 기능을 재사용하자는 것
- 상속, 위임의 방식을 취하는 OOP 방식으로는 깔끔한 모듈화가 안됨
- 인프라, 부가기능의 모듈화: logging, 보안, 트랜잭션
- 애플리케이션 전반에 흩어진 공통 기능을 하나로 모으자!
<AOP의 개요>
3) AOP 용어
(1) Target: 부가 기능(Advice)를 부여할 대상, 핵심기능
(2) Aspect: OOP에서의 object와 유사한 의미
부가기능 모듈이라고 부름
부가될 기능을 정의한 advice와 어디에 적용할지 결정하는 pointcut을 갖고 있음
(3) Advice: 실질적으로 부가기능을 담은 구현체
(4) PointCut: 부가기능이 적용될 대상(method)을 선정할 방법
advice를 적용할 joinpoint를 선별하는 기능을 정의
(5) JoinPoint: advice가 적용될 수 있는 위치
spring에서는 joinpoint는 method뿐이다
(6) Proxy: target을 감싸서 target의 요청을 대신 받아주는 wrapping object (대리인)
client가 target을 호출하면 target이 아닌 target을 감싸고 있는 proxy가 호출되어
target method 실행 전 선처리, 실행 후 후처리를 실행하도록 구성됨
(7) Weaving: 지정된 객체에 aspect를 적용하여 새로운 proxy 객체를 생성하는 과정
예) A객체에 트랜잭션 aspect를 지정
A객체가 실행되기 전 connection을 오픈하고 실행이 끝나면 close하는 기능이
추가된 프록시 객체가 생성
생성된 프록시 객체가 앞으로 A객체가 호출되면 사용됨
이 프록시 생성과정을 Weaving이라고 함
4) AOP 사용법
(1) @Before: target method가 호출되기 전에 advice 기능을 수행
(2) @After: 결과에 상관없이 target method가 완료되면 advice 기능을 수행
(3) @AfterRetruning: target method가 성공적으로 결과값을 리턴한 후 advice기능 수행
(4) @AfterThrowing: target method 수행 중에 예외가 발생하면 advice 기능을 수행
(5) @Around: advice가 target method를 감싸고 method 호출 전, 후에 advice 기능 수행
1. proxy
- 대리인: a인척하며 진짜 a와 같은 기능을 하는 것- 사용자가 target에 접근하는 방법을 제어
- target에 부가적인 기능을 부여
- 매번 새로운 클래스 정의가 필요
- target의 인터페이스를 구현하고 위임하는 코드를 만들어야 하는 번거로움
- 부가 기능 코드의 중복
<프록시란?>
2. Dynamic proxy
- 런타임 시에 동적으로 생성되는 오브젝트
- 팩토리 빈 이용
<Dynamic proxy?>
<Dynamic proxy?!>
- Weaving: target object와 advice 엮기 = advice를 핵심 로직에 적용하는 것
3. AOP 구현 절차(1)
- spring은 join point가 method뿐이다
- 수많은 AOP framework중 하나인 springAOP
- xxxAOP, xxxadvice는 spring에서 지원할 뿐
1) target object 구현
2) advice 구현
3) dynamic proxy 생성
<target object, advice, wiring, weaving>
4. AOP 구현절차(2)
<AOP 구현절차 두 번째: point cut, advisor 추가>
1) target object 구현
2) 선, 후처리 advice
3) point cut 설정
4) advisor 설정
5) dynamic proxy 생성
- point cut: advice를 어느 method에 적용할지 정하는 것
- advisor: advice+point cut
5. AOP 구현절차(3)
1) target object 구현
2) 선, 후처리 advice
3) point cut을 advisor 내부에 injection
(1) point cut 설정과 advisor 설정을 합쳐 메타 데이터 양을 줄이자! (point cut 삭제)
(2) advisor 내부로 point cut이 들어감 (injection)
- advisor에 "value = rule"이 들어있는 properties 삭제
- advisor에 expression setter method 넣기
4) dynamic proxy 생성
- interface삭제: proxy factory bean이 wiring된 target object를 자동으로 찾음
6. AOP 구현절차(4)
1) target object 구현
2) 선, 후처리 advice
3) point cut을 advisor 내부에 injection
4) dynamic proxy 생성하는 프록시 팩토리 빈 삭제
- dynamic proxy를 자동으로 생성하는 AutoProxyCreator를 정의
※ AutoProxyCreator
- advisor에 정의된 pointcut 정보를 보고 자동으로 생성
- pointcut과 일치하는 method를 가진 모든 bean을 찾아 dynamic proxy 생성
- 직접 AutoProxyCreator를 기술하는 방법
- @(annotation) 기반으로도 가능(서술방식 변화): <aop:aspectj-autoproxy/>