노트

결합도

Coupling

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

쉽게 말하면

결합도는 줄줄이 이어진 크리스마스 전구 같은 거예요. 전구 하나를 바꾸려는데 옆 전구까지 손대야 한다면 묶여 있는 거고, 그런 연쇄가 많을수록 고치는 비용이 커져요.

비유가 깨지는 곳 전구 줄은 늘 함께 묶여 있지만, 코드의 결합은 '어떤 변경을 기준으로' 묶였는지를 같이 말해야 해요. 같은 두 모듈도 어떤 변경엔 묶이고 어떤 변경엔 독립적이라, 모든 결합을 없애려 하지 않아요.

한 요소를 바꿀 때 다른 요소도 바꿔야 하는 관계. 결합도는 언제나 "어떤 변경에 대해" 결합되어 있는지를 함께 말해야 의미가 있다. 같은 두 모듈도 어떤 변경에는 묶여 있고 어떤 변경에는 독립적일 수 있다.

  • 일대다: 변경 하나가 여러 요소에 닿는다
  • 연쇄: 바뀐 요소가 또 다른 변경을 부른다. "시스템이 복잡하다"는 말은 결국 변경이 예상치 못한 결과를 낳는다는 뜻이다
  • 소스 코드만 봐서는 다 보이지 않는다. 실제로 어떤 변경들이 함께 일어났는지를 봐야 드러난다

콘스탄틴의 등가성

래리 콘스탄틴(Larry Constantine, 『Structured Design』)의 관찰을 켄트 벡이 정리한 식이다. 소프트웨어 비용은 변경 비용과 거의 같고, 변경 비용은 소수의 큰 변경이 지배하며, 큰 변경을 비싸게 만드는 것은 결합이다. 그러므로 비용(소프트웨어) ≈ 결합도.

결합을 줄일 때

  • 결합이 생긴 이유는 중요하지 않다. 지금 결합 비용을 계속 낼지, 없애는 비용을 낼지 고를 뿐이다
  • 한 종류의 변경에 대한 결합을 줄이면 다른 종류의 변경에 대한 결합이 늘기 쉽다. 모든 결합을 없애려 하지 않는다
  • 바로 디커플링(Decoupling)하기 어렵다면 먼저 응집도를 높인다. 함께 바뀌는 것을 가까이 모으는 것만으로도 변경이 쉬워진다

구체적인 처방으로는 디미터 법칙, 의존성 역전 원칙, 함수·필드 옮기기이 있다. 시스템 사이 결합을 메시지 큐(Message Queue)로 느슨하게 만드는 이야기는 Kafka와 트랜잭셔널 아웃박스 패턴 쪽에 있다.

출처: 『켄트 벡의 Tidy First?』 켄트 벡 (원서 Tidy First?)

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 정리(Tidying)

    동작을 바꾸지 않는 아주 작은 구조 변경. 켄트 벡은 리팩터링이라는 말이 "기능 개발 중간의 긴 공사"처럼 쓰이며 동작 보존 원칙이 흐려지자, 더 작고 겁나지 않는 단위를 정리라는 이름으로 따로 불렀다. refactoring의 부분집합이다.

  • 심플 디자인

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

  • 최종 일관성

    최종 일관성(eventual consistency)은 "지금 당장은 저장소마다 값이 다를 수 있지만, 새 변경이 멈추면 결국 같아진다"는 보장이다. 원본 DB와 검색 색인·캐시·다른 서비스처럼 물리적으로 분리된 저장소를 한 트랜잭션으로 묶을 수 없을 때 받아들이는 일관성 모델(consistency model)이다.

  • 매개변수 객체 만들기

    여러 함수에 늘 함께 넘겨지는 값 묶음(데이터 뭉치, Data Clumps)을 하나의 객체로 묶어 넘기는 리팩터링.

  • 소프트웨어 공학의 법칙들

    소프트웨어 시스템과 팀, 의사결정에 반복해서 나타나는 경험칙들을 모아 부르는 말. 법칙이라고 부르지만 대부분 증명된 정리가 아니라 관찰과 격언이다. 판단할 때 떠올릴 이름표로 쓴다. 따로 노트를 둔 것은 링크로, 나머지는 한 줄로 적었다.

보기 옵션