라떼군 이야기


1 / 13강

객체의 역할과 약속 나누기

주문을 처리하는 코드가 이메일 전송 방식까지 직접 결정하면, 알림 방식이 바뀔 때 주문 코드도 수정해야 합니다. 먼저 ‘주문 처리’와 ‘알림 보내기’의 책임을 나누어 봅시다.

필요한 기능을 전달받습니다

class EmailNotifier:
    def send(self, message):
        print("email:", message)

class OrderService:
    def __init__(self, notifier):
        self.notifier = notifier
    def accept(self, order_id):
        self.notifier.send(f"Order {order_id} accepted")

OrderService(EmailNotifier()).accept(7)

출력은 email: Order 7 accepted입니다. OrderService는 알림 객체가 send(message)를 제공한다는 약속만 따릅니다. 다른 알림 객체를 전달하면 주문 흐름은 그대로 두고 전송 방식만 바꿀 수 있습니다. 이처럼 필요한 객체를 외부에서 넣는 방식을 의존성 주입이라고 합니다.

상속과 구성

구성이 언제나 상속보다 좋은 것은 아닙니다. 바뀔 가능성이 있는 역할을 교체하기에는 구성이 편리하고, 안정적인 공통 절차를 확장할 때는 상속이 어울릴 수 있습니다.

확인 문제

알림을 이메일에서 화면 출력으로 바꾸려면 어느 부분을 바꾸면 될까요?

해설 보기

같은 send(message) 약속을 지키는 알림 객체를 만들어 전달하면 됩니다. 주문 처리가 알림 전송의 세부 사항을 몰라도 되도록 경계를 나눈 덕분입니다.

제품 기획, 개발 파트너 찾으시나요? 개인, 팀, 기업 모두 환영. 문제 정의부터 출시까지 함께합니다.