모범답안:
(1) **useSyncExternalStore** — navigator.onLine은 React 외부 store. 두 컴포넌트가 같은 hook(useOnlineStatus)을 호출하면 React가 tearing 없이 일관성을 보장하고, getServerSnapshot으로 SSR도 안전. 수동 useEffect+addEventListener는 #11 안티패턴.
(2) **이벤트 핸들러** — 둘 다 '메뉴 클릭 때문에' 발생하는 인터랙션 결과. 한 핸들러에서 navigate(...)와 trackEvent(...)를 함께 호출. 분석을 Effect에 두면 리로드/뒤로가기 같은 표시 트리거에서도 발화하는 #6 안티패턴.
(3) **state-during-render(2순위)** 또는 **derived(가능하면 1순위)** — 부분 조정. const [prevSort, setPrevSort] = useState(sort); if (sort !== prevSort) { setPrevSort(sort); setPage(1); }. page를 derived로 만들 수 없다면(사용자가 직접 페이지를 넘기는 state) state-during-render가 적절. Effect로 setPage(1)을 부르면 #4 안티패턴.
채점 기준:- criteria
- full_credit
- partial_credit