stack-analysis
CHAPTER 29 / 90
읽기 약 2분
FUNCTION
모노레포: pnpm workspaces + Turborepo
핵심 개념
workspace 구조·remote cache·pipeline·shared package — 다중 앱.
본문
폴더 구조
my-monorepo/
├── apps/
│ ├── web/ # Next.js 메인
│ ├── admin/ # Next.js 어드민
│ └── api/ # Express 백엔드
├── packages/
│ ├── ui/ # 공유 디자인 시스템
│ ├── config/ # ESLint/TS/Tailwind 공유
│ ├── types/ # 공유 타입 (DB 스키마 등)
│ ├── utils/ # 공통 함수
│ └── db/ # Prisma 스키마
├── package.json
├── pnpm-workspace.yaml
└── turbo.jsonpnpm workspaces
# pnpm-workspace.yaml
packages:
- 'apps/*'
- 'packages/*'// package.json (루트)
{
"name": "my-monorepo",
"private": true,
"scripts": {
"dev": "turbo run dev",
"build": "turbo run build",
"lint": "turbo run lint",
"test": "turbo run test"
},
"devDependencies": {
"turbo": "^2.0.0"
}
}
// apps/web/package.json
{
"name": "@my/web",
"dependencies": {
"@my/ui": "workspace:*",
"@my/types": "workspace:*",
"@my/utils": "workspace:*",
"next": "^16.0.0"
}
}Turborepo 파이프라인
// turbo.json
{
"$schema": "https://turbo.build/schema.json",
"globalDependencies": ["**/.env.*local"],
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": [".next/**", "!.next/cache/**", "dist/**"],
"env": ["NODE_ENV", "DATABASE_URL"]
},
"dev": {
"cache": false,
"persistent": true
},
"lint": {
"dependsOn": ["^build"],
"outputs": []
},
"test": {
"dependsOn": ["^build"],
"outputs": ["coverage/**"]
}
}
}공유 패키지 — UI
// packages/ui/src/Button.tsx
export function Button({ children, ...props }: Props) {
return <button {...props}>{children}</button>;
}
// packages/ui/package.json
{
"name": "@my/ui",
"version": "0.0.0",
"main": "./src/index.ts",
"types": "./src/index.ts",
"exports": {
".": "./src/index.ts",
"./styles.css": "./src/styles.css"
},
"peerDependencies": {
"react": "^18.0.0"
}
}
// apps/web에서 사용
import { Button } from '@my/ui';
import '@my/ui/styles.css';공유 ESLint/TS 설정
// packages/config/eslint-base.js
export default [
// ... 공유 규칙
];
// packages/config/tsconfig-base.json
{
"compilerOptions": {
"strict": true,
"target": "es2020",
"moduleResolution": "bundler"
}
}
// apps/web/eslint.config.js
import base from '@my/config/eslint-base';
export default base;
// apps/web/tsconfig.json
{
"extends": "@my/config/tsconfig-base.json",
"compilerOptions": {
"paths": { "@/*": ["./src/*"] }
}
}Remote Cache (Vercel)
# 로그인 + 연결
pnpm dlx turbo login
pnpm dlx turbo link
# 빌드 — 자동 원격 캐시
pnpm build
# → 동일 입력 → 결과 즉시 (Vercel CDN에서)
# CI에서 분 단위 → 초 단위다음 챕터
CH.30 "보일러플레이트 + 베스트 프랙티스 종합".
AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
내 코드의 모노레포 부분을 분석해서 실전 분석 + 개선 우선순위를 알려줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
모노레포 관련 인기 라이브러리/패턴 5개를 비교 분석해서 패턴 추출를 알려줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
내 프로젝트 전체에서 모노레포 최적화 가능 위치를 보고해줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
2026년 한국 프론트엔드 시장의 모노레포 트렌드를 솔직히 알려줘.
⭐ 이것만 기억하세요
모노레포: pnpm workspaces + Turborepo는 이 3가지만 확실히 잡으세요
1.pnpm workspaces + Turborepo = 다중 앱·패키지 표준 — 빌드 캐시 자동
2.@my/ui·@my/config·@my/types로 공유 — DRY + 일관성
3.Remote Cache = 팀원·CI 모두 빌드 캐시 공유 — 시간 90% 절감
공유하기
진행도 29 / 90