- Next.js의 미들웨어는 로깅 설정이 제한적이며, 기본 로깅이 개발 환경에서만 활성화되어 생산 환경에서 문제 추적이 어려움
- 미들웨어에서 헤더만 전달 가능하며, 다중 미들웨어 체이닝이 불가능해 복잡한 로깅 구현이 제한됨
- AsyncLocalStorage를 사용한 로깅은 Edge 런타임에서 예상치 못한 동작을 보이며, 페이지와 미들웨어 간 컨텍스트 공유가 제대로 작동하지 않음
- 커스텀 서버를 사용해도 로깅 문제를 해결하기 어렵고, Next.js의 설계 제약이 개발자를 특정 방식으로 강제함
- Vercel의 SvelteKit은 유연한 미들웨어와 데이터 전달 메커니즘을 제공하며, Next.js보다 개발자 친화적인 설계를 보여줌
Next.js의 로깅 문제 배경
- Next.js 서비스를 운영하며 프로덕션 로그 기록을 시도할 때, 기본 로그 기능이 개발 환경에만 활성화됨을 알게 됨
- 운영 환경에 적합한 로깅 시스템 구현이 필요한 상황에서 Next.js의 한계에 직면함
미들웨어의 한계
- 공식 문서에 따르면 미들웨어는 라우팅 전 실행되며 인증, 로깅, 리다이렉션 같은 기능 구현에 적합함
- 실제로 미들웨어에 전달 가능한 파라미터가 4개로 제한되고, 오직 헤더만 실질적으로 전달 가능
- 여러 개의 미들웨어를 체이닝하거나 조합하는 구조를 지원하지 않음
- Node.js에는 Express 등에서 확립된 미들웨어 관행이 존재하지만, Next.js에서는 이를 제대로 적용 불가함
AsyncLocalStorage로 우회 시도
- pino와 AsyncLocalStorage를 사용해 미들웨어 레벨에서 로깅 인스턴스 관리 시도
- 미들웨어에서 요청마다 고유 콘텍스트로 로그 저장이 가능하나, 브라우저 환경에서만 정상 동작하는 현상 확인
- 이는 Next.js 미들웨어가 기본적으로 edge 런타임을 사용하기 때문이며, nodejs 런타임으로 설정해도 프로젝트 상황에 따라 불안정함
페이지 컴포넌트에서의 장애
- 실제 페이지나 레이아웃 컴포넌트에서 로깅 함수 호출 시, logger()가 null을 반환함
- 미들웨어에서 생성한 logger 콘텍스트가 비동기 렌더링 맥락으로 전달되지 않는 구조적 문제 존재
- 해결책은 헤더에 requestId 등 로깅 정보를 실어 전달하는 방법뿐이며, 코드가 복잡해지고 import 구조도 혼란스러워짐
- 클라이언트 컴포넌트에서도 유사한 구조적 분리가 추가 요구됨
커스텀 서버 도입 시도
- 공식 문서의 커스텀 서버 예제를 따라 http.createServer와 next.js의 app.getRequestHandler 활용 실험 진행
- 이 환경에서 AsyncLocalStorage를 다시 활용하고자 했으나, 미들웨어–페이지–커스텀 서버 사이 콘텍스트 연동 불가 현상 반복
- 근본적으로 Next.js 내부에서만 AsyncLocalStorage를 제대로 사용하고 있으며, 개발자에게는 동일한 권한 제공 안 함
- 미들웨어에서 페이지로 전달 가능한 방식이 사실상 응답 헤더(change) 및 리다이렉트/리라이트 경로 이동 뿐임
- 사용자 입장에서 유연한 확장이나 커스텀 콘텍스트 전달이 매우 어려움
SvelteKit과의 비교
- Vercel의 SvelteKit은 Next.js보다 유연한 미들웨어 시스템 제공
- event.locals 객체를 통해 요청 데이터를 자유롭게 전달 가능
- 다중 handle 함수를 정의해 체이닝 가능, 복잡한 로직 구현 용이
- SvelteKit은 개발자 친화적 설계를 보여주며, Next.js의 제약과 대조됨
- SvelteKit은 Vercel의 제품이지만, Next.js보다 부차적 프로젝트로 간주됨에도 더 나은 경험 제공
이슈 트래커 및 생태계 문화 비판
- Next.js의 공식 GitHub 이슈 트래커는 사용자 피드백에 거의 응답하지 않는 상황 발생
- 인기 이슈나 버그도 오랜 기간 답변이나 해결 없이 방치되는 경우 빈번함
- 미니멀 재현 코드를 준비해 이슈를 올려도 실질적 응답이나 후속 조치 없음
결론 및 반성
- Next.js에서 발견되는 버그와 구조적 테두리는 반복적으로 개발자의 생산성을 해치며, 근본적 개선이 필요한 양상임
- 타 프레임워크(SvelteKit 등) 비교 시 Next.js가 주력 제품임에도 사용성에서 밀림
- 당장 Next.js를 대체할 계획은 어렵지만, 향후 프로젝트에선 다른 선택지를 고려하고 싶은 마음 생김