๋ฉ”์ธ ์ฝ˜ํ…์ธ ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ
Sonamu UI๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์‹ค์šฉ์ ์ธ ํŒ๊ณผ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

ํ‚ค๋ณด๋“œ ๋‹จ์ถ•ํ‚ค

๋น ๋ฅธ ์ž‘์—…์„ ์œ„ํ•œ ํ•„์ˆ˜ ๋‹จ์ถ•ํ‚ค:
๋‹จ์ถ•ํ‚ค๊ธฐ๋Šฅ์„ค๋ช…
โŒ˜K / Ctrl+K๊ฒ€์ƒ‰์ „์ฒด ๊ฒ€์ƒ‰ ๋ชจ๋‹ฌ ์—ด๊ธฐ
Esc๋‹ซ๊ธฐ์—ด๋ฆฐ ๋ชจ๋‹ฌ ๋‹ซ๊ธฐ
โŒ˜S / Ctrl+S์ €์žฅํ˜„์žฌ ํŽธ์ง‘ ๋‚ด์šฉ ์ €์žฅ
Tab๋‹ค์Œ ํ•„๋“œํผ ์ž…๋ ฅ ์‹œ ๋‹ค์Œ ํ•„๋“œ๋กœ ์ด๋™
Enterํ™•์ธํผ ์ œ์ถœ ๋˜๋Š” ํŽธ์ง‘ ์™„๋ฃŒ
๊ฒ€์ƒ‰ ํ™œ์šฉ: โŒ˜K๋กœ ๊ฒ€์ƒ‰์„ ์—ด๊ณ  Entity ์ด๋ฆ„, ํ•„๋“œ๋ช… ๋“ฑ์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Entity ๊ด€๋ฆฌ ํŒ

1. ๋ถ€๋ชจ-์ž์‹ Entity ๊ตฌ์กฐํ™”

๊ด€๋ จ๋œ Entity๋“ค์€ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋กœ ๊ตฌ์กฐํ™”ํ•˜์„ธ์š”:
Order (๋ถ€๋ชจ)
โ”œโ”€โ”€ OrderItem (์ž์‹)
โ”œโ”€โ”€ OrderPayment (์ž์‹)
โ””โ”€โ”€ OrderShipment (์ž์‹)
์žฅ์ :
  • ์‚ฌ์ด๋“œ๋ฐ”์—์„œ ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ํ‘œ์‹œ
  • ๊ด€๋ จ Entity๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ
  • ๋…ผ๋ฆฌ์  ๊ทธ๋ฃนํ•‘

2. ๋ช…๋ช… ๊ทœ์น™ ์ผ๊ด€์„ฑ

๊ตฌ๋ถ„๊ทœ์น™์˜ˆ์‹œ
Entity IDPascalCaseUser, OrderItem
ํ•„๋“œ๋ช…snake_casecreated_at, user_id
EnumPascalCaseUserRole, OrderStatus
Subset ID๋Œ€๋ฌธ์žA, B, C

3. AI ์ฑ„ํŒ… ํ™œ์šฉ

ํšจ๊ณผ์ ์ธ ํ”„๋กฌํ”„ํŠธ ์ž‘์„ฑ:
โŒ ๋‚˜์œ ์˜ˆ:
"์‚ฌ์šฉ์ž ๋งŒ๋“ค์–ด์ค˜"

โœ… ์ข‹์€ ์˜ˆ:
"์ด์ปค๋จธ์Šค ์‚ฌ์šฉ์ž Entity๋ฅผ ๋งŒ๋“ค์–ด์ค˜.
ํ•„๋“œ: ์ด๋ฉ”์ผ(unique), ์ด๋ฆ„, ์ „ํ™”๋ฒˆํ˜ธ(nullable),
์—ญํ• (enum: admin, user, guest),
์ƒ์„ฑ์ผ, ๋งˆ์ง€๋ง‰ ๋กœ๊ทธ์ธ"
๊ตฌ์ฒด์ ์œผ๋กœ ์š”์ฒญ:
  • ํ•„๋“œ ํƒ€์ž…๊ณผ ์ œ์•ฝ์กฐ๊ฑด ๋ช…์‹œ
  • ๊ด€๊ณ„ ์„ค์ • ์„ค๋ช…
  • ์ธ๋ฑ์Šค ํ•„์š” ์—ฌ๋ถ€ ์–ธ๊ธ‰

4. Property ์ˆœ์„œ ์ •๋ฆฌ

์˜๋ฏธ ์žˆ๋Š” ์ˆœ์„œ๋กœ ํ•„๋“œ๋ฅผ ๋ฐฐ์น˜ํ•˜์„ธ์š”:
{
  properties: [
    // 1. Primary Key
    { name: "id", ... },

    // 2. ํ•ต์‹ฌ ์ •๋ณด
    { name: "title", ... },
    { name: "content", ... },

    // 3. ์™ธ๋ž˜ํ‚ค
    { name: "user_id", ... },
    { name: "category_id", ... },

    // 4. ์ƒํƒœ/ํ”Œ๋ž˜๊ทธ
    { name: "status", ... },
    { name: "is_active", ... },

    // 5. ํƒ€์ž„์Šคํƒฌํ”„
    { name: "created_at", ... },
    { name: "updated_at", ... },
  ]
}

Migration ํŒ

1. ์ž‘์€ ๋‹จ์œ„๋กœ ์ž์ฃผ ์‹คํ–‰

โŒ ๋‚˜์œ ์˜ˆ:
- 10๊ฐœ Entity ํ•œ๋ฒˆ์— ์ˆ˜์ •
- 1์ฃผ์ผ์— ํ•œ ๋ฒˆ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

โœ… ์ข‹์€ ์˜ˆ:
- 1-2๊ฐœ Entity์”ฉ ์ˆ˜์ •
- ํ•˜๋ฃจ์— ์—ฌ๋Ÿฌ ๋ฒˆ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
- ๊ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ›„ ํ…Œ์ŠคํŠธ

2. Migration Preview ํ™œ์šฉ

์‹คํ–‰ ์ „ ๋ฐ˜๋“œ์‹œ Preview๋ฅผ ํ™•์ธํ•˜์„ธ์š”: ํ™•์ธ ์‚ฌํ•ญ:
  • โœ… ์ถ”๊ฐ€๋˜๋Š” ์ปฌ๋Ÿผ์ด ๋งž๋Š”๊ฐ€?
  • โš ๏ธ ์‚ญ์ œ๋˜๋Š” ์ปฌ๋Ÿผ์€ ์—†๋Š”๊ฐ€?
  • ๐Ÿ”„ ํƒ€์ž… ๋ณ€๊ฒฝ์ด ์˜๋„ํ•œ ๊ฒƒ์ธ๊ฐ€?

3. ํ”„๋กœ๋•์…˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

โ–ก Development DB์—์„œ ํ…Œ์ŠคํŠธ ์™„๋ฃŒ
โ–ก Testing DB์—์„œ ๊ฒ€์ฆ ์™„๋ฃŒ
โ–ก ๋ฐ์ดํ„ฐ ๋ฐฑ์—… ์™„๋ฃŒ
โ–ก ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ Preview ํ™•์ธ
โ–ก ๋กค๋ฐฑ ๊ณ„ํš ์ˆ˜๋ฆฝ
โ–ก ํŒ€์›์—๊ฒŒ ๊ณต์ง€
โ–ก Production DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹คํ–‰
โ–ก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์žฌ์‹œ์ž‘ ๋ฐ ํ™•์ธ

Scaffolding ํŒ

1. ์ผ๊ด„ ์ƒ์„ฑ ์ „๋žต

ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ:
1. ๋ชจ๋“  Entity ์ •์˜
2. [Select All] โ†’ Model + Test ์ผ๊ด„ ์ƒ์„ฑ
3. ๊ฐ Model์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ถ”๊ฐ€
๊ฐœ๋ฐœ ์ค‘:
1. ์ƒˆ Entity ํ•˜๋‚˜๋งŒ ์ถ”๊ฐ€
2. ํ•ด๋‹น Entity๋งŒ ์„ ํƒํ•˜์—ฌ ์ƒ์„ฑ
3. ์ฆ‰์‹œ ๊ฐœ๋ฐœ ์‹œ์ž‘

2. ํŒŒ์ผ ๋ฐฑ์—… ์Šต๊ด€

์ค‘์š”ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์žˆ๋Š” Model์€ ์žฌ์ƒ์„ฑ ์ „ ๋ฐฑ์—…:
# ๋ฐฑ์—…
cp src/models/User.model.ts src/models/User.model.ts.bak

# ์žฌ์ƒ์„ฑ
[UI์—์„œ Overwrite]

# ํ•„์š”ํ•œ ๋กœ์ง ๋ณต์›

3. Git ํ™œ์šฉ

์ƒ์„ฑ๋œ ํŒŒ์ผ์„ ๋ฐ”๋กœ ์ปค๋ฐ‹ํ•˜์—ฌ ๋ณ€๊ฒฝ ์ด๋ ฅ ๊ด€๋ฆฌ:
git add src/models/
git commit -m "Generate models for User, Post, Comment"

Subset ํ™œ์šฉ ํŒ

1. ํ‘œ์ค€ Subset ์ •์˜

๋ชจ๋“  Entity์— ์ผ๊ด€๋œ Subset์„ ์ •์˜ํ•˜์„ธ์š”:
// ๋ชจ๋“  Entity์— ๊ณตํ†ต ์ ์šฉ

Subset A: ๋ชฉ๋ก์šฉ
- id
- title (๋˜๋Š” name)
- ํ•ต์‹ฌ 1-2๊ฐœ ํ•„๋“œ
- created_at

Subset B: ์ƒ์„ธ์šฉ
- ๋ชจ๋“  ์ผ๋ฐ˜ ํ•„๋“œ
- ๋ฏผ๊ฐ ์ •๋ณด ์ œ์™ธ
- ํƒ€์ž„์Šคํƒฌํ”„ ํฌํ•จ

Subset C: ๊ด€๊ณ„ ํฌํ•จ
- Subset B ๊ธฐ๋ฐ˜
- ํ•„์š”ํ•œ ๊ด€๊ณ„ ์ถ”๊ฐ€

2. ์„ฑ๋Šฅ ์ตœ์ ํ™”

ํ•„์š”ํ•œ ํ•„๋“œ๋งŒ ํฌํ•จ:
// โŒ ๊ณผ๋„ํ•œ ํ•„๋“œ
{
  ...๋ชจ๋“ ํ•„๋“œ,
  author: "User.C",  // User์˜ ๋ชจ๋“  ๊ด€๊ณ„๊นŒ์ง€
  category: "Category.B",
  tags: "Tag.C",
}

// โœ… ์ตœ์ ํ™”
{
  id: true,
  title: true,
  content: true,
  author: "User.A",  // ์ตœ์†Œ ์ •๋ณด๋งŒ
  category_id: true,
  created_at: true,
}

3. API๋ณ„ Subset ์„ ํƒ

API์ถ”์ฒœ Subset์ด์œ 
๋ชฉ๋ก ์กฐํšŒA๋น ๋ฅธ ์‘๋‹ต
์ƒ์„ธ ์กฐํšŒB ๋˜๋Š” C์ „์ฒด ์ •๋ณด
์ž๋™์™„์„ฑA (์ตœ์†Œํ™”)์ดˆ๊ณ ์† ์‘๋‹ต
๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€C๋ชจ๋“  ์ •๋ณด

๊ฒ€์ƒ‰ ํ™œ์šฉ

๋น ๋ฅธ ํƒ์ƒ‰

๊ฒ€์ƒ‰(โŒ˜K)์œผ๋กœ ๋‹ค์Œ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  • Entity: User, Post
  • ํ•„๋“œ: email, created_at
  • Migration: ํŒŒ์ผ๋ช… ๊ฒ€์ƒ‰
  • Subset: User.Subset A
๊ฒ€์ƒ‰ ํŒ:
user email       โ†’ User Entity์˜ email ํ•„๋“œ
post migration   โ†’ Post ๊ด€๋ จ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
subset A         โ†’ ๋ชจ๋“  Subset A

์›Œํฌํ”Œ๋กœ์šฐ ์ตœ์ ํ™”

์‹ ๊ทœ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ํ”Œ๋กœ์šฐ

1. Entity ์ •์˜ (Entity ํƒญ)
   - AI ์ฑ„ํŒ…์œผ๋กœ ๋น ๋ฅธ ์ƒ์„ฑ
   - ํ•„๋“œ์™€ ๊ด€๊ณ„ ์„ค์ •
   โ†“
2. Subset ์ •์˜ (Entity ํƒญ ๋‚ด)
   - A, B, C ํ‘œ์ค€ Subset ์ƒ์„ฑ
   โ†“
3. Migration ์‹คํ–‰ (Migration ํƒญ)
   - Preview ํ™•์ธ
   - Development โ†’ Testing ์ˆœ์„œ๋กœ ์‹คํ–‰
   โ†“
4. Scaffolding (Scaffolding ํƒญ)
   - Model + Test ์ƒ์„ฑ
   โ†“
5. ๊ฐœ๋ฐœ (์ฝ”๋“œ ์—๋””ํ„ฐ)
   - Model ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
   - API ์—”๋“œํฌ์ธํŠธ ๊ตฌํ˜„
   - ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
   โ†“
6. Fixture ๋“ฑ๋ก (Fixture ํƒญ)
   - ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ค€๋น„

Entity ์ˆ˜์ • ํ”Œ๋กœ์šฐ

1. Entity ์ˆ˜์ • (Entity ํƒญ)
   - ํ•„๋“œ ์ถ”๊ฐ€/์ˆ˜์ •/์‚ญ์ œ
   โ†“
2. Migration ์ƒ์„ฑ ํ™•์ธ (Migration ํƒญ)
   - ์ž๋™ ์ƒ์„ฑ๋œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ™•์ธ
   โ†“
3. Preview ๊ฒ€ํ† 
   - ์˜๋„ํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ธ์ง€ ํ™•์ธ
   - ๋ฐ์ดํ„ฐ ์†์‹ค ์œ„ํ—˜ ์ฒดํฌ
   โ†“
4. Migration ์‹คํ–‰
   - Development โ†’ Testing ์ˆœ์„œ
   โ†“
5. Model ์ˆ˜์ • (ํ•„์š” ์‹œ)
   - ํƒ€์ž… ์ž๋™ ๋™๊ธฐํ™” ํ™•์ธ
   - ์ƒˆ ํ•„๋“œ ํ™œ์šฉ ๋กœ์ง ์ถ”๊ฐ€

๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ํ™œ์šฉ

Network ํƒญ

API ํ˜ธ์ถœ์„ ํ™•์ธํ•˜์—ฌ ๋””๋ฒ„๊น…:
F12 โ†’ Network ํƒญ

- ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹คํ–‰ โ†’ /api/migrate/run ํ™•์ธ
- Entity ์ €์žฅ โ†’ /api/entity/save ํ™•์ธ
- ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์‘๋‹ต ๋‚ด์šฉ ํ™•์ธ

Console ํƒญ

์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ํ™•์ธ:
F12 โ†’ Console ํƒญ

- JavaScript ์—๋Ÿฌ ํ™•์ธ
- API ์‘๋‹ต ์—๋Ÿฌ ๋กœ๊ทธ
- ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์‹คํŒจ ์›์ธ

๋ฌธ์ œ ํ•ด๊ฒฐ

UI๊ฐ€ ๋А๋ฆด ๋•Œ

์›์ธ: ๋„ˆ๋ฌด ๋งŽ์€ Entity๋‚˜ ํฐ ๋ฐ์ดํ„ฐ ํ•ด๊ฒฐ:
  • ๋ธŒ๋ผ์šฐ์ € ์บ์‹œ ์‚ญ์ œ
  • ๋ถˆํ•„์š”ํ•œ ๋ธŒ๋ผ์šฐ์ € ํƒญ ๋‹ซ๊ธฐ
  • Sonamu UI ์žฌ์‹œ์ž‘

๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋ฐ˜์˜๋˜์ง€ ์•Š์„ ๋•Œ

ํ•ด๊ฒฐ:
  1. ๋ธŒ๋ผ์šฐ์ € ์ƒˆ๋กœ๊ณ ์นจ (F5)
  2. ํ•˜๋“œ ๋ฆฌ๋กœ๋“œ (โŒ˜โ‡งR / Ctrl+Shift+R)
  3. API ์„œ๋ฒ„ ์žฌ์‹œ์ž‘
  4. Sonamu UI ์žฌ์‹œ์ž‘

Entity ์ €์žฅ ์‹คํŒจ

ํ™•์ธ ์‚ฌํ•ญ:
  • API ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ์ค‘์ธ๊ฐ€?
  • ํŒŒ์ผ ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์žˆ๋Š”๊ฐ€?
  • ํ•„๋“œ๋ช…์ด ์œ ํšจํ•œ๊ฐ€? (์˜ˆ์•ฝ์–ด ์ฒดํฌ)
  • ์™ธ๋ž˜ํ‚ค ์ฐธ์กฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ๊ฐ€?

๋‹ค์Œ ๋‹จ๊ณ„

Entity ๊ด€๋ฆฌ

Entity ๊ด€๋ฆฌ ์ž์„ธํžˆ ๋ณด๊ธฐ

Sonamu CLI

CLI๋กœ ๊ณ ๊ธ‰ ์ž‘์—…ํ•˜๊ธฐ