728x90
반응형
계속 같은 프로젝트를 진행 중인데,
유사한 UI의 시스템 2개를 동시에 관리해야 하는 경우 어떻게 해야할지에 대해 계속 고민됐었다.
이 경우 turborepo 사용을 많이 추천 받았는데,
모노레포 구조가 익숙하지 않아 기존 방식대로 계속 작업하다가 이제야 도입해봤다.
Turborepo + Vite + React + TanStack Router + TailwindCSS 세팅 과정
1. Turborepo 프로젝트 생성
먼저 Turborepo 기본 뼈대를 만들어준다.
npx create-turbo@latest cms-monorepo
cd cms-monorepo
생성된 구조는 다음과 같다.
cms-monorepo/
apps/ # 실제 실행할 앱들
docs/
web/
packages/ # 공통 UI, 설정
package.json # 루트 package.json (공통 deps)
turbo.json # Turborepo 설정
2. Vite + React 앱 생성
이제 apps/ 폴더 안에 실제 앱을 만든다.
여기서 중요한 건 반드시 apps/ 안에서 생성해야 한다는 점이다.
cd apps
# CMS 내부관리자용
npm create vite@latest cms -- --template react-ts
# client-CMS 고객용
npm create vite@latest client-cms -- --template react-ts
아래와 같이 두 프로젝트가 생성된다.
cms-monorepo/
apps/
cms/ # vite + react 프로젝트
client-cms/ # vite + react 프로젝트
packages/
3. 공통 패키지 생성
공유할 UI 컴포넌트나 config는 packages/에 넣어 관리한다.
cd ../packages
mkdir ui config
cd ui
npm init -y
예시(packages/ui/Button.tsx):
import React from "react";
export const Button = ({ children }: { children: React.ReactNode }) => {
return (
<button className="px-4 py-2 bg-blue-500 text-white rounded">
{children}
</button>
);
};
package.json 이름을 정해주면 앱에서 불러올 수 있다.
{
"name": "@acme/ui",
"version": "0.0.1"
}
4. 라이브러리 설치 (루트에서)
cms와 client-cms 두 앱 모두 같은 라이브러리를 쓴다면,
항상 루트(cms-monorepo/)에서 설치
cd cms-monorepo
# 라우터
npm install @tanstack/react-router
# 스타일
npm install tailwindcss postcss autoprefixer
# UI 컴포넌트
npm install lucide-react
# 코드 스타일
npm install -D @biomejs/biome
-w 옵션은 뭘까?
루트에서 실행하면 기본적으로 루트에 설치되기 때문에 -w는 필수가 아니다ㅣ.
하지만, 앱 디렉토리(apps/cms) 안에서 설치하되 루트에 기록하고 싶다면 -w 옵션을 붙이면 된다.
5. TanStack Router 기본 세팅
apps/cms/src/main.tsx 예시
import ReactDOM from "react-dom/client";
import { RouterProvider, createRouter } from "@tanstack/react-router";
import { routeTree } from "./routeTree.gen";
const router = createRouter({ routeTree });
ReactDOM.createRoot(document.getElementById("root")!).render(
<RouterProvider router={router} />
);
6. Turbo 설정 (turbo.json)
루트의 turbo.json은 빌드 파이프라인을 정의한다.
예시
{
"$schema": "https://turbo.build/schema.json",
"pipeline": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**"]
},
"dev": {
"cache": false,
"persistent": true
},
"lint": {
"outputs": []
}
}
}
7. 실행
개별 앱 실행:
npm run dev --workspace=apps/cms
npm run dev --workspace=apps/apt-cms
모든 앱 실행:
turbo run dev
정리
- apps/ → Vite + React 앱(cms, client-cms)
- packages/ → 공통 UI, config, utils
- 공통 라이브러리는 루트에서 설치 (npm install 라이브러리명)
- 특정 앱 전용 라이브러리라면 workspace 옵션 사용 (--workspace=apps/cms)
이렇게 하면 두 앱은 독립적으로 실행되면서도,
공통 UI와 라이브러리를 한 번만 관리할 수 있는 구조가 완성된다.
728x90
반응형
'React' 카테고리의 다른 글
| [Part .06] React 프로젝트에서 Recharts 사용하기: Vite + React 19 + Tailwind CSS 환경에서의 선택과 적용기 (3) | 2025.07.06 |
|---|---|
| [Part. 05] TanStack Router로 React 프로젝트 라우팅하기 (3) | 2025.07.05 |
| [Part. 04] 라우팅된 페이지 새로고침 시 404 에러, 왜 뜨는걸까? (0) | 2025.05.14 |
| [Part. 03] Github 비공개 저장소 vercel배포 (5) | 2025.05.11 |
| [Part. 02] 코드 스타일 및 포맷팅 Biome와 ESLint + Prettier (2) | 2025.05.06 |