뒤로가기

Next.js 사이드 프로젝트에서 발견한 실무 적용 고려사항

next.js

Next.js는 React 서버사이드 렌더링의 사실상 표준으로 자리잡았으며, 백엔드 API까지 통합하는 풀스택 프레임워크로 발전하고 있습니다. 이 글에서는 Next.js를 활용한 사이드 프로젝트 경험을 바탕으로 실무 도입 시 고려해야 할 장단점을 구체적으로 살펴보겠습니다.

프로젝트 개요

Todo 앱을 통해 Next.js의 핵심 기능을 검증했습니다. 생성/수정/삭제 기능을 가진 간단한 구조로, Next.js의 주요 특징을 빠르게 파악할 수 있었습니다. (프로젝트 링크)

기술 스택

사용한 기술:

  • 프론트엔드: Next.js
  • 인증: Google OAuth
  • 데이터베이스: AWS DynamoDB

아키텍처 특징:

  • Next.js의 API 라우터를 활용하여 별도의 백엔드 서버 없이 구현
  • Vercel을 통한 서버리스 배포로 간편한 운영 환경 구축

Next.js의 장점

손쉬운 서버사이드 렌더링

Next.js 없이 서버사이드 렌더링을 구현하려면 하이드레이션 최적화와 HTML 스트리밍 서버 구축이 필요합니다. Next.js는 이러한 복잡성을 프레임워크 레벨에서 해결하여 개발 생산성을 크게 향상시킵니다.

작은 번들 사이즈

서버 사이드 렌더링을 통해 클라이언트 JavaScript 크기를 대폭 줄일 수 있습니다. 웹뷰와 같이 번들 사이즈에 민감한 환경에서 효과적입니다.

API 라우팅 지원

별도의 백엔드 서버 없이 하나의 레포지토리에서 백엔드와 프론트엔드 코드를 통합 관리할 수 있습니다. 이는 개발 생산성을 극대화하고 배포 프로세스를 단순화합니다.

민감한 정보 보호

개발자 도구를 통한 클라이언트 데이터 노출을 방지할 수 있습니다. 서버 사이드에서 렌더링하여 민감한 정보를 클라이언트에 전달하지 않고도 화면을 구성할 수 있습니다.

훌륭한 문서

공식 문서는 페이지 라우터와 앱 라우터 방식을 모두 상세히 다루고 있으며, 실무에서 발생하는 대부분의 이슈에 대한 해결 방법을 제공합니다.

Next.js의 단점

코드의 파편화

기본적으로 서버 컴포넌트이기 때문에 useState와 같은 클라이언트 기능을 사용하려면 명시적으로 클라이언트 컴포넌트로 선언해야 합니다. 사용자 이벤트나 비즈니스 로직이 포함된 컴포넌트는 클라이언트 컴포넌트로 분리되어야 하며, 이는 코드 파편화를 야기합니다.

복잡한 상태 관리

서버 컴포넌트의 이점을 활용하려면 클라이언트 컴포넌트의 상태를 서버에서 프리패치해야 합니다. 서버와 클라이언트 컴포넌트 간의 상태 공유는 코드 복잡도를 높이고, 개발자가 컴포넌트 경계를 항상 인지해야 하는 부담을 가중시킵니다.

기본 동작의 한계

별도로 명시하지 않으면 기본적으로 서버 컴포넌트로 동작합니다. 인터랙션이 많은 애플리케이션에서는 대부분의 컴포넌트가 클라이언트 컴포넌트로 선언되며, 이는 Next.js의 주요 이점을 감소시킵니다.

빈번한 Breaking Changes

Next.js 13 이전 버전과 이후 버전 간의 차이가 큽니다. 버전 업데이트 시 기존 코드가 동작하지 않을 수 있으며, 마이그레이션 비용이 발생할 수 있습니다.

적용 고려사항

Next.js는 다음과 같은 특성을 가진 프로젝트에서 효과적입니다:

  • 작은 번들 사이즈가 중요한 경우: 웹뷰나 모바일 환경
  • 높은 데이터 보안이 필요한 경우: 민감한 정보를 클라이언트에 노출하지 않아야 할 때
  • 정적 페이지 비율이 높은 경우: 서버 컴포넌트의 이점을 충분히 활용할 수 있는 구조

반면 인터랙션이 많고 동적인 SPA 형태의 애플리케이션이라면 React만으로도 충분히 효과적인 구현이 가능하며, Next.js는 오버스펙일 수 있습니다.

결론

Next.js는 서버사이드 렌더링과 풀스택 개발을 위한 강력한 프레임워크입니다. 하지만 서버/클라이언트 컴포넌트 간의 복잡성과 빈번한 버전 변경 등의 단점도 존재합니다. 프로젝트의 특성과 요구사항을 명확히 파악하여 Next.js 도입 여부를 결정하는 것이 중요합니다.

관련 아티클