OPEN HYPER STEP
← 목록으로 (stack-analysis)
STACK-ANALYSIS · 29 / 90
stack-analysis
CHAPTER 29 / 90
읽기 약 2
FUNCTION

모노레포: pnpm workspaces + Turborepo


핵심 개념

workspace 구조·remote cache·pipeline·shared package — 다중 앱.

본문

폴더 구조

📋 코드 (14줄)
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.json

pnpm workspaces

YAML📋 코드 (4줄)
# pnpm-workspace.yaml
packages:
  - 'apps/*'
  - 'packages/*'
JSON📋 코드 (26줄)
// 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 파이프라인

JSON📋 코드 (24줄)
// 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

TYPESCRIPT📋 코드 (25줄)
// 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 설정

JSON📋 코드 (27줄)
// 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)

BASH📋 코드 (11줄)
# 로그인 + 연결
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