본문 바로가기

Programming/Design pattern

[Design pattern] 퍼사드(Facade)패턴

[출처] https://ko.wikipedia.org/wiki/%ED%8D%BC%EC%82%AC%EB%93%9C_%ED%8C%A8%ED%84%B4

 

퍼사드(Facade) 패턴

퍼사드(Facade) 패턴복잡한 서브시스템의 내부 구현을 감추고, 외부에서는 간단한 인터페이스 하나만 제공하는 구조 패턴입니다. 쉽게 말해 복잡한 시스템을 감추고, 단순하게 사용할 수 있게 해주는 ‘외벽’ 같은 클래스라고 보면 됩니다.

퍼사드 패턴은 다음과 같은 경우에 사용합니다.

  • 클라이언트가 내부 구조를 몰라도 기능을 편하게 사용할 수 있게 하고 싶을 때
  • 여러 모듈/클래스의 조합을 하나의 단일 진입점으로 묶고 싶을 때
  • 라이브러리나 레거시 시스템의 사용법이 복잡할 때 간단한 인터페이스를 덧씌우기 위해

퍼사드(Facade) 패턴 예제

비디오스트리밍 시스템을 시나리오로 퍼사드 패턴에 대해 간단하게 알아보도록 하겠습니다.

동영상을 재생하기 위해서는 실제로는 디코더, 버퍼, 오디오/비디오 동기화, 재생 로직 등 여러 컴포넌트가 필요합니다.

하지만 클라이언트 입장에서는 play() 기능 하나로 끝내기를 원합니다.

class VideoDecoder:
    def decode(self, filename):
        print(f"디코딩: {filename}")

class AudioSystem:
    def prepare_audio(self):
        print("오디오 준비 완료")

class VideoBuffer:
    def buffer(self):
        print("비디오 버퍼링 중...")

class Renderer:
    def render(self):
        print("화면 렌더링 시작")

 

동영상을 재생하기 위한 각각의 기능들을 수행하는 모듈들이 위와 같이 정의되어 있을겁니다. 클라이언트가 동영상 재생을 위해 모듈들을 일일이 다 호출하면 복잡하기 때문에 이러한 문제를 해결하고자 퍼사드 패턴을 이용하여 시스템을 구현할 수 있습니다.

class VideoPlayer:
    def __init__(self):
        self.decoder = VideoDecoder()
        self.audio = AudioSystem()
        self.buffer = VideoBuffer()
        self.renderer = Renderer()

    def play(self, filename):
        print("[재생 시작]")
        self.decoder.decode(filename)
        self.audio.prepare_audio()
        self.buffer.buffer()
        self.renderer.render()
        print("[재생 완료]")

 

위와 같이 퍼사드 클래스를 생성해주고, 비디오 재생에 필요한 로직들을 해당 클래스에서 구현합니다.

위의 예제에서는 play()함수에서 디코딩, 버퍼링, 오디오 동기화, 렌더링의 과정을 수행하도록 되어있습니다.

player = VideoPlayer()
player.play("movie.mp4")

# [재생 시작]
# 디코딩: movie.mp4
# 오디오 준비 완료
# 비디오 버퍼링 중...
# 화면 렌더링 시작
# [재생 완료]

 

클라이언트에서는 퍼사드 클래스의 객체를 생성하고 play()함수를 호출하기만하면 비디오 재생 기능을 사용할 수 있습니다. 위와 같이 내부 복잡한 구성에 대한 이해가 없어도 해당 기능을 사용할 수 있습니다.

 

퍼사드(Facade) 패턴 장/단점

장점

1. 복잡한 시스템의 내부구조를 몰라도 쉽게 사용할 수 있음

2. 시스템의 구현 세부사항과 클라이언트 코드가 분리됨

3. 내부 구현이 바뀌어도 퍼사드만 유지하면 되서 유지보수 용이

 

단점

1. 지나치게 많은 기능일 몰리면 클래스가 비대해짐

2. 퍼사드로 단순화하면서 세부기능을 제어하기 어려워 질 수 있음

3. 모든 걸 퍼사드로 감싸면 오히려 시스템의 이해가 어려워짐

 

퍼사드 패턴은 복잡한 시스템을 단순하게 감싸는 인터페이스를 제공함으로써,
사용성은 높이고 결합도는 낮출 수 있는 매우 실용적인 패턴입니다.

특히 실무에서 서비스 레이어, API 래퍼 클래스, 라이브러리 캡슐화 등에 자주 쓰입니다.