React Udemy 강의 178번 정리
이번 강의의 핵심은 한 가지,
"렌더링 중에 state를 바꾸면 왜 문제가 생기고, 그걸 useEffect로 어떻게 해결할까?"
사용자 위치를 가져와서 그 위치를 기준으로 장소 목록을 정렬. 그리고 그 결과를 state에 저장.
// 컴포넌트 함수 안
setAvailablePlaces(sortedPlaces);
이 코드가 컴포넌트 실행 중에 바로 실행됨.
즉, 렌더링 중에 side effect(state 변경)를 실행함.
렌더링과 직접적인 관련이 없는 작업을 말한다.
예를 들면, 데이터 fetch, 브라우저 API 사용(위치, localStorage 등), 타이머, interval 등등.
이런 작업은 렌더링 도중에 하면 안 됨.
useEffect(() => {
// side effect 코드
}, []);
useEffect 안의 코드는 컴포넌트가 렌더링된 이후에 실행됨.
즉, 렌더링 완료 후.
그래서 렌더링 중에 state를 바꾸는 문제가 사라짐.
[])이 중요할까?useEffect(() => {
// 위치 가져오고 state 업데이트
}, []);
| 의존성 배열 | 실행 시점 |
|---|---|
| 생략 | 모든 렌더링 후마다 실행 |
| [ ] | 최초 렌더링 후 1번만 실행 |
| [value] | value가 바뀔 때만 실행 |
이번 예제에서는 사용자 위치를 앱 시작 시 한 번만 필요로 하기 때문에 [] 사용함.
결과적으로 무한 루프에서 벗어나 최초 1번만 실행함.
React는 의존성 배열을 보고 판단함.
배열 안에 아무 값도 없으면 비교할 값이 없음.
즉, 바뀐 게 없음.
그렇다면, 다시 실행할 이유가 없음.
그래서 첫 렌더링 이후 딱 한 번만 실행하는 것.
<Places fallbackText="Sorting places by distance..." />
위치 정보 요청은 시간이 걸릴 수 있기 때문에 그동안 보여줄 UI가 필요함.
useEffect + fallback UI는 자연스러운 비동기 흐름.
useEffect는 렌더링과 무관한 작업(side effect)을 렌더링 이후 안전한 시점에 실행하도록 도와주는 훅이다.