Railway가 프론트엔드를 Next.js에서 벗어난 이야기 — 빌드 시간 10분 → 2분 미만
We moved Railway's frontend off Next.js. Builds went from 10+ mins to under 2
TL;DR Highlight
Railway는 프로덕션 프론트엔드를 Next.js에서 Vite + TanStack Start로 마이그레이션하여 빌드 시간을 10분대에서 2분 미만으로 단축했다.
Who Should Read
Next.js로 클라이언트 중심의 대시보드나 SPA를 운영 중인데 빌드 시간이 늘어나거나 서버 우선 패러다임과 맞지 않는다고 느끼는 프론트엔드 개발자. 특히 하루에 여러 번 배포하는 팀에서 빌드 병목을 해소하고 싶은 경우.
Core Mechanics
- Railway의 프로덕션 프론트엔드(대시보드, 캔버스, railway.com 전체)가 Next.js에서 Vite + TanStack Router로 완전 전환됐고, 단 두 개의 PR로 다운타임 없이 마이그레이션을 완료했다.
- 기존 Next.js 빌드는 10분 이상 걸렸는데 그 중 6분이 Next.js 자체 처리 시간이었고, 특히 'finalizing page optimization' 단계에서 절반 가까이 막혀 있었다. 하루 수차례 배포하는 팀에게 이건 단순한 불편함이 아니라 이터레이션마다 붙는 무거운 세금이었다.
- Railway 앱은 대시보드가 리치한 상태 기반 인터페이스이고, 캔버스는 실시간, WebSocket이 전반적으로 사용되는 구조라서 Next.js의 서버 우선(server-first) 설계 방향과 근본적으로 맞지 않았다.
- Pages Router를 유지하면서 레이아웃 공유 등을 처리하려다 보니 프레임워크 위에 자체 추상화를 덧붙이는 상황이 됐고, 모든 레이아웃 패턴이 프레임워크 기능이 아닌 임시방편 워크어라운드였다. App Router로 전환하면 일부 문제는 해결되지만 서버 우선 패러다임을 강요받게 돼 그쪽도 맞지 않았다.
- TanStack Start + Vite를 선택한 이유는 크게 네 가지다: 라우트 파라미터와 검색 파라미터가 자동 추론되는 타입 안전 라우팅, 레이아웃을 일급 개념으로 지원하는 Pathless Layout Route, 즉각적인 HMR로 피드백 루프가 사실상 사라지는 빠른 개발 루프, 마케팅 페이지 등 필요한 곳에만 선택적으로 SSR을 적용하는 유연성.
- 마이그레이션은 두 단계로 나뉘었다. PR 1에서는 프레임워크는 건드리지 않고 next/image, next/head, next/router 등 Next.js 의존성만 네이티브 브라우저 API 또는 프레임워크 무관한 대안으로 교체했다. PR 2에서는 200개 이상의 라우트를 실제로 마이그레이션했다.
- 서버 레이어로 Nitro를 추가하고 next.config.js를 Nitro 설정으로 교체했다. 리다이렉트 500개 이상, 보안 헤더, 캐싱 규칙을 한 곳에 통합했다. 또한 Next.js가 폴리필 처리하던 Node.js API(Buffer, url.parse 등)를 브라우저 네이티브 대안으로 교체해 코드가 더 깔끔해지는 부수 효과도 얻었다.
- 트레이드오프도 있다. next/image의 내장 이미지 최적화는 Fastly 엣지 이미지 최적화로 대체했고, next-seo나 next-sitemap 같은 에코시스템 도구들은 소규모 인하우스 구현으로 교체했다. TanStack Start 자체가 아직 새로운 프레임워크라 거친 부분이 있을 수 있다는 점도 감수했다.
Evidence
- 비슷한 마이그레이션을 경험한 팀의 사례 공유가 있었다. Next.js 랜딩 페이지와 TanStack Router SPA를 하나의 Vite + TanStack Start 앱으로 통합했더니 빌드 시간이 12분에서 2분 미만으로 줄었고, 클라이언트 중심의 실시간 상태 앱에서 Next.js의 서버 우선 가정과 싸우는 게 더 이상 의미 없었다는 의견이었다.
- Next.js 빌드가 Railway 플랫폼에서 특히 느리다는 지적이 있었다. Railway는 컨테이너 기반이라 Vercel에서 2분짜리 빌드가 Railway에서는 12분씩 걸리는 반면, VPS 직접 배포는 20초 수준이라는 경험담이 공유됐다. 이는 Railway의 마이그레이션 결정에 맥락을 더해준다.
- LLM이 Next.js와 Vercel 에코시스템에 매우 익숙하고 Vercel이 LLM 도구 통합에 공격적으로 투자하고 있다는 점에서, AI 코딩 도구를 사용하는 개발자들이 Next.js/Vercel 쪽으로 더 강하게 쏠리게 될 것이라는 우려가 제기됐다.
- 2분도 여전히 너무 길다는 비판적 시각도 있었다. '2분짜리 빌드도 말이 안 된다'는 댓글과 '10분이 정상이었다는 게 놀랍다. 얼마나 퇴보한 건가'라는 냉소적 반응이 있었다.
- 원문에서 어떤 Next.js 버전을 쓰고 있었는지, Turbopack은 사용했는지 언급하지 않았다는 지적이 있었다. Turbopack을 켰다면 빌드 시간이 달라질 수 있기 때문에 비교의 기준점이 명확하지 않다는 점이 지적됐다.
How to Apply
- 현재 Next.js 앱이 클라이언트 중심(SPA, 대시보드, 실시간 기능 위주)인데 빌드가 5분 이상 걸린다면, PR을 두 단계로 나눠 마이그레이션하는 방법을 참고할 수 있다. 첫 번째 PR에서 next/image, next/head, next/router 등 Next.js 전용 API만 프레임워크 무관한 대안으로 교체하고, 두 번째 PR에서 실제 프레임워크를 교체하면 리스크를 줄일 수 있다.
- 500개 이상의 리다이렉트와 보안 헤더, 캐싱 규칙을 next.config.js에서 관리하고 있다면, Nitro 서버 레이어로 이전하면서 이를 한 파일에 통합할 수 있다. Railway 사례처럼 설정 파일 단일화와 코드 정리를 함께 가져갈 수 있다.
- Next.js에서 레이아웃을 Pages Router 위에 자체 추상화로 구현하고 있는 팀이라면, TanStack Router의 Pathless Layout Route가 그 워크어라운드를 대체할 수 있다. 파일 시스템 기반 라우트 생성과 함께 타입 안전 라우팅도 자동으로 얻을 수 있다.
- next/image 없이 이미지 최적화가 필요한 경우, Railway처럼 Fastly 같은 CDN의 엣지 이미지 최적화를 사용하거나 Cloudflare Image Resizing 등 외부 서비스를 활용하면 프레임워크 의존 없이 동일한 효과를 낼 수 있다.
Terminology
관련 논문
Swift로 LLM 학습시키기 Part 1: 행렬 곱셈을 Gflop/s에서 Tflop/s로 끌어올리기
Apple Silicon에서 Swift로 직접 행렬 곱셈 커널을 구현하며 CPU, SIMD, AMX, GPU(Metal)를 단계별로 최적화해 Gflop/s에서 Tflop/s 수준까지 성능을 높이는 과정을 상세히 설명한 글이다. 프레임워크 없이 LLM 학습의 핵심 연산을 밑바닥부터 구현하고 싶은 개발자에게 Apple Silicon의 성능 한계를 체감할 수 있는 드문 자료다.
fsync 없이 로컬 스토리지 엔진을 crash-consistent하게 만든 방법
FractalBits가 fsync 없이 SSD 전용 KV 스토리지 엔진을 구현해 동일 조건 대비 약 65% 높은 쓰기 성능을 달성한 설계 방법을 공유했다. fsync의 메타데이터 오버헤드를 피하기 위해 사전 할당, O_DIRECT, SSD 원자 쓰기 단위 정렬 저널을 조합한 구조가 핵심이다.
Google Chrome, 사용자 동의 없이 4GB AI 모델(Gemini Nano)을 몰래 설치
Google Chrome이 사용자 동의 없이 Gemini Nano 4GB 모델 파일을 자동 다운로드하고, 삭제해도 재다운로드되는 문제가 발견됐다. GDPR 위반 가능성과 수십억 대 기기에 적용될 때의 환경 비용 문제가 제기되고 있다.
OpenAI가 대규모 저지연 Voice AI를 제공하는 방법
OpenAI가 9억 명 이상의 사용자에게 실시간 음성 AI를 제공하기 위해 WebRTC 스택을 어떻게 재설계했는지 설명하는 글로, relay + transceiver 분리 아키텍처의 설계 결정과 trade-off를 상세히 다룬다.
Truncated Decoding Tree의 결정론적 탐색을 통한 효율적인 Test-Time Inference
Self-consistency의 중복 샘플링 낭비를 없애는 결정론적 트리 탐색 디코딩 기법 DLE로 수학/코드 추론 성능과 속도를 동시에 개선
GoModel – Go로 작성된 오픈소스 AI Gateway
OpenAI, Anthropic, Gemini 등 여러 AI 프로바이더를 하나의 OpenAI 호환 API로 묶어주는 Go 기반 오픈소스 AI 게이트웨이로, LiteLLM의 컴파일 언어 대안이다.