Next.js SSR 환경에서 'window is not defined' 오류 해결과 Isomorphic 코드 작성법
🤖 AI 추천
Next.js와 같은 SSR 프레임워크를 사용하며 'window is not defined' 또는 Hydration Mismatch 오류를 경험한 프론트엔드 개발자에게 유용한 정보입니다.
🔖 주요 키워드

Next.js SSR 환경에서 'window is not defined' 오류 해결과 Isomorphic 코드 작성법
핵심 기술
본 콘텐츠는 Next.js와 같은 서버 사이드 렌더링(SSR) 프레임워크 사용 시 발생하는 ReferenceError: window is not defined
오류의 원인을 설명하고, 브라우저와 서버 환경의 차이를 극복하기 위한 Isomorphic 코드 작성 방식을 제시합니다.
기술적 세부사항
- SSR의 기본 이해: SSR은 서버에서 React 컴포넌트를 실행하여 완성된 HTML을 생성하고 브라우저에 전달하여 초기 로딩 속도 및 SEO에 유리합니다.
- 오류 발생 원인: SSR은 Node.js 기반 서버 환경에서 실행되며, 이 환경에는
window
,document
와 같은 브라우저 전용 객체가 존재하지 않기 때문에 발생합니다.- 예시:
const name = new URL(location.href).searchParams.get('name');
(SSR 환경에서location is not defined
에러 발생)
- 예시:
- Hydration과 Hydration Mismatch: SSR로 전달된 HTML에 클라이언트 측 JavaScript 로직과 상태를 연결하는 과정을 Hydration이라고 합니다. 서버와 클라이언트의 데이터 또는 렌더링 결과가 일치하지 않으면
Warning: Text content did not match
(Hydration Mismatch) 경고가 발생합니다. - SSR 실행 흐름:
- 서버에서 React 컴포넌트 실행 -> HTML 문자열 생성.
- 필요한 초기 상태(props)를 JSON으로 직렬화하여
<script id="__NEXT_DATA__">
에 포함. - 브라우저가 HTML 렌더링 후, 직렬화된 데이터로
ReactDOM.hydrate()
실행. - 클라이언트가 동일한 구조의 가상 DOM 생성 및 상호작용 가능한 React 앱으로 전환.
- Isomorphic 코드: 서버와 클라이언트 양쪽 환경 모두에서 동일하게 실행될 수 있는 코드를 작성하여 SSR 관련 오류를 방지하고 일관된 렌더링을 보장합니다.
getServerSideProps
예시: 서버에서new Date()
를 사용하여serverTime
을 생성하고 props로 전달하여 클라이언트와 UI 일치성을 보장합니다.- 오류 발생 예시: 클라이언트에서만
new Date()
를 사용하여now
값을 생성하면 서버와 클라이언트의 렌더링 결과가 달라져 Hydration mismatch 발생 가능성이 있습니다.
개발 임팩트
- SSR 환경에서 흔히 발생하는 브라우저 환경 의존성 오류를 효과적으로 예방할 수 있습니다.
- 서버와 클라이언트 간의 렌더링 일관성을 유지하여 사용자 경험을 개선하고 디버깅 시간을 단축합니다.
- SSR의 장점(빠른 초기 로딩, SEO)을 극대화하면서 안정적인 애플리케이션을 구축할 수 있습니다.
커뮤니티 반응
(본문 내용에 커뮤니티 반응에 대한 직접적인 언급은 없습니다.)
📚 관련 자료
Next.js
Next.js 프레임워크 자체이며, 본문에서 설명하는 SSR, `getServerSideProps`, Hydration 등의 핵심 개념들이 구현되고 사용되는 곳입니다.
관련도: 98%
React
React는 Next.js의 기반 라이브러리로, 컴포넌트 렌더링 및 Hydration 로직의 근간을 이룹니다. 본문에서 언급된 `ReactDOM.hydrate()` 등이 React와 관련이 깊습니다.
관련도: 90%
Node.js
SSR이 실행되는 서버 환경의 기반이 되는 런타임입니다. Node.js 환경에서 `window` 객체가 없는 것이 오류의 근본 원인이므로 관련성이 높습니다.
관련도: 70%