PE Notes · SW
SW 모듈화 — 응집도와 결합도
모듈 안 결속인 응집 일곱 단계와 모듈 사이 의존인 결합 여섯 단계를 가른 뒤, 응집을 올리고 결합을 낮추는 SRP·ISP·DIP를 붙입니다.
세금만 계산해야 할 함수가 로그를 쓰고 메일을 보내면, 세율이 바뀌든 메일 서버가 바뀌든 같은 파일을 엽니다. 모듈화는 교체 가능한 칸으로 나누는 일입니다. 는 칸 안의 요소가 한 이야기로 묶인 정도이고, 는 칸 사이가 얼마나 서로를 알고 있는 정도입니다. 목표는 같습니다. 응집은 올리고, 결합은 내립니다.
안의 결속, 일곱 칸
강할수록 변경 이유가 하나로 모입니다. 약할수록 서로 다른 일이 한 상자에 삽니다.
이 최강입니다. 요소가 하나의 기능만 수행합니다. calculateTax()가 세액만 내는 꼴입니다. 순차 응집은 한 단계의 출력이 다음 입력입니다. 파이프라인이 가깝습니다. 통신 응집은 같은 데이터·같은 레코드를 만지는 작업의 묶음입니다. 절차 응집은 “열고 읽고 닫기”처럼 순서만 같은 활동입니다. 시간 응집은 시작 시 초기화처럼 같은 시각에 돌아가서 모인 것들입니다. 논리 응집은 입력 처리 모음처럼 범주만 같고, 플래그로 실제 일을 고릅니다. 이 최약입니다. 관련 없는 코드를 한 클래스에 던져 넣은 상태입니다.
| 강 → 약 | 묶는 이유 |
|---|---|
| 기능 | 하나의 책임 |
| 순차 | 출력-입력 사슬 |
| 통신 | 같은 데이터 |
| 절차 | 같은 실행 순서 |
| 시간 | 같은 시점 |
| 논리 | 같은 범주, 다른 일 |
| 우연 | 이유 없음 |
은 변경 이유를 하나로 남겨 기능 응집을 설계 언어로 올립니다. 우연 응집은 기술 부채의 이자가 가장 빨리 붙는 자리입니다.
사이의 의존, 여섯 칸
낮을수록 한 모듈을 고쳐도 이웃이 안 흔들립니다. 높을수록 내부 구현이 밖으로 셉니다.
이 가장 낮습니다. 필요한 값만 매개변수로 넘깁니다. 스탬프 결합은 레코드·객체 전체를 넘겨 쓰지도 않는 필드까지 공유합니다. 구조가 바뀌면 호출부도 같이 컴파일됩니다. 제어 결합은 플래그로 “이렇게 동작하라”를 지시합니다. 호출자가 피호출 모듈의 내부를 알아야 합니다. 외부 결합은 파일 포맷·프로토콜·장치 명세를 같이 붙습니다. 바깥 표준이 바뀌면 모두가 흔들립니다. 공통 결합은 전역 변수를 여러 모듈이 읽습니다. 누가 바꿨는지 추적이 어렵습니다. 이 최악입니다. 다른 모듈의 코드·데이터에 직접 손을 넣습니다. 경계가 사라집니다.
| 낮 → 높 | 주고받는 것 |
|---|---|
| 데이터 | 필요한 값만 |
| 스탬프 | 구조 전체 |
| 제어 | 동작 플래그 |
| 외부 | 공유 형식·프로토콜 |
| 공통 | 전역 상태 |
| 내용 | 내부 직접 접근 |
는 안 쓰는 메서드에 의존하지 않게 잘라 결합을 줄입니다. 은 구현이 아니라 추상에 기대 내용·공통 결합을 막습니다. 은 내부를 숨겨 밖이 몰라도 되게 합니다. 서비스 사이 REST가 파라미터만 주고받으면 데이터 결합에 가깝고, 공유 DB를 여러 서비스가 직접 만지면 공통에 가깝습니다. 패턴 글의 파사드·어댑터는 바깥에 얇은 문을 남겨 결합을 낮추는 쪽입니다.
좋은 모듈은 한 이유로 바뀌고, 이웃에는 값만 건넵니다. 응집이 낮으면 결합이 같이 올라가는 일이 많습니다. 답을 쓸 때는 정의, 일곱·여섯의 끝단(기능↔우연, 데이터↔내용), 그리고 “응집 ↑ · 결합 ↓”에 SOLID 한 줄을 붙입니다.