Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save YangSiJun528/2def02993bba7990fcbec1729066e43c to your computer and use it in GitHub Desktop.

Select an option

Save YangSiJun528/2def02993bba7990fcbec1729066e43c to your computer and use it in GitHub Desktop.
TS 기반 풀스택 아키텍처 구상

왜?

TS를 하면 tRPC나 스키마 관리가 편리함.

풀스택 개발을 해보고 싶었고, 가벼운 스택이면서 작은 서비스도 문제 없이 운영 가능한 정도를 원했음.

기술 선택 이유들

TypeScript, React, Next.js << 많이 쓰니까 사실 상 React/Next.js가 웹 표준이 되었으므로... 처음 배운다면 이게 좋아보임.

SSR 많이 필요하면 Next.js (버셀때매 선호하진 않긴 함) 기본적으론 React 기반으로.

  • Zod: FE/BE 서로 호환이 잘 됨. BE 자체만으로 보면 JSON Schema인가 그거 기반인 TypeBox가 나음.

  • tRPC: 풀스택 개발을 간결하게 해주는 핵심

  • TanStack Query: 상태는 서버 위주, 왜? 내가 서버 개발자니까. FE 위주의 서비스면 별도로 Zustand 추가.

  • shadcn/ui & Tailwind CSS: 국밥 스택, 단, 스타일은 최대한 제공해주는걸 쓰고, 레이아웃만 Tailwind로 쓰기.

  • TanStack Router: 라우터 필요하니까 국밥 스택 하나 고름

  • Fastify:

    • NestJS를 싫어함.
      • Spring이랑 비슷하기만 하고, DB/WEB 추상화 잘 안되고, Starter나 버전 관리나 생태계 면에서 그냥 흉내내는거 같음.
      • 뭐 그것 자체만으로도 가치가 있을 수 있겠지만? 내 스타일은 아니야... 이정도로 큰 서비스 필요하면 걍 Spring Boot 쓰고 말지?
    • 간결함. NestJS 대체제로 다음으로 유명한거면서 최소한의 기능만 제공해줘서 채택, 통합 테스트 위주의 기능 제공해주는것도 맘에 듬.
      • 단위 테스트는 좋지만 전체 검증이 잘 안되는 느낌이라...
      • 통합은 테스트 느리지 않음? -> 요즘 쓰는 Agents는 뭐 빠름? 그리고 작은 서비스 기준이라 충분히 빠를듯?
  • Kysely: ORM은 솔직히 익숙해지면 편한데, 기술 스택 여러가지 쓰는 입장에서 약간씩 있는 차이점이 오히려 어려움; SQL 매퍼가 더 무난함.

  • Better Auth: 인증은 필요하니까, 괜찮아보이는데?

  • pg-boss: Task 작업은 은근 많이 필요함, 특히 LLM 이나 배치 같은 작업을 안전하게 돌리기 좋고, 인프라를 늘리지 않는 DB 기반을 나는 선호하는 편 (느리면 바꾸면 됨)

  • PostgreSQL: 기능 많고, 빠르고, 외국 자료 많고...

  • Caddy: 솔직히 nginx랑 별 차이 없긴 해? 그냥 간단해서 쓰는거지

구상은 내가 함.

AI 정리 버전

1. 순수 React 버전

목적

가볍고 단순한 SPA 기반 실제 서비스 보일러플레이트

스택

Common
+ TypeScript
+ tRPC
+ Zod
+ Vite
+ NPM Workspaces

FE
+ React
+ TanStack Query
+ TanStack Router
+ shadcn/ui
+ Tailwind CSS

BE
+ Fastify
+ Kysely
+ pg-boss
+ Better Auth
+ Pino

Infra
+ PostgreSQL
+ Docker
+ Caddy

구조

apps/
  web/       # Vite React SPA
  api/       # Fastify API server
  worker/    # pg-boss worker

packages/
  schemas/   # Zod schemas
  trpc/      # shared AppRouter types/client helpers
  db/        # Kysely types/migrations
  ui/        # shared shadcn/ui components optional

운영 배포

Caddy
├─ /trpc/*      → Fastify API
├─ /api/auth/*  → Fastify API
└─ /*           → React 정적 파일

React는 Vite로 build 후 정적 파일로 서빙합니다. Vite는 백엔드 통합 시 개발 서버 proxy/origin 구성을 안내하고, 운영에서는 빌드 결과물을 백엔드나 웹서버가 서빙하는 방식이 일반적입니다. (vitejs)

장점

+ 구조가 단순함
+ 컨테이너 수 적음
+ Fastify가 API와 정적 파일 서빙 모두 가능
+ TanStack Router로 앱 라우팅 명확
+ tRPC + Zod로 내부 API 타입 안전성 확보
+ pg-boss로 PostgreSQL 기반 task queue 처리 가능

단점

- SEO 약함
- SSR/SSG 없음
- 공개 랜딩/블로그/문서 SEO는 별도 대응 필요
- 첫 HTML은 대체로 빈 앱 shell에 가까움

SEO 대응

순수 React 버전에서 SEO를 어느 정도 챙기려면 다음 정도가 현실적입니다.

1. /, /pricing, /docs 같은 공개 페이지를 정적 HTML로 별도 작성
2. React SPA는 /app 하위에 배치
3. sitemap.xml, robots.txt, meta tag는 직접 관리
4. 강한 SEO가 필요하면 Next 버전으로 이동

즉, 순수 React 버전은 이런 서비스에 적합합니다.

내부 도구
관리자 페이지
SaaS 대시보드
로그인 후 기능 중심 앱
SEO가 핵심이 아닌 서비스

2. Next 버전

목적

SEO/SSR/SSG가 필요한 실제 서비스 보일러플레이트

스택

Common
+ TypeScript
+ tRPC
+ Zod
+ NPM Workspaces

FE
+ Next.js
+ React
+ TanStack Query
+ shadcn/ui
+ Tailwind CSS

BE
+ Fastify
+ Kysely
+ pg-boss
+ Better Auth
+ Pino

Infra
+ PostgreSQL
+ Docker
+ Caddy

삭제되는 것:

- Vite
- TanStack Router

Next가 빌드 시스템과 라우터 역할을 가져갑니다.

구조

apps/
  web/       # Next.js
  api/       # Fastify API server
  worker/    # pg-boss worker

packages/
  schemas/   # Zod schemas
  trpc/      # shared AppRouter types/client helpers
  db/        # Kysely types/migrations
  ui/        # shared shadcn/ui components optional

운영 배포

Caddy
├─ /trpc/*      → Fastify API
├─ /api/auth/*  → Fastify API
└─ /*           → Next.js web

Next는 self-hosting을 지원하며, Node.js 서버, Docker image, static export 방식으로 배포할 수 있습니다. Docker 배포도 공식적으로 지원됩니다. (Next.js)

중요한 원칙

Next = FE / SEO / SSR / SSG
Fastify = API / Auth / tRPC
Worker = background jobs
PostgreSQL = app data + queue

Next의 API Route나 Server Action을 메인 백엔드로 쓰지 않는 게 좋습니다.

피할 구조:

Next API 일부
Fastify API 일부
Next auth 일부
Fastify auth 일부

권장 구조:

Next는 화면만
Fastify는 API만

장점

+ SEO 좋음
+ 공개 페이지 SSG/SSR 가능
+ 랜딩/가격/문서/블로그에 적합
+ React 기반 유지
+ 별도 Astro 불필요
+ FE 라우팅/빌드/SEO 메타 관리가 통합됨

단점

- 순수 React/Vite보다 무거움
- web 컨테이너가 별도로 필요함
- Next와 Fastify 역할 경계를 잘 지켜야 함
- TanStack Router는 사실상 제거됨

적합한 페이지 분리

Next 공개 페이지
+ /
+ /pricing
+ /features
+ /docs
+ /blog
+ /legal
+ /changelog

Next 로그인 앱
+ /app
+ /app/projects
+ /app/settings
+ /app/jobs

Fastify
+ /trpc/*
+ /api/auth/*

둘의 차이

항목 순수 React 버전 Next 버전
FE 빌드 Vite Next
라우팅 TanStack Router Next App Router
SEO 약함 좋음
SSR/SSG 직접 구현 필요 기본 지원
배포 정적 파일 + Fastify/Caddy Next Node server + Fastify
구조 단순성 더 단순 약간 복잡
대시보드 앱 좋음 좋음
랜딩/블로그/문서 약함 좋음
컨테이너 web 정적 서빙 가능 web Node 컨테이너 권장
추천 용도 내부 앱, MVP, 도구형 SaaS 공개 서비스, SEO 필요 SaaS

Docker 기준 프로세스

순수 React 버전

containers
├─ caddy
├─ api
├─ worker
└─ postgres

React build 결과는 Caddy나 Fastify가 정적으로 서빙.

Next 버전

containers
├─ caddy
├─ web      # Next.js
├─ api      # Fastify
├─ worker   # pg-boss
└─ postgres

Next 때문에 컨테이너가 하나 늘어납니다. 이 정도가 배포 복잡도의 핵심 차이입니다.

최종 추천

SEO가 중요하지 않으면

순수 React 버전

선택 이유:

더 단순함
더 가벼움
보일러플레이트 만들기 쉬움
Fastify 중심 구조가 깔끔함

공개 페이지 SEO가 중요하면

Next 버전

선택 이유:

랜딩/문서/블로그/가격 페이지에 유리함
SSR/SSG 직접 구현 안 해도 됨
React 기반 유지 가능
Astro 없이 해결 가능

내 판단

당신 목적이:

최소한의 실제 서비스를 위한 보일러플레이트
다목적 서버
API 서버
DB 기반 Task Queue
FE 존재
나중에 공개 서비스 가능성 있음

이면 Next 버전이 더 범용적입니다.

단, 아키텍처는 이렇게 고정하는 게 좋습니다.

Next = Frontend only
Fastify = Backend only
Worker = Jobs only
PostgreSQL = Data + Queue
Caddy = Routing/TLS

반대로 “내부 도구나 대시보드 중심”이면 순수 React 버전이 더 낫습니다.

@YangSiJun528

Copy link
Copy Markdown
Author

일단 React 쓰고, Next는 공부하면서 업그레이드하거나 하기.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment