본문으로 건너뛰기

React · Next.js 노트

React · Next.js 노트

Next.js 14.x / React 18.x 기준

app router 마이그레이션, 서버 컴포넌트, 하이드레이션 에러, 데이터 패칭 비교 등 실무에서 자주 부딪히는 함정을 before/after 비교 중심으로 정리했다.

Before / After 비교

잘못 쓰기 쉬운 패턴과 권장 패턴

잘못 쓰기 쉬운 패턴(before)과 권장 패턴(after)을 나란히 정리했다.

case / 01

useRouter import 위치

비교 자세히 보기
before
// pages router 시절
import { useRouter } from 'next/router';
after
// app router
import { useRouter } from 'next/navigation';

reasonapp router에서 `next/router`를 import하면 런타임 에러가 발생한다.

case / 02

서버 컴포넌트에서 이벤트 핸들러

비교 자세히 보기
before
// Server Component에서 onClick 사용 (불가)
export default function Page() {
  return <button onClick={() => {}}>클릭</button>;
}
after
// Client Component로 분리
'use client';
export default function Button() {
  return <button onClick={() => {}}>클릭</button>;
}

reason서버 컴포넌트는 이벤트 핸들러를 가질 수 없다. 인터랙션이 필요한 부분만 `'use client'`로 분리한다.

case / 03

useEffect 의존성 배열

비교 자세히 보기
before
useEffect(() => {
  fetchData(userId);
}, []); // userId 변경에 반응 안 함
after
useEffect(() => {
  fetchData(userId);
}, [userId]); // userId 변경 시 재실행

reason의존성 배열이 비어있으면 `userId`가 바뀌어도 재실행되지 않는다. ESLint `exhaustive-deps` 규칙이 경고를 잡아준다.

관련 데브로그 글

React · Next.js 관련 노트

글 읽기
아직 React · Next.js 관련 글이 없다. 데브로그 전체를 확인한다.

React · Next.js 자주 묻는 것들

자주 나오는 질문과 답

  • pages router도 Next.js 14에서 여전히 지원된다. 신규 프로젝트라면 app router 기준으로 시작하는 것이 낫다. 기존 프로젝트는 팀 상황에 따라 판단이 필요하다. 두 라우터를 혼용하는 것은 가능하지만 복잡도가 올라간다.