퍼사드(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 래퍼 클래스, 라이브러리 캡슐화 등에 자주 쓰입니다.
'Programming > Design pattern' 카테고리의 다른 글
[Design pattern] 프록시(Proxy)패턴 (11) | 2025.07.04 |
---|---|
[Design pattern] 플라이웨이트(Flyweight)패턴 (3) | 2025.07.04 |
[Design pattern] 데코레이터(Decorator) 패턴 (3) | 2025.07.03 |
[Design pattern] 컴포지트(Composite) 패턴 (16) | 2025.07.02 |
[Design pattern] 브릿지 패턴(Bridge) 패턴 (10) | 2025.07.02 |