스프링은 일관된 방법으로 프록시를 만들 수 있게 도와주는 추상 레이어를 제공한다

  • 프록시(Proxy)
    • 클라이언트가 사용하려고 하는 실제 대상인 것처럼 위장하여 요청을 받아주는 역할
    • 클라이언트가 구체 클래스를 알 필요가 없어짐
    • 원래 요청하려던 대상(Target)에게 최종적으로 넘겨줄 때 다양한 부가기능을 지원할 수 있음

스프링에서 생성된 프록시는 빈으로 등록돼야 한다

  • ProxyFactoryBean
    • 프록시를 생성하고 빈 오브젝트로 등록하게 도와주는 팩토리 빈
    • 프록시를 통해 제공해줄 부가기능은 별도의 빈에 둘 수 있다
    • 부가기능은 MethodInterceptor 인터페이스를 구현하여 만듬
  • MethodInterceptor
    • 구현클래스에서 타깃 오브젝트가 등장하지 않는다
    • 메소드 정보와 함께 타깃 오브젝트가 담긴 MethodInvocation 오브젝트가 전달된다
  • MethodInvocation
    • 일종의 콜백 오브젝트
    • proceed() 메소드 실행 시 타깃 오브젝트의 메소드를 내부적으로 실행해주는 기능이 있다
    • 일종의 템플릿 역할을 하며, 싱글톤으로 공유된다
  • 어드바이스(Advice)
    • 타겟 오브젝트 메소드 호출에 부가 기능을 추가하는데 사용되는 오브젝트
    • 타깃 오브젝트에 종속되지 않는 순수한 부가기능을 담은 오브젝트
  • 포인트컷(Pointcut)
    • 부가기능을 적용할 위치를 지정하는 필터링 로직

Dynamic Proxy | ProxyFactoryBean

  • Dynamic Proxy 방식
  • 타깃과 메소드 선정방식이 다르면 InvocationHandler 오브젝트를 여러 프록시가 공유할 수 없다

  • ProxyFactoryBean 방식
  • 어드바이스와 포인트컷이 프록시에 DI로 주입돼서 사용
  • 공유 가능하도록 만들어지기 떄문에 싱글톤 빈으로 등록이 가능
  • MethodInvocation타입 콜백 오브젝트의 proceed() 메소드를 통한 타깃의 간접 호출

  • 어드바이저(Advisor) : 포인트컷 + 어드바이스

프록시 자동생성

  • 빈 후처리기
    • 스프링은 OCP에 충실하기 위한 여러가지 확장 포인트를 제공한다
    • BeanPostProcessor 인터페이스를 구현하여 만드는 빈 후처리기는 만들어진 빈 오브젝트를 다시 가공할 수 있게 해준다
  • DefaultAdvisorAutoProxyCreator
    • 어드바이저를 이용한 자동 프록시 생성기
    • 자체를 빈으로 등록
    • 빈 오브젝트가 생성될 때마다 빈 후처리기에게 후처리 작업을 요청
    • 빈 오브젝트의 일부를 프록시로 포장하고, 프록시를 빈으로 대신 등록할 수 있다
  • 프록시 자동생성 과정

포인트컷 표현식

표현식 언어를 사용해 선정 알고리즘을 작성

  • AspectJ 프레임워크에서 제공하는 것을 확장해서 사용
  • 포인트컷 표현식을 적용하려면 AspectJExpressionPointcut 클래스를 사용

  • 포인트컷 표현식 문법
  • [] : 생략 가능 항목(옵션)
  • ㅣ : OR 조건
  • execution 지시자
  • 접근제어자 패턴(옵션) : public, private
  • 타입 패턴 : 메서드의 반환 타입 (‘ * ‘ 를 통해 모든 반환 타입을 의미할 수 있다)
  • 타입 패턴.(옵션) : 메서드를 선언한 패키지나 클래스 (이후의 이름패턴과 ‘.’ 을 사용해 연결)
  • 이름 패턴 : 적용 메서드의 이름(‘ * ‘ 를 통해 모든 이름을 의미할 수 있다)
  • 타입 패턴(파라미터) : 여러개의 타입은 쉼표로 구분 (‘ .. ‘ 를 통해 모든 파라미터를 의미할 수 있다)
  • 예외 패턴(예외) : 메서드가 던질 수 있는 예외

  • 예시
    • execution(* * (..))
    • execution(public String com.example.service.* . * (String, ..))

AOP

  • 애스펙트(Aspect) : 애플리케이션의 부가 기능을 담고 있는 모듈
    • 어드바이스 : 부가될 기능을 정의한 코드
    • 포인트컷 : 그것을 어디에 적용할 지 결정하는 코드
  • AOP(Aspect Oriented Programming) : 관점 지향 프로그래밍, 애플리케이션의 핵심 기능과 부가 기능을 분리하여 애스펙트라는 모듈로 관리하는 프로그래밍 기법 (관점이란 어떤 기능을 구현할 때 그 기능이 ‘핵심 기능’인가 ‘부가 기능’인가를 구분하여 각각 하나의 관점으로 보는 것)
    • OOP를 돕는 보조적인 기술
  • 스프링의 AOP 적용기술
    • 프록시, 데코레이터 패턴, 프록시 패턴, 자동 프록시 생성 기법, 빈 오브젝트 후처리 조작 기법 등등 (스프링은 프록시 방식의 AOP이다)
    • 자바의 기본 JDK와 스프링 컨테이너 외에 특별한 기술이나 환경을 요구하지 않는다
  • AspectJ의 AOP
    • 타깃 오브젝트 클래스가 JVM에 로딩되는 시점에 가로채어 바이트코드를 조작
      • DI 컨테이너의 도움같은 것이 필요없다
      • 프록시 방식보다 강력하고 유연한 AOP가 가능하다
  • 용어 정리
    • 조인 포인트 : 어드바이스가 적용될 수 있는 위치
    • 애스펙트 : AOP의 기본 모듈, 한 개 이상의 포인트컷과 어드바이스의 조합으로 보통 싱글톤 형태의 오브젝트로 존재
  • 스프링의 프록시 방식 AOP 적용하기 위해 등록해야 할 빈
    • 자동 프록시 생성기(DefaultAdvisorAutoProxyCreator)
    • 어드바이스(부가기능을 구현한 클래스)
    • 포인트컷(AspectJExpressionPointcut)
    • 어드바이저(DefaultPointcutAdvisor)

카테고리:

업데이트:

댓글남기기