본문으로 건너뛰기

안동민 개발노트

본문 시작

유용한 Next.js 라이브러리 소개

인증·상태·UI·폼·데이터베이스 요구사항과 서버·클라이언트 실행 위치를 기준으로 보조 라이브러리를 선택합니다.

Next.js는 React 기반 프레임워크이지만, 실제 프로덕션 수준의 애플리케이션을 구축하려면 다양한 외부 라이브러리 및 도구의 도움이 필요합니다.

Next.js 프로젝트에서는 인증, 상태 관리, UI, 데이터 페칭, 유효성 검사 같은 요구사항에 맞춰 외부 라이브러리를 함께 검토해야 합니다.

이 절에서는 Next.js 프로젝트의 생산성과 효율성을 극대화하는 데 유용한 핵심 라이브러리들을 카테고리별로 소개하고, 각 라이브러리의 주요 기능과 Next.js 환경에서의 활용 팁을 제시합니다.

먼저 라이브러리를 이름으로 외우기보다 요구사항과 실행 위치 기준으로 나눠 봅니다.

Next.js 라이브러리는 기능 요구와 실행 위치를 먼저 보고 고른다

인증, 상태, UI, 데이터, 폼, DB 라이브러리는 모두 같은 기준으로 고르지 않는다. 서버/클라이언트 경계와 유지 비용을 함께 본다.

요구사항대표 선택지주로 실행되는 곳선택 기준
인증·세션Auth.js, ClerkServer Component, Proxy, Route Handlerprovider, 세션 전략, 보호할 route 범위
클라이언트 상태Zustand, JotaiClient Component전역 UI 상태인지 atom 단위 상태인지
서버 상태TanStack Query, SWRClient Component + 서버 API캐시, 재검증, mutation 복잡도
UI·스타일Tailwind, Radix UI, shadcn/ui컴포넌트 계층디자인 시스템, 접근성, 커스터마이징
폼·검증React Hook Form, ZodClient Form + Server Action입력 UX, 런타임 검증, 타입 공유
DB 접근Prisma, Mongoose서버 전용 코드관계형/문서형 모델, 타입 안정성

인증 (Authentication)

인증 라이브러리는 provider 목록보다 세션을 어디서 읽고 어떤 경계를 보호할지 먼저 정해야 합니다.

인증은 Provider보다 세션 위치와 서버 보호 경계를 먼저 정한다

로그인 버튼만 붙이는 문제가 아니다. Server Component에서 세션을 읽고, Proxy에서 진입을 선별하며, Server Action과 Route Handler에서 권한을 다시 확인한다.

결정 항목Auth.js에서 보는 것Next.js 연결 지점주의할 점
로그인 방식OAuth Provider, CredentialsAuth.js handlers, callback URLProvider callback URL과 AUTH_* 환경 변수의 정합성
세션 전략JWT 또는 Database Sessionauth(), jwt/session callbacks쿠키 크기, 만료, 서버 조회 비용
페이지 보호authorized callbackproxy.ts matcher정적 자산과 공개 페이지를 잘못 막지 않기
서버 데이터 접근auth()Server Component, Server Action, Route Handler클라이언트 세션만 믿고 서버 권한을 생략하지 않기
운영 추적events, loggerRuntime Logs, monitoring인증 실패 이유와 개인정보 노출을 분리

사용자 로그인, 회원가입, 세션 관리 등은 모든 웹 애플리케이션에 필수적인 기능입니다.

  • Auth.js
    • 설명: Next.js 애플리케이션을 위한 강력하고 유연한 오픈 소스 인증 솔루션입니다. Google, GitHub, Kakao 등 다양한 소셜 로그인 제공자(Provider)를 쉽게 통합할 수 있으며, 이메일/비밀번호, 자격 증명(Credential) 기반 로그인도 지원합니다. 세션 관리, JWT(JSON Web Tokens), OAuth 같은 복잡한 인증 로직을 추상화해 개발자가 인증 구현에 드는 노력을 최소화합니다.
    • Next.js 활용 팁: App Router에서 src/auth.ts가 내보낸 handlers를 인증 라우트에 연결하고, 서버 컴포넌트와 라우트 핸들러에서는 auth()로 세션을 확인합니다.
    • 설치: 아래의 v5 auth() 예제를 사용하려면 npm install next-auth@beta로 설치합니다.
    • 링크: https://authjs.dev/

상태 관리 (State Management)

클라이언트 컴포넌트에서 복잡한 전역 상태를 효율적으로 관리하기 위한 라이브러리들입니다.

  • Zustand
    • 설명: 작고 빠르며 확장 가능한 상태 관리 라이브러리입니다. 비교적 적은 코드로 스토어를 정의하고 업데이트하며, 미들웨어와 개발자 도구 연동도 가능합니다.
    • Next.js 활용 팁: use client 지시문이 있는 클라이언트 컴포넌트에서만 사용 가능합니다. Context API와 결합하여 사용할 수도 있습니다.
    • 설치: npm install zustand
    • 링크: https://zustand-demo.pmnd.rs/
  • Jotai
    • 설명: Zustand와 유사하게 작고 원자적인(atomic) 상태 관리를 지향하는 라이브러리입니다. React의 useState와 유사한 atom 개념을 사용하여 상태를 정의하며, 최소한의 리렌더링을 보장합니다.
    • Next.js 활용 팁: 마찬가지로 클라이언트 컴포넌트에서 사용됩니다. Suspense와 React Concurrent Features와 잘 통합됩니다.
    • 설치: npm install jotai
    • 링크: https://jotai.org/
  • React Query (TanStack Query)
    • 설명: 서버 상태(Server State) 관리에 특화된 라이브러리입니다. 데이터 페칭, 캐싱, 동기화, 업데이트 등 비동기 데이터와 관련된 복잡한 작업을 선언적으로 처리합니다. 로딩, 에러, 성공 상태를 자동으로 관리해주어 불필요한 보일러플레이트 코드를 줄여줍니다.
    • Next.js 활용 팁: Next.js의 SSR/SSG 환경에서 데이터를 미리 페칭하고, 클라이언트에서 하이드레이션(Hydration)하여 사용자 경험을 개선할 수 있습니다. app 라우터에서는 서버 컴포넌트에서 데이터를 페칭하고 클라이언트 컴포넌트에서 React Query를 활용하여 추가 데이터 관리 및 UI 업데이트를 처리하는 방식이 일반적입니다.
    • 설치: npm install @tanstack/react-query
    • 링크: https://tanstack.com/query/latest
  • SWR
    • 설명: Vercel에서 개발한 데이터 페칭 라이브러리로, React Query와 유사하게 서버 상태 관리에 사용됩니다. stale-while-revalidate 전략을 사용하여 캐시된 데이터를 즉시 반환하고 백그라운드에서 최신 데이터를 다시 가져와 업데이트합니다.
    • Next.js 활용 팁: React Query와 마찬가지로 Next.js의 데이터 페칭 패턴과 잘 통합됩니다.
    • 설치: npm install swr
    • 링크: https://swr.vercel.app/ko

UI 컴포넌트 및 스타일링

아름답고 반응성 있는 UI를 빠르게 구축하는 데 도움을 주는 라이브러리들입니다.

  • Tailwind CSS
    • 설명: 유틸리티 우선(Utility-first) CSS 프레임워크입니다. 작은 단위의 유틸리티 클래스를 조합하고 CSS의 @theme에서 디자인 토큰을 선언합니다.
    • Next.js 활용 팁: Tailwind CSS 4에서는 @tailwindcss/postcss를 PostCSS 플러그인으로 등록하고 전역 CSS에 @import "tailwindcss";를 작성합니다. 일반적인 프로젝트에는 별도의 content 배열이나 Purge 설정이 필요하지 않습니다.
    • 설치: npm install -D tailwindcss @tailwindcss/postcss postcss
    • 링크: https://tailwindcss.com/
  • Chakra UI
    • 설명: 접근성(Accessibility)에 중점을 둔 React 컴포넌트 라이브러리입니다. 버튼, 폼, 다이얼로그 같은 컴포넌트와 일관된 스타일 속성·레시피를 제공합니다.
    • Next.js 활용 팁: Chakra UI 3의 CLI snippet이 생성하는 Provider를 App Router의 layout.tsx에 배치합니다. 이 Provider는 Chakra 설정과 next-themes 기반 색상 모드를 묶습니다. Turbopack에서 Emotion 하이드레이션 불일치가 보이면 공식 Next.js 가이드에 따라 Webpack 개발 모드로 재현 여부를 확인합니다.
    • 설치: npm install @chakra-ui/react @emotion/reactnpx @chakra-ui/cli snippet add
    • 링크: https://chakra-ui.com/
  • Radix UI
    • 설명: CSS 프레임워크나 디자인 시스템에 종속되지 않는 저수준(low-level) UI 컴포넌트 프리미티브(Primitive) 라이브러리입니다. Headless UI로, 컴포넌트의 논리와 접근성에만 집중하며 스타일은 개발자가 직접 정의할 수 있습니다.
    • Next.js 활용 팁: 개발자가 원하는 어떤 스타일링 방식(CSS Modules, Tailwind CSS, styled-components 등)과도 함께 사용할 수 있습니다.
    • 설치: npm install @radix-ui/react-<component-name> (예: @radix-ui/react-dialog)
    • 링크: https://www.radix-ui.com/

폼 유효성 검사 (Form Validation)

사용자 입력 폼의 유효성을 검사하고 관리하는 데 사용됩니다.

  • React Hook Form
    • 설명: React 폼 관리를 위한 고성능 라이브러리입니다. 적은 리렌더링, 쉬운 유효성 검사 통합(Zod, Yup 등), 그리고 적은 코드량으로 복잡한 폼을 처리할 수 있습니다. useForm 훅을 통해 폼 상태와 유효성 검사 로직을 효율적으로 관리합니다.
    • Next.js 활용 팁: 클라이언트 컴포넌트에서 폼을 정의할 때 주로 사용합니다. Server Actions와 함께 사용할 경우, 클라이언트 측에서 1차 유효성 검사를 수행하고 서버 측에서 2차 검사를 통해 데이터 무결성을 확보할 수 있습니다.
    • 설치: npm install react-hook-form
    • 링크: https://react-hook-form.com/
  • Zod
    • 설명: TypeScript 우선 스키마 유효성 검사 라이브러리입니다. 런타임에 TypeScript 타입을 정의하고, 이를 기반으로 데이터의 유효성을 검사합니다. React Hook Form, Next.js Server Actions 등과 함께 사용하여 프론트엔드와 백엔드 모두에서 데이터의 형태와 유효성을 강력하게 보장할 수 있습니다.
    • Next.js 활용 팁: Server Actions의 입력값 유효성 검사에 Zod 스키마를 사용하여 안정적인 데이터 처리를 구현할 수 있습니다. 클라이언트 컴포넌트에서도 React Hook Form의 resolver로 Zod를 사용할 수 있습니다.
    • 설치: npm install zod
    • 링크: https://zod.dev/

데이터베이스 ORM/ODM

데이터베이스 접근 라이브러리는 데이터 모델, 타입 안정성, 서버 런타임 경계를 함께 보고 선택합니다.

DB 접근 라이브러리는 데이터 모델과 서버 런타임 경계를 기준으로 고른다

Prisma와 Mongoose는 역할이 다르다. 관계형 스키마, 문서 모델, 타입 안전성, 서버리스 연결 방식을 함께 비교한다.

상황잘 맞는 선택Next.js 사용 위치확인할 비용
PostgreSQL/MySQL 중심Prismaserver action, route handler, server componentmigration, query 성능, connection 관리
MongoDB 문서 모델MongooseAPI route, server actionschema 변경, validation, 모델 재사용
타입 안전한 쿼리 우선Prisma Client서버 전용 lib/db.ts생성 코드, edge runtime 제약
직접 SQL 최적화 필요SQL builder 또는 raw query서버 데이터 계층SQL 인젝션 방어, 테스트 부담
서버리스 트래픽 증가pool/proxy 전략 동반배포 환경 DB 연결cold start, connection limit, timeout

데이터베이스와 애플리케이션 간의 상호작용을 돕는 라이브러리입니다.

  • Mongoose
    • 설명: Node.js 환경에서 MongoDB를 위한 객체 데이터 모델링(ODM) 라이브러리입니다. 스키마 기반으로 데이터를 정의하고, 데이터 유효성 검사, 쿼리 빌더, 미들웨어 등 다양한 기능을 제공하여 MongoDB 사용을 편리하게 합니다.
    • Next.js 활용 팁: Route Handler, 서버 컴포넌트와 Server Actions에서 MongoDB를 사용할 때 연결 로직은 lib/db.ts 같은 서버 전용 모듈로 분리합니다.
    • 설치: npm install mongoose
    • 링크: https://mongoosejs.com/
  • Prisma
    • 설명: 차세대 Node.js 및 TypeScript ORM(객체 관계형 매핑)입니다. 데이터베이스 스키마를 정의하고 이를 기반으로 타입 세이프한 쿼리를 자동으로 생성합니다. PostgreSQL, MySQL, SQLite 등 다양한 관계형 데이터베이스를 지원합니다.
    • Next.js 활용 팁: Route Handler, 서버 컴포넌트와 Server Actions의 데이터 계층에서 사용합니다. 생성된 Prisma Client의 타입을 서버 경계까지 유지합니다.
    • 설치: npm install prisma @prisma/clientnpx prisma init
    • 링크: https://www.prisma.io/

다음 다이어그램은 요구사항을 먼저 분류하고 그에 맞는 라이브러리 범주를 고르는 선택 기준입니다.

요구사항을 먼저 분류해야 라이브러리 후보가 좁혀진다

유명한 패키지부터 설치하면 역할이 겹친다. 기능 요구를 상태, 데이터, 검증, UI, 운영 기준으로 나눈 뒤 후보를 고른다.

사용자 요구기술 범주후보고르기 전 질문
로그인 후 개인 페이지AuthenticationAuth.js, Clerk세션을 서버에서 읽어야 하는가
검색어 입력 후 목록 갱신Server stateTanStack Query, SWR, use-debounce캐시와 재검증이 필요한가
모달, 필터, 임시 선택값Client stateZustand, JotaiURL이나 서버에 저장할 상태인가
접근성 있는 UI 컴포넌트UI primitive/designRadix UI, shadcn/ui, Tailwind디자인 시스템을 직접 유지할 수 있는가
복잡한 입력 폼Form validationReact Hook Form, Zod클라이언트와 서버 검증을 공유할 수 있는가
DB 모델과 CRUDORM/ODMPrisma, Mongoose관계형 모델인지 문서 모델인지

기타 유용한 라이브러리

  • use-debounce: 사용자 입력(검색어, 텍스트 입력 등)에 대한 이벤트를 디바운싱(Debouncing) 처리하여 과도한 함수 호출이나 API 요청을 방지합니다. 검색 필터링 기능 구현 시 유용합니다.
  • react-icons: 인기 있는 아이콘 라이브러리(Font Awesome, Material Design Icons 등)의 아이콘들을 React 컴포넌트로 제공하여 쉽게 사용할 수 있습니다.
  • date-fns / moment / dayjs: 날짜 및 시간 조작을 위한 유틸리티 라이브러리입니다. 날짜 포매팅, 계산 등을 편리하게 수행할 수 있습니다. date-fns는 모듈화되어 필요한 함수만 임포트할 수 있어 번들 크기에 유리합니다.

Next.js 생태계의 라이브러리는 프로젝트 요구사항, 유지보수성, 번들 영향, 팀 숙련도를 기준으로 선택해야 합니다.

새 기능을 추가할 때는 라이브러리가 제공하는 추상화가 실제 복잡도를 줄이는지도 함께 확인합니다.


다음 다이어그램은 Next.js 프로젝트에 라이브러리를 도입할 때 기능, 런타임, 타입, 유지 비용을 함께 보는 기준입니다.

라이브러리는 기능, 런타임, 타입, 유지 비용을 함께 통과해야 도입한다

기능이 좋아도 서버 컴포넌트와 맞지 않거나 번들을 크게 늘리면 비용이 커진다. 설치 전 확인 기준을 고정한다.

점검 축확인 질문좋은 신호위험 신호
기능 적합성현재 문제를 직접 줄이는가보일러플레이트와 오류 처리가 줄어듦단순 편의 함수 때문에 큰 의존성 추가
런타임 경계서버/클라이언트/Edge 중 어디서 동작하는가Next.js App Router 사용 예시가 명확함브라우저 API가 서버 코드에 섞임
타입·검증TypeScript와 런타임 검증을 지원하는가타입 추론과 schema 공유가 가능함any 기반 adapter가 많음
번들 영향클라이언트 JS가 얼마나 늘어나는가tree-shaking, dynamic import 가능모든 페이지에 무거운 provider 강제
유지보수업데이트와 생태계가 살아 있는가최근 release, 문서, issue 대응Next.js 최신 버전 호환 이슈 방치

라이브러리 선택은 라우팅 자체보다 번들 크기, 서버 경계, 데이터 일관성, 운영 대응에 직접 영향을 줍니다.

라이브러리 선택은 번들, 서버 경계, 데이터 일관성, 운영 비용에 영향을 준다

라이브러리는 코드 편의성만 바꾸지 않는다. 렌더 위치, 캐시 정책, 타입 검증, 장애 대응 방식까지 바꾼다.

영향 영역관련 라이브러리좋은 선택의 효과잘못 고르면 생기는 일
초기 로딩UI kit, icon, date library필요한 코드만 client bundle에 포함모든 페이지 JS 증가
서버 경계Auth, ORM, logger서버 전용 로직이 client로 새지 않음secret 노출, hydration 오류
데이터 일관성TanStack Query, SWR, Zod캐시와 검증 기준이 명확함오래된 데이터와 입력 오류 증가
개발 속도React Hook Form, shadcn/ui반복 UI와 폼 처리 비용 감소프로젝트 규칙과 맞지 않는 추상화 증가
운영 대응Sentry, logger, APM오류 영향도와 원인 추적 가능장애 후 재현 단서 부족

아래 다이어그램은 인증, 상태 관리, UI 컴포넌트, 폼 검증, ORM 라이브러리를 역할별로 나눠 보여줍니다.

라이브러리는 역할별로 나눠야 중복 도입과 경계 혼선을 줄인다

인증, 상태, UI, 폼, DB, 유틸리티는 서로 다른 층을 담당한다. 한 문제를 두 라이브러리가 동시에 맡지 않게 나눈다.

역할대표 라이브러리책임겹치면 안 되는 부분
인증Auth.js로그인, 세션, provider, 보호 경계클라이언트 전역 상태로 권한을 대체하지 않기
클라이언트 상태Zustand, Jotai모달, 필터, 임시 선택값서버 데이터 캐시를 전역 상태로 복제하지 않기
서버 상태TanStack Query, SWRfetch, cache, revalidate, mutationDB schema 검증까지 맡기지 않기
UI와 접근성Radix UI, shadcn/ui, Tailwind컴포넌트 구조, 스타일, 접근성비즈니스 상태 관리까지 UI 컴포넌트에 넣지 않기
폼·검증React Hook Form, Zod입력 상태, 오류 메시지, runtime schema서버 권한 검사를 클라이언트 검증으로 대체하지 않기
DB 접근Prisma, Mongoose모델, query, migration 또는 schema클라이언트 번들로 DB client를 보내지 않기

마지막으로 새 라이브러리를 도입할 때는 유지보수 상태, App Router 호환성, 번들 영향, 적용 비용을 실제 프로젝트 기준으로 확인해야 합니다.