퍼사드 facade 패턴 - 자바스크립트 예제
요약
퍼사드 facade 패턴을 자바스크립트 코드와 함께 알아봅니다. 정보처리기사 대비 문제가 포함되어있습니다.
퍼사드 패턴 요약
패턴 종류 | 핵심 키워드 |
---|---|
퍼사드 (Facade) | 단순 인터페이스, 오류 단위 확인 |

퍼사드 (Facade) 패턴
퍼사드(Facade)는 '건물의 정면'이라는 뜻으로, 복잡한 서브시스템(subsystem)에 대한 간단한 통합 인터페이스를 제공하는 디자인 패턴입니다. 클라이언트가 서브시스템의 복잡한 내부 구조를 알 필요 없이, 퍼사드 객체가 제공하는 단순한 메서드만 호출하여 원하는 기능을 수행할 수 있도록 합니다.
현실 세계의 예로 '컴퓨터 전원 버튼'을 들 수 있습니다. 우리는 전원 버튼 하나만 누르면 컴퓨터가 켜진다고 생각하지만, 내부적으로는 CPU, 메모리, 하드디스크, 운영체제 등 수많은 부품과 소프트웨어가 복잡하게 상호작용합니다. 이때 '전원 버튼'이 바로 퍼사드 역할을 하는 것입니다. 복잡한 과정을 숨기고 사용자에게 단순한 인터페이스를 제공합니다.
기본 구조
- Facade: 서브시스템의 기능을 통합하여 간단한 인터페이스를 제공합니다. 클라이언트의 요청을 받으면, 자신이 알고 있는 여러 서브시스템 객체들에게 작업을 위임합니다.
- Subsystem Classes: 실제 기능을 수행하는 여러 클래스들의 집합입니다. 퍼사드에 의해 호출되며, 클라이언트는 보통 이 클래스들을 직접적으로 알지 못합니다.
예시: 홈시어터 시스템 제어하기
집에 DVD 플레이어, 앰프, 프로젝터, 조명 등으로 구성된 홈시어터 시스템이 있다고 상상해봅시다. 영화를 보려면 다음과 같은 여러 단계를 거쳐야 합니다.
- 프로젝터를 켠다.
- DVD 플레이어를 켠다.
- 앰프를 켠다.
- 앰프의 볼륨을 조절한다.
- 조명을 어둡게 한다.
이 모든 과정을 매번 직접 제어하는 것은 매우 번거롭습니다. 이때 퍼사드 패턴을 사용하여 "영화 보기"라는 간단한 명령 하나로 모든 것을 처리할 수 있습니다.
먼저, 각 장치를 나타내는 서브시스템 클래스들을 정의합니다.
// 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
를 만듭니다.
// 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();
출력 결과:
--- 영화 볼 준비를 시작합니다 ---
조명이 10% 밝기로 어두워졌습니다.
프로젝터가 켜졌습니다.
앰프가 켜졌습니다.
볼륨이 7로 설정되었습니다.
DVD 플레이어가 켜졌습니다.
'인터스텔라' 영화를 재생합니다.
--- 홈시어터를 종료합니다 ---
DVD 플레이어가 꺼졌습니다.
앰프가 꺼졌습니다.
프로젝터가 꺼졌습니다.
조명이 밝아졌습니다.
클라이언트는 HomeTheaterFacade
의 watchMovie()
와 endMovie()
메서드만 호출하면 됩니다. 프로젝터를 먼저 켜야 하는지, 앰프 볼륨은 언제 조절해야 하는지와 같은 복잡한 내부 동작 순서나 의존성을 전혀 알 필요가 없습니다. 이처럼 퍼사드 패턴은 서브시스템과 클라이언트 간의 결합도를 낮추어 코드를 더 단순하고 유지보수하기 쉽게 만들어줍니다.
퍼사드 패턴 중요 키워드
- 복잡한 서브시스템에 대한 단순한 창구(인터페이스) 를 제공합니다.
- 클라이언트와 서브시스템 간의 결합도를 낮춥니다.
- 서브시스템의 내부 구현을 캡슐화합니다.
- 퍼사드는 단지 요청을 위임할 뿐, 스스로 새로운 기능을 만들지는 않습니다.
- 오류에 대해서 단위별로 확인할 수 있습니다.
문제 | 복잡한 서브시스템에 대한 간단한 통합 인터페이스를 제공하는 패턴으로, 클라이언트가 서브시스템의 복잡한 내부 구조를 알 필요 없이 단순한 창구 역할을 하여 클라이언트와 서브시스템 간의 결합도를 낮추는 디자인 패턴은? |
보기 | |
답변 | |
정답 | 정답 보기 |