본문으로 건너뛰기

프런트엔드 로컬 틸트 아키텍처

이 회고에서는 bf25fc6, 8b28948, 88d7c0a, c7ad4395501704 전반의 변화를 다룹니다.

증상

  • next dev가 클러스터 수신 뒤에서 실행될 때 프런트엔드 하이드레이션 및 HMR이 불안정했습니다.
  • 프런트엔드 반복 속도는 클러스터 배포 및 수신 동작과 결합되었습니다.
  • *.localhost의 로컬 커스텀 도메인 검사가 서버 측 가져오기에 실패했습니다.
  • Apple Silicon의 Turbopack 개발 세션은 안정화되지 않고 몇 시간 동안 메모리를 늘릴 수 있습니다.

진단

현재 아키텍처는 의도적으로 로컬 우선입니다.

  • lumie-frontend/Tiltfilelumie-frontendnpm run dev를 실행하는 local_resource로 등록합니다.
  • lumie-frontend/package.jsondevnext dev --turbo가 아닌 일반 next dev로 정의합니다.
  • lumie-frontend/src/shared/api/resolveBaseUrl.ts는 SSR 요청을 프런트엔드 원본을 통해 다시 루프하고 localhost*.localhosthttp를 사용합니다.
  • .github/tilt-up.sh는 여전히 작업 공간 루트에서 Tilt를 실행하므로 프런트엔드는 클러스터에 배포되지 않고 클러스터 지원 서비스와 함께 시작됩니다.

근본 원인

원래 dev-cluster 레이아웃은 Next.js 프런트엔드를 다른 클러스터 작업 부하처럼 처리했습니다. 해당 모델은 next dev의 실제 동작과 싸웠습니다.

  • bf25fc6는 Traefik HTTP/2 ALPN 뒤에 반복적으로 수화 교착 상태가 발생한 후 클러스터 배포를 완전히 제거했습니다.
  • 8b28948tilt up의 프런트엔드 참여를 복원했지만 개발자 노트북의 로컬 프로세스로만 가능했습니다.
  • 장기간 실행된 Apple Silicon 개발 세션에서 터보팩 메모리 증가가 무제한으로 나타난 후 88d7c0a--turbo를 제거했습니다.
  • c7ad439는 비밀이 아닌 프런트엔드 환경을 Tiltfile serve_env로 옮겼으므로 로컬 개발자는 더 이상 개발자별 .env.local 드리프트에 의존하지 않습니다.
  • 5501704는 나머지 SSR 엣지 케이스를 수정했습니다. next devhttp를 통해 해당 호스트에 서비스를 제공하더라도 resolveBaseUrl()foo.localhosthttps로 처리했습니다.

수정

안정적인 아키텍처는 다음과 같습니다.

  • 상태가 많은 서비스는 클러스터에 유지됩니다.
  • Next.js 앱은 Tilt 관리형 npm run dev를 통해 로컬로 실행됩니다.
  • 브라우저 요청은 http://localhost:3000에서 동일한 출처를 유지하고 프런트엔드 /api 프록시를 통해 NEXT_PUBLIC_API_BASE로 이동합니다.
  • 로컬 SSR은 강제 내부 백엔드 URL 대신 요청 Host 헤더를 사용합니다.

관련 프록시별 인증 함정은 Next.js API Proxy Auth Gotchas에 문서화되어 있습니다.

예방 및 검증

  • 클러스터 배포로 next dev를 다시 도입하지 마십시오. 경고는 lumie-frontend/Tiltfile에 직접 보존됩니다.
  • tilt up가 Kubernetes 배포가 아닌 로컬 lumie-frontend 리소스를 노출하는지 확인합니다.
  • lumie-frontend/package.json가 여전히 next dev를 사용하는지 확인하세요.
  • resolveBaseUrl()가 여전히 localhost*.localhost를 모두 http에 매핑하는지 확인합니다.