프록시 팩토리
jdk 동적 프록시, cglib 를 통합 추상화하여 스프링에서 제공해주는 라이브러리
인터페이스가 있는 경우에는 jdk 동적 프록시를 사용하고, 구체 클래스가 있을경우에는 CGLIB를 사용해준다.
* CGLIB 만 사용하도록 설정 가능
프록시 팩토리의 'Advice' 를 통해 두개의 상황을 구분하지 않고 'Advice' 를 만들어주기만 하면 된다.
* 프록시 팩토리 내부에서 InvocationHandler 와 MethodInterceptor 를 내부에서 사용
어드바이저, 어드바이스, 포인트컷
어드바이스 - 프록시가 호출하는 부가 기능. 프록시 로직
org.aopalliance.intercept.MethodInterceptor // 인터페이스 구현
포인트컷 - 부가 기능을 적용할지, 적용하지 않을지 판단하는 필터링 로직. 주로 클래스나 메서드 이름으로 필터링 한다 -> 직접 구현 거의 x
어드바이저 - 하나의 포인트컷과 하나의 어드바이스를 가지고 있는 것.
* 역할과 책음을 명확하게 분리하기 위해 명칭으로 구분
어드바이저를 적용한 로직 구조
클라이언트 호출 -> 프록시 팩토리가 포인트컷 호출 -> 필터를 통과하면 어드바이스를 통해 부가 기능 추가 -> 타겟 호출
* 프록시에 어드바이저를 여러게 등록하게 되면 프록시는 하나만 생성되고 한 프록시에 모든 어드바이저가 적용 (프록시 여러개 생성 x)
프록시 팩토리 문제점
- 설정이 많음 - 프록시를 적용할 빈의 개수 만큼 프록시를 생성하는 코드를 만들어 줘야한다.
- 컴포넌트 스캔 - 컴포넌트 스캔을 통해 빈에 등록된 객체는 해당 방식으로 프록시 등록이 불가능하다.
-> 문제를 해결할 수 있는 방법으로 빈 후처리기가 있다.
'Spring' 카테고리의 다른 글
[Spring] 객체 지향 설계 5가지 - SOLID (0) | 2021.11.10 |
---|---|
[Spring] 빈 후처리기 - BeanPostProcessor (0) | 2021.11.08 |
[Spring] 프록시 패턴 (0) | 2021.11.05 |
[Spring] 전략 패턴 (0) | 2021.11.05 |
[Spring] 템플릿 메서드 패턴 (0) | 2021.11.05 |