디자인 패턴 - 서비스 중개자 패턴(Service locator pattern)

서비스를 구현한 구체 클래스는 숨긴 채로 어디에서나 서비스에 접근할 수 있게 한다.

 객체나 시스템 중에 거의 모든 코드에서 사용되는 것들이 있다. 이런 시스템은 게임 전체에서 사용 가능해야 하는, 일종의 서비스라고 볼 수 있다.(메모리 할당, 로그, 난수 생성 등)

서비스를 사용하는 코드로부터 서비스가 누구인지(서비스를 구현한 구체 클래스 자료형이 무엇인지), 어디에 있는지(클래스 인스턴스를 어떻게 얻을지)를 몰라도 되게 해준다.

서비스는 여러 기능을 추상 인터페이스로 제공한다. 구체 서비스 제공자(Service provider)는 이런 서비스 인터페이스를 상속받아 구현한다.
 이와 별도인 서비스 중개자(Service locator)는 서비스 제공자의 실제 자료형과 이를 등록하는 과정은 숨긴 채 적절한 서비스 제공자를 찾아 서비스에 대한 접근을 제공한다.

서비스 중개자는 서비스 제공자를 등록하고, 서비스를 사용하는 측에서 이 서비스를 이용할 수 있도록 중개해준다.

서비스 등록은?
 외부 코드에서 등록할 수도 있고, 컴파일 시 바인딩될 수도 있다. 런타임에 설정 값을 읽을 수도 있다.

서비스를 못 찾으면?
 사용자가 알아서 처리. 혹은 단언문으로 게임을 멈춤. 널 서비스 반환.

서비스 범위는?
 전역(언제 어디에서 사용되는지 제어 불가)
 특정 클래스로 제한(커플링 제어 가능. 중복 가능성)

사용처 :
 접근해야 할 객체가 있다면 전역 메커니즘 대신 필요한 객체를 인수로 넘겨줄 수 없는지부터 봐야 한다. 쉽고 커플링을 명확히 보여줄 수 있다.

  •  렌더링 함수 매개변수에 렌더링에 관련된 것만 있어야지 로그 같은 게 섞여 있으면 곤란하다.
  •  어떤 시스템은 본질적으로 하나뿐이다. 대부분의 게임 플랫폼에 오디오나 디스플레이 시스템이 딱 하나만 있다. 
서비스 중개자는 일종의 더 유연하고 더 설정하기 좋은 싱글턴 패턴이다. 

유연성을 얻지만, 코드만 보고 어떤 의존성을 사용하는지 알기 어렵다.

모든 코드에서 서비스를 요청하고 접근할 수 있으므로, 어느 환경에서나 문제없이 동작해야 한다. 만약 게임 루프에서 시뮬레이션할 때만 사용하고 렌더링 중에는 사용하면 안 된다면 서비스로 적합하지 않다.


만약 서비스 제공자가 서비스를 등록하기 전에 서비스를 사용하려고 하면, Null이 반환된다. 이럴 때엔 널 객체(Null object) 패턴을 사용할 수 있다. 널 서비스가 사용될 때마다 디버깅용 로그를 출력하게끔 하면 서비스 등록이 되지 않았다는 것을 명확히 할 수 있다.
(널 객체 패턴의 핵심은 객체를 찾지 못하거나 만들지 못해서 NULL을 반환해야 할 때, 대신 같은 인터페이스를 구현한 특수한 객체(아무런 구현이 되어있지 않은)를 반환한다. 반환받은 쪽에서는 안전하게 작업을 진행할 수 있다.)


댓글

이 블로그의 인기 게시물

디자인 패턴 - 더티 플래그(Dirty flag)

인공지능 - 유한 상태 기계(Finite state machine)