Next.js 신입 트러블슈팅 기술면접

Next.js 신입 · 취준 (0~1년) 트러블슈팅 10문항 조회수 51 · 2026-09-07 (월) 02:11:47
1 Hydration Error
Easy

Q. Next.js로 개발한 페이지를 배포했는데 브라우저 콘솔에 'Hydration failed because the initial UI does not match what was rendered on the server'라는 에러가 발생했습니다. 이 에러가 발생하는 원인과 해결 방법을 설명해주세요.

서버에서 렌더링된 HTML과 클라이언트에서 렌더링된 HTML이 일치하지 않을 때 발생하는 문제입니다.

A. 모범답안

Hydration 에러는 서버 사이드 렌더링(SSR) 시 생성된 HTML과 클라이언트에서 React가 다시 렌더링한 결과가 일치하지 않을 때 발생합니다. 주요 원인으로는 서버와 클라이언트에서 다른 값을 반환하는 Date.now()나 Math.random() 같은 함수 사용, window나 localStorage 같은 브라우저 전용 API 사용, 조건부 렌더링에서 서버/클라이언트 환경 차이 등이 있습니다. 해결 방법은 useEffect 훅 내부에서 클라이언트 전용 로직을 실행하거나, suppressHydrationWarning 속성을 사용하거나, 서버와 클라이언트에서 동일한 초기값을 사용하도록 수정하는 것입니다. 또한 개발자 도구의 콘솔에서 정확히 어떤 요소가 불일치하는지 확인하여 해당 부분을 수정해야 합니다.

핵심 포인트
  • • 서버와 클라이언트의 렌더링 결과 불일치가 원인
  • • 브라우저 전용 API나 랜덤 값 사용 시 발생
  • • useEffect 내부에서 클라이언트 전용 로직 실행으로 해결
답변에 넣으면 좋은 키워드
Hydration SSR useEffect suppressHydrationWarning 서버-클라이언트 불일치
실무에서는

시간 정보나 사용자별 개인화 콘텐츠를 표시하는 컴포넌트에서 자주 발생하는 문제입니다.

Follow-up 질문

suppressHydrationWarning을 사용할 때 주의해야 할 점은 무엇인가요?

2 Routing
Easy

Q. Next.js 프로젝트에서 페이지 이동 후 404 에러가 발생했습니다. 로컬 환경에서는 정상 작동하는데 Vercel에 배포 후 특정 페이지에서만 404가 나타납니다. 어떤 원인들을 확인해봐야 하나요?

파일명의 대소문자 구분과 파일 구조를 먼저 점검해보세요.

A. 모범답안

배포 환경에서만 404가 발생하는 경우 가장 흔한 원인은 파일명의 대소문자 문제입니다. Windows나 macOS는 파일명 대소문자를 구분하지 않지만 Linux 기반 서버는 구분하므로, 코드에서 'About.tsx'를 참조하는데 실제 파일명이 'about.tsx'인 경우 배포 시 404가 발생합니다. 또한 pages 폴더 구조가 올바른지, 동적 라우팅을 사용하는 경우 대괄호 파일명이 정확한지 확인해야 합니다. getStaticPaths를 사용하는 동적 페이지에서 fallback 설정이 적절한지도 점검해야 하며, 빌드 로그를 확인하여 해당 페이지가 정상적으로 생성되었는지 검증해야 합니다.

핵심 포인트
  • • 파일명 대소문자 구분 문제 확인
  • • 로컬과 배포 환경의 파일 시스템 차이
  • • 동적 라우팅 설정과 빌드 로그 검증
답변에 넣으면 좋은 키워드
404 대소문자 파일 시스템 동적 라우팅 getStaticPaths fallback
실무에서는

팀 협업 시 Windows와 Mac 사용자가 섞여있을 때 자주 발생하는 배포 이슈입니다.

Follow-up 질문

getStaticPaths의 fallback 옵션인 false, true, 'blocking'의 차이를 설명해주세요.

3 Image Optimization
Medium

Q. Next.js의 Image 컴포넌트를 사용했는데 이미지가 로드되지 않고 'Invalid src prop'이라는 경고가 나타납니다. 외부 URL의 이미지를 사용하고 있는데 어떻게 해결해야 하나요?

Next.js는 보안을 위해 외부 이미지 도메인을 명시적으로 허용해야 합니다.

A. 모범답안

Next.js Image 컴포넌트는 보안과 최적화를 위해 외부 도메인의 이미지를 기본적으로 차단합니다. next.config.js 파일에서 images.domains 또는 images.remotePatterns 설정을 통해 허용할 도메인을 명시해야 합니다. Next.js 12.3 이후 버전에서는 remotePatterns가 권장되며, 프로토콜, 호스트명, 경로 패턴을 더 세밀하게 제어할 수 있습니다. 설정 변경 후에는 개발 서버를 재시작해야 적용되며, 배포 환경에서는 재빌드가 필요합니다. 또한 이미지 src가 올바른 URL 형식인지, width와 height 속성이 제공되었는지도 함께 확인해야 합니다.

핵심 포인트
  • • next.config.js에서 외부 도메인 허용 설정 필요
  • • remotePatterns 사용이 권장됨
  • • 설정 변경 후 서버 재시작 필수
답변에 넣으면 좋은 키워드
Image 컴포넌트 next.config.js remotePatterns domains 외부 이미지
실무에서는

외부 CDN이나 S3 버킷의 이미지를 사용하는 프로젝트에서 초기 설정 시 반드시 필요한 작업입니다.

Follow-up 질문

Image 컴포넌트의 layout 속성 중 fill, responsive, intrinsic의 차이는 무엇인가요?

4 API Routes
Easy

Q. Next.js의 API Routes를 만들어 테스트하는데 POST 요청 시 500 에러가 발생하고 'API resolved without sending a response'라는 경고가 나타납니다. 이 문제의 원인과 해결 방법을 설명해주세요.

API 핸들러 함수에서 응답을 보내는 것을 잊었거나, 비동기 처리가 완료되기 전에 함수가 종료되었을 수 있습니다.

A. 모범답안

이 에러는 API 라우트 핸들러 함수가 클라이언트에게 응답을 보내지 않고 종료될 때 발생합니다. 주요 원인은 res.json()이나 res.send() 같은 응답 메서드를 호출하지 않았거나, 비동기 함수에서 await 키워드를 빼먹어 Promise가 완료되기 전에 함수가 종료되는 경우입니다. 해결 방법은 모든 코드 경로에서 반드시 res.status().json() 등의 응답을 보내도록 하고, async/await을 올바르게 사용하며, try-catch 블록에서 에러 발생 시에도 응답을 보내도록 처리하는 것입니다. 또한 조건문의 모든 분기에서 응답이 전송되는지 확인해야 합니다.

핵심 포인트
  • • API 핸들러에서 응답을 보내지 않아 발생
  • • 모든 코드 경로에서 res 응답 메서드 호출 필요
  • • 비동기 처리 시 await 키워드 필수
답변에 넣으면 좋은 키워드
API Routes res.json 응답 처리 async/await 에러 핸들링
실무에서는

백엔드 API를 Next.js로 통합할 때 초기 개발 단계에서 자주 마주치는 문제입니다.

Follow-up 질문

API Routes에서 CORS 에러가 발생할 때는 어떻게 해결하나요?

5 Build & Deploy
Medium

Q. Next.js 프로젝트를 빌드했는데 'Module not found' 에러가 발생하면서 빌드가 실패합니다. 로컬 개발 환경에서는 정상 작동하는데 빌드 시에만 에러가 발생합니다. 어떤 원인들을 체크해야 하나요?

import 경로의 정확성과 의존성 패키지 설치 상태를 확인해보세요.

A. 모범답안

빌드 시에만 발생하는 Module not found 에러는 여러 원인이 있습니다. 첫째, import 경로에서 파일 확장자를 생략했거나 상대 경로가 잘못된 경우입니다. 둘째, 패키지가 devDependencies에만 설치되어 있고 프로덕션 빌드 시 포함되지 않은 경우입니다. 셋째, node_modules 폴더가 .gitignore에 포함되어 배포 환경에서 npm install이 제대로 실행되지 않은 경우입니다. 넷째, 클라이언트 코드에서 Node.js 전용 모듈을 import하려고 시도하는 경우입니다. 해결을 위해서는 에러 메시지에서 정확한 모듈명을 확인하고, package.json의 dependencies를 점검하며, 빌드 환경에서 npm ci 명령으로 깨끗하게 재설치해봐야 합니다.

핵심 포인트
  • • import 경로와 파일 확장자 확인
  • • dependencies와 devDependencies 구분
  • • 클라이언트와 서버 환경의 모듈 사용 차이
답변에 넣으면 좋은 키워드
Module not found 빌드 에러 dependencies import 경로 node_modules
실무에서는

CI/CD 파이프라인에서 자동 배포 시 자주 발생하는 빌드 실패 원인입니다.

Follow-up 질문

Next.js에서 서버 전용 코드와 클라이언트 코드를 분리하는 방법은 무엇인가요?

6 Data Fetching
Medium

Q. getServerSideProps에서 외부 API를 호출하는데 간헐적으로 페이지 로딩이 매우 느리거나 타임아웃 에러가 발생합니다. 이 문제를 어떻게 디버깅하고 해결할 수 있나요?

API 응답 시간, 에러 처리, 그리고 대안적인 데이터 페칭 방법을 고려해보세요.

A. 모범답안

getServerSideProps의 성능 문제는 외부 API 의존성 때문에 발생합니다. 먼저 콘솔에 API 호출 시작과 종료 시간을 로깅하여 정확한 응답 시간을 측정해야 합니다. try-catch 블록으로 에러를 잡아 로깅하고, API 실패 시에도 페이지가 렌더링되도록 fallback 데이터를 제공해야 합니다. 근본적인 해결책으로는 getStaticProps + revalidate를 사용해 ISR(Incremental Static Regeneration)로 전환하거나, 클라이언트 사이드에서 SWR이나 React Query로 데이터를 가져오는 방법을 고려할 수 있습니다. 또한 외부 API에 타임아웃 설정을 추가하고, 캐싱 전략을 도입하여 반복 호출을 줄여야 합니다.

핵심 포인트
  • • API 응답 시간 측정과 에러 로깅
  • • fallback 데이터 제공으로 사용자 경험 보호
  • • ISR이나 클라이언트 사이드 페칭으로 전환 고려
답변에 넣으면 좋은 키워드
getServerSideProps 타임아웃 ISR SWR 에러 처리 캐싱
실무에서는

외부 API 서버의 불안정성이 사용자 경험에 직접 영향을 미치는 상황에서 중요한 문제입니다.

Follow-up 질문

getServerSideProps와 getStaticProps 중 어떤 상황에서 무엇을 선택해야 하나요?

7 Environment Variables
Easy

Q. Next.js 프로젝트에서 .env.local 파일에 API 키를 저장했는데, 브라우저에서 process.env.API_KEY로 접근하면 undefined가 나옵니다. 어떻게 해결해야 하나요?

Next.js에서 클라이언트에 노출할 환경 변수는 특별한 접두사가 필요합니다.

A. 모범답안

Next.js에서 환경 변수는 기본적으로 서버 사이드에서만 접근 가능합니다. 클라이언트(브라우저)에서 접근하려면 변수명 앞에 NEXT_PUBLIC_ 접두사를 붙여야 합니다. 예를 들어 NEXT_PUBLIC_API_KEY로 선언하면 브라우저에서 process.env.NEXT_PUBLIC_API_KEY로 접근할 수 있습니다. 단, 이렇게 노출된 환경 변수는 빌드 타임에 번들에 포함되어 클라이언트에 완전히 노출되므로, 민감한 정보(비밀 키, 토큰 등)는 절대 NEXT_PUBLIC_을 붙이면 안 됩니다. 민감한 API 호출은 API Routes를 통해 서버 사이드에서 처리해야 합니다. 환경 변수 변경 후에는 개발 서버를 재시작해야 적용됩니다.

핵심 포인트
  • • 클라이언트 노출 환경 변수는 NEXT_PUBLIC_ 접두사 필요
  • • 민감한 정보는 NEXT_PUBLIC_ 사용 금지
  • • 변경 후 서버 재시작 필수
답변에 넣으면 좋은 키워드
환경 변수 NEXT_PUBLIC_ process.env .env.local 보안
실무에서는

API 키나 설정값을 안전하게 관리하면서도 필요한 곳에서 접근 가능하게 하는 기본적인 보안 실무입니다.

Follow-up 질문

.env.local과 .env.production의 차이는 무엇인가요?

8 Performance
Medium

Q. Next.js 앱에서 페이지 전환 시 깜빡임이 발생하고, 이전 페이지의 스타일이 잠깐 보이는 현상이 있습니다. CSS-in-JS 라이브러리(styled-components)를 사용하고 있는데 어떻게 해결하나요?

서버 사이드 렌더링 시 스타일을 함께 렌더링하는 설정이 필요합니다.

A. 모범답안

styled-components 같은 CSS-in-JS 라이브러리를 Next.js에서 사용할 때는 서버 사이드 렌더링 설정이 필요합니다. _document.js 파일을 생성하고 ServerStyleSheet을 사용해 서버에서 스타일을 수집하여 초기 HTML에 포함시켜야 합니다. next.config.js에 compiler.styledComponents: true 옵션을 추가하면 Next.js 12 이후 버전에서는 SWC 컴파일러가 자동으로 처리해줍니다. 또한 babel-plugin-styled-components를 설치하고 .babelrc 설정이 필요할 수 있습니다. 깜빡임은 클라이언트에서 스타일이 다시 주입되는 과정에서 발생하므로, 서버와 클라이언트의 스타일 렌더링을 일치시키는 것이 핵심입니다. 최신 프로젝트에서는 Tailwind CSS나 CSS Modules 같은 대안도 고려할 수 있습니다.

핵심 포인트
  • • _document.js에서 서버 사이드 스타일 수집
  • • next.config.js에 styledComponents 컴파일러 옵션 설정
  • • 서버-클라이언트 스타일 일치가 핵심
답변에 넣으면 좋은 키워드
styled-components CSS-in-JS _document.js ServerStyleSheet FOUC SWC
실무에서는

디자인 시스템을 styled-components로 구축한 프로젝트에서 SSR 환경 설정 시 필수적으로 해결해야 하는 문제입니다.

Follow-up 질문

Next.js에서 CSS Modules과 CSS-in-JS의 장단점을 비교해주세요.

9 Link & Navigation
Easy

Q. Next.js에서 Link 컴포넌트로 페이지 이동 시 스크롤 위치가 상단으로 이동하지 않고 이전 페이지의 스크롤 위치를 유지하는 문제가 발생했습니다. 어떻게 해결하나요?

Next.js는 기본적으로 스크롤 복원 기능을 제공하지만, 특정 상황에서는 수동 처리가 필요합니다.

A. 모범답안

Next.js는 기본적으로 페이지 이동 시 스크롤을 최상단으로 이동시키지만, 브라우저 히스토리 이동(뒤로가기/앞으로가기) 시에는 이전 스크롤 위치를 복원합니다. 의도적으로 스크롤을 제어하려면 Link 컴포넌트의 scroll 속성을 사용할 수 있습니다. scroll={false}로 설정하면 자동 스크롤이 비활성화되고, 필요시 useEffect에서 window.scrollTo(0, 0)로 수동 제어할 수 있습니다. 또한 next.config.js의 scrollRestoration 옵션으로 전역 동작을 변경하거나, router.push의 두 번째 인자에 scroll 옵션을 전달할 수도 있습니다. 특정 앵커로 이동하려면 hash를 URL에 포함시키면 됩니다.

핵심 포인트
  • • Link 컴포넌트의 scroll 속성으로 제어
  • • 기본 동작은 페이지 이동 시 상단 스크롤
  • • 히스토리 이동 시에는 위치 복원
답변에 넣으면 좋은 키워드
Link scroll 스크롤 복원 router.push useEffect
실무에서는

사용자 경험을 개선하기 위해 페이지 전환 시 스크롤 동작을 세밀하게 제어해야 하는 상황에서 사용됩니다.

Follow-up 질문

페이지 전환 시 로딩 인디케이터를 보여주려면 어떻게 해야 하나요?

10 Memory Leak
Medium

Q. Next.js 개발 서버를 오래 실행하다 보면 점점 느려지고 메모리 사용량이 계속 증가합니다. Fast Refresh를 사용하는데 이 문제를 어떻게 해결하거나 완화할 수 있나요?

개발 환경의 Hot Module Replacement와 메모리 누수 패턴을 확인해보세요.

A. 모범답안

개발 서버의 메모리 증가는 Fast Refresh(HMR) 사용 시 자주 발생하는 현상입니다. 주요 원인은 컴포넌트에서 정리되지 않은 이벤트 리스너, setInterval/setTimeout, 구독(subscription) 등이 페이지 수정 시 계속 쌓이는 것입니다. useEffect의 cleanup 함수에서 모든 구독을 해제하고 타이머를 정리해야 합니다. 또한 전역 변수나 모듈 레벨 캐시가 계속 쌓이는지 확인하고, 개발 중에는 주기적으로 서버를 재시작하는 것도 방법입니다. node --max-old-space-size 옵션으로 Node.js 메모리 제한을 늘릴 수 있지만 근본 해결책은 아닙니다. Chrome DevTools의 Memory 프로파일러나 Node.js의 --inspect 옵션으로 메모리 누수를 분석할 수 있습니다.

핵심 포인트
  • • useEffect cleanup 함수에서 리소스 정리
  • • 이벤트 리스너와 타이머 해제 필수
  • • 개발 중 주기적 서버 재시작
답변에 넣으면 좋은 키워드
메모리 누수 Fast Refresh cleanup useEffect 이벤트 리스너 HMR
실무에서는

장시간 개발 작업 시 개발 생산성을 유지하기 위해 메모리 관리가 중요합니다.

Follow-up 질문

useEffect의 cleanup 함수가 실행되는 시점은 언제인가요?

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!