책임 분리, 응집도, 결합도
2강. 책임 분리, 응집도, 결합도
1. 이번 강의에서 해결할 문제
큰 Manager가 입력·규칙·DB·출력을 모두 알면 한 기능의 변경이 전체에 번집니다. 참조 개수만 세는 결합도 분석도 구체 구현 의존과 변경 방향을 놓칩니다.
2. 학습 목표
3. 핵심 개념
높은 응집도는 관련 없는 기능을 몰아넣는 뜻이 아니라 한 책임을 위해 멤버가 함께 움직인다는 뜻입니다. 결합도는 참조 수보다 구체 구현 변화가 몇 모듈에 영향을 주는지, 호출자가 내부 순서를 알아야 하는지를 봅니다.
용어 정리
- 책임: 코드가 맡은 판단 또는 행동이며, 같은 이유로 바뀌는 코드의 묶음입니다.
- 응집도: 한 클래스의 데이터와 함수가 같은 책임을 수행하기 위해 얼마나 밀접하게 협력하는지 나타냅니다.
- 결합도: 한 코드의 변경이 다른 코드의 수정·재컴파일·재검증을 얼마나 요구하는지 나타냅니다.
- 협력 계약: 호출자가 구현 세부 대신 기대할 수 있는 입력, 결과, 실패 규칙입니다.
- God Object: 여러 규칙과 외부 시스템을 한곳에서 알고 조정해 변경 이유가 지나치게 많은 객체입니다.
“클래스가 작다”와 “응집도가 높다”는 같은 말이 아닙니다. 필드 하나만 가진 클래스도 서로 관계없는 이유로 바뀌면 응집도가 낮습니다. 반대로 도메인 규칙을 완결하는 데 필요한 여러 메서드가 함께 움직인다면 코드가 조금 길어도 한 책임일 수 있습니다.
4. 가장 작은 구조로 시작하기
다음 선언은 구현 전체가 아니라 누가 무엇을 알아야 하는지 보여 주는 경계입니다. Task는 자기 상태 규칙을 알고, TaskService는 저장소에서 작업을 찾아 완료시키고 알림을 보내는 유스케이스 순서를 압니다.
class Task {
public: void complete(); bool isCompleted() const noexcept;
};
class TaskService {
public: TaskService(TaskRepository& repo, Notifier& notifier);
void complete(TaskId id);
};
Task는 상태 규칙, Service는 유스케이스 순서, Repository와 Notifier는 외부 경계를 담당합니다.
코드 한 줄씩 이해하기
Task::complete()는 “완료 가능한 상태인가?”라는 규칙과 실제 상태 변경을 한곳에 둡니다.isCompleted() const noexcept는 상태를 바꾸지 않는 조회이며, 정상 조회에서 예외를 던지지 않겠다는 계약입니다.TaskService생성자는 이미 존재하는TaskRepository와Notifier를 참조로 받습니다. 구체 파일 저장소나 메일 SDK를 직접 생성하지 않습니다.complete(TaskId id)는 작업 조회 → 도메인 상태 변경 → 저장 → 알림이라는 흐름을 조정합니다.
| 코드 위치 | 알아야 하는 것 | 알 필요가 없는 것 |
|---|---|---|
Task | 완료 가능 조건과 상태 | DB, 메일 SDK, UI |
TaskService | 유스케이스 순서 | SQL 문법, 메일 전송 상세 |
TaskRepository 구현 | 저장·조회 방식 | 알림 표현 |
Notifier 구현 | 알림 전송 방식 | 작업 내부 필드 배치 |
5. 코드가 동작하는 이유
상태 규칙 변경은 Task 테스트, 저장 방식 변경은 Repository 구현 테스트로 제한됩니다. Service는 역할 계약에만 의존합니다.
예를 들어 파일 저장소를 메모리 저장소로 바꾸더라도 Task::complete()는 그대로입니다. 반대로 “취소된 작업은 완료할 수 없다”는 규칙이 추가되면 Task와 그 테스트를 중심으로 수정합니다. 이렇게 변경 이유와 테스트 범위가 함께 좁아지는지가 책임 분리의 실제 결과입니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
10. 다음 강의 연결
책임을 나눴다면 객체 내부 상태가 우회 경로로 망가지지 않게 해야 합니다. 다음 강의에서는 Task의 필드를 무제한 setter로 노출하지 않고, 허용된 상태 변화와 불변 조건을 코드로 보호합니다.
책임 분리, 응집도, 결합도 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.