정답: 분리된 두 Effect 작성 + 각 deps 근거모범 답안:
```js
useEffect(() => {
const onResize = () => setSize(window.innerWidth);
window.addEventListener('resize', onResize);
return () => window.removeEventListener('resize', onResize);
}, []); // reactive 값을 안 읽으므로 재동기화 불필요
useEffect(() => {
const c = createConnection(serverUrl, roomId);
c.connect();
return () => c.disconnect();
}, [roomId]); // roomId(reactive)가 바뀔 때마다 재연결
```
resize 리스너는 어떤 reactive 값도 읽지 않으므로 [], 채팅 연결은 reactive prop인 roomId를 읽으므로 [roomId].
채점 기준:- [1점] 두 개의 별도 useEffect로 분리되어 있다 (한 Effect = 한 동기화).
- [1점] resize Effect의 deps가 [] 이고 cleanup으로 removeEventListener를 호출한다.
- [1점] 채팅 Effect의 deps가 [roomId] 이고 cleanup으로 disconnect를 호출한다.
- [1점] 각 deps의 근거가 reactive/non-reactive 분류로 설명되어 있다(특히 [] 가 '재동기화 불필요'의 의미라는 점).
- 감점: 두 Effect를 하나로 둔 경우, eslint-disable로 처리한 경우, ref.current/모듈 상수를 deps에 넣은 경우.