NextJS 2024 FullStack
점점 더 개발 도구들이 발전한다.
- 이러한 도구들을 이용하면 개발 속도가 빨라진다.
- 빠르게 시장검증이 가능하다.
- 사용자의 반응을 보고, PMF를 찾기 적절한 기술 풀스택을 정하자.
MLP/MVP 등의 프로덕트를 빠르게 개발할 수 있는 기술 스택은 ?
웹 풀스택 with NextJS
Web
- Nextjs App Router + TS
- UI : TailwindCSS, RadixUI, FramerMotion, react-icons, react-spinners
- State : Zustand, React-Query, Zod
- *pnpm(turbo), yarn berry
- *ai-sdk, usehooks-ts, biome
Supabase & Infra
- DDL, DML, CRUD, TypeGen
- Auth, Storage, Vector DB, Edge Functions, Cron(pg_cron), Queue(pgmq)
- (Vercel | Circle CI + AWS lambda )
1.Typescript + Javascript
빠른 개발이 필요한 부분, 유연성이 필요한 부분은 JS를 통해서 개발하자. eg) UI개발
안정성이 필요한 부분은 TS를 이용해서 개발하자. eg) DB 접근, API 정의, 결제시스템
2.Supabase (postgreSQL)
Supabase 를 사용하자.!
- 내부적으로는 postgreSQL를 사용한다.
- 오픈소스라서 직접 온프레미스로 docker를 활용해서 Supabase를 구축할 수 있다.
- 재미있을것 같지만 많은 부분들을 이해해야 해서 당장은 프리티어 플린으로 가자.
빠르게 구현할 수 있는 기능들
- DDL With Admin Tool
- DML with Admin Tool
- CRUD ORM with TypeGenerator
- OAuth2 with Login UI Helper
- Object Storage
- EdgeFunctions
3.NextJS 14의 강력한 기능
Server Level
1.Router Handler
- 정적인 REST API 에 대한 처리가 가능하다.
- 로그인 콜백, 결제 시스템 콜백, 웹훅 같은 기능은 NextJS의 api 디렉터리를 사용하자.
2.Server Actions
- 매번 API 경로를 따서, 브라우저에서 POST요청을 보내는것은 번거롭다.
- ServerAction 기능을 사용하면 이를 해결 할 수 있다.
- 랜덤한 해시 경로가 생성되며, 브라우저는 이러한 경로를 관리할 필요가 없다.
- 그냥 서버의 함수 import 후 부르는것으로 개발자 경험이 향상된다.
Rendering Level
1.React Server Component 도입
줄여서 RSC 라고 한다.
SSR 서버 사이드 랜더링과 함께 혼란스럽지만, 기존의 패러다임을 변화시킬것은 분명하다.
RSC을 이용해서 여러 SSR 전략을 사용할 수 있다.
NextJS은 기본적으로 서버컴포넌트 이므로, 클라이언트 컴포넌트와 같이 로직을 짜게 된다.
클라이언트 컴포넌트는
use client
지시어를 사용하면 된다.*서버컴포넌트 import하는 모듈이 클라이언트 컴포넌트라면, RSC는 RCC가 된다. 이는 클라이언트 경계를 구분짓기 위함.
*특정 클라이언트 컴포넌트도, RCS 처럼 작동한다.
1.1 Full Page Loading
새로운 경로 혹은 다른 라우터의 경로에 접근할 때 full page loading이 된다.
- 서버에서는 compiling 이라는 메시지와 함께 서버 컴포넌트가 컴파일 된다.
- 여기서 특정 클라이언트 컴포넌트들도 초기 랜더링에 포함된다.
- 이후 hydration 과정을 거처 CSR이 완성된다.
1.2 Subpage subsequent
- 하위 경로에 대해서 NextJS는 필요한 부분만 랜더링 하게 된다.
- RootLayout에서 클라이언트 컴포넌트는 유지 된다.
2.다양한 SSR(Server Side Rending) 사용
2.1 랜더링 종류 ( 구지 나누자면 )
SSG : 정적사이트 생성
- 앞으로 웹 페이지가 불변하다.
- 서버컴포넌트, 클라이언트 컴포넌트가 모두 정적인 html파일로 변한다.
- next를 이용해서도 react 결과물 처럼 정적파일만 만들어 낼 수 있다.
ISR : Incremental Static Regeneration
- 주기적으로 정적사이트를 다시 생성한다.
- 정적사이트의 들어가는 재료인, 데이터가 업데이트 되면 새로운 Static Site가 만들어진다.
- 마치 Batch를 통해서 갱신하는 방법
SSR : Dynamic Server Side Rendering
- 요청할 떄, 항상 새로운 데이터를 바탕으로 랜더링 결과물을 만든다.
- 항상 최신 데이터를 유지한다.
- 성능상 캐싱을 사용할 수 있다.
- eg) Revalidating
- Time-based Revalidation:
- Time-based Revalidation: Route Handlers, Server Actions
Streaming : 스트리밍 랜더링
- SSR은 full page loading 후 hyration이 일어난다.
- 부분적으로 페이지를 로딩하고 hyration을 구역별로 할 수 없을까?
- Streaming 방식으로 랜더링을 할 수 있다.
- 이는 경계가 필요한데, React Suspense + RSC 조합으로 가능하다.
CSR : 클라이언트 사이드 랜더링
- 리액트와 동일하게 작동
2.2 RSC 을 이용한 다양한 랜더링 방식 구현
- RSC - 빌드 시점에서 데이터 Fetch 후 정적파일로 변환
- RCC - 특정 컴포넌트 html 변환, UI단 리액트 처럼 작동
- 위 조합으로 SSG / ISR / SSR / Streaming / CSR 작동
4.TailwindCSS 의 가능성
원래는 CSS만 아는것으로 만족했다.
- 하지만 tailwind CSS를 보고 생산성이 올라가는것을 느꼈다.
- 물론 tailwind like css 를 배우는데 러닝 커브가 있다.
- 완적히 몸에 익혔을때는 마크업과 동시에 CSS까지 모두 처리하는 생산성을 보여준다.
5.전역 상태관리는 Zustand
서버컴포넌트와 서버사이드 랜더링 개념을 받아들이면서 전역상태를 관리하는게 이상했다.
- Redux, Zustand 등 React의 Root Provder로 들어가는 Context 인데,
- 서버컴포넌트에 이를 사용하는게 이해가 되지 않았다.
- 이는 컴포넌트 트리 관점에서 Import 모듈 관점에서 계층을 이해해야 한다.
6.결제 시스템까지 처리하는 Backend NextJS!
Stripe API를 도입하면 결제시스템을 쉽게 붙일 수 있다.
- 다만 클라이언트 요청, 서버단의 처리, Stripe 서버의 처리
- 등 3가지를 왔다갔다 해야 한다.
- NextJS에서는 Stripe의 웹훅을 처리할 수 있다.