pile·
프론트엔드·레모네이드레모네이드·

Next.js 개발 경험기

Fastcampus Language 팀에서 Next.js 로 웹 애플리케이션을 만들며 느낀 장단점을 정리한 글이다. "SSR 과 SEO 빼면 쓸 이유가 없다" 는 시각을 겨냥해, 파일 시스템 라우팅·내장 기능·데이터 페칭 메서드의 차이를 실제 사용 경험으로 풀어낸다.

핵심 포인트
  • 페이지 라우트 기반의 다소 강압적인 파일 시스템이 오히려 좋게 작용했다. 구조를 고민하는 데 들던 리소스가 줄고 파생되는 하위 구조가 명확해졌다.
  • 부수 효과로 파일명이 곧 URL 이 되고 라우트별 자동 code splitting 이 붙는다.
  • 환경 변수는 서버·클라이언트 노출 여부에 따라 나뉜다. `NEXT_PUBLIC_` 접두사가 붙으면 브라우저에 노출되고, 없으면 Node 환경에서만 보인다.
  • `.env.*` 형태로 값을 지정하면 jest·cypress 같은 테스트 환경도 자동으로 잡혀, axios mocking·action creator 테스트·e2e 테스트를 간편하게 할 수 있다.
  • dev 서버는 속도와 생산성, production 은 최적화와 효율성이라는 책임 분할 원칙이 뚜렷하다고 평가한다.
상세 정리
  • 배경으로 Zeit → Vercel 리브랜딩과 시리즈 A 2,100만 달러 투자를 언급하며, 2018년 5버전에서 2020년 10버전까지 2~3개월 주기로 꾸준히 올라온 속도를 근거로 든다.
  • Vercel 의 철학을 생산성과 간편화로 읽고, React·Vue 와 Express·Koa 사이의 고민을 덜어 주는 Next·Nest 같은 프레임워크가 사람들을 움직였다고 본다.
  • `getInitialProps` 의 주의점: universal method 라 서버 사이드와 `next/router`(클라이언트) 양쪽에서 호출될 가능성이 있다. 공식 문서도 `getStaticProps`·`getServerSideProps` 를 권한다.
  • styled-components 를 서버 사이드에서 쓰는 예를 든다. `ServerStyleSheet` 인스턴스를 만들어 `collectStyles` 로 앱 전체 스타일을 수집하고 `getElement()` 로 스타일 태그를 만들어 `_document.js` 템플릿에 전달한다.
  • `_document.js` 의 용도는 애플리케이션의 `<html>`·`<body>` 태그를 보강하는 것이라고 정리한다.
  • `getStaticProps` 를 쓸 상황 넷: 매 요청마다 fetch 할 필요 없는 데이터, headless CMS 에서 오는 데이터, 유저와 무관하게 공개 캐시 가능한 데이터, SEO 때문에 미리 렌더링해야 하는 페이지. HTML 과 JSON 을 모두 생성해 둬 CDN 캐시가 쉽다.
  • `getServerSideProps` 는 서버에서만 실행되고 브라우저에서는 절대 실행되지 않는다. `next/link` 로 클라이언트 사이드 전환을 해도 `getInitialProps` 와 달리 무조건 서버에서 돈다. 당연히 page 에서만 쓸 수 있다.
  • 컨텍스트 하위 키로 params·req(HTTP 요청 객체)·res(HTTP 응답 객체)·query(쿼리 문자열)를 정리한다.
  • TypeScript 컴파일 체크는 내장 지원되다가 속도 이슈로 제거된 것으로 알고 있다며 개인적으로 아쉬운 점으로 남긴다.
  • 프레임워크의 단점으로 낮은 자율성과 높은 종속성을 꼽되, 공식 문서가 외부 라이브러리 적용 예시를 잘 보여 준 점을 좋게 본다.
  • 자유도의 예: CSS-in-JS 만 9개 라이브러리를 지원하고 CSS·SASS 도 지원하며 LESS 는 내장 지원 예정이라, 취향에 따라 고르면 된다.
  • 다만 지원하지 않는 라이브러리나 커스터마이징이 필요한 부분은 적용하기 매우 힘들었다고 한계를 명시한다.
왜 읽나Next.js 를 SSR·SEO 용도로만 보고 있던 프론트엔드 개발자에게, 실제로 생산성이 올라가는 지점과 프레임워크 종속의 대가를 함께 보여준다.
레모네이드
레모네이드 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 프론트엔드·여기어때 (GC컴퍼니)여기어때 (GC컴퍼니)·

    항공 프론트엔드 구축기 (7/10): 창구를 하나만 두었습니다

    여기어때 항공 서비스 프론트엔드가 웹과 앱 웹뷰 두 환경에서 동일한 함수 호출로 동작하는 앱 브릿지 추상화 레이어를 설계한 과정을 다룬다. iOS·안드로이드 규약 차이와 "웹에 존재하지 않는 브릿지를 어떻게 호출하나"라는 문제를 단일 추상화 층으로 해결한 구현 사례다.

    요약 이어보기
    #react#typescript#webview+2