노트응집도
Cohesion
설계#architecture · 연결된 개념 11개
쉽게 말하면
응집도는 공구를 쓰임새별로 한 서랍에 모아 둔 정도예요. 드라이버와 나사가 한곳에 있으면 고칠 때 그 서랍만 열면 되고, 엉뚱한 서랍을 뒤지다 다른 걸 흐트러뜨리지 않아요.
비유가 깨지는 곳 서랍 정리는 '비슷해 보이는 것'끼리 모으기 쉽지만, 응집도는 '함께 바뀌는 것'끼리 모으는 거예요. 그래서 controllers 같은 기술 레이어보다 기능·도메인 단위로 묶는 편이 응집도가 높아요.
함께 바뀌는(결합된) 요소들이 같은 상위 요소 안에 모여 있는 정도. 응집도가 높으면 변경이 한곳에 집중되어 분석과 수정이 쉽고, 엉뚱한 곳의 동작을 실수로 바꿀 가능성이 준다.
응집도를 높이는 두 방법:
-
결합된 요소를 묶는다: 서로 얽힌 코드를 하위 요소로 뽑는다. 헬퍼 함수나 클래스 추출이 여기 해당한다(함수 추출하기, 함수·필드 옮기기)
-
결합되지 않은 요소를 내보낸다: 상관없는 것을 다른 곳으로 옮긴다. 한 번에 다 재배치하지 말고 한 요소씩 옮긴다
-
코드 배치 수준에서는 함께 바뀌는 코드를 붙여 두는 것만으로 시작할 수 있다(응집 순서)
-
폴더 구조를 기술 레이어(controllers, services…)가 아니라 기능·도메인 단위로 묶는 것도 응집도를 높이는 선택이다(도메인 주도 설계 (DDD), 변경하기 쉬운 프런트엔드 코드)
-
응집도가 높아지면 결합을 끊기 쉬워진다. 둘은 동전의 양면이다
-
응집도가 낮을 때 나는 냄새가 산탄총 수술과 뒤엉킨 변경다
출처: 『켄트 벡의 Tidy First?』 켄트 벡 (원서 Tidy First?)
연결된 개념
이 노트를 가리키는 문서
뜻이 가까운 노트
- 정리(Tidying)
동작을 바꾸지 않는 아주 작은 구조 변경. 켄트 벡은 리팩터링이라는 말이 "기능 개발 중간의 긴 공사"처럼 쓰이며 동작 보존 원칙이 흐려지자, 더 작고 겁나지 않는 단위를 정리라는 이름으로 따로 불렀다. refactoring의 부분집합이다.
- 테스트 주도 개발 (TDD)
코드를 쓰기 전에 실패하는 자동화된 테스트부터 쓰고, 그 테스트를 통과시킨 뒤 중복을 없애는 짧은 주기를 반복하는 개발 방식. 켄트 벡이 정리했다.
- 청킹과 코드 읽기
여러 정보를 의미 있는 덩어리 하나로 묶어 기억하는 것. 아는 것이 많을수록 코드를 큰 덩어리로 읽는다.
- 심플 디자인
켄트 벡이 XP(Extreme Programming)에서 제시한 단순한 설계의 네 가지 규칙. 우선순위 순으로 ① 모든 테스트를 통과하고 ② 의도를 드러내고 ③ 중복이 없고 ④ 요소가 가장 적다. 마틴 파울러가 이렇게 정리한 형태가 널리 쓰인다.
- 구성요소 줄이기
셀 수 있는 모든 구성요소(파일, 폴더 깊이, 클래스, 함수, 분기, 변수, 테이블, 필드, 테스트 케이스…)는 비용이라는 관점. 심플 디자인의 네 번째 규칙을 실무 기준으로 풀어낸 것이다.