2. Next.js, 과거의 영광과
현재의 비판
과거의 영광
• React 생태계의 핵심 프레임워크
• 빠른 성능 , 뛰어난 SEO
• 활발한 커뮤니티와 풍부한 자료
현재의 비판
• 복잡성 증가 , 성능 저하 문제 제기
• 특정 호스팅 서비스 (Vercel) 에
대한 의존성 비판
"Next.js 는 React 개발의 패러다임을 바꾼 혁신적인 프레임워크였습니다 .
하지만 모든 성공적인 기술이 그렇듯 , Next.js 도 발전과 함께 성장통을 겪고
있습니다 ."
3. Next.js 의 주요 문제점 (1) - 지나친 복잡성
기능 과부하
• 엣지 함수 (Edge Functions)
• 앱 라우터 (App Router)
• 미들웨어 (Middleware)
학습 곡선 증가
CSR, SSR, SSG, ISR, RSC, RCC 등
다양한 렌더링 방식과 개념을
이해해야 합니다 .
개발 난이도 상승
개발자들이 느끼는 피로도가
증가하고 , 작은 기능 구현에도 많은
고민과 학습이 필요해 생산성이
저하됩니다 .
4. Next.js 의 주요 문제점 (2) - 성능 저하
1 자동 성능 보장의 한계
개발자가 최적화 기법 ( 데이터 페칭 방식 , 캐싱 전략 등 ) 을 깊이 이해하고
적용해야만 원하는 성능을 얻을 수 있습니다 .
2 서버리스 함수 콜드 스타트
일정 시간 호출이 없다가 다시 호출될 때 초기화 지연 ( 콜드 스타트 ) 이 발생하여
응답 속도가 느려질 수 있습니다 .
3 React 서버 컴포넌트 (RSC)
복잡한 데이터 흐름이나 상호작용이 많은 앱에서는 오히려 여러 번의 네트워크
왕복 (Waterfalling) 을 유발하여 전체적인 지연을 발생시킬 수 있습니다 .
4 캐싱 문제
개발자가 캐싱 전략을 잘못 이해하거나 적용하면 stale data( 오래된 데이터 ) 가
노출되거나 디버깅하기 어려운 버그의 원인이 될 수 있습니다 .
5. Next.js 의 주요 문제점 (3) - Vercel 종속성 ( 벤더 락인 )
Vercel 최적화
Next.js 는 Vercel 팀에서 개발 및 유지보수하고 있으며 , Next.js 의 많은 고급 기능은
Vercel 의 인프라와 긴밀하게 통합되어 있습니다 .
호스팅 이전의 어려움
• 다른 서버리스 플랫폼에 배포하려면 Vercel 에서 제공하는 최적화된 빌드 환경을
재구성해야 함
• next.config.js 설정이나 빌드 스크립트를 수동으로 조정해야 함
자유도 제한
개발자가 특정 클라우드 벤더에 종속되면 , 비용 , 기능 , 규제 등에서 선택의 폭이 좁아질
수 있습니다 . 장기적인 관점에서 유연성이 저하되는 문제입니다 .
6. Next.js 의 대안 프레임워크들
Astro
부분 하이드레이션 방식으로
상호작용이 필요한 부분만
선택적으로 JavaScript 를 로드하여
불필요한 번들 크기를 최소화합니다 .
Qwik
재개 가능성 (Resumability)
개념으로 HTML 을 받은 즉시
인터랙션이 가능하도록 최소한의 JS
만 로드하고 , 나머지는 필요할 때
" 재개 " 합니다 .
Remix
웹 표준 기반으로 개발 복잡성을
줄이고 안정성을 높이며 , 강력한
데이터 핸들링 기능을 제공합니다 .
SolidJS
React 와 유사한 개발 경험을 제공하지만 , 가상 DOM 대신
실제 DOM 에 직접 접근하여 더 효율적인 업데이트를
수행합니다 .
SvelteKit
가상 DOM 불필요 , 컴파일 시 최적화되어 간결한 문법 ,
쉬운 반응형 시스템 , 작은 번들 크기 , 뛰어난 성능이
특징입니다 .
"
7. 결론 : Next.js, 계속 사용해야
할까 ?
여전히 강력한 선택
• 서버 사이드 렌더링이 필수적인
대규모 애플리케이션
• React 생태계의 풍부한 자원
활용
• Vercel 과의 시너지
고려할 점
• 프로젝트의 복잡성과 성능 문제
• 특정 벤더 (Vercel) 에 대한
종속성 문제
• 프로젝트의 요구사항에 맞는
최적의 도구 선택
#1:오늘은 웹 개발 프레임워크의 Next.js에 대해 이야기해보려 합니다. 한때 React 개발자들에게 절대적인 사랑을 받던 Next.js가 최근 들어 왜 비판에 직면하게 되었는지, 그리고 그 대안으로 어떤 프레임워크들이 주목받고 있는지 상세하게 살펴보겠습니다."
#2:과거:
React 생태계의 핵심 프레임워크: React를 기반으로 서버 사이드 렌더링(SSR), 정적 사이트 생성(SSG) 등을 쉽게 구현하게 해줌으로써 개발 생산성을 크게 높였습니다.
빠른 성능, 뛰어난 SEO: 초기 로딩 속도와 검색 엔진 최적화에 강점을 보이며, 마케팅 및 사용자 경험 측면에서 큰 이점을 제공했습니다.
활발한 커뮤니티와 풍부한 자료: 방대한 공식 문서, 다양한 튜토리얼, 활발한 개발자 커뮤니티 덕분에 학습 및 문제 해결이 용이했습니다.
현재:
복잡성 증가, 성능 저하 문제 제기: 특히 App Router 도입 이후, 기능은 많아졌지만 오히려 개발 복잡성이 늘고 예상치 못한 성능 저하를 겪는 사례가 늘고 있습니다.
특정 호스팅 서비스(Vercel)에 대한 의존성 비판: Next.js의 최신 기능들이 Vercel이라는 특정 플랫폼에 너무 깊이 종속되어 있다는 비판이 커지고 있습니다.
상세 내용 추가:
• • "Next.js는 React 개발의 패러다임을 바꾼 혁신적인 프레임워크였습니다. 하지만 모든 성공적인 기술이 그렇듯, Next.js도 발전과 함께 성장통을 겪고 있습니다. 최근 개발자들 사이에서는 'Next.js가 너무 복잡해졌다', '예전만큼 빠르지 않다', '특정 회사에 너무 묶여있는 것 같다'는 불만들이 나오고 있습니다. 왜 이런 이야기들이 나오는지 구체적으로 살펴보겠습니다."
#3:기능 과부하:
엣지 함수 (Edge Functions): 글로벌 분산 네트워크에서 코드를 실행하여 응답 속도를 높이는 기능이지만, 기존 서버리스 함수와는 다른 개념으로 학습이 필요합니다.
앱 라우터 (App Router): pages 디렉토리 방식에서 app 디렉토리 방식으로 전환되면서 서버 컴포넌트, 클라이언트 컴포넌트, Suspense 등 새로운 개념들을 동시에 이해하고 적용해야 합니다.
미들웨어 (Middleware): 요청이 들어오기 전에 특정 로직을 실행하여 경로 보호, 리다이렉트 등을 처리하지만, 복잡한 로직 구현 시 디버깅이 어려울 수 있습니다.
학습 곡선 증가: 단순한 웹사이트를 만드는 경우에도 CSR(클라이언트 사이드 렌더링), SSR, SSG, ISR(증분 정적 재생성), RSC(React 서버 컴포넌트), RCC(React 클라이언트 컴포넌트) 등 다양한 렌더링 방식과 개념을 이해해야 합니다.
개발 난이도 상승: 개발자들이 느끼는 피로도가 증가하고, 작은 기능 구현에도 많은 고민과 학습이 필요해 생산성이 저하되는 역효과를 초래할 수 있습니다.
상세 내용 추가:
• • "Next.js는 개발 편의성을 높이기 위해 많은 기능을 추가했습니다. 하지만 이 기능들이 '독'이 될 수도 있습니다. 마치 만능칼처럼 여러 기능이 한데 뭉치면서, 개발자는 필요 없는 기능까지 모두 이해해야 하는 부담을 안게 됩니다. 특히 최근 도입된 App Router는 기존 Pages Router와는 전혀 다른 접근 방식을 요구하며, 서버 컴포넌트와 클라이언트 컴포넌트의 개념을 정확히 파악하지 않으면 예상치 못한 문제에 부딪힐 수 있습니다. 이는 결국 개발자의 학습 부담을 가중시키고, 프로젝트의 복잡성을 불필요하게 높이는 결과를 낳습니다."
#4:자동 성능 보장의 한계: 초기 Next.js는 '그냥 사용하면 빠르다'는 인식이 강했지만, 이제는 개발자가 최적화 기법(데이터 페칭 방식, 캐싱 전략 등)을 깊이 이해하고 적용해야만 원하는 성능을 얻을 수 있습니다.
서버리스 함수 콜드 스타트: Vercel이나 다른 서버리스 환경에서 Next.js API 라우트나 엣지 함수를 사용하면, 일정 시간 호출이 없다가 다시 호출될 때 초기화 지연(콜드 스타트)이 발생하여 응답 속도가 느려질 수 있습니다.
React 서버 컴포넌트 (RSC): RSC는 클라이언트 번들 크기를 줄여 초기 로딩 성능을 개선하는 잠재력을 가졌지만, 복잡한 데이터 흐름이나 상호작용이 많은 앱에서는 오히려 여러 번의 네트워크 왕복(Waterfalling)을 유발하여 전체적인 지연을 발생시킬 수 있습니다.
캐싱 문제: Next.js 13+에서 도입된 캐싱 메커니즘은 성능 향상을 위한 것이지만, 개발자가 캐싱 전략을 잘못 이해하거나 적용하면 stale data(오래된 데이터)가 노출되거나 디버깅하기 어려운 버그의 원인이 될 수 있습니다.
실제 사례: 노스 플랭크(Northflank)와 같은 실제 기업들이 Next.js를 사용하면서 최적화 부족으로 인한 성능 병목 현상을 겪고, 다른 프레임워크로의 전환을 고려하는 사례가 나타나고 있습니다.
상세 내용 추가:
"Next.js가 '빠르다'는 것은 특정 조건 하에서의 이야기입니다. 새로운 기능들이 추가되면서, Next.js는 더 이상 마법처럼 모든 것을 빠르게 만들어주지 않습니다. 특히 서버리스 환경에서의 콜드 스타트, 그리고 React 서버 컴포넌트가 가져오는 복잡한 데이터 흐름은 예상치 못한 성능 저하를 일으킬 수 있습니다. 캐싱 기능 또한 양날의 검입니다. 잘못 사용하면 사용자에게 오래된 정보를 보여주거나, 디버깅하기 어려운 문제의 원인이 되기도 합니다. 심지어 실제 기업에서도 Next.js의 성능 문제로 인해 다른 대안을 찾아 나서는 경우가 발생하고 있습니다."
#5:Vercel 최적화: Next.js는 Vercel 팀에서 개발 및 유지보수하고 있으며, Next.js의 많은 고급 기능(예: 엣지 함수, ISR의 데이터 캐싱 등)은 Vercel의 인프라와 긴밀하게 통합되어 있습니다.
호스팅 이전의 어려움:
Next.js 앱을 AWS Lambda, Google Cloud Functions, Azure Functions 등 다른 서버리스 플랫폼에 배포하려면 Vercel에서 제공하는 최적화된 빌드 환경을 재구성해야 합니다.
next.config.js 설정이나 빌드 스크립트를 수동으로 조정해야 하므로 추가적인 개발 및 유지보수 비용이 발생합니다.
자유도 제한: 개발자가 특정 클라우드 벤더에 종속되면, 비용, 기능, 규제 등에서 선택의 폭이 좁아질 수 있습니다. 장기적인 관점에서 유연성이 저하되는 문제입니다.
상세 내용 추가:
• • "Next.js의 강력한 기능들은 Vercel이라는 특정 플랫폼에 최적화되어 있습니다. 이는 Next.js 개발 팀과 Vercel이 같은 회사이기 때문이기도 합니다. Vercel 환경에서는 최고의 성능과 편의성을 제공하지만, 문제는 이 앱을 다른 클라우드(AWS, Azure, Google Cloud 등)에 배포하려고 할 때 발생합니다. Vercel이 제공하는 빌드 환경이나 엣지 네트워크 통합 기능을 다른 플랫폼에서 재현하는 것이 쉽지 않아, 배포 과정에서 상당한 추가 작업과 복잡성이 따르게 됩니다. 이는 개발팀에게 '벤더 락인(Vendor Lock-in)'이라는 잠재적인 위험을 안겨줍니다."
#6:부분 하이드레이션 (Partial Hydration) 방식: 페이지의 모든 부분을 JavaScript로 만드는 대신, 상호작용이 필요한 부분만 선택적으로 JavaScript를 로드하여 불필요한 번들 크기를 최소화합니다.
특징: Content-heavy(콘텐츠 중심) 웹사이트, 블로그, 정적 사이트에 특히 강력하며, 다양한 UI 프레임워크(React, Vue, Svelte 등)를 하나의 프로젝트에서 함께 사용할 수 있습니다.
Qwik:
재개 가능성 (Resumability) 개념: 페이지 로딩 시 모든 JavaScript를 실행하는 대신, HTML을 받은 즉시 인터랙션이 가능하도록 최소한의 JS만 로드하고, 나머지는 필요할 때 "재개"합니다.
특징: 초기 로딩 속도와 TTI(Time To Interactive)가 매우 빠르며, JavaScript 번들 크기를 극적으로 줄일 수 있습니다.
Remix:
웹 표준 기반: 웹의 기본적인 원리(폼 제출, HTTP 캐싱 등)를 활용하여 개발 복잡성을 줄이고 안정성을 높입니다.
특징: Nested Routes, Error Boundaries, Loaders, Actions 등 강력한 데이터 핸들링 기능을 제공하여 UI와 데이터 계층을 효율적으로 관리할 수 있습니다. Next.js와 비슷한 기능을 제공하지만 다른 철학을 가집니다.
SolidJS (SolidStart):
React와 유사한 개발 경험: JSX 문법을 사용하고 컴포넌트 기반이지만, React의 가상 DOM 대신 실제 DOM에 직접 접근하여 더 효율적인 업데이트를 수행합니다.
특징: 반응형(Reactivity) 시스템이 매우 강력하고 직관적이며, 번들 크기가 작고 런타임 성능이 뛰어납니다. Next.js와 비슷하게 서버 렌더링 기능을 제공하는 SolidStart가 있습니다.
SvelteKit:
가상 DOM 불필요, 컴파일 시 최적화: Svelte는 컴파일 시점에 일반 JavaScript로 변환되므로, 런타임에 가상 DOM을 사용하지 않아 오버헤드가 적습니다.
특징: 간결한 문법, 쉬운 반응형 시스템, 작은 번들 크기, 뛰어난 성능이 특징입니다. React 생태계를 벗어나 새로운 개발 경험을 원하는 경우 좋은 대안입니다.
상세 내용 추가:
"Next.js의 대안들은 단순히 '다른' 프레임워크가 아닙니다. 각자 Next.js가 가진 문제점들을 해결하기 위한 고유한 철학과 기술을 가지고 있습니다. 예를 들어, Astro는 콘텐츠 중심 사이트에 필요한 부분만 JS를 로드하여 극도로 가볍게 만들고, Qwik은 '재개 가능성'이라는 혁신적인 개념으로 초기 로딩 속도를 최적화합니다. Remix는 웹 표준을 적극 활용하여 견고하고 안정적인 앱을 만들 수 있게 돕고, SolidJS와 SvelteKit은 React와는 다른 방식으로 뛰어난 성능과 간결한 개발 경험을 제공합니다."
#7:여전히 강력한 선택:
서버 사이드 렌더링이 필수적인 대규모 애플리케이션: SEO, 초기 로딩 속도가 중요한 엔터프라이즈급 웹 애플리케이션에는 여전히 Next.js가 훌륭한 선택입니다.
React 생태계의 풍부한 자원 활용: 이미 React 개발에 익숙하고, React의 방대한 라이브러리와 커뮤니티의 이점을 계속 누리고 싶다면 Next.js는 좋은 도구입니다.
Vercel과의 시너지: Vercel을 메인 배포 플랫폼으로 사용할 계획이라면, Next.js는 Vercel 인프라의 모든 이점을 최대한 활용할 수 있도록 설계되어 있습니다.
고려할 점:
프로젝트의 복잡성과 성능 문제: 만약 현재 프로젝트가 Next.js 때문에 과도하게 복잡해지거나, 예상치 못한 성능 저하를 겪고 있다면 다른 대안 프레임워크를 적극적으로 고려해야 합니다.
특정 벤더(Vercel)에 대한 종속성 문제 인지 및 대비: Vercel 생태계를 벗어날 가능성이 있다면, Next.js의 벤더 종속성 문제를 사전에 인지하고 마이그레이션 계획 등을 미리 세워두는 것이 좋습니다.
프로젝트의 요구사항에 맞는 최적의 도구 선택: 모든 도구에는 장단점이 있습니다. 개발할 애플리케이션의 특성(정적 사이트, 동적인 웹 앱, 관리자 페이지 등), 팀의 숙련도, 예산 등을 고려하여 가장 적합한 프레임워크를 선택하는 것이 중요합니다.
상세 내용 추가:
• • "그렇다면 Next.js는 이제 과거의 유물이 될까요? 물론 아닙니다! Next.js는 여전히 거대한 규모의 애플리케이션이나 SEO가 매우 중요한 웹 서비스에 강력한 이점을 제공합니다. 이미 React 생태계에 익숙한 팀에게는 여전히 매력적인 선택지입니다. 하지만 핵심은 '무조건 Next.js'가 아니라, '우리 프로젝트에 Next.js가 최적의 선택인가?'를 질문해야 한다는 것입니다. 만약 복잡성이나 성능, 혹은 벤더 종속성 문제가 걸림돌이 된다면, 오늘 살펴본 대안 프레임워크들이 훌륭한 해답이 될 수 있습니다. 중요한 것은 프로젝트의 요구사항과 팀의 특성을 고려하여 현명한 도구 선택을 하는 것입니다."