브릿지 (Bridge) 패턴
브릿지(Bridge) 패턴은 추상화와 구현을 독립적으로 분리하여 각각을 독립적으로 확장 가능하게 만드는 구조입니다.
쉽게 말하면 기능의 계층과 구현의 계층을 따로 분리해서, 서로 독립적으로 확장할 수 있도록 하는 디자인 패턴입니다.
추상화 계층
시스템에서 무엇을 할 것인가에 대한 정의 즉, 사용자 입장에서의 기능/행위를 다루는 계층입니다.
추상화 계층은 클라이언트에서 사용할 인터페이스를 정의합니다.
구현 계층
시스템에서 어떻게 할 것인가에 대한 정의 즉, 실제 동작을 담당하는 계층입니다.
추상화 계층에서 정의한 인터페이스를 구현합니다.
브릿지 패턴을 사용하는 이유는 아래와 같습니다
- 클래스 상속으로 기능을 확장하면 클래스 폭발 문제가 발생합니다.
- 기능과 구현을 따로 두면 유지보수와 확장성에 유리합니다.
- 여러 저합이 가능한 상황에서 코드의 중복을 피할 수 있습니다.
브릿지 패턴 예제
브릿지 패턴을 설명하기 위해 간단한 알림 시스템을 구현해보려합니다.
Slack, Email, SMS로 알림을 보낼 수 있고, 일반 메시지와 긴급 메시지로 구분이 가능한 걸로 가정합니다.
이걸 단순 상속 구조로 구현한다면
- NormalSlackNotifier
- UrgentSlackNotifier
- NormalEmailNotifier
- UrgentEmailNotifier
- ...
매체, 메세지 등급에 따라 클래스를 생성해야하고, 매체와 메시지 등급이 늘어날수록 클래스 수도 증가할 수 밖에 없을 것입니다. 이러한 문제를 해결하고, 효과적으로 구현하기 위해 브릿지 패턴으로 코드를 구현할 수 있습니다.
이때 알림(구현)과 알림 수준(추상화)를 분리합니다
추상화 계층 : 메시지의 종류 (알림 수준)
class Notification:
def __init__(self, sender: MessageSender):
self.sender = sender
def notify(self, message: str):
raise NotImplementedError()
class NormalNotification(Notification):
def notify(self, message: str):
self.sender.send(f"[일반] {message}")
class UrgentNotification(Notification):
def notify(self, message: str):
self.sender.send(f"[긴급‼] {message.upper()}")
Notification은 알림의 성격을 나타내는 추상화 계층입니다.
알림의 수준을 기준으로 나뉘고, sender는 알림 매체를 주입 받습니다.
구현 계층 : 메시지 전송 방식 정의
class MessageSender:
def send(self, message: str):
raise NotImplementedError()
class EmailSender(MessageSender):
def send(self, message: str):
print(f"[email] {message}")
class SlackSender(MessageSender):
def send(self, message: str):
print(f"[slack] {message}")
MessageSender는 구현 계층의 인터페이스입니다. 이메일, 슬랙 등 방식으로 알림을 보내도록 구현합니다.
사용 예시
email_sender = EmailSender()
slack_sender = SlackSender()
noti1 = NormalNotification(email_sender)
noti2 = UrgentNotification(slack_sender)
noti1.notify("업무보고가 도착했습니다")
noti2.notify("서버 다운!!")
# [email] [일반] 업무보고가 도착했습니다
# [slack] [긴급‼] 서버 다운!!
브릿지 패턴 장/단점
장점
1. 기능과 구현의 독립성
- 새로운 메시지 유형 또는 전송 방식 추가 시, 서로 영향을 주지 않음
2. 조합 확장 용이
- 2 × N 구조 → N개의 방식, M개의 유형 조합 가능
3. 코드 중복 감소
- 클래스 폭발 문제 방지
4. OCP 만족
- 확장에는 열려있고, 변경에는 닫힘
단점
1. 설계 난이도 상승
- 단순한 문제 해결일 경우에는 오히려 과한 설계 일 수 있음
2. 코드 추상화가 많아짐
- 추상화가 너무 많으면 오히려 가독성이 떨어질 수 있음
브릿지 패턴은 “기능 계층과 구현 계층을 분리”하는 구조 패턴입니다.
다형성을 통한 유연한 확장이 필요한 경우, 특히 조합 가능한 요소들이 많을 때 매우 유용하게 쓰입니다.
복잡한 설계가 필요한 대규모 시스템이라면,
브릿지 패턴은 확장성과 유연성 확보를 위한 강력한 도구가 될 수 있습니다.
'Programming > Design pattern' 카테고리의 다른 글
[Design pattern] 데코레이터(Decorator) 패턴 (3) | 2025.07.03 |
---|---|
[Design pattern] 컴포지트(Composite) 패턴 (16) | 2025.07.02 |
[Design pattern] 어댑터(Adapter) 패턴 (10) | 2025.06.30 |
[Design pattern] 프로토타입(Prototype) 패턴 (8) | 2025.06.28 |
[Design pattern] 빌더(Builder) 패턴 (5) | 2025.06.27 |