본문 바로가기

Programming/Design pattern

[Design pattern] 브릿지 패턴(Bridge) 패턴

파이썬로고

브릿지 (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. 코드 추상화가 많아짐

  • 추상화가 너무 많으면 오히려 가독성이 떨어질 수 있음

 

브릿지 패턴은 “기능 계층과 구현 계층을 분리”하는 구조 패턴입니다.
다형성을 통한 유연한 확장이 필요한 경우, 특히 조합 가능한 요소들이 많을 때 매우 유용하게 쓰입니다.

복잡한 설계가 필요한 대규모 시스템이라면,
브릿지 패턴은 확장성과 유연성 확보를 위한 강력한 도구가 될 수 있습니다.