노트

디미터 법칙

Law of Demeter

설계#architecture · 연결된 개념 8개

쉽게 말하면

디미터 법칙은 친구의 친구에게 직접 연락하지 말고 친구에게만 부탁하라는 거예요. 친구 회사 부장의 이름까지 줄줄이 알아야 한다면, 그 사이 누가 자리만 옮겨도 연락망이 다 깨지거든요.

비유가 깨지는 곳 친구에게 다 부탁하다 보면 친구가 말만 전하는 중개자가 돼요. 그래서 위임 숨기기와 중개자 제거를 오가며 균형을 찾고, 파울러는 이 법칙을 '가끔 유용한 제안' 정도로 받아들이라고 해요.

객체는 직접 아는 친구하고만 이야기하고, 친구의 친구에게 말을 걸지 말라는 원칙. a.getB().getC().doSomething() 같은 체인 호출을 피해 결합도를 낮춘다.

  • 메시지 체인(Message Chains) 냄새: person.department.manager.name처럼 객체를 타고 들어가는 코드는 중간 구조가 바뀌면 줄줄이 고쳐야 한다
  • 위임 숨기기(Hide Delegate): 서버 객체에 위임 메서드를 만들어 내부 협력 객체를 감춘다. person.manager만 쓰면 부서 객체가 바뀌어도 클라이언트는 영향을 받지 않는다
  • 중개자 제거하기(Remove Middle Man): 반대로 위임 메서드만 잔뜩 늘어나 클래스가 전달만 하는 중개자로 전락했다면, 클라이언트가 실제 객체를 직접 부르게 되돌린다

어디까지 숨길지에 정답은 없다. 위임 숨기기와 중개자 제거를 오가며 균형점을 찾는다. 파울러는 이 법칙을 지나치게 믿으면 중개자 냄새가 난다며 "가끔 유용한 디미터의 제안" 정도로 받아들이라고 한다.

체인을 무작정 감추기보다, 체인의 최종 결과를 쓰는 코드 자체를 옮겨서 체인이 필요 없게 만드는 편이 나을 때가 많다. 옵셔널 체이닝(Optional Chaining, a?.b?.c)은 null 안전성을 줄 뿐 결합 문제를 풀어 주지는 않는다(옵셔널 체이닝과 null 병합 연산자).

결합도을 줄이는 구체적인 규칙 중 하나이고, 서비스 사이에서는 하위 시스템 앞에 창구를 세우는 퍼사드 패턴이 같은 역할을 한다.

출처: 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition) · Laws of Software Engineering: Law of Demeter · refactoring.com: Hide Delegate · refactoring.com: Remove Middle Man · Refactoring.Guru: Message Chains

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 심플 디자인

    켄트 벡이 XP(Extreme Programming)에서 제시한 단순한 설계의 네 가지 규칙. 우선순위 순으로 ① 모든 테스트를 통과하고 ② 의도를 드러내고 ③ 중복이 없고 ④ 요소가 가장 적다. 마틴 파울러가 이렇게 정리한 형태가 널리 쓰인다.

  • 하이럼의 법칙

    API(Application Programming Interface) 사용자가 충분히 많아지면, 계약에 무엇을 적었든 시스템의 관찰 가능한 모든 동작에 누군가는 의존하게 된다는 법칙. 구글의 하이럼 라이트(Hyrum Wright)가 라이브러리 변경 경험에서 관찰했고, 『Software Engineering at Google』에 소개됐다.

  • 리팩터링

    겉으로 보이는 동작은 그대로 둔 채, 코드를 이해하고 고치기 쉽게 내부 구조를 바꾸는 일. 기능을 더하는 일이 아니라 다음 변경을 덜 위험하게 만드는 정리다.

  • 섣부른 최적화

    "섣부른 최적화는 모든 악의 근원이다." 도널드 크누스(Donald Knuth)가 1974년 글 「Structured Programming with go to Statements」에서 쓴 말이다. 원문의 맥락은 작은 효율은 대부분(약 97%)의 경우 잊으라는 것이고, 정말 중요한 3%는 놓치지 말라는 말이 이어진다.

  • 언어적 안티패턴

    이름, 타입, 주석이 말하는 것과 코드가 실제로 하는 일이 어긋나는 것. 읽는 사람을 잘못된 추측으로 이끈다.

보기 옵션