스프링은 지정된 클래스 이름을 가지고 리플렉션을 이용해서 해당 클래스의 오브젝트를 만듦.
* Class의 newInstance() - > 기본 생성자 호출 후 오브젝트 돌려줌 (빈이 기본생성자가 있어야 하는 이유)
java.lang.reflect.Proxy 객체는 스태틱 메서드로만 오브젝트를 생성할 수 있기 때문에 스프링의 Factory Bean 을 이용해 DI 방식으로 Proxy 적용
FactoryBean -> Dynamic Proxy 생성 -> InvocationHandler 호출 -> 타겟 메서드 제어
범용적으로 부가기능 사용이 가능해짐
프록시 팩토리 빈의 한계
한번에 여러개의 클레스에 공통적인 부가기능 제어 못함.
같은 타깃에 여러개의 부가기능 제공 못함
따라서 최악의 경우 클래스 수 x 부가기능 수 만큼 설정파일의 줄이 길어질 수 잇음. 비슷한 설정이 반복됨
Spring ProxyFactoryBean -> 프록시를 생성해 빈으로 등록하게 해주는 팩토리 빈. 일관된 방법으로 프록시를 만들 수 있게 도와주는 추상레이어 제공.
순수하게 프록시를 생성하는 작업만 담당.
MethodInterceptor(Advice의 서브인터페이스) -> ProxyFactoryBean 이 생성하는 프록시에서 사용할 부가기능. jdk 의 InvocationHandler와 비슷하지만 ProxyFactoryBean으로부터 타깃 오브젝트에 대한 정보를 함께 제공받는다는 것이 다르다. 아래 장점
Advice -> 타깃 오브젝트에 적용하는 부가기능을 담은 오브젝트.
타깃에 종속되지 않음. 순수하게 부가기능만 담음.
ProxyFactoryBean은 작은 단위의 템플릿/콜백 구조로 응용해서 적용함.
-> 템플릿 역할을 하는 MethodInvocation 을 싱글톤으로 두고 공유
타깃의 인터페이스를 자동으로 검출한다.
기본적으로 jdk의 다이내믹 프록시로 만들어줌.
CGLib -> 오픈소스 바이트코드 생성 프레임워크
Advice -> 부가기능을 제공하는 오브젝트
Pointcut -> 메소드 선정 알고리즘을 담은 오브젝트
위 두개는 여러 프록시에서 공유 가능
싱글톤 빈으로 등록 가능
Advisor = Pointcut + Advice
중복 문제의 접근 방법 -> 런타임 시 다이내믹하게 연결
빈 후처리기 (BeanPostProcessor)
스프링 빈 오브젝트로 만들어지고 난 후에 빈 오브젝트를 다시 가공할 수 있게 해줌.
DefaultAdvisorAutoProxyCreator(자동 프록시 생성기)
빈으로 static 클래스를 등록할때는 클래스&스태틱클래스
bean 태그의 parent 애트리뷰트 ->
parent 대상의 설정을 그대로 가져와서 사용
프로퍼티 설정까지 모두 상속받음
포인트컷 표현식 AspectJExpressionPointcut.setExcpression(표현식)
AOP란? 애스펙트 지향 프로그래밍
애스펙트는 부가기능을 담고있는 모듈
ex) Spring 의 Advisor
핵심 기능에서 부가 기능을 분리해서 Aspect라는 독특한 모듈로 만들어
설계하고 개발하는 방법
AspectJ -> 클래스가 JVM에서 로딩되는 시점을 가로채 바이트코드 조작
용어정리
타깃 -> 부가기능을 부여할 대상
어드바이스 -> 타깃에게 제공할 부가기능을 담은 모듈
조인포인트 -> 어드바이스가 적용될 수 있는 위치 (메서드 시작점)
포인트컷 -> 어드바이스로 적용할 조인포인트를 선별하는 기능을 정의하는 모듈
프록시 -> 클라이언트와 타깃 사이에 투명하게 존재하면서 부가기능을 제공하는 오브젝트. DI를 통해 타깃 대신 클라이언트에게 주입됨. 클라이언트 메소드 호출을 대신 받아서 타깃에 위임
어드바이저 -> 자동 프록시 생성기가 어드바이저를 AOP 작업의 정보로 활용
애스펙트 -> AOP의 기본 모듈. OOP의 클래스와 마찬가지
싱글톤 형태의 오브젝트로 존재
스프링의 프록시 방식 AOP를 적용할때 필요한 4가지 빈
DefaultAdvisorAutoProxyCreator -> 독립적으로 존재 (bean 태그의 id 애트리뷰트 필요 없음) 포인트컷을 참고해 빈을 프록시로 자동 생성
Advice -> MethodInterceptor
Pointcut -> AspectJExpressionPointcut 에 표현식을 넣는다
Advisor -> 자동 프록시 생성기에 의해 자동 검색