퍼사드 facade 패턴 - 자바스크립트 예제

SW설계
읽는데 5분 소요
처음 쓰여진 날: 2025-09-01
마지막 수정일: 2025-09-01

요약

퍼사드 facade 패턴을 자바스크립트 코드와 함께 알아봅니다. 정보처리기사 대비 문제가 포함되어있습니다.

퍼사드 패턴 요약

패턴 종류핵심 키워드
퍼사드 (Facade)단순 인터페이스, 오류 단위 확인
퍼사드 패턴 감자
퍼사드 패턴 감자

퍼사드 (Facade) 패턴

퍼사드(Facade)는 '건물의 정면'이라는 뜻으로, 복잡한 서브시스템(subsystem)에 대한 간단한 통합 인터페이스를 제공하는 디자인 패턴입니다. 클라이언트가 서브시스템의 복잡한 내부 구조를 알 필요 없이, 퍼사드 객체가 제공하는 단순한 메서드만 호출하여 원하는 기능을 수행할 수 있도록 합니다.

현실 세계의 예로 '컴퓨터 전원 버튼'을 들 수 있습니다. 우리는 전원 버튼 하나만 누르면 컴퓨터가 켜진다고 생각하지만, 내부적으로는 CPU, 메모리, 하드디스크, 운영체제 등 수많은 부품과 소프트웨어가 복잡하게 상호작용합니다. 이때 '전원 버튼'이 바로 퍼사드 역할을 하는 것입니다. 복잡한 과정을 숨기고 사용자에게 단순한 인터페이스를 제공합니다.

기본 구조

  • Facade: 서브시스템의 기능을 통합하여 간단한 인터페이스를 제공합니다. 클라이언트의 요청을 받으면, 자신이 알고 있는 여러 서브시스템 객체들에게 작업을 위임합니다.
  • Subsystem Classes: 실제 기능을 수행하는 여러 클래스들의 집합입니다. 퍼사드에 의해 호출되며, 클라이언트는 보통 이 클래스들을 직접적으로 알지 못합니다.

예시: 홈시어터 시스템 제어하기

집에 DVD 플레이어, 앰프, 프로젝터, 조명 등으로 구성된 홈시어터 시스템이 있다고 상상해봅시다. 영화를 보려면 다음과 같은 여러 단계를 거쳐야 합니다.

  1. 프로젝터를 켠다.
  2. DVD 플레이어를 켠다.
  3. 앰프를 켠다.
  4. 앰프의 볼륨을 조절한다.
  5. 조명을 어둡게 한다.

이 모든 과정을 매번 직접 제어하는 것은 매우 번거롭습니다. 이때 퍼사드 패턴을 사용하여 "영화 보기"라는 간단한 명령 하나로 모든 것을 처리할 수 있습니다.

먼저, 각 장치를 나타내는 서브시스템 클래스들을 정의합니다.

javascript
// Subsystem Class 1: 프로젝터
class Projector {
  on() {
    console.log("프로젝터가 켜졌습니다.");
  }
  off() {
    console.log("프로젝터가 꺼졌습니다.");
  }
}

// Subsystem Class 2: 앰프
class Amplifier {
  on() {
    console.log("앰프가 켜졌습니다.");
  }
  setVolume(level) {
    console.log(`볼륨이 ${level}로 설정되었습니다.`);
  }
  off() {
    console.log("앰프가 꺼졌습니다.");
  }
}

// Subsystem Class 3: 조명
class Lights {
  dim(level) {
    console.log(`조명이 ${level}% 밝기로 어두워졌습니다.`);
  }
  brighten() {
    console.log("조명이 밝아졌습니다.");
  }
}

// Subsystem Class 4: DVD 플레이어
class DvdPlayer {
  on() {
    console.log("DVD 플레이어가 켜졌습니다.");
  }
  play(movie) {
    console.log(`'${movie}' 영화를 재생합니다.`);
  }
  off() {
    console.log("DVD 플레이어가 꺼졌습니다.");
  }
}

이제 이 모든 서브시스템을 제어하는 HomeTheaterFacade를 만듭니다.

javascript
// Facade
class HomeTheaterFacade {
  constructor(amp, projector, lights, dvd) {
    this.amplifier = amp;
    this.projector = projector;
    this.lights = lights;
    this.dvdPlayer = dvd;
  }

  // 영화 보는 과정을 하나의 메서드로 통합
  watchMovie(movie) {
    console.log("--- 영화 볼 준비를 시작합니다 ---");
    this.lights.dim(10);
    this.projector.on();
    this.amplifier.on();
    this.amplifier.setVolume(7);
    this.dvdPlayer.on();
    this.dvdPlayer.play(movie);
  }

  // 영화 끝내는 과정을 하나의 메서드로 통합
  endMovie() {
    console.log("\n--- 홈시어터를 종료합니다 ---");
    this.dvdPlayer.off();
    this.amplifier.off();
    this.projector.off();
    this.lights.brighten();
  }
}

// 클라이언트 코드
const amp = new Amplifier();
const projector = new Projector();
const lights = new Lights();
const dvd = new DvdPlayer();

// 퍼사드 객체 생성
const homeTheater = new HomeTheaterFacade(amp, projector, lights, dvd);

// 클라이언트는 복잡한 과정을 알 필요 없이, 간단한 메서드만 호출합니다.
homeTheater.watchMovie("인터스텔라");
homeTheater.endMovie();

출력 결과:

text
--- 영화 볼 준비를 시작합니다 ---
조명이 10% 밝기로 어두워졌습니다.
프로젝터가 켜졌습니다.
앰프가 켜졌습니다.
볼륨이 7로 설정되었습니다.
DVD 플레이어가 켜졌습니다.
'인터스텔라' 영화를 재생합니다.

--- 홈시어터를 종료합니다 ---
DVD 플레이어가 꺼졌습니다.
앰프가 꺼졌습니다.
프로젝터가 꺼졌습니다.
조명이 밝아졌습니다.

클라이언트는 HomeTheaterFacadewatchMovie()endMovie() 메서드만 호출하면 됩니다. 프로젝터를 먼저 켜야 하는지, 앰프 볼륨은 언제 조절해야 하는지와 같은 복잡한 내부 동작 순서나 의존성을 전혀 알 필요가 없습니다. 이처럼 퍼사드 패턴은 서브시스템과 클라이언트 간의 결합도를 낮추어 코드를 더 단순하고 유지보수하기 쉽게 만들어줍니다.

퍼사드 패턴 중요 키워드

  • 복잡한 서브시스템에 대한 단순한 창구(인터페이스) 를 제공합니다.
  • 클라이언트와 서브시스템 간의 결합도를 낮춥니다.
  • 서브시스템의 내부 구현을 캡슐화합니다.
  • 퍼사드는 단지 요청을 위임할 뿐, 스스로 새로운 기능을 만들지는 않습니다.
  • 오류에 대해서 단위별로 확인할 수 있습니다.
문제
복잡한 서브시스템에 대한 간단한 통합 인터페이스를 제공하는 패턴으로, 클라이언트가 서브시스템의 복잡한 내부 구조를 알 필요 없이 단순한 창구 역할을 하여 클라이언트와 서브시스템 간의 결합도를 낮추는 디자인 패턴은?
보기
답변
정답정답 보기