ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프록시 패턴
    @19.1 ~ /Nodejs 2020. 6. 19. 01:36

    프록시는 각 작업을 대상(Subject)으로 전달하여 추가적인 전처리 또는 후처리로 동작을 향상시킵니다.

     

    여러 상황에서 유용하다

    데이터 유효성 검사 : 프록시가 입력을 대상(Subject)으로 전달하기 전에 유효성을 검사

    보안 : 프록시는 클라이언트가 작업을 수행할 수 있는 권한이 있는지 확인하고 검사 결과가 긍정적인 경우에만 요청을 대상으로 전달

    캐싱 : 프록시가 내부 캐시를 유지하여 데이터가 캐시에 아직 존재하지 않는 경우에만 대상에서 작업이 실행되도록 한다

    지연 초기화 : 대상의 생성 비용이 비싸다면 프록시는 그것을 필요로 할 떄까지 연기할 수 있다

    로깅 : 프록시는 메소드 호출과 상대 매개 변수를 인터셉트하고 이를 기록한다

    원격 객체 : 프록시는 원격 위치에 있는 객체를 가져와서 로컬처럼 보이게 할 수 있다

     

    객체를 프록시할 때 우리는 모든 메소드를 가로채기로 결정할 수도 있고

    그중 일부만 가로채고 나머지는 직접 대상에 위엄하기로 결정할 수도 있습니다

     

    오브젝트 컴포지션

    컴포지션은 기능을 확장하거나 사용하거나 사용하기 위해 객체가 다른 객체와 결합되는 기술입니다

    특정 프록시 패턴의 경우

    대상과 동일한 인터페이스를 가진 새로운 객체가 작성되고 대상에 대한 참조가 인스턴스 변수 혹은 클로저 변수 형식으로 프록시의 내부에 저장됩니다

    대상은 작성 시 클라이언트로부터 주입되거나 프록시 자체에 의해 작성될 수 있습니다

    function createProxy(subject)
    {
      const proto = Object.getPrototypeOf(subject);
        
        function Proxy(subject)
        {
          this.subject = subject;
        }
        
        Proxy.prototype = Object.create(proto);
        
        //프록시된 메소드
        Proxy.prototype.hello = function()
        {
          return this.subject.hello() + ' world';
        };
        
        Proxy.prototype.goodbye = function()
        {
          return this.subject.goodbye.apply(this.subject, arguments);
        }
        
        return new Proxy(subject);
    }
    
    module.exports = createProxy;
    
    
    
    //아래처럼 가능
    function create Proxy(subject)
    {
        return{
        	hello : ()=> (subject.hello() + ' world!),
            goodbye : ()=> (subject.goodbye.apply(subject, arguments))
        };
    }

    컴포지션을 사용해 프록시를 구현하려면 hello()와 같이 조작하고자 하는 메소드를 가로채고

    나머지는 단순히 대상에 위임해야합니다(goodbye()와 마찬가지로)

    위의 코드는 대상이 프로토타입을 가지고 있고 제대로 된 프로토 타입 체인을 유지하기 위한 특정한 사례를 보여주므로

    proxy instanceof Subject를 실행하면 true가 반환됩니다

    우리는 이것을 달성하기 위해 상속을 사용했었다

    하지만 자바스크립트는 동적 타입 결정이 되어서 대부분 상속하지 않고 위의 코드 //아래처럼 접근이 가능하다

     

    객체 증강

    객체 증강은 아마도 객체의 개별 메소드를 프록시하는 가장 실용적인 방법일 수 있는데

    메소드를 프록시된 구현체로 대체하여 직접 대상을 수정하는 것으로 이뤄진다

    function createProxy(subject)
    {
       const helloOrig = subject.hello;
       subject.hello = () => (helloOrig.call(this) + ' world!');
       
       return subject;
    }

    이 기법은 하나 또는 몇 개의 메소드만 프록시할 필요가 있을 때

    가장 편리한 메소드지만 대상 객체를 직접 수정하는 단점이 있습니다

    '@19.1 ~ > Nodejs' 카테고리의 다른 글

    노드 Promise 패턴  (0) 2020.06.11
    모듈 정의패턴  (0) 2020.06.03
    콜백 규칙 및 예외처리  (0) 2020.05.31
    Map, WeakMap  (0) 2020.05.31
Designed by Tistory.