๋ฉ”์ธ ์ฝ˜ํ…์ธ ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ
Sonamu UI๋Š” Entity๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ์ •์˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์›น ๊ธฐ๋ฐ˜ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ์ž๋™ ์™„์„ฑ, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ์‹ค์‹œ๊ฐ„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋“ฑ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Sonamu UI ์ ‘์†ํ•˜๊ธฐ

์„œ๋ฒ„ ์‹คํ–‰

cd api
pnpm dev

UI ์ ‘์†

API ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์ž๋™์œผ๋กœ Sonamu UI๋„ ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค:
http://localhost:1028/sonamu-ui
Sonamu UI๋Š” ๋ณ„๋„์˜ ํฌํŠธ ์—†์ด API ์„œ๋ฒ„์˜ /sonamu-ui ๊ฒฝ๋กœ์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“ธ ํ•„์š”: Sonamu UI ๋ฉ”์ธ ํ™”๋ฉด - Entities ํƒญ์ด ์—ด๋ฆฐ ์ƒํƒœ

์ฃผ์š” ํƒญ ๊ตฌ์„ฑ

Sonamu UI๋Š” 4๊ฐœ์˜ ์ฃผ์š” ํƒญ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:
Entity ์ •์˜์™€ ๊ด€๋ฆฌ
  • Entity ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ
  • Props, Indexes, Subsets, Enums ์„ค์ •

Entity ์ƒ์„ฑํ•˜๊ธฐ

1. Entity ๋ชฉ๋ก ํŽ˜์ด์ง€

Entities ํƒญ์„ ํด๋ฆญํ•˜๋ฉด ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  Entity ๋ชฉ๋ก์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“ธ ํ•„์š”: Entity ๋ชฉ๋ก ํ™”๋ฉด - ์—ฌ๋Ÿฌ Entity๊ฐ€ ์นด๋“œ ํ˜•ํƒœ๋กœ ๋‚˜์—ด

ํ‘œ์‹œ ์ •๋ณด:
  • Entity ID์™€ Title
  • ํ…Œ์ด๋ธ”๋ช…
  • Props ๊ฐœ์ˆ˜
  • Relation ๊ฐœ์ˆ˜

2. ์ƒˆ Entity ์ƒ์„ฑ

1

Create Entity ๋ฒ„ํŠผ ํด๋ฆญ

์šฐ์ธก ์ƒ๋‹จ์˜ โ€œCreate Entityโ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
2

๊ธฐ๋ณธ ์ •๋ณด ์ž…๋ ฅ

Entity ์ƒ์„ฑ ํผ์—์„œ ๋‹ค์Œ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค:
  • Entity ID: PascalCase (์˜ˆ: User, BlogPost)
  • Table Name: snake_case (์˜ˆ: users, blog_posts)
  • Title: ํ•œ๊ธ€ ๋˜๋Š” ํ‘œ์‹œ๋ช… (์˜ˆ: โ€œ์‚ฌ์šฉ์žโ€, โ€œ๋ธ”๋กœ๊ทธ ๊ธ€โ€)
  • Parent ID: ์„ ํƒ ์‚ฌํ•ญ - ๋‹ค๋ฅธ Entity๋ฅผ ์ƒ์†ํ•  ๋•Œ ์‚ฌ์šฉ
Entity ID๋Š” ์ƒ์„ฑ ํ›„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์‹ ์ค‘ํ•˜๊ฒŒ ์ž…๋ ฅํ•˜์„ธ์š”.
3

์ €์žฅ

โ€œCreateโ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด:
  • {entity}.entity.json ํŒŒ์ผ ์ƒ์„ฑ
  • Entity ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ์ž๋™ ์ด๋™

๐Ÿ“ธ ํ•„์š”: Entity ์ƒ์„ฑ ๋‹ค์ด์–ผ๋กœ๊ทธ - ์ž…๋ ฅ ํผ ํ™”๋ฉด

Entity ํŽธ์ง‘ํ•˜๊ธฐ

Entity๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ƒ์„ธ ํŽธ์ง‘ ํŽ˜์ด์ง€๊ฐ€ ์—ด๋ฆฝ๋‹ˆ๋‹ค. 4๊ฐœ์˜ ์‹œํŠธ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:

Props ์‹œํŠธ

Entity์˜ ์†์„ฑ(์ปฌ๋Ÿผ)์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ”์ธ ์‹œํŠธ์ž…๋‹ˆ๋‹ค.

๐Ÿ“ธ ํ•„์š”: Props ์‹œํŠธ ํ™”๋ฉด - ์†์„ฑ ๋ชฉ๋ก์ด ํ‘œ ํ˜•ํƒœ๋กœ ํ‘œ์‹œ

Props ์ถ”๊ฐ€ํ•˜๊ธฐ

1

Add Property ๋ฒ„ํŠผ ํด๋ฆญ

์šฐ์ธก ์ƒ๋‹จ์˜ โ€œAdd Propertyโ€ ๋ฒ„ํŠผ ํด๋ฆญ ๋˜๋Š” ๋‹จ์ถ•ํ‚ค Ctrl+Cmd+Shift+N ์‚ฌ์šฉ
2

์†์„ฑ ์ •๋ณด ์ž…๋ ฅ

๊ธฐ๋ณธ ํ•„๋“œ:
  • name: ์†์„ฑ๋ช… (snake_case)
  • type: ๋ฐ์ดํ„ฐ ํƒ€์ž… (๋“œ๋กญ๋‹ค์šด์—์„œ ์„ ํƒ)
  • desc: ์„ค๋ช… (์„ ํƒ ์‚ฌํ•ญ)
  • nullable: NULL ํ—ˆ์šฉ ์—ฌ๋ถ€ (์ฒดํฌ๋ฐ•์Šค)
  • dbDefault: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋ณธ๊ฐ’
ํƒ€์ž…๋ณ„ ์ถ”๊ฐ€ ์˜ต์…˜:
  • length: ๋ฌธ์ž์—ด ๊ธธ์ด (๊ธฐ๋ณธ๊ฐ’: TEXT)
  • ์˜ˆ: length: 255 โ†’ VARCHAR(255)
  • precision: ์ „์ฒด ์ž๋ฆฟ์ˆ˜
  • scale: ์†Œ์ˆ˜์  ์ž๋ฆฟ์ˆ˜
  • numberType: real | double precision | numeric (๊ธฐ๋ณธ๊ฐ’: numeric)
  • ์˜ˆ: precision: 10, scale: 2 โ†’ NUMERIC(10, 2)
  • precision: ์ „์ฒด ์ž๋ฆฟ์ˆ˜
  • scale: ์†Œ์ˆ˜์  ์ž๋ฆฟ์ˆ˜
  • ์ฃผ์˜: TypeScript์—์„œ string ํƒ€์ž…์œผ๋กœ ์ฒ˜๋ฆฌ๋จ (์ •๋ฐ€๋„ ์œ ์ง€)
  • id: Enum ํƒ€์ž… ID (์˜ˆ: UserRole)
  • Enum์€ ๋ณ„๋„์˜ Enums ์„น์…˜์—์„œ ์ •์˜
  • id: JSON ์Šคํ‚ค๋งˆ ํƒ€์ž… ID
  • TypeScript ํƒ€์ž…์„ {entity}.types.ts์—์„œ ์ •์˜
  • dimensions: ๋ฒกํ„ฐ ์ฐจ์› (์˜ˆ: 1536)
  • pgvector ํ™•์žฅ ํ•„์š”
  • id: Virtual ํƒ€์ž… ID
  • virtualType: code | query
    • code: TypeScript ์ฝ”๋“œ๋กœ ๊ณ„์‚ฐ (๊ธฐ๋ณธ๊ฐ’)
    • query: SQL ์ฟผ๋ฆฌ๋กœ ๊ณ„์‚ฐ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜์ง€ ์•Š๋Š” ๊ณ„์‚ฐ๋œ ํ•„๋“œ
  • Relation ํƒ€์ž… ์„ ํƒ ๋ฐ ์„ค์ •
  • ์ž์„ธํ•œ ๋‚ด์šฉ์€ Relations ์ฐธ์กฐ
3

์ €์žฅ

์ž…๋ ฅ ์™„๋ฃŒ ํ›„ โ€œSaveโ€ ๋ฒ„ํŠผ ํด๋ฆญ

Props ์ˆ˜์ • ๋ฐ ์‚ญ์ œ

  • Props ๋ชฉ๋ก์—์„œ ์ˆ˜์ •ํ•  ํ–‰์„ ๋”๋ธ”ํด๋ฆญ ๋˜๋Š” Enter ํ‚ค
  • ๋˜๋Š” ํ–‰ ์„ ํƒ ํ›„ ์šฐ์ธก์˜ โ€œEditโ€ ๋ฒ„ํŠผ ํด๋ฆญ
  • ํผ์—์„œ ๊ฐ’ ์ˆ˜์ • ํ›„ ์ €์žฅ
Props๋ฅผ ์‚ญ์ œํ•˜๋ฉด ํ•ด๋‹น ์ปฌ๋Ÿผ์ด ๋ชจ๋“  Subset์—์„œ๋„ ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๋ณต๊ตฌํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•˜์„ธ์š”.

Indexes ์‹œํŠธ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ๋ฑ์Šค๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ธ ํ•„์š”: Indexes ์‹œํŠธ ํ™”๋ฉด

Index ์ถ”๊ฐ€ํ•˜๊ธฐ

1

Add Index ๋ฒ„ํŠผ ํด๋ฆญ

โ€œAdd Indexโ€ ๋ฒ„ํŠผ ํด๋ฆญ ๋˜๋Š” Indexes ์‹œํŠธ์—์„œ Ctrl+Cmd+Shift+N
2

Index ์„ค์ •

Index ์˜ต์…˜:
  • type: ์ธ๋ฑ์Šค ํƒ€์ž…
    • index: ์ผ๋ฐ˜ ์ธ๋ฑ์Šค
    • unique: ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค (์ค‘๋ณต ๋ฐฉ์ง€)
    • hnsw: Vector HNSW ์ธ๋ฑ์Šค
    • ivfflat: Vector IVFFlat ์ธ๋ฑ์Šค
  • name: ์ธ๋ฑ์Šค๋ช… (์ž๋™ ์ƒ์„ฑ ๊ฐ€๋Šฅ)
  • columns: ์ธ๋ฑ์Šค์— ํฌํ•จํ•  ์ปฌ๋Ÿผ ์„ ํƒ
    • ๋‹ค์ค‘ ์ปฌ๋Ÿผ ์„ ํƒ ๊ฐ€๋Šฅ
    • ์ปฌ๋Ÿผ ์ˆœ์„œ ์ค‘์š” (๋ณตํ•ฉ ์ธ๋ฑ์Šค)
  • using: ์ธ๋ฑ์Šค ๋ฐฉ๋ฒ• (์„ ํƒ ์‚ฌํ•ญ)
    • btree (๊ธฐ๋ณธ๊ฐ’)
    • hash
    • gin
    • gist
Vector ์ธ๋ฑ์Šค ์ถ”๊ฐ€ ์˜ต์…˜:
  • vectorOps: ๊ฑฐ๋ฆฌ ์—ฐ์‚ฐ์ž
    • vector_cosine_ops: ์ฝ”์‚ฌ์ธ ๊ฑฐ๋ฆฌ (๊ถŒ์žฅ)
    • vector_ip_ops: ๋‚ด์  ๊ฑฐ๋ฆฌ
    • vector_l2_ops: ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ
  • m: HNSW ๊ทธ๋ž˜ํ”„ ์—ฐ๊ฒฐ ์ˆ˜ (๊ธฐ๋ณธ๊ฐ’: 16)
  • efConstruction: HNSW ๊ตฌ์„ฑ ํ’ˆ์งˆ (๊ธฐ๋ณธ๊ฐ’: 64)
  • lists: IVFFlat ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜ (๊ธฐ๋ณธ๊ฐ’: 100)
์ธ๋ฑ์Šค ๋„ค์ด๋ฐ ๊ทœ์น™:
  • ์ผ๋ฐ˜ ์ธ๋ฑ์Šค: {table}_{columns}_idx
  • ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค: {table}_{columns}_unique
  • ์˜ˆ: users_email_unique, posts_created_at_idx

Subsets ์‹œํŠธ

API ์‘๋‹ต์„ ์œ„ํ•œ ํ•„๋“œ ์กฐํ•ฉ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ธ ํ•„์š”: Subsets ์‹œํŠธ ํ™”๋ฉด - ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ํ•„๋“œ ์„ ํƒ

Subset ํ‚ค ์ถ”๊ฐ€

1

Add Subset ๋ฒ„ํŠผ ํด๋ฆญ

โ€œAdd Subsetโ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์ƒˆ subset ํ‚ค ์ถ”๊ฐ€
2

Subset ํ‚ค ์ž…๋ ฅ

  • ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ์งง์€ ํ‚ค ๊ถŒ์žฅ (์˜ˆ: A, P, SS)
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํ‚ค:
    • A: All - ๋ชจ๋“  ํ•„๋“œ
    • P: Public - ๊ณต๊ฐœ API์šฉ
    • SS: Simple Short - ๊ฐ„๋‹จํ•œ ์ •๋ณด๋งŒ

ํ•„๋“œ ์„ ํƒ

  • ์ฒดํฌ๋ฐ•์Šค๋ฅผ ํด๋ฆญํ•˜์—ฌ ํ•„๋“œ ํฌํ•จ/์ œ์™ธ
  • ์—ฌ๋Ÿฌ subset์—์„œ ๋™์ผ ํ•„๋“œ ์„ ํƒ ๊ฐ€๋Šฅ
๋ถ€๋ชจ Relation์„ ์„ ํƒํ•˜๋ฉด ํ•˜์œ„ ํ•„๋“œ๋ฅผ ๊ฐœ๋ณ„ ์„ ํƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๋˜๋Š” ํŠน์ • ํ•„๋“œ๋งŒ ์„ ํƒํ•˜์„ธ์š”.

Enums ์„น์…˜

Enum ํƒ€์ž…์˜ ํ‚ค์™€ ๋ ˆ์ด๋ธ”์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ธ ํ•„์š”: Enums ์„น์…˜ ํ™”๋ฉด - ์—ฌ๋Ÿฌ Enum์ด ํƒญ์œผ๋กœ ๊ตฌ๋ถ„

Enum ์ถ”๊ฐ€

1

Add Enum ๋ฒ„ํŠผ ํด๋ฆญ

โ€œAdd Enumโ€ ๋ฒ„ํŠผ์„ ํด๋ฆญ
2

Enum ID ์ž…๋ ฅ

  • PascalCase๋กœ ์ž…๋ ฅ (์˜ˆ: UserRole, PostStatus)
  • Entity ID์™€ ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด {EntityId} ํŒจํ„ด ์‚ฌ์šฉ
    • ์˜ˆ: $ModelRole โ†’ UserRole (์ž๋™ ๋ณ€ํ™˜)

Enum ๊ฐ’ ์ถ”๊ฐ€

๊ฐ Enum์€ ๋ณ„๋„์˜ ํƒญ์œผ๋กœ ํ‘œ์‹œ๋˜๋ฉฐ, ํ‚ค-๋ ˆ์ด๋ธ” ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
{
  "UserRole": {
    "normal": "์ผ๋ฐ˜ ์‚ฌ์šฉ์ž",
    "admin": "๊ด€๋ฆฌ์ž",
    "superadmin": "์ตœ๊ณ  ๊ด€๋ฆฌ์ž"
  }
}
Enum ๊ฐ’ ์ถ”๊ฐ€ ๋ฐฉ๋ฒ•:
  • โ€œAdd Rowโ€ ๋ฒ„ํŠผ ํด๋ฆญ
  • ๋˜๋Š” Enum ํƒญ์—์„œ Ctrl+Cmd+Shift+N
  • Key์™€ Label ์ž…๋ ฅ
    • Key: ์˜๋ฌธ ์†Œ๋ฌธ์ž, ์ˆซ์ž, ์–ธ๋”์Šค์ฝ”์–ด๋งŒ ํ—ˆ์šฉ
    • Label: ํ•œ๊ธ€ ๋˜๋Š” ํ‘œ์‹œ์šฉ ํ…์ŠคํŠธ
์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” Enum ํŒจํ„ด:
  • {Entity}OrderBy: ์ •๋ ฌ ์˜ต์…˜ (์˜ˆ: id-desc, created_at-desc)
  • {Entity}SearchField: ๊ฒ€์ƒ‰ ํ•„๋“œ (์˜ˆ: email, username)
  • {Entity}Status: ์ƒํƒœ (์˜ˆ: active, inactive, deleted)

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

Sonamu UI๋Š” ํšจ์œจ์ ์ธ ์ž‘์—…์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋‹จ์ถ•ํ‚ค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ „์—ญ ๋‹จ์ถ•ํ‚ค

๋‹จ์ถ•ํ‚ค๊ธฐ๋Šฅ
Cmd+Sํ˜„์žฌ Entity ์ €์žฅ
Cmd+K๊ฒ€์ƒ‰ ๋ชจ๋“œ ์ง„์ž…
Tab๋‹ค์Œ ์‹œํŠธ๋กœ ์ด๋™
Shift+Tab์ด์ „ ์‹œํŠธ๋กœ ์ด๋™
Esc๋‹ค์ด์–ผ๋กœ๊ทธ ๋‹ซ๊ธฐ / ์„ ํƒ ํ•ด์ œ

Props/Indexes ์‹œํŠธ

๋‹จ์ถ•ํ‚ค๊ธฐ๋Šฅ
Ctrl+Cmd+Shift+N์ƒˆ ํ•ญ๋ชฉ ์ถ”๊ฐ€
Enter์„ ํƒํ•œ ํ•ญ๋ชฉ ์ˆ˜์ •
Cmd+Backspace์„ ํƒํ•œ ํ•ญ๋ชฉ ์‚ญ์ œ
โ†‘ โ†“ํ•ญ๋ชฉ ์„ ํƒ ์ด๋™
Cmd+โ†‘ Cmd+โ†“ํ•ญ๋ชฉ ์ˆœ์„œ ๋ณ€๊ฒฝ

๊ฒ€์ƒ‰ ๋ชจ๋“œ

๋‹จ์ถ•ํ‚ค๊ธฐ๋Šฅ
Cmd+K๊ฒ€์ƒ‰ ์‹œ์ž‘
ํƒ€์ดํ•‘์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์œผ๋กœ ์ž๋™ ์ด๋™
Enter๊ฒ€์ƒ‰ ์™„๋ฃŒ
Esc๊ฒ€์ƒ‰ ์ทจ์†Œ
๊ฒ€์ƒ‰ ๋ชจ๋“œ์—์„œ๋Š” ํƒ€์ดํ•‘ํ•˜๋Š” ์ฆ‰์‹œ ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์œผ๋กœ ์ปค์„œ๊ฐ€ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๋น ๋ฅธ ๋„ค๋น„๊ฒŒ์ด์…˜์— ํ™œ์šฉํ•˜์„ธ์š”!

Entity ์‚ญ์ œํ•˜๊ธฐ

Entity ์‚ญ์ œ๋Š” ๋˜๋Œ๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ๋ฐฑ์—… ํ›„ ์ง„ํ–‰ํ•˜์„ธ์š”.
1

Entity ์„ ํƒ

์‚ญ์ œํ•  Entity์˜ ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ์ด๋™
2

Delete Entity ๋ฒ„ํŠผ ํด๋ฆญ

์šฐ์ธก ์ƒ๋‹จ์˜ โ€œDelete Entityโ€ ๋ฒ„ํŠผ ํด๋ฆญ
3

ํ™•์ธ

ํ™•์ธ ๋‹ค์ด์–ผ๋กœ๊ทธ์—์„œ Entity ID๋ฅผ ์ •ํ™•ํžˆ ์ž…๋ ฅํ•˜์—ฌ ์‚ญ์ œ ํ™•์ธ
์‚ญ์ œ ์‹œ ์˜ํ–ฅ:
  • {entity}.entity.json ํŒŒ์ผ ์‚ญ์ œ
  • ๊ด€๋ จ๋œ Model, Types ํŒŒ์ผ์€ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œ ํ•„์š”
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ†ตํ•ด ๋ณ„๋„๋กœ ์‚ญ์ œ

ํŒŒ์ผ ๊ตฌ์กฐ

Entity๋ฅผ ์ €์žฅํ•˜๋ฉด ๋‹ค์Œ ํŒŒ์ผ๋“ค์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค:
ํ•˜์ด๋ผ์ดํŠธ๋œ ํŒŒ์ผ๋“ค์€ Sonamu๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

์‹ค์‹œ๊ฐ„ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ

Sonamu UI๋Š” ์ž…๋ ฅ ์ฆ‰์‹œ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค:
  • ์˜ˆ์•ฝ์–ด ์ฒดํฌ (JavaScript/TypeScript ํ‚ค์›Œ๋“œ)
  • ํƒ€์ž…๋ณ„ ํ•„์ˆ˜ ์˜ต์…˜ ์ฒดํฌ
  • ์ค‘๋ณต ์ด๋ฆ„ ์ฒดํฌ
์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉด ๋นจ๊ฐ„์ƒ‰ ํ…Œ๋‘๋ฆฌ์™€ ํ•จ๊ป˜ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“ธ ํ•„์š”: ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์˜ค๋ฅ˜ ํ‘œ์‹œ ์˜ˆ์ œ

์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ

Sonamu UI๋Š” ์ปจํ…์ŠคํŠธ์— ๋งž๋Š” ์ž๋™ ์™„์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:
  • ๊ธฐ์กด Entity ๋ชฉ๋ก ์ œ์•ˆ
  • ํƒ€์ดํ•‘์— ๋”ฐ๋ผ ํ•„ํ„ฐ๋ง
  • with ํ•„๋“œ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Entity ๋ชฉ๋ก ์ž๋™ ์™„์„ฑ
  • JSON, Virtual ํƒ€์ž…์˜ id ํ•„๋“œ์—์„œ ํƒ€์ž… ์ œ์•ˆ
  • ์ •์˜๋œ Enum ๋ชฉ๋ก ์ œ์•ˆ
  • ์ƒˆ Enum ์ƒ์„ฑ ์˜ต์…˜ ์ œ๊ณต

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

Sonamu UI์˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•์„ ์ตํ˜”๋‹ค๋ฉด, ๋‹ค์Œ ์ฃผ์ œ๋ฅผ ํ•™์Šตํ•˜์„ธ์š”: