프로그래밍공부(Programming Study)

퍼사드 패턴(Facade Pattern): 복잡성을 숨기고 간결성을 제공하는 디자인 패턴

Chann._.y 2024. 12. 3.
728x90

1. 퍼사드 패턴(Facade Pattern)이란?

퍼사드 패턴은 복잡한 서브시스템의 인터페이스를 단순화하여 사용자가 쉽게 접근할 수 있는 상위 수준의 인터페이스를 제공하는 디자인 패턴입니다. 이는 객체 지향 프로그래밍에서 사용되는 구조적 디자인 패턴(Structural Design Pattern) 중 하나입니다.

퍼사드(Facade)는 '건물의 정면' 또는 '겉모습'을 의미하며, 이 패턴은 복잡한 내부 시스템을 숨기고 사용자에게 간단한 인터페이스를 제공하는 데 중점을 둡니다.


2. 퍼사드 패턴의 특징

  1. 단순화된 인터페이스 제공
    복잡한 시스템의 기능을 감싸는 간단한 API나 클래스가 제공됩니다.
  2. 서브시스템 독립성 유지
    클라이언트는 서브시스템의 세부 사항을 알 필요 없이 퍼사드를 통해 간접적으로 접근합니다.
  3. 코드 유지보수성 향상
    복잡한 코드를 퍼사드 뒤에 숨김으로써 시스템의 수정과 확장이 용이해집니다.

3. 퍼사드 패턴의 장단점

장점:

  • 단순화된 코드: 클라이언트 코드가 서브시스템의 복잡성에서 해방됩니다.
  • 모듈성 증가: 서브시스템이 변경되어도 퍼사드만 수정하면 클라이언트에 영향을 미치지 않습니다.
  • 가독성 향상: 간결하고 명확한 상위 수준의 인터페이스로 코드 이해도가 높아집니다.

단점:

  • 추가 클래스 필요: 퍼사드 클래스를 추가로 작성해야 하므로 초기 개발 작업량이 증가할 수 있습니다.
  • 확장성 제한 가능성: 퍼사드가 과도하게 많은 기능을 처리하면, 오히려 유지보수가 어려워질 수 있습니다.

4. 퍼사드 패턴의 활용 사례

  1. GUI 라이브러리
    복잡한 그래픽 렌더링 작업을 단순화한 API를 제공하여 개발자가 쉽게 사용할 수 있도록 합니다.
  2. 데이터베이스 연결
    데이터베이스 접근을 간단한 CRUD 메서드로 감싸는 데이터 접근 계층(Data Access Layer)에서 활용됩니다.
  3. 멀티미디어 애플리케이션
    오디오, 비디오, 네트워크 스트리밍 등 복잡한 처리를 단순화한 인터페이스 제공.

5. 퍼사드 패턴 구현 예제 (Python)

예제: 홈 시어터 시스템

# 서브시스템 클래스 정의
class Amplifier:
    def turn_on(self):
        print("Amplifier: 전원이 켜졌습니다.")
    def set_volume(self, level):
        print(f"Amplifier: 볼륨이 {level}로 설정되었습니다.")

class DVDPlayer:
    def play(self, movie):
        print(f"DVDPlayer: '{movie}' 재생 중입니다.")
    def stop(self):
        print("DVDPlayer: 정지되었습니다.")

class Projector:
    def turn_on(self):
        print("Projector: 전원이 켜졌습니다.")
    def set_mode(self, mode):
        print(f"Projector: '{mode}' 모드로 설정되었습니다.")

# 퍼사드 클래스 정의
class HomeTheaterFacade:
    def __init__(self, amplifier, dvd_player, projector):
        self.amplifier = amplifier
        self.dvd_player = dvd_player
        self.projector = projector
    
    def watch_movie(self, movie):
        print("\n--- 영화 감상 모드 시작 ---")
        self.amplifier.turn_on()
        self.amplifier.set_volume(5)
        self.projector.turn_on()
        self.projector.set_mode("와이드 스크린")
        self.dvd_player.play(movie)
    
    def end_movie(self):
        print("\n--- 영화 감상 모드 종료 ---")
        self.dvd_player.stop()

# 클라이언트 코드
if __name__ == "__main__":
    # 서브시스템 객체 생성
    amp = Amplifier()
    dvd = DVDPlayer()
    proj = Projector()
    
    # 퍼사드 객체 생성
    home_theater = HomeTheaterFacade(amp, dvd, proj)
    
    # 간단한 인터페이스로 복잡한 작업 수행
    home_theater.watch_movie("어벤져스: 엔드게임")
    home_theater.end_movie()

실행 결과:

--- 영화 감상 모드 시작 ---
Amplifier: 전원이 켜졌습니다.
Amplifier: 볼륨이 5로 설정되었습니다.
Projector: 전원이 켜졌습니다.
Projector: '와이드 스크린' 모드로 설정되었습니다.
DVDPlayer: '어벤져스: 엔드게임' 재생 중입니다.

--- 영화 감상 모드 종료 ---
DVDPlayer: 정지되었습니다.

6. 퍼사드 패턴과 관련된 확장

  • Adapter 패턴: 기존 클래스의 인터페이스를 변경하여 호환성을 제공합니다.
  • Decorator 패턴: 객체에 새로운 기능을 동적으로 추가합니다.
  • Mediator 패턴: 객체 간의 복잡한 통신을 중앙에서 조정합니다.

 

728x90

댓글