Q6
Evaluate
short_answer
최종 솔루션에서 `useChatRoom({ serverUrl, roomId, onMessage })` 커스텀 훅을 추출했다. 그런데 현재 앱에서 useChatRoom은 단 한 곳에서만 사용된다. 동료가 PR review에서 묻는다: "단일 사용처인데 왜 추출했어? S8.4는 단일 사용처에 Custom Hook 자제하라고 했잖아."
이 결정을 정당화하라. 답변에는 (1) 왜 추출했는지(2가지 이상의 가치), (2) 어떤 다른 선택지가 있었고 왜 탈락했는지, (3) 받아들인 트레이드오프를 모두 포함할 것.
정답: 참조 답안 키워드: (1) 의도 캡슐화('채팅방 연결'이라는 도메인 명명) + 핸들러 최신화 패턴(useEffectEvent wrap, S8.3) 캡슐화 + 미래의 useSyncExternalStore로 내부 교체 가능(S8.5) + 테스트 가능성. (2) 탈락 — 인라인 Effect 유지: 컴포넌트 본문이 동기화 노이즈로 길어지고 의도 흐려짐 / useMount 같은 lifecycle wrapper로 추출: deps linter가 죽고 의도 잃음(S8.4). (3) 트레이드오프: 약간의 간접 지향(파일/호출 한 단계 더), 단일 사용처라 DRY 가치는 약함 — 그러나 의도 표현·핸들러 패턴 캡슐화·교체 가능성이 그 비용을 정당화.
S8.4는 'lifecycle wrapper나 Hook 미호출 함수'를 자제하라는 것이지 모든 단일 사용처를 금지하지 않는다. 핵심 채점 포인트는 LO-S9.3의 본질 — '왜 이 도구인가, 다른 선택지는 무엇이었나, 어떤 트레이드오프를 받아들였나'를 모두 답하는 것.
채점 rubric (4점 만점):
- 1점: 추출한 가치를 2개 이상 제시 (의도 캡슐화 / 핸들러 패턴 / 교체 가능성 / 테스트 중 2개)
- 1점: 다른 선택지(인라인 유지, lifecycle wrapper 등) 중 최소 1개를 비교하고 탈락 사유 제시
- 1점: 받아들인 트레이드오프(간접 지향, 단일 사용처라 DRY 약함 등)를 명시
- 1점: S8.4의 '단일 사용처 자제' 원칙이 lifecycle wrapper에 대한 것임을 구분하거나, 의도 캡슐화 가치가 DRY를 능가한다는 판단 근거 제시