Published on

Proxy Pattern

Proxy Design Pattern

  • 프록시는 내부적으로 실제의 객체에 접근할 때 호출되는 래퍼(wrapper) 혹은 대리 객체이다.

  • 프록시는 코드를 간결하게 만들고, 명확하게 하지만 잘못 사용하면 성능문제를 초래할 수 있다.

  • ES6에서 지원해주는 Proxy를 통해서 구현 가능하다.

  • 아래는 Proxy객체를 통한 로그 캐시 구현 내용이다.

실제 객체 코드

function GeoCoder() {
  this.getLatLng = function (address) {
    if (address === 'Amsterdam') {
      return '52.3700° N, 4.8900° E';
    } else if (address === 'London') {
      return '51.5171° N, 0.1062° W';
    } else if (address === 'Paris') {
      return '48.8742° N, 2.3470° E';
    } else if (address === 'Berlin') {
      return '52.5233° N, 13.4127° E';
    } else {
      return '';
    }
  };
}

Proxy 객체의 구현

function GeoProxy() {
  var geocoder = new GeoCoder();
  var geocache = {};

  return {
    getLatLng: function (address) {
      if (!geocache[address]) {
        geocache[address] = geocoder.getLatLng(address);
      }
      log.add(address + ': ' + geocache[address]);
      return geocache[address];
    },
    getCount: function () {
      var count = 0;
      for (var code in geocache) {
        count++;
      }
      return count;
    },
  };
}

// log helper
var log = (function () {
  var log = '';

  return {
    add: function (msg) {
      log += msg + '\n';
    },
    show: function () {
      alert(log);
      log = '';
    },
  };
})();

Proxy 객체 사용

function run() {
  var geo = new GeoProxy();

  // geolocation requests

  geo.getLatLng('Paris');
  geo.getLatLng('London');
  geo.getLatLng('London');
  geo.getLatLng('London');
  geo.getLatLng('London');
  geo.getLatLng('Amsterdam');
  geo.getLatLng('Amsterdam');
  geo.getLatLng('Amsterdam');
  geo.getLatLng('Amsterdam');
  geo.getLatLng('London');
  geo.getLatLng('London');

  log.add('\nCache size: ' + geo.getCount());
  log.show();
}
  • 결과는 아래와 같다.
Paris: 48.8742° N, 2.3470° E
London: 51.5171° N, 0.1062° W
London: 51.5171° N, 0.1062° W
London: 51.5171° N, 0.1062° W
London: 51.5171° N, 0.1062° W
Amsterdam: 52.3700° N, 4.8900° E
Amsterdam: 52.3700° N, 4.8900° E
Amsterdam: 52.3700° N, 4.8900° E
Amsterdam: 52.3700° N, 4.8900° E
London: 51.5171° N, 0.1062° W
London: 51.5171° N, 0.1062° W

Cache size: 3

참조