프록시 패턴(Proxy pattern)

Head First - Design Patterns
(에릭 프리먼, 엘리자베스 프리먼, 케이시 시에라, 버트 베이츠 저 | 서환수 역)
을 읽고 정리한 내용입니다.

프록시 패턴(Proxy pattern)의 정의

어떤 객체에 대한 접근을 제어하기 위한 용도로,
실제 객체의 메서드를 호출하면 그 호출을 중간에 가로채는 패턴


Tip>

책에 나온 프록시의 종류들 즉 용어 하나하나를 아는 건 중요하지 않다.
프록시 패턴의 용도와 쓰임새를 보자.

프록시 패턴스프링의 AOP에 많이 쓰인다.


AOP 구현 방법

  1. XML 스키마 기반의 POJO 클래스를 이용한 AOP구현
  2. AspectJ에서 정의한 @Aspect 애노테이션 기반의 AOP구현
  3. 스프링 API를 이용한 AOP구현

위의 3가지 방식 중 어떤 방식을 사용하더라도 내부적으로 프록시를 이용하여 AOP가 구현된다.

  • 따라서, 프록시를 통한 메소드 호출만 AOP를 적용할 수 있다.


    ex) 내부클래스 내에서 다른 메소드를 호출시,
    이 경우에는 프록시를 거쳐 가는것이 아니기 때문에 AOP가 적용되지 않는다.

프록시 객체 생성 방법

  1. JDK Dynamic Proxy

    • service에 꼭 인터페이스를 만들 필요는 없다.
    • 인터페이스가 있어야 작동할 수 있다.
    • 인터페이스를 기반으로 프록시 객체를 생성하기 때문에
      인터페이스에 정의되어 있지 않은 메서드에 대해서는 AOP가 적용되지 않는다!

  2. CGLIB 라이브러리를 이용하는 방법

    • 대상 클래스를 상속 받아서 프록시를 구현한다.
    • 클래스가 final일 경우, 프록시를 생성할 수 없다!
    • 인터페이스가 없어도 된다.
    • cf) Kotlin은 기본이 final이다.
      (기본적으로 상속이 불가능하다. 상속하기 위해서는 접근제어자를 붙여줘야 한다. )
      • ex) Kotlin에서 상속하기 위해 open을 붙여준 예시
        1
        2
        3
        open class A {
        // ...
        }

프록시 패턴의 클래스 다이어그램

프록시 패턴- 클래스 다이어그램

  • Subject
    • RealSubjectProxy 클래스 모두 이 Subject 인터페이스를 구현한다.
    • 똑같은 인터페이스를 구현함으로써,
      RealSubject가 들어갈 자리에 Proxy를 대신 집어넣을 수 있다.

  • RealSubject: Spring에서의 Service에 해당하는 클래스

  • Proxy
    • 실제로 작업을 처리하는 객체 대한 레퍼런스가 들어 있다.
    • 실제 객체가 필요할 경우, 그 레퍼런스를 이용해서 요청을 전달한다.

가상 프록시

클라이언트에서는 RealSubject를 직접 호출하지 않고, Proxy를 호출한다.

클라이언트에서는 호출하는 게 RealSubject인지, Proxy인지 알 필요가 없다.


프록시 VS 데코레이터

프록시(Proxy)

  • 실제 객체의 메서드를 호출하면, 그 호출을 중간에 가로챈다.
  • 결과는 건드리지 않고, 앞 뒤에 추가하는 패턴
  • 어떤 클래스에 대한 접근을 제어하기 위한 용도

데코레이터(Decorator)

  • 결과값을 보정하는데 초점을 두는 패턴
  • 클래스에 새로운 행동을 추가하기 위한 용도

To study more

  • gRPC
  • AOP

참고 링크