[Next.js] ReferenceError: localStorage is not defined

이진혁·2023년 1월 24일
0

이슈

만족도 평가를 완료한 유저의 경우 만족도 평가 모달이 다시 뜨지 않도록 평가가 완료되면 localstorage에 isReviewed 라는 키값으로 true를 저장하는 로직을 작성하였다.

이후 페이지가 렌더링 될 때 localstorage에 있는 isReviewed를 가져와 만약 true라면 모달을 띄우지 않는 로직을 작성하였는데 위와 같이 ReferenceError가 발생.

원인

Next.js에서 제공하는 Server Side Rendering(SSR)에서는 window, document 같은 브라우저 전역 객체를 사용할 수 없기 때문.

따라서 우리는 페이지가 client가 로드되고 window 객체가 정의될 때까지 localStorage에 접근할 수 없다.

사실 조금만 생각해보면 당연히 에러가 날 상황인데 CSR에 익숙해서 그런지 에러를 만나버리고 말았다,,! ^,^

해결 방안

useEffect 사용

import { useEffect } from "react";

useEffect(() => {
  const isReviewed = localStorage.getItem('isReviewed')
}, [])

useEffect는 컴포넌트가 모두 렌더링 된 이후 실행하기 때문에 useEffect 안에 localstorage와 관련된 로직을 작성하면 안전하게 접근이 가능하다!


참고
https://github.com/vercel/next.js/discussions/19911
https://velog.io/@qhflrnfl4324/%EB%82%91%EA%B9%A1%ED%8C%9C08-js-cookie

profile
개발 === 99%의 노력과 1%의 기도

0개의 댓글