Q8
Evaluate
short_answer
다음 ChatRoom 컴포넌트에 대해, 어느 전략 조합을 적용할지 결정하고 가독성·캡슐화·마이그레이션 비용 3축으로 트레이드오프를 정당화하시오. (호출부는 5곳, 팀은 안정 API만 선호하지만 useEffectEvent 사용은 허용)
function Form({ initialValues, onSubmit }) {
useEffect(() => {
reset(initialValues);
register(onSubmit);
}, [initialValues, onSubmit]);
}
// 부모: <Form initialValues={{ name: '' }} onSubmit={(d) => save(d)} />
모범 답안 윤곽: (1) initialValues 객체 prop은 매 렌더 새 참조 → 호출부가 5곳뿐이라면 전략 6(원시값 분해, 예: name/email prop으로 평탄화)이 가장 정직 — 마이그레이션 비용은 5곳 수정으로 감당 가능하고 캡슐화도 명확. 호출부가 더 많거나 필드가 가변적이면 전략 2(Effect 안에서 객체 생성)로 자식에 흡수. (2) onSubmit 인라인 함수 prop도 매 렌더 새 참조 → 전략 4(useEffectEvent로 wrap)이 호출부에 영향 없이 캡슐화 ↑. 다만 useEffectEvent의 'Effect 안에서만 호출' 제약을 지킬 것. 결론: 전략 6 + 전략 4 조합. 트레이드오프: 가독성 ↑(deps가 [name] 같은 원시값으로 의도가 명확), 캡슐화 ↑(자식이 reset/register 책임 흡수), 마이그레이션 비용 보통(호출부 5곳 prop 변경).
채점 rubric (4점 만점):
- 1점: initialValues가 매 렌더 새 참조라는 원인 식별
- 1점: onSubmit이 매 렌더 새 참조라는 원인 식별
- 1점: 적절한 전략(6 또는 2 + 4) 명시 및 그 선택 근거 제시
- 1점: 가독성/캡슐화/마이그레이션 비용 3축 중 최소 2축에 대한 비교 언급