DIP 준수하는 메시지 발송 시스템 구현 - 1

hyuckhoon.ko·2022년 8월 30일
0

1. 배경

"무질서 소프트웨어 시스템은 기능의 동일성을 특징으로 한다.
API 핸들러 안에 도메인 지식이 있고 이메일을 보내고 로그를 남긴다. '비스니스 로직' 클래스가 아무 계산을 하지 않고 I/O를 수행한다. 모든 요소가 다른 모든 요소와 결합(coupling)되어 있어서 시스템의 일부를 바꾸는 것은 위험하다. 이런 일이 흔히 발생해서 소프트웨어 엔지니어링은 이런 혼돈 상태를 부르는 용어를 만들었다. 바로 '큰 진흙 공(big ball of mud) 안티패턴'이다.

고수준 모듈인 비즈니스 로직과 슬랙, 비즈엠과 같은 알림톡 발송 코드가 강하게 결합되어 있다.(고수준모듈이 저수준 모듈을 의존)


2. 고민하기

우선 고수준 모듈 관점에서 추상화에 의존하도록 하는 부분을
염두에 둗고 설계를 진행해봤다.


3. messenger_module.py

class Slack:
    def __init__(self):
        print("슬랙입니다")
        
    def send(self, channel, msg):
        print(f"슬랙 메시지 발송됩니다 : {msg}")


class BizM:
    def __init__(self):
        print("비즈엠입니다")

    def send(self, channel, msg):
        print(f"비즈엠 메시지 발송됩니다 : {msg}")


class Jandi:
    def __init__(self):
        print("잔디입니다")

    def send(self, channel, msg):
        print(f"잔디 메시지 발송됩니다 : {msg}")
        

4. main.py

from abc import ABCMeta

from messenger_module import Slack, BizM, Jandi


class MessageSystem(metaclass=ABCMeta):

    messanger_set = {
       'slack'  : Slack, 
        'bizm'  : BizM,
        'jandi' : Jandi,
    }
    def __init__(self, messanger: str, channel: str, msg: str) -> None: 
        if messanger not in self.messanger_set.keys():
            raise ValueError
        self.messanger = self.messanger_set[messanger]()
        self.channel = channel
        self.msg = msg

    def send(self):
        self.messanger.send(self.channel, self.msg)


if __name__ == "__main__":
    messager = MessageSystem('jandi', 'test7', '잔디 관련 내용입니다')
    messager.send()

5. 문제점

MessageSystem이 messanger_module에 의존하는 느낌을 지울 수가 없다.

분명 DIP 정의에 따르면 고수준 모듈인 비즈니스 로직과
구체적 구현인 저수준모듈 모두 추상화에 의존해야 한다.

"의존성은 꼭 임포트나 호출만을 뜻하지 않는다. 한 모듈이 다른 모듈을 필요로 하거나, 안다는 좀 더 일반적인 생각까지 의존성이다."

0개의 댓글