본문 바로가기
에러 디버깅 & 리팩토링

Intersection Observer API 이용하여 무한스크롤 구현하기 / useEffect 의존성 배열 문제 해결하기

by growingTangerine 2023. 5. 29.

새로고침하여 페이지를 렌더링 했을 때, page 상태값이 초기값으로 설정한 1이 나오기를 기대했다. 

 

<문제 파악> 

그러나, 

이렇게 2가 나오는 에러가 발생했다. 

 

그런데, fetch 요청 시 URL 파라미터에 page를 넣어서 요청하는 로직으로 구성되어 있어 원하는 데이터를 요청하려면 이 page 상태값을 정확히 관리해주는 것이 필요했다. 

 

문제 원인은 렌더링 되자마자 observer를 설정하고 실행한 useEffect 훅이 작동하는 것으로 확인되었다. 그래서 그 안의 콜백함수에 작성된 setPage 코드가 실행되어 page의 상태값이 2로 업데이트 된 것이다.

 

<문제 해결> 

useEffect의 dependency array를 잘못 작성했었다. 

저기서 page, target으로 설정해주니, setPage 코드가 돌아가면서 계속 page 상태가 변경되고, 이로 인해 useEffect가 연속적으로 실행되었던 것이다. 

 

dependency array에 [] 빈 배열을 넣어주어, 처음 한 번만 작동되도록 수정해보았다.

페이지를 새로고침하자 page가 1, 즉 초기값으로 잘 나왔다.

그러나 또 다른 문제 발생... 

 

<문제 파악>

setPage 가 동작하지 않는다. 

div가 viewport에 관측되어 API 콜백 함수를 호출할 때마다, page 상태의 초기값만 찍히고 값이 업데이트 되지 않는 문제가 발생했다. 

 

문제를 해결하기 위해서는 useEffect의 동작 방식을 더 정확히 파악할 필요가 있다고 느껴졌다.

https://www.rinae.dev/posts/a-complete-guide-to-useeffect-ko

 

[번역] useEffect 완벽 가이드

Dan Abramov의 'A Complete Guide to useEffect 번역'

www.rinae.dev

이 글을 참고하여 useEffect에 대해 파헤친 후, 다시 돌아와서 에러를 해결해보도록 하겠음! 

 

<문제 해결> 

위 글을 참고하여 코드를 다시 본 결과, 수정한 코드는 맞았는데 console.log(page)를 찍어주는 위치 문제였음. 

 

dependency array가 빈 배열이기 때문에, 렌더링 시 이펙트는 업데이트 되지 않는다. 즉, 저 스코프 내에서 page 라는 상태는 항상 초기값이다. prevPage로 setPage를 호출해주기 때문에! 

 

해당 useEffect 밖에서 page를 콘솔에 찍어보니, 원래 의도한 동작대로 div가 관측될 시에 딱 한번만 page 를 1씩 증가시켜주고 있었다! 

 

<느낀 점>

useEffect가 리액트 런타임에서 어떠한 방식으로 작동하는지 시간이 오래 걸리더라도 차근차근 이해하는 것의 중요성을 크게 느꼈다. 

리액트 런타임과 더 친해지자!