복잡한 하위 시스템 앞에 단순한 창구 하나를 세워, 호출자가 내부의 여러 객체와 호출 순서를 몰라도 되게 하는 패턴.
class VideoConverter {
convert(file: string, format: 'mp4' | 'webm') {
const source = new VideoFile(file)
const codec = CodecFactory.extract(source)
const buffer = BitrateReader.read(source, codec)
const result = BitrateReader.convert(buffer, format)
return new AudioMixer().fix(result)
}
}
// 호출자는 new VideoConverter().convert('a.ogg', 'mp4')만 안다- 하위 시스템과의 결합이 퍼사드 한 곳으로 모인다. 내부 라이브러리를 바꿔도 호출자는 그대로다
- 하위 시스템을 숨기는 것이 아니라 자주 쓰는 길을 쉽게 만드는 것이다. 세밀한 제어가 필요하면 하위 객체를 직접 쓸 수도 있다
- 모든 기능을 한 퍼사드에 몰아넣으면 또 하나의 거대한 서비스 객체가 된다. 용도별로 나눈다
- 계층형 구조의 서비스 계층, 여러 API 호출을 묶어 화면에 맞게 내려주는 BFF(Backend for Frontend), 프런트엔드에서 여러 훅을 묶은 커스텀 훅이 비슷한 역할을 한다
호출자 입장의 복잡성을 창구 뒤로 옮긴다는 점에서 복잡성 보존의 법칙의 한 예이고, 서비스 단위의 디미터 법칙다. 구조 패턴 전체는 구조 패턴.