| name | notion-uploader |
| description | This skill registers BITDA ERP UI screens and components to Notion databases. Use this skill AFTER github-deployer when the deployed code has been reviewed and confirmed. Triggers on requests like "๋
ธ์
์ ๋ฑ๋กํด์ค", "Notion DB ์
๋ฐ์ดํธํด์ค", "ํ๋ฉด DB์ ์ฌ๋ ค์ค", "์ปดํฌ๋ํธ ๋ฑ๋กํด์ค". This skill requires the github-deployer to be completed first. |
Notion Uploader
Overview
This skill handles the Notion registration phase for BITDA ERP UI:
- ํ๋ฉด DB ๋ฑ๋ก: Register screens with code, type, and source links
- ์ปดํฌ๋ํธ & ๋ก์ง DB ๋ฑ๋ก: Register components with detailed business logic for backend API development
- Relation ์ฐ๊ฒฐ: Link components to their parent screens
- ์๋ ๊ฒ์:
/notion-validator ์คํฌ๋ก ๋ฑ๋ก ๋ฐ์ดํฐ ํ์ง ๊ฒ์ฆ (MANDATORY)
Prerequisites
- REST API Script:
.claude/shared-references/notion-db-uploader.py for DB ํ ๋ฑ๋ก (ํ๋ฉด/์ปดํฌ๋ํธ)
- Notion MCP: ์ฝ๊ธฐ(
notion-fetch, notion-search)์ ์์ฑ ์
๋ฐ์ดํธ(notion-update-page update_properties)์ฉ
- GitHub Deployment: Code already pushed via github-deployer skill
- Design Review: UI confirmed and ready for registration
๋๊ตฌ ๋ถ๋ด (REST API vs MCP)
| ์์
| ๋๊ตฌ | ์ด์ |
|---|
| ํ๋ฉด/์ปดํฌ๋ํธ DB ํ ๋ฑ๋ก | python .claude/shared-references/notion-db-uploader.py | ๋น ๋ฅด๊ณ ์์ ์ , ํ ํฐ 0 |
| ๋ง์คํฐ ์ฝ๋ ์กฐํ | REST API lookup ๋ช
๋ น ๋๋ MCP notion-search | ์๋ ํด์ |
| ์์ฑ ์
๋ฐ์ดํธ | MCP notion-update-page update_properties | ์์ฑ ์ ์ฉ |
| ํ์ด์ง ์กฐํ | MCP notion-fetch, notion-search | ์ฝ๊ธฐ ์ ์ฉ |
| ํ
์คํธ ๋ฐ์ดํฐ ์ญ์ | REST API archive ๋ช
๋ น | ๋น ๋ฅธ ์ ๋ฆฌ |
Reference Files
../../shared-references/convention-template.md: BITDA ERP screen code conventions (shared)
../../shared-references/notion-db-uploader.py: REST API DB ํ ๋ฑ๋ก ์คํฌ๋ฆฝํธ
references/notion-db-config.md: Notion database IDs and schemas
references/agent-integration-guide.md: Specialized agent usage for documentation quality
Workflow
Phase 1: Gather Context from Planning Documents
-
๊ธฐํ๋ฌธ์ ํ์ธ:
- ๋จผ์
.claude/shared-references/notion-manifest.md์์ ํด๋น ๊ธฐํ๋ฌธ์์ Page ID ํ์ธ (0 ํ ํฐ)
- ๋งค๋ํ์คํธ์ ์์ผ๋ฉด ํด๋น Page ID๋ก ์ง์
notion-fetch
- ๋งค๋ํ์คํธ์ ์์ผ๋ฉด: https://www.notion.so/invigoworks/01-2df471f8dcff80c0893becf766c394b0 ์์ ๊ฒ์
- Note: ๊ธฐํ๋ฌธ์๋ ์ด์ ์ํ์ด๋ฏ๋ก ํผ๋ธ๋ฆฌ์ฑ ์ฝ๋์ ๋ฐ์๋ ํผ๋๋ฐฑ ์ฌํญ๋ค์ ์ถ๊ฐ๋ก ํ์
ํด์ผ ํจ
-
ํผ๋ธ๋ฆฌ์ฑ ์ฝ๋ ๋ถ์:
- Read the deployed code from GitHub (source ๋งํฌ)
- Identify UI components, form fields, validation rules
- Extract actual business logic implemented in the code
- This represents the FINAL confirmed specifications after feedback
Phase 2: Gather Registration Data
- Screen Information: ํ๋ฉด์ฝ๋, ํ๋ฉด๋ช
, ํ๋ฉด์ ํ (S/F/P/R/D/M), ๊ธฐ๋ฅ์ฝ๋, GitHub source ๋งํฌ, ์ฐ๊ด๋ ๊ธฐํ๋ฌธ์
- Component Information: ์์๋ช
, ๋น์ฆ๋์ค ๋ก์ง (Phase 3 ์ฐธ์กฐ), ์ฐ๊ฒฐํ ํ๋ฉด
Phase 2.5: ์ปดํฌ๋ํธ ๋ฑ๋ก ๋จ์ ํ๋จ (CRITICAL)
ํ
์ด๋ธ API์ ๊ฒฐํฉ๋ ์์๋ฅผ ๋ณ๋ ๋ฑ๋กํ๋ฉด ๋ฐฑ์๋๊ฐ ํํธํ๋ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ๊ฒ ๋จ.
ํ๋จ ๊ธฐ์ค: "์ด ์์๊ฐ ๋
๋ฆฝ์ ์ธ API๋ฅผ ํ์๋ก ํ๋๊ฐ?"
| ์ง๋ฌธ | Yes โ ๋ถ๋ฆฌ ๋ฑ๋ก | No โ ๋ณํฉ |
|---|
| ์์ฒด CRUD ์๋ํฌ์ธํธ๊ฐ ํ์ํ๊ฐ? | Sheet, Dialog | FilterBar, Toolbar |
| ๋
๋ฆฝ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํ/์ ์ฅํ๋๊ฐ? | ๋ณ๋ API ํธ์ถ ์์ ฏ | ํ
์ด๋ธ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ๋ณ๊ฒฝ UI |
| ๋ค๋ฅธ ํ๋ฉด์์๋ ๋์ผ API๋ก ์ฌ์ฌ์ฉ๋๋๊ฐ? | ๊ณตํต ๋ชจ๋ฌ | ํน์ ํ
์ด๋ธ ์ ์ฉ ํํฐ |
๋ณํฉ ๋์ (๋ณ๋ ๋ฑ๋ก ๊ธ์ง)
| ์ ํ | ์์ | ๋ณํฉ ์์น |
|---|
| ํํฐ๋ฐ/๊ฒ์๋ฐ | *FilterBar, *SearchBar | ๋ถ๋ชจ Table โ ํํฐ ํ๋ผ๋ฏธํฐ |
| ์ ๋ ฌ/ํ์ด์ง๋ค์ด์
| SortableHeader, *Pagination | ๋ถ๋ชจ Table โ ์ ๋ ฌ/ํ์ด์ง |
| ํ
์ด๋ธ ํด๋ฐ | TableToolbar, BulkInputToolbar | ๋ถ๋ชจ Table โ ๋๋ ์์
|
| ์ธ๋ผ์ธ ์ก์
| ํ ๋ด ๋ฒํผ, ํ ๊ธ | ๋ถ๋ชจ Table โ ํ ์ก์
|
๋ถ๋ฆฌ ๋ฑ๋ก ๋์
| ์ ํ | ์์ | ์ด์ |
|---|
| Sheet (์์ฑ/์์ ํผ) | UserSheet, OrderSheet | ๋
๋ฆฝ์ ์ธ Create/Update API |
| Dialog (ํ์ธ/์ญ์ ) | DeleteDialog, ConfirmDialog | ๋
๋ฆฝ์ ์ธ Delete/Action API |
| ๋
๋ฆฝ ๋ชจ๋ฌ ํผ | ImportExcelDialog | ๋
๋ฆฝ์ ์ธ ์
๋ก๋ API |
BAD (ํํธํ):
1. InventoryTable โ ๋ชฉ๋ก ์กฐํ ๋ก์ง
2. InventoryFilterBar โ ํํฐ ๋ก์ง โ โ ๋ณ๋ ๋ฑ๋ก
3. InventoryPagination โ ํ์ด์ง๋ค์ด์
โ โ ๋ณ๋ ๋ฑ๋ก
GOOD (๋ณํฉ):
1. InventoryTable โ ๋ชฉ๋ก ์กฐํ + ํํฐ + ์ ๋ ฌ + ํ์ด์ง๋ค์ด์
ํตํฉ
2. InventorySheet โ CRUD ๋ก์ง
Route Page ์ปดํฌ๋ํธ ๋ฑ๋ก ๊ท์น (CRITICAL)
๋ฐฐ๊ฒฝ: form-page.tsx, detail-page.tsx ๋ฑ route page๊ฐ ํ๋ฉด DB์ ๋ฑ๋ก๋์์ผ๋
๋์ํ๋ ์ปดํฌ๋ํธ๊ฐ ์์ฑ๋์ง ์๋ ๋๋ฝ ์ฌ๊ณ ๊ฐ ๋ฐ์ํจ. ์์ธ: components/ ๋๋ ํ ๋ฆฌ์
Sheet ํ์ผ์ด ์๋ ์๊ธฐ์๊ฒฐํ route page๋ฅผ ์์ด์ ํธ๊ฐ ์ปดํฌ๋ํธ๋ก ์ธ์ํ์ง ๋ชปํจ.
ํ์ ๊ฒ์ฆ: ํ๋ฉด DB์ ๋ฑ๋กํ ๋ชจ๋ route page์ ๋ํด ์ปดํฌ๋ํธ 1:1 ๋งค์นญ ํ์ธ.
| route ํ์ผ ํจํด | ํ๋ฉด์ ํ | ์ปดํฌ๋ํธ ๋งคํ ๋ฐฉ๋ฒ |
|---|
page.tsx | S (Screen) | components/*Table.tsx โ ์ปดํฌ๋ํธ ๋ฑ๋ก |
form-page.tsx ๋๋ form/page.tsx | F (Form) | ์๋ ํ๋จ ๋ก์ง ์ ์ฉ |
detail-page.tsx ๋๋ detail/page.tsx | F (Form) | ์๋ ํ๋จ ๋ก์ง ์ ์ฉ |
Form/Detail ์ปดํฌ๋ํธ ๋งคํ ํ๋จ:
form-page.tsx ๋๋ form/page.tsx ๋ฐ๊ฒฌ
โ
โโ components/ ์ *Sheet.tsx ์กด์ฌ?
โ โโ YES โ ํด๋น Sheet๋ฅผ ์ปดํฌ๋ํธ๋ก ๋ฑ๋ก (๊ธฐ์กด ํจํด)
โ โ ์: SalesOrderSheet.tsx โ form-page.tsx ํ๋ฉด์ ์ฐ๊ฒฐ
โ โ
โ โโ NO โ route page ์์ฒด๋ฅผ ์ปดํฌ๋ํธ๋ก ๋ฑ๋ก โ ๏ธ
โ ๋ช
๋ช
: [Module]FormPage (์: MiscIncomingFormPage)
โ ๋น์ฆ๋์ค ๋ก์ง: route ํ์ผ ๋ด๋ถ ์ฝ๋์์ ์ถ์ถ
โ
detail-page.tsx ๋๋ detail/page.tsx ๋ฐ๊ฒฌ
โ
โโ components/ ์ *DetailSheet.tsx ์กด์ฌ?
โ โโ YES โ ํด๋น DetailSheet๋ฅผ ์ปดํฌ๋ํธ๋ก ๋ฑ๋ก
โ โ
โ โโ NO โ route page ์์ฒด๋ฅผ ์ปดํฌ๋ํธ๋ก ๋ฑ๋ก โ ๏ธ
โ ๋ช
๋ช
: [Module]DetailPage (์: MiscIncomingDetailPage)
์ต์ข
๊ฒ์ฆ (Phase 5 ์๋ฃ ์ง์ ):
๋ชจ๋ ํ๋ฉด์ ์ต์ 1๊ฐ ์ด์์ ์ปดํฌ๋ํธ๊ฐ ์ฐ๊ฒฐ๋์ด ์๋๊ฐ?
์ปดํฌ๋ํธ๊ฐ 0๊ฐ์ธ ํ๋ฉด์ด ์์ผ๋ฉด ๋๋ฝ๋ ๊ฒ์ด๋ฏ๋ก ์ถ๊ฐ ์์ฑํ ํ Phase 6์ผ๋ก ์งํ.
Phase 3: ๋น์ฆ๋์ค ๋ก์ง ์์ฑ ๊ฐ์ด๋
๋ชฉ์ : ๋ฐฑ์๋ ๊ฐ๋ฐ์๊ฐ ๊ธฐํ๋ฌธ์ ์์ด API๋ฅผ ๊ฐ๋ฐํ ์ ์๋ ์์ค์ ์์ธ ๋ช
์ธ
๐ซ ์ ๋ ๊ธ์ง: ๋ฐ์ดํฐ ํ๋์ FE ๋ณ์๋ช
์ฌ์ฉ
ENFORCEMENT: ๋ฐ์ดํฐ ํ๋ ํ
์ด๋ธ์ "ํญ๋ชฉ" ์ปฌ๋ผ์๋ ๋ฐ๋์ ํ๊ธ ์์ ๋ช
๋ง ์ฌ์ฉ.
๋ณ์๋ช
์ ๋ฐฑ์๋๊ฐ ์์ฒด ์ ์ํ๋ฏ๋ก FE ๋ณ์๋ช
์ ๊ธฐ์ฌํ๋ฉด ํผ๋๋ง ์ด๋ํจ.
BAD - FE ๋ณ์๋ช
์ฌ์ฉ:
| ํญ๋ชฉ | ํ์
| ํ์ | ์ค๋ช
|
|------|------|------|------|
| orderNumber | string | Y | ์ฃผ๋ฌธ๋ฒํธ |
| supplierId | string(UUID) | Y | ์
๊ณ ์ฒ ID |
| totalAmount | number | Y | ํฉ๊ณ ๊ธ์ก |
| status | enum | Y | ์งํ์ํ |
GOOD - ํ๊ธ ์์ ๋ช
์ฌ์ฉ:
| ํญ๋ชฉ | ํ์
| ํ์ | ์ค๋ช
|
|------|------|------|------|
| ๋ฐ์ฃผ๋ฒํธ | string | Y | ์๋ ์ฑ๋ฒ (PO-yyyyMMdd-NNN) |
| ์
๊ณ ์ฒ | string(UUID) | Y | ๊ฑฐ๋์ฒ FK |
| ํฉ๊ณ ๊ธ์ก | number | Y | ํ๋ชฉ๋ณ ๊ธ์ก ํฉ์ฐ, ์๋ ๊ณ์ฐ |
| ์งํ์ํ | enum | Y | ์์ฑ์ค/๋ฐ์ฃผ์๋ฃ/์
๊ณ ์๋ฃ/์ทจ์ |
์ด ๊ท์น์ ํํฐ ํ๋ผ๋ฏธํฐ, ์ ๋ ฌ ํ๋, ํ์ด์ง๋ค์ด์
ํ๋ผ๋ฏธํฐ์๋ ๋์ผํ๊ฒ ์ ์ฉ๋จ.
BAD - ํํฐ์ ๋ณ์๋ช
:
| ํ๋ผ๋ฏธํฐ | ํ์
| ์ค๋ช
|
|---------|------|------|
| warehouseId | string[] | ์ฐฝ๊ณ ํํฐ |
| keyword | string | ๊ฒ์์ด |
GOOD - ํํฐ์ ํ๊ธ๋ช
:
| ํํฐ ํญ๋ชฉ | ํ์
| ์ค๋ช
|
|----------|------|------|
| ์ฐฝ๊ณ | string[] | ๋ค์ค ์ ํ |
| ๊ฒ์์ด | string | ํ๋ชฉ๋ช
/ํ๋ชฉ์ฝ๋ ๋ถ๋ถ ์ผ์น |
๋น์ฆ๋์ค ๋ก์ง ํ์ ํฌํจ ์ฌํญ
- ๋ฐ์ดํฐ ํ๋ ์ ์: ํญ๋ชฉ(ํ๊ธ), ํ์
, ํ์ ์ฌ๋ถ, ์ ํจ์ฑ ๊ท์น, ๊ธฐ๋ณธ๊ฐ/์ต์
- CRUD ๋์: ์์ฑ(ํ์/์๋ ํ๋), ์กฐํ(ํํฐ/์ ๋ ฌ/ํ์ด์ง), ์์ (๊ฐ๋ฅ/๋ถ๊ฐ ํ๋), ์ญ์ (์กฐ๊ฑด/์ฐ๊ด ์ฒ๋ฆฌ)
- ๋น์ฆ๋์ค ๊ท์น: ์ํ ๋ณ๊ฒฝ ๋ก์ง, ๊ถํ ์ฒดํฌ, ์ฐ๊ด ๊ด๊ณ
- API ์๋ํฌ์ธํธ ์ ์: HTTP Method + Path
์์ฑ ์์
## InventoryTable (์ฌ๊ณ ๋ชฉ๋ก)
### ๋ฐ์ดํฐ ํ๋
| ํญ๋ชฉ | ํ์
| ํ์ | ์ค๋ช
|
|------|------|------|------|
| ํ๋ชฉ ID | string(UUID) | Y | ์๋์์ฑ |
| ํ๋ชฉ๋ช
| string | Y | ์ ํ/์์ฌ๋ฃ๋ช
|
| ์ฐฝ๊ณ | string | Y | ์ฐฝ๊ณ FK |
| ํ์ฌ๊ณ | number | Y | ์ค์๊ฐ ์๋ |
| ๋จ์ | string | Y | kg, L, EA ๋ฑ |
| ์ต์ข
์
๊ณ ์ผ | datetime | N | ๋ง์ง๋ง ์
๊ณ ์ผ์ |
### ๋ชฉ๋ก ์กฐํ
- GET /api/v1/inventory
#### ํํฐ
| ํํฐ ํญ๋ชฉ | ํ์
| ์ค๋ช
|
|----------|------|------|
| ์ฐฝ๊ณ | string[] | ๋ค์ค ์ ํ |
| ํ๋ชฉ ๋ถ๋ฅ | string | ๋ถ๋ฅ ์ฝ๋ |
| ๊ฒ์์ด | string | ํ๋ชฉ๋ช
/ํ๋ชฉ์ฝ๋ ๋ถ๋ถ ์ผ์น |
| ์ฌ๊ณ ์ํ | enum | ์ ์ฒด/์ฌ๊ณ ์์/์ฌ๊ณ ์์ |
#### ์ ๋ ฌ
| ์ ๋ ฌ ๊ธฐ์ค | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช
|
|----------|--------|------|
| ์ต์ข
์
๊ณ ์ผ | desc | ๊ธฐ๋ณธ ์ ๋ ฌ |
| ํ๋ชฉ๋ช
| - | ๊ฐ๋๋ค์ |
#### ํ์ด์ง๋ค์ด์
- ๊ธฐ๋ณธ 20๊ฑด, ์ต๋ 100๊ฑด
- ์๋ต์ ์ ์ฒด ๊ฑด์, ์ ์ฒด ํ์ด์ง ์ ํฌํจ
### ๋น์ฆ๋์ค ๊ท์น
- ์ฌ๊ณ 0 ์ดํ: ๋นจ๊ฐ์ ๊ฐ์กฐ
- ๊ถํ: ์ ์ฒด ์ฌ์ฉ์ ์กฐํ ๊ฐ๋ฅ
Phase 4: ํ๋ฉด DB ๋ฑ๋ก
4.1 Find Related Codes
ํ๋ฉด์ ํ ์ฝ๋ (DB ID: 2d3471f8-dcff-8051-ac76-000b25732bf2):
| ์ฝ๋ | ์์ด | ํ๊ธ |
|---|
| D | Dashboard | ๋์๋ณด๋ |
| S | Screen | ์ผ๋ฐํ๋ฉด |
| F | Form | ๋ฑ๋ก/์์ |
| P | Popup | ํ์
/๋ชจ๋ฌ |
| R | Report | ๋ฆฌํฌํธ |
| M | Matrix | ๋งคํธ๋ฆญ์ค |
๋ง์คํฐ ๊ธฐ๋ฅ์ฝ๋ (DB ID: 2d3471f8-dcff-803d-8b2c-000b5b9855af):
- Search for the feature code โ Get page URL for relation
CRITICAL: ์ค๋ณต ๊ธฐ๋ฅ์ฝ๋ ์ ํ ๊ท์น
์ผ๋ถ ๊ธฐ๋ฅ์ฝ๋(DCL, PMA ๋ฑ)๋ ์ฌ๋ฌ ๋ชจ๋์ ๋์ผํ ์ฝ๋๋ช
์ผ๋ก ์กด์ฌํจ.
notion-search๋ก ๊ธฐ๋ฅ์ฝ๋๋ฅผ ๊ฒ์ํ๋ฉด 2๊ฑด ์ด์ ๋์ฌ ์ ์์ผ๋ฏ๋ก, ๋ฐ๋์ ๋ชจ๋ ์ฝ๋(๋ชจ๋ ์ฝ๋ relation)๋ฅผ ํ์ธํ์ฌ ์ฌ๋ฐ๋ฅธ ๊ฒ์ ์ ํํด์ผ ํจ.
์ฑ๋ณ ๋ชจ๋ ์ฝ๋ ๋งคํ:
| ๋์ ์ฑ | ์ฑ ํด๋ | ๋ชจ๋ ์ฝ๋ | ๋ชจ๋ Page ID |
|---|
| ์ฃผ๋ฅ ERP | apps/liquor | TAX | d71c7ac7-e101-49e9-aaad-a6ae2aea0b60 |
| ์ธ๋ฌด์ ์ฐ๋ | apps/tax-office | OFC | 2e3471f8-dcff-8039-836f-fa67a897ae8d |
์ค๋ณต ๊ธฐ๋ฅ์ฝ๋ ์ฌ๋ฐ๋ฅธ ์ ํ ํ
์ด๋ธ:
| ๊ธฐ๋ฅ์ฝ๋ | ์ฃผ๋ฅ์ฑ(TAX) ์ฌ์ฉ ์ | ์ธ๋ฌด์์ฑ(OFC) ์ฌ์ฉ ์ |
|---|
| DCL | 2d3471f8-dcff-8035-8fe4-c9b102554fd1 | 2e3471f8-dcff-80d2-9e5c-c51e3a37768b |
| PMA | 2d3471f8-dcff-80d2-8d8d-c1304047a73e | 2e3471f8-dcff-802f-8487-c69ee879f7a3 |
๊ฒ์ฆ ๋ฐฉ๋ฒ: ๊ธฐ๋ฅ์ฝ๋ ํ์ด์ง๋ฅผ notion-fetchํ์ฌ ๋ชจ๋ ์ฝ๋ relation์ด ๋์ ์ฑ์ ๋ชจ๋๊ณผ ์ผ์นํ๋์ง ํ์ธ.
4.2 ํ๋ฉด๋ช
๋ค์ด๋ฐ ๊ท์น (CRITICAL)
ํ๋ฉด๋ช
์ ํ๋ฉด์ฝ๋๋ฅผ ์ ๋ ํฌํจํ์ง ์๋๋ค.
ํ๋ฉด์ฝ๋๋ DB์ ํ๋ฉด ์ฝ๋ ID formula ์์ฑ์์ ์๋ ์์ฑ๋๋ฏ๋ก ํ๋ฉด๋ช
์ ์ค๋ณต ๊ธฐ์ฌํ๋ฉด ์ ๋จ.
BAD - ํ๋ฉด์ฝ๋ ํฌํจ:
BITDA-CM-HAC-LOG-S001 ๊ฒ์ฌ์ผ์ง (๋ชฉ๋ก)
BITDA-CM-HAC-LOG-F001 ๊ฒ์ฌ์ผ์ง ๋ฑ๋ก/์์ (ํผ)
BITDA-BR-DOC-EVD-P001 ์ฆ๋น ๋ฏธ๋ฆฌ๋ณด๊ธฐ Dialog
GOOD - ํ๊ธ ํ๋ฉด๋ช
๋ง ์ฌ์ฉ:
๊ฒ์ฌ์ผ์ง (๋ชฉ๋ก)
๊ฒ์ฌ์ผ์ง ๋ฑ๋ก/์์ (ํผ)
์ฆ๋น ๋ฏธ๋ฆฌ๋ณด๊ธฐ Dialog
๋ค์ด๋ฐ ํจํด:
| ํ๋ฉด์ ํ | ํจํด | ์์ |
|---|
| S (Screen) | [๊ธฐ๋ฅ๋ช
] ๋๋ [๊ธฐ๋ฅ๋ช
] (๋ชฉ๋ก) | ์ฆ๋น์๋ฃ ๊ด๋ฆฌ, ๊ฒ์ฌํ๋ชฉ (๋ชฉ๋ก) |
| F (Form) | [๊ธฐ๋ฅ๋ช
] ๋ฑ๋ก/์์ Sheet ๋๋ [๊ธฐ๋ฅ๋ช
] ๋ฑ๋ก/์์ (ํผ) | ๋ณด๊ฑด์ฆ ๋ฑ๋ก/์์ Sheet |
| P (Popup) | [๊ธฐ๋ฅ/๋์๋ช
] Dialog | ์ญ์ ํ์ธ Dialog, ๊ตฌ๋งค์ ์ ํ Dialog |
| R (Report) | [๋ฆฌํฌํธ๋ช
] | ์๊ฐ ๋ณด๊ณ ์ |
| D (Dashboard) | [๋์๋ณด๋๋ช
] | ๊ด๋ฆฌ์ ๋์๋ณด๋ |
4.3 Create Screen Entries
CRITICAL: source ๋งํฌ ํ์ - ๋ชจ๋ ํ๋ฉด์ GitHub source URL์ ๋ฐ๋์ ์ค์ ํด์ผ ํจ.
๋น ๊ฐ์ผ๋ก ๋ฑ๋กํ๋ฉด notion-validator์์ Critical ์ค๋ฅ๋ก ๊ฒ์ถ๋จ.
๋ณ๋ ฌ ์์ด์ ํธ ์์
์ ๊ณต์ ์ง์นจ์์ ์ด ์์ฑ์ด ๋๋ฝ๋๋ฉด ์ ์ฒด ํ๋ฉด์ด ๋น URL๋ก ๋ฑ๋ก๋๋ ์ฌ๊ณ ๊ฐ ๋ฐ์ํจ.
source ๋งํฌ URL ๊ตฌ์ฑ ๊ท์น:
| ํ๋ฉด์ ํ | URL ํจํด |
|---|
| S (Screen/PAGE) | [base]/[module]/page.tsx |
| F (Form) | [base]/[module]/form-page.tsx ๋๋ [base]/[module]/components/[Name]Sheet.tsx |
| P (Popup) | [base]/[module]/components/[Name]Dialog.tsx |
- base:
https://github.com/invigoworks/pre-publishing/blob/main/apps/[app]/src/[domain]/[feature]
- ์ค์ ํ์ผ์ด ์กด์ฌํ๋ ๊ฒฝ๋ก์ฌ์ผ ํจ (๋ฑ๋ก ์
Glob์ผ๋ก ํ์ธ ๊ถ์ฅ)
REST API๋ก ๋ฑ๋ก (๊ถ์ฅ):
python .claude/shared-references/notion-db-uploader.py screen \
--title "๊ฒ์ฌ์ผ์ง (๋ชฉ๋ก)" \
--source "https://github.com/invigoworks/pre-publishing/blob/main/apps/liquor/src/haccp/inspection-log/page.tsx" \
--status "๊ธฐํ ์๋ฃ" \
--screen-type "S" \
--feature-code "LOG" \
--plan-doc "๊ธฐํ๋ฌธ์-page-id"
python .claude/shared-references/notion-db-uploader.py batch --file /tmp/entries.json
JSON ์ผ๊ด ๋ฑ๋ก ํ์:
{
"screens": [
{
"title": "๊ฒ์ฌ์ผ์ง (๋ชฉ๋ก)",
"source": "https://github.com/invigoworks/pre-publishing/blob/main/...",
"status": "๊ธฐํ ์๋ฃ",
"screen_type": "S",
"feature_code": "LOG",
"plan_doc": "๊ธฐํ๋ฌธ์-page-id"
}
],
"components": [
{
"title": "InspectionTable",
"logic": "## ๋ชฉ๋ก ์กฐํ\n- GET /api/v1/inspections\n...",
"screen": "auto:0"
}
]
}
"screen": "auto:0" โ ๊ฐ์ JSON์ screens[0] page_id๋ฅผ ์๋ ์ฐธ์กฐ
MCP ๋์ฒด ์ฌ์ฉ๋ฒ (REST API ์คํจ ์ fallback):
notion-create-pages({
parent: { data_source_id: "2d3471f8-dcff-8067-b573-000b0e2b1d04" },
pages: [{
properties: {
"ํ๋ฉด๋ช
": "[ํ๋ฉด๋ช
]",
"source ๋งํฌ": "https://github.com/.../[path]",
"์ํ": "๊ธฐํ ์๋ฃ",
"ํ๋ฉด์ ํ ์ฝ๋": "[\"[ํ๋ฉด์ ํURL]\"]",
"๊ธฐ๋ฅ์ฝ๋": "[\"[๊ธฐ๋ฅ์ฝ๋URL]\"]",
"์ฐ๊ด๋ ๊ธฐํ๋ฌธ์": "[\"[๊ธฐํ๋ฌธ์URL]\"]"
}
}]
})
๋ฑ๋ก ์งํ ํ์ธ: ๋ชจ๋ ํ๋ฉด์ source ๋งํฌ๊ฐ ๋น์ด์์ง ์์์ง ๊ฒ์ฆ. 1๊ฑด์ด๋ผ๋ ๋น ๊ฐ์ด๋ฉด ์ฆ์ ์์ .
Phase 4.5: ๊ธฐํ๋ฌธ์ DB Prepub URL ์ค์ (MANDATORY)
๊ธฐํ๋ฌธ์ DB์ ํผ๋ธ๋ฆฌ์ฑ ๊ฒฐ๊ณผ ํ์ธ ์์ฑ์ prepub URL์ ๋ฐ๋์ ์ค์ ํด์ผ ํจ.
์ด ์์ฑ์ด ํ๋ฉด DB์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋งํฌ ๋กค์
์ผ๋ก ์ฐ๊ฒฐ๋๋ฏ๋ก, ๋น ๊ฐ์ด๋ฉด ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋งํฌ๋ ๋น ๊ฐ์ด ๋จ.
Prepub URL ๊ตฌ์ฑ: https://prepub.invigoworks.co.kr/[route-path]
notion-update-page({
page_id: "[๊ธฐํ๋ฌธ์ Page ID]",
command: "update_properties",
properties: {
"ํผ๋ธ๋ฆฌ์ฑ ๊ฒฐ๊ณผ ํ์ธ": "https://prepub.invigoworks.co.kr/[route-path]"
}
})
Phase 5: ์ปดํฌ๋ํธ & ๋ก์ง DB ๋ฑ๋ก
Phase 2.5 ์๋ฃ ํ ๋ฑ๋ก. FilterBar/Toolbar/Pagination์ ๋ถ๋ชจ Table์ ํตํฉ.
REST API๋ก ๋ฑ๋ก (๊ถ์ฅ):
python .claude/shared-references/notion-db-uploader.py component \
--title "InspectionTable" \
--logic-file /tmp/inspection-table-logic.md \
--screen "ํ๋ฉด-page-id"
python .claude/shared-references/notion-db-uploader.py component \
--title "InspectionSheet" \
--logic "## ๋ฑ๋ก/์์ \n- POST /api/v1/inspections\n..." \
--screen "ํ๋ฉด-page-id"
๋น์ฆ๋์ค ๋ก์ง์ด ๊ธด ๊ฒฝ์ฐ --logic-file๋ก ํ์ผ ๊ฒฝ๋ก ์ ๋ฌ ๊ถ์ฅ (2000์ ์๋ ๋ถํ )
MCP ๋์ฒด ์ฌ์ฉ๋ฒ (REST API ์คํจ ์ fallback):
notion-create-pages({
parent: { data_source_id: "2d3471f8-dcff-8076-a4a3-000b502a3811" },
pages: [{
properties: {
"์์๋ช
(ID)": "[์ปดํฌ๋ํธ๋ช
]",
"๋น์ฆ๋์ค ๋ก์ง": "[์์ธ ๋น์ฆ๋์ค ๋ก์ง]",
"ํ๋ฉด DB ์ฐ๋": "[\"[ํ๋ฉดURL]\"]"
}
}]
})
Phase 6: ๋ฑ๋ก ๊ฒ์ (MANDATORY)
Phase 5 ์๋ฃ ํ ๋ฐ๋์ /notion-validator ์คํฌ ์คํ. ๊ฒ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ:
| ๊ฒฐ๊ณผ | ์ฒ๋ฆฌ |
|---|
| โ
ํต๊ณผ | ๋ฑ๋ก ์๋ฃ ํ์ |
| โ ๏ธ ๊ฒฝ๊ณ | ์ฌ์ฉ์์๊ฒ ์์ ๊ถ๊ณ |
| โ ์ค๋ฅ | ์ฆ์ ์์ ํ ์ฌ๊ฒ์ |
Notion Database References
ํ๋ฉด DB
| ์์ฑ | ํ์
| ์ค๋ช
|
|---|
| ํ๋ฉด๋ช
| title | ํ๋ฉด ์ด๋ฆ |
| source ๋งํฌ | url | GitHub ์์ค ๋งํฌ |
| ๊ธฐ๋ฅ์ฝ๋ | relation | ๋ง์คํฐ ๊ธฐ๋ฅ์ฝ๋ ์ฐ๊ฒฐ |
| ํ๋ฉด์ ํ ์ฝ๋ | relation | ํ๋ฉด์ ํ ์ฝ๋ ์ฐ๊ฒฐ |
| ์ฐ๊ด๋ ๊ธฐํ๋ฌธ์ | relation | ๊ธฐํ๋ฌธ์ DB ์ฐ๊ฒฐ |
| ์ํ | status | ์์ ์ /๊ธฐํ ์ค/๊ฐ๋ฐ ์ค/๊ธฐํ ์๋ฃ/๊ฐ๋ฐ ์๋ฃ |
์ปดํฌ๋ํธ & ๋ก์ง DB
| ์์ฑ | ํ์
| ์ค๋ช
|
|---|
| ์์๋ช
(ID) | title | ์ปดํฌ๋ํธ ์ด๋ฆ |
| ๋น์ฆ๋์ค ๋ก์ง | text | ๋ฐฑ์๋ API ๊ฐ๋ฐ์ฉ ์์ธ ๋น์ฆ๋์ค ๋ก์ง |
| ํ๋ฉด DB ์ฐ๋ | relation | ํ๋ฉด DB ์ฐ๊ฒฐ |
๊ธฐํ DB
โ ๏ธ REST API vs MCP ID ์ฐจ์ด: MCP Data Source ID์ REST API Database ID๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ ์์. notion-db-uploader.py์ ์ฌ๋ฐ๋ฅธ REST API ID๊ฐ ํ๋์ฝ๋ฉ๋์ด ์์ผ๋ฏ๋ก ์คํฌ๋ฆฝํธ ์ฌ์ฉ ์ ๋ณ๋ ID ์ง์ ๋ถํ์.
| DB | MCP Data Source ID | REST API Database ID |
|---|
| ๋ง์คํฐ ๊ธฐ๋ฅ์ฝ๋ | 2d3471f8-dcff-803d-8b2c-000b5b9855af | 2d3471f8-dcff-80cd-9de7-dac5de60856a |
| ํ๋ฉด์ ํ ์ฝ๋ | 2d3471f8-dcff-8051-ac76-000b25732bf2 | c7255e5a-4433-4977-95cb-18b1f8d31a39 |
| ๊ธฐํ๋ฌธ์ DB | 2df471f8-dcff-80b2-9a6d-f9972b15aa06 | ๋์ผ (URL) |
Registration Checklist
Before:
After (MANDATORY):
Post-Registration Output
## Notion ๋ฑ๋ก ์๋ฃ
### ํ๋ฉด DB
| ํ๋ฉด๋ช
| ํ๋ฉด์ฝ๋ | ์ํ | ์ฐ๊ด๋ ๊ธฐํ๋ฌธ์ |
|--------|---------|------|----------------|
| [ํ๋ฉด๋ช
] | BITDA-XX-XX-XX-S001 | ๊ธฐํ ์๋ฃ | [๊ธฐํ๋ฌธ์๋ช
] |
๋ฑ๋ก๋ ํ๋ฉด: [N]๊ฐ
### ์ปดํฌ๋ํธ & ๋ก์ง DB
| ์์๋ช
| ์ฐ๊ฒฐ ํ๋ฉด | ๋น์ฆ๋์ค ๋ก์ง ์์ฝ |
|--------|----------|-------------------|
| [์ปดํฌ๋ํธ] | [ํ๋ฉด๋ช
] | [CRUD ์์ฝ] |
๋ฑ๋ก๋ ์ปดํฌ๋ํธ: [N]๊ฐ
### ํ์ธ ๋งํฌ
- ํ๋ฉด DB: https://www.notion.so/2d3471f8dcff802f945fc5add962fc6f
- ์ปดํฌ๋ํธ DB: https://www.notion.so/2d3471f8dcff80d28041f0e98910c922
Error Handling
| ์ค๋ฅ | ํด๊ฒฐ |
|---|
| Notion ์ฐ๊ฒฐ ์คํจ | MCP ์ฌ์ฐ๊ฒฐ |
| ์ค๋ณต ๋ฑ๋ก | ๊ธฐ์กด ํญ๋ชฉ ํ์ธ |
| ์ฝ๋ ์ค๋ฅ | BITDA ์ปจ๋ฒค์
์ฌํ์ธ |
| Relation ๋๋ฝ | ๋ง์คํฐ DB์์ ์ฝ๋ ๊ฒ์ |
| ๋น์ฆ๋์ค ๋ก์ง ๋ถ์ค | Phase 3 ๊ฐ์ด๋ ์ฌ์ฐธ์กฐ |