-
Notifications
You must be signed in to change notification settings - Fork 2
Feat: 모노레포 인프라 설정 #88
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
이 PR은 모노레포 기반 인프라 구축을 위한 핵심 설정 패키지들을 도입하여 프로젝트의 확장성과 유지보수성을 대폭 개선합니다.
주요 변경사항
- TypeScript 공유 설정 패키지 (
@soso/tsconfig) 생성으로 일관된 타입 체크 환경 구축 - ESLint 공유 설정 패키지 (
@soso/eslint-config) 확장으로 통일된 코드 스타일 적용 - Changesets 버전 관리 시스템 도입으로 패키지 배포 프로세스 자동화 준비
Reviewed changes
Copilot reviewed 16 out of 17 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
pnpm-workspace.yaml |
docs 단독 항목 제거, glob 패턴으로 워크스페이스 구조 최적화 |
pnpm-lock.yaml |
Changesets CLI 및 관련 의존성 추가, 새로운 패키지 등록 |
packages/tsconfig/base.json |
모든 패키지의 기반이 되는 TypeScript 기본 설정 (strict 모드, ES2020) |
packages/tsconfig/nextjs.json |
Next.js 앱용 TypeScript 설정 (JSX preserve, Next.js 플러그인 지원) |
packages/tsconfig/react-library.json |
React 라이브러리용 TypeScript 설정 (react-jsx, bundler 해석) |
packages/tsconfig/package.json |
tsconfig 패키지 메타데이터 및 공개 파일 목록 정의 |
packages/tsconfig/README.md |
tsconfig 패키지 사용 가이드 및 각 설정 파일 설명 |
packages/tsconfig/.eslintrc.cjs |
tsconfig 패키지 자체의 ESLint 설정 |
packages/eslint-config/index.cjs |
Next.js 앱용 ESLint 설정 (Airbnb, Next.js 규칙 포함) |
packages/eslint-config/library.cjs |
React 라이브러리용 ESLint 설정 (devDependencies 허용) |
packages/eslint-config/package.json |
eslint-config 패키지 메타데이터 및 진입점 정의 |
packages/eslint-config/README.md |
eslint-config 패키지 사용 가이드 |
packages/eslint-config/.eslintrc.cjs |
eslint-config 패키지 자체의 ESLint 설정 |
package.json |
Changesets 관련 스크립트 추가 및 의존성 추가 |
.eslintignore |
설정 파일 무시 패턴 최적화 |
.changeset/config.json |
Changesets 설정 (배포 대상 패키지, 버전 관리 전략) |
.changeset/README.md |
Changesets 사용 가이드 및 워크플로우 설명 |
Files not reviewed (1)
- pnpm-lock.yaml: Language not supported
| ## 📚 참고 | ||
|
|
||
| - [TSConfig Reference](https://www.typescriptlang.org/tsconfig) | ||
| - [TypeScript 모노레포 베스트 프랙티스](hhttps://turborepo.com/docs/guides/tools/typescript) |
Copilot
AI
Nov 29, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
URL에 오타가 있습니다. "hhttps" → "https"로 수정해야 합니다.
| - [TypeScript 모노레포 베스트 프랙티스](hhttps://turborepo.com/docs/guides/tools/typescript) | |
| - [TypeScript 모노레포 베스트 프랙티스](https://turborepo.com/docs/guides/tools/typescript) |
| @@ -0,0 +1,42 @@ | |||
| /* tools/eslint-config/index.cjs ───── 공통 ESLint preset */ | |||
Copilot
AI
Nov 29, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
파일 경로가 잘못되었습니다. "tools/eslint-config/index.cjs" → "packages/eslint-config/index.cjs"로 수정해야 합니다.
| /* tools/eslint-config/index.cjs ───── 공통 ESLint preset */ | |
| /* packages/eslint-config/index.cjs ───── 공통 ESLint preset */ |
| Release PR이 머지되면, GitHub Actions가 자동으로: | ||
|
|
Copilot
AI
Nov 29, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
문서에서 GitHub Actions를 통한 자동 배포를 언급하고 있지만, 현재 .github/workflows 디렉토리에는 changesets 관련 워크플로우가 없는 것으로 보입니다. 실제 구현이 아직 완료되지 않았다면 이 부분을 "추후 구현 예정"으로 명시하거나 제거하는 것이 좋습니다.
| Release PR이 머지되면, GitHub Actions가 자동으로: | |
| > ⚠️ 현재 GitHub Actions를 통한 자동 배포는 아직 구현되지 않았으며, 추후 구현될 예정입니다. | |
| Release PR이 머지되면, (추후 구현 예정) GitHub Actions가 자동으로 다음 작업을 수행합니다: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
곧 합니다
| "access": "public", | ||
| "baseBranch": "main", | ||
| "updateInternalDependencies": "patch", | ||
| "ignore": ["@soso/web", "@soso/docs", "@soso/storybook"] |
Copilot
AI
Nov 29, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
현재 ignore 목록에 @soso/docs와 @soso/storybook가 포함되어 있지만, 실제 apps/ 디렉토리에는 아직 이 패키지들이 존재하지 않습니다. 향후 추가될 패키지를 미리 설정해둔 것이라면 문제없지만, 존재하지 않는 패키지를 설정에 포함하면 혼란을 줄 수 있습니다. 실제 패키지가 추가될 때 함께 설정하는 것을 권장합니다.
| "ignore": ["@soso/web", "@soso/docs", "@soso/storybook"] | |
| "ignore": ["@soso/web"] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
추가할겁니다
| "include": [ | ||
| "next-env.d.ts", | ||
| "**/*.ts", | ||
| "**/*.tsx", | ||
| ".next/types/**/*.ts" | ||
| ], | ||
| "exclude": ["node_modules"] |
Copilot
AI
Nov 29, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nextjs.json은 공유 설정 파일이므로 include와 exclude 필드를 포함하지 않는 것이 좋습니다. 이 필드들은 각 앱의 tsconfig.json에서 프로젝트별로 정의해야 합니다. 공유 설정에 포함하면 이를 상속받는 모든 프로젝트에 동일한 경로가 적용되어 유연성이 떨어집니다. README.md의 사용 예시처럼 각 앱에서 직접 정의하도록 수정하는 것을 권장합니다.
| "include": [ | |
| "next-env.d.ts", | |
| "**/*.ts", | |
| "**/*.tsx", | |
| ".next/types/**/*.ts" | |
| ], | |
| "exclude": ["node_modules"] |
📦 번들 분석 결과📊 번들 크기 요약
🔍 주요 청크 파일 (크기순)🤖 자동 생성된 번들 분석 리포트 |
⚡ Lighthouse 성능 분석 결과📊 전체 평균 점수
📈 측정 현황
📄 페이지별 상세 분석🏠 커뮤니티 페이지:
|
| 지표 | 점수 |
|---|---|
| 🚀 Performance | 71점 |
| ♿ Accessibility | 78점 |
| ✅ Best Practices | 100점 |
| 🔍 SEO | 100점 |
📊 상세 분석 보기
👥 창업자 페이지: /main/founder
| 지표 | 점수 |
|---|---|
| 🚀 Performance | 75점 |
| ♿ Accessibility | 87점 |
| ✅ Best Practices | 100점 |
| 🔍 SEO | 100점 |
📊 상세 분석 보기
🏡 홈 페이지: /main/home
| 지표 | 점수 |
|---|---|
| 🚀 Performance | 75점 |
| ♿ Accessibility | 91점 |
| ✅ Best Practices | 100점 |
| 🔍 SEO | 100점 |
📊 상세 분석 보기
🗺️ 지도 페이지: /main/maps
| 지표 | 점수 |
|---|---|
| 🚀 Performance | 75점 |
| ♿ Accessibility | 87점 |
| ✅ Best Practices | 100점 |
| 🔍 SEO | 100점 |
📊 상세 분석 보기
👤 프로필 페이지: /main/profile
| 지표 | 점수 |
|---|---|
| 🚀 Performance | 75점 |
| ♿ Accessibility | 88점 |
| ✅ Best Practices | 100점 |
| 🔍 SEO | 100점 |
📊 상세 분석 보기
🔗 전체 상세 분석 결과
📄 측정된 페이지
- /main/community
- /main/founder
- /main/home
- /main/maps
- /main/profile
모든 페이지에서 성능 측정이 완료되었습니다.
🤖 자동 생성된 Lighthouse 성능 리포트
youdaeng2
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
전체적으로 모노레포 구조 정리해주셔서 더 명확해진 것 같습니다.
apps/web, packages 구조가 잘 분리된 것 같네요 👍👍 사용하면서 이슈 있으면 공유드리겠습니다!
고생 많으셨어요!
📌 개요
모노레포 인프라 관리를 위한 TypeScript/ESLint 공유 설정 및 Changesets 버전 관리 시스템 도입
@soso/tsconfig) 생성@soso/eslint-config) 확장apps/,packages/)🗒 상세 설명
1. 모노레포 디렉토리 구조 확립
프론트엔드 팀의 통합 인프라를 위한 모노레포 기본 구조를 설계하고 생성했습니다.
핵심 기술 및 구현사항
apps/: 실행 가능한 애플리케이션 (web, docs, storybook)packages/: 재사용 가능한 라이브러리 (ui, hooks, utils, config)디렉토리 구조
사용 예시
2. TypeScript 공유 설정 패키지 (
@soso/tsconfig)모든 패키지와 앱에서 재사용할 수 있는 TypeScript 설정을 패키지로 분리했습니다.
핵심 기술 및 구현사항
3가지 설정 파일 제공:
base.json: 모든 설정의 기본 (strict, ES2020, incremental)nextjs.json: Next.js 앱용 (noEmit: false, 빌드 가능)react-library.json: React 라이브러리용 (noEmit: true, 타입 체크만)Strict 모드 기본 활성화:
strict: truenoUnusedLocals: truenoUnusedParameters: truenoFallthroughCasesInSwitch: true모던 JavaScript 타겟:
target: ES2020lib: ["ES2020", "DOM"]module: ESNext생성된 파일
사용 예시
3. ESLint 공유 설정 패키지 (
@soso/eslint-config)Next.js 앱과 React 라이브러리를 위한 ESLint 설정을 확장했습니다.
핵심 기술 및 구현사항
2가지 설정 파일 제공:
index.cjs: Next.js 앱용 (next/core-web-vitals 포함)library.cjs: React 라이브러리용 (airbnb-typescript 기반)통합된 스타일 가이드:
React 17+ 대응:
react/react-in-jsx-scope: off(JSX Transform 지원)react/jsx-filename-extension: ['.tsx']생성된 파일
사용 예시
4. Changesets 자동 버전 관리 시스템 추가
패키지의 버전 관리, Changelog 생성, npm 배포를 자동화하는 Changesets를 도입했습니다.
🎯 Changesets란?
Changesets는 모노레포 환경에서 여러 패키지의 버전을 자동으로 관리하고 Changelog를 생성하며 npm에 배포하는 도구입니다.
주요 기능:
📚 Changesets 워크플로우
🔧 설정 파일 상세 설명
📖 Changesets 사용 가이드
Step 1: 변경사항 기록 (changeset 생성)
코드를 수정한 후 changeset을 생성합니다:
대화형 CLI가 실행됩니다:
화살표 키로 이동, 스페이스로 선택, 엔터로 확정합니다.
버전 선택 기준:
기존 API가 변경되어 사용자 코드가 깨질 수 있음
- prop 이름 변경
- 기능 제거
새로운 기능 추가 (하위 호환)
- 새로운 prop 추가
- 새로운 훅 추가
버그 수정 또는 내부 개선
- 타입 수정
- 문서 업데이트
변경사항 요약 입력:
생성된 changeset 파일:
Step 2: 버전 업데이트
PR이 머지된 후, 배포 준비가 되면 버전을 업데이트합니다:
자동으로 수행되는 작업:
.changeset/*.md파일 읽기package.json버전 업데이트CHANGELOG.md생성/업데이트예시:
Step 3: npm 배포
자동으로 수행되는 작업:
pnpm build:packages- 모든 패키지 빌드changeset publish- npm에 배포@soso/[email protected])💡 Changesets 옵션 선택 가이드
1. 어떤 패키지를 선택해야 하나요?
실제로 코드를 수정한 패키지만 선택하세요.
의존 패키지는 자동으로 처리됩니다:
@soso/ui업데이트 →@soso/web도 자동으로@soso/ui버전 업데이트2. major/minor/patch 구분이 어려워요
구체적인 예시:
<Button>컴포넌트에sizeprop 추가<Button>컴포넌트의variantprop을type으로 변경<Button>의 클릭 시 버그 수정useAuth훅 새로 추가useAuth훅의 반환 타입 변경헷갈릴 때는 이렇게 질문하세요:
3. 여러 패키지를 동시에 수정했어요
하나의 changeset에 여러 패키지를 포함할 수 있습니다:
pnpm changeset # 선택 ✅ @soso/ui (minor) ✅ @soso/hooks (patch)생성된 changeset:
각 패키지마다 다른 버전 타입을 지정 가능합니다.
4. changeset 파일을 수정할 수 있나요?
네, 직접 수정 가능합니다:
Markdown 문법 사용 가능하며, 이 내용이 Changelog에 그대로 들어갑니다.
5. changeset을 삭제하고 싶어요
Git에 커밋하기 전이라면 언제든 수정/삭제 가능합니다.
🚀 실전 시나리오
시나리오 1: Button 컴포넌트에 size prop 추가
시나리오 2: Breaking Change (prop 이름 변경)
Reason: Better naming convention
2개의 changeset 파일 생성:
.changeset/add-select.md(ui: minor, hooks: minor).changeset/fix-button.md(ui: patch)버전 업데이트 시 결과:
@soso/ui: 0.1.0 → 0.2.0 (minor가 우선)@soso/hooks: 0.1.0 → 0.2.0📋 Changesets 체크리스트
PR 생성 전:
pnpm changeset실행.changeset/*.md파일 Git에 커밋PR 머지 후 (릴리즈 담당자):
pnpm version-packages실행pnpm release실행🎨 Changesets 파일 예시
사용 예시
5. pnpm workspace 최적화
핵심 기술 및 구현사항
apps/*,packages/*로 자동 인식docs단독 항목 제거:apps/*에 포함설정 파일
6. 루트 package.json 스크립트 추가
핵심 기술 및 구현사항
모노레포를 편리하게 관리할 수 있는 스크립트를 추가했습니다.
{ "scripts": { // 개발 서버 "dev:storybook": "pnpm --filter @soso/storybook dev", "dev:docs": "pnpm --filter @soso/docs dev", // 빌드 및 테스트 (Turborepo) "build:packages": "turbo run build --filter='./packages/*'", "test:packages": "turbo run test --filter='./packages/*'", // Changesets "changeset": "changeset", "version-packages": "changeset version", "release": "pnpm build:packages && changeset publish" } }사용 예시
7. ESLint 설정 최적화
문제 상황
packages/eslint-config/*.cjs파일에서 TypeScript 파서 에러가 발생했습니다:해결 방법
.eslintignore생성:각 패키지별
.eslintrc.cjs추가:📸 스크린샷
AS-IS
TO-BE
🔗 이슈
closes #86
✅ 체크리스트
🧪 테스트 방법
변경 사항을 다음 방법으로 검증했습니다:
1. pnpm workspace 확인
2. 디렉토리 구조 확인
3. Changesets 동작 확인
4. ESLint 실행 확인
5. TypeScript 설정 확인
📝 추가 노트
참고 자료
후속 작업
이어서 진행할 작업 계획:
Issue 1.2: UI 패키지 기본 설정 및 빌드 시스템 (예정)
packages/ui/package.json작성exports필드 설정 (ESM/CJS 지원)peerDependencies설정 (React, React-DOM)tsup 빌드 설정
Vitest 단위 테스트 환경
간단한 컴포넌트 예제
Dependencies: ✅ Issue 1.1 완료
Issue 1.3: Storybook 개발 환경 구축 (예정)
Dependencies: Issue 1.2 완료 필요