관리 메뉴

나만의공간

🎬 퍼사드 패턴(Facade Pattern) 완전 정복 - 영화 감상 시스템 예제로 이해하기 본문

IT/JAVA

🎬 퍼사드 패턴(Facade Pattern) 완전 정복 - 영화 감상 시스템 예제로 이해하기

밥알이 2025. 6. 1. 22:28

복잡한 시스템을 하나의 창구로 단순하게 사용할 수 있다면 얼마나 편할까요?
이번 글에서는 바로 그런 역할을 하는 퍼사드 패턴(Facade Pattern)을 다룹니다.
영화 감상 시스템 예제를 통해 실무에서 어떻게 활용할 수 있는지도 함께 살펴보겠습니다.


🧱 퍼사드 패턴이란?

퍼사드 패턴은 복잡한 서브 시스템을 단순한 인터페이스로 감싸는 구조 패턴입니다.
여러 클래스를 하나의 진입점으로 통합하여 클라이언트가 복잡한 내부 구조를 몰라도 사용할 수 있게 도와줍니다.

📌 핵심: 복잡한 하위 시스템을 감추고, 단일 창구(Facade)를 제공해 사용 편의성을 높이는 것!

🎨 실생활 예시로 이해하기

🏨 호텔 프런트 데스크

  • 손님은 프런트 데스크에만 요청하면 됩니다.
  • 실제 내부에선 청소, 식사, 룸서비스 등 다양한 부서가 작동합니다.

➡️ 퍼사드 = 프런트 데스크
➡️ 복잡한 구조 = 호텔 내부 시스템


📌 퍼사드 패턴, 언제 사용할까?

  • 복잡한 라이브러리나 시스템을 단순하게 사용할 때
  • 클라이언트가 세부 구현을 몰라도 되게 하고 싶을 때
  • 유지보수성과 테스트 용이성을 높이고 싶을 때

 

🎯 예제 시나리오: 영화 감상 시스템

사용자는 단 하나의 클래스, MovieFacade만 호출하면 영화 감상이 시작됩니다.
하지만 실제로는 다양한 장치들이 함께 작동합니다:

  • Light : 조명 제어
  • Projector : 프로젝터 조작
  • Speaker : 서라운드 사운드 설정
  • StreamingService : 영화 재생

🔧 실무형 자바 예제

1️⃣ 서브 시스템 클래스

public class Light {
    public void dim() { System.out.println("💡 불을 어둡게 합니다."); }
    public void on() { System.out.println("💡 불을 밝힙니다."); }
}

public class Projector {
    public void turnOn() { System.out.println("🎥 프로젝터를 켭니다."); }
    public void turnOff() { System.out.println("🎥 프로젝터를 끕니다."); }
}

public class Speaker {
    public void setSurroundSound() { System.out.println("🔊 서라운드 사운드를 설정합니다."); }
    public void off() { System.out.println("🔇 스피커를 끕니다."); }
}

public class StreamingService {
    public void play(String movie) { System.out.println("🎬 '" + movie + "' 영화를 재생합니다."); }
    public void stop() { System.out.println("⏹️ 영화를 정지합니다."); }
}

2️⃣ 퍼사드 클래스: MovieFacade

public class MovieFacade {
    private Light light = new Light();
    private Projector projector = new Projector();
    private Speaker speaker = new Speaker();
    private StreamingService service = new StreamingService();

    public void watchMovie(String movie) {
        System.out.println("===== 영화 감상 시작 =====");
        light.dim();
        projector.turnOn();
        speaker.setSurroundSound();
        service.play(movie);
    }

    public void endMovie() {
        System.out.println("===== 영화 감상 종료 =====");
        service.stop();
        speaker.off();
        projector.turnOff();
        light.on();
    }
}

3️⃣ 사용 예

public class Main {
    public static void main(String[] args) {
        MovieFacade movieFacade = new MovieFacade();
        movieFacade.watchMovie("인셉션");
        System.out.println();
        movieFacade.endMovie();
    }
}

✅ 실행 결과

===== 영화 감상 시작 =====
💡 불을 어둡게 합니다.
🎥 프로젝터를 켭니다.
🔊 서라운드 사운드를 설정합니다.
🎬 '인셉션' 영화를 재생합니다.

===== 영화 감상 종료 =====
⏹️ 영화를 정지합니다.
🔇 스피커를 끕니다.
🎥 프로젝터를 끕니다.
💡 불을 밝힙니다.

📊 구조 요약 (UML 구성)

[Client]
   │
   ▼
[MovieFacade] ─────────────┐
   │     │     │          │
[Light][Projector][Speaker][StreamingService]

💼 실무 활용 사례

사례 설명
Spring JdbcTemplate 내부 JDBC 작업을 감추고 단순화
카카오/슬랙 API 모듈 복잡한 API 호출을 퍼사드로 감쌈
통합 서비스 여러 도메인 서비스 호출을 하나로 묶음
테스트용 Fake 서버 복잡한 외부 시스템을 테스트용으로 단순화

✅ 퍼사드 패턴 장단점

구분 설명
✅ 장점 클라이언트는 복잡한 내부 구조를 몰라도 됨
외부 시스템 변경이 퍼사드 내부로만 제한
가독성과 유지보수성 향상
⚠️ 단점 퍼사드 클래스가 과도하게 비대해질 수 있음
내부 세부 구현이 숨겨져 디버깅이 어려움

🧠 마무리 요약

항목 설명
이름 퍼사드(Facade) 패턴
목적 복잡한 시스템을 단순한 인터페이스로 감싸서 제공
실무 활용 API 래퍼, 통합 서비스, 라이브러리 추상화
핵심 효과 의존성 감소, 클라이언트 단순화, 유지보수 용이

 

Comments