๋ฉ”์ธ ์ฝ˜ํ…์ธ ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ
Sonamu UI์˜ Entity ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ๊ฐ์  ์ธํ„ฐํŽ˜์ด์Šค๋กœ Entity๋ฅผ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•˜๊ณ  ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CLI๋กœ ํŒŒ์ผ์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.

Entity ํƒญ ๊ตฌ์กฐ

Entity ๊ด€๋ฆฌ ํ™”๋ฉด

Entity ํƒญ์€ ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์˜์—ญ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:
  • ์™ผ์ชฝ Sidebar: Entity ๋ชฉ๋ก๊ณผ ์ƒˆ Entity ์ถ”๊ฐ€ ๋ฒ„ํŠผ
  • ์˜ค๋ฅธ์ชฝ Content: ์„ ํƒํ•œ Entity์˜ ์ƒ์„ธ ์ •๋ณด (Properties, Indexes, Relations, Subsets, Enums)

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

1. New Entity ๋ฒ„ํŠผ ํด๋ฆญ

์‚ฌ์ด๋“œ๋ฐ” ํ•˜๋‹จ์˜ [+ New Entity] ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

2. Entity ์ •๋ณด ์ž…๋ ฅ

๋ชจ๋‹ฌ์ด ์—ด๋ฆฌ๋ฉด ๋‹ค์Œ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค:
ํ•„๋“œ์„ค๋ช…์˜ˆ์‹œ
Entity IDEntity ์‹๋ณ„์ž (PascalCase)Product, OrderItem
Titleํ•œ๊ธ€ ์ œ๋ชฉ์ƒํ’ˆ, ์ฃผ๋ฌธ ํ•ญ๋ชฉ
Parent Entity๋ถ€๋ชจ Entity (์„ ํƒ)Order
Parent Entity๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋ถ€๋ชจ Entity์˜ ํ•˜์œ„ Entity๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ: Order โ†’ OrderItem

3. ๊ธฐ๋ณธ Properties ์ถ”๊ฐ€

์ƒ์„ฑ๋œ Entity๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ ํ•„๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค:
{
  properties: [
    { name: "id", type: "int", primaryKey: true, autoIncrement: true },
    { name: "title", type: "string", length: 255 },
    { name: "created_at", type: "datetime", default: "CURRENT_TIMESTAMP" },
  ]
}

Properties ํŽธ์ง‘

Property ์ถ”๊ฐ€

  1. [+ Add Property] ๋ฒ„ํŠผ ํด๋ฆญ
  2. Property ์ •๋ณด ์ž…๋ ฅ:
ํ•„๋“œํ•„์ˆ˜์„ค๋ช…์˜ˆ์‹œ
Nameโœ…ํ•„๋“œ๋ช… (snake_case)email, phone_number
Typeโœ…๋ฐ์ดํ„ฐ ํƒ€์ž…string, int, decimal
Length์กฐ๊ฑด๋ถ€๋ฌธ์ž์—ด ๊ธธ์ด255
NullableNULL ํ—ˆ์šฉ ์—ฌ๋ถ€true
Default๊ธฐ๋ณธ๊ฐ’0, CURRENT_TIMESTAMP
Comment์„ค๋ช…์‚ฌ์šฉ์ž ์ด๋ฉ”์ผ
์ง€์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…:
  • ๋ฌธ์ž์—ด: string, text, mediumtext, longtext
  • ์ˆซ์ž: int, bigint, float, double, decimal
  • ๋‚ ์งœ: date, datetime, timestamp
  • ๊ธฐํƒ€: boolean, json, enum

Property ์ˆ˜์ •

  1. Property ํ–‰์„ ํด๋ฆญํ•˜์—ฌ ํŽธ์ง‘ ๋ชจ๋“œ๋กœ ์ „ํ™˜
  2. ๊ฐ’์„ ์ˆ˜์ •
  3. ๋‹ค๋ฅธ ๊ณณ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ Enter๋ฅผ ๋ˆŒ๋Ÿฌ ์ €์žฅ

Property ์‚ญ์ œ

Property ํ–‰์˜ [ร—] ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ ์†์‹ค ์ฃผ์˜: Property๋ฅผ ์‚ญ์ œํ•˜๋ฉด ํ•ด๋‹น ์ปฌ๋Ÿผ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฑ์—…ํ•˜์„ธ์š”.

Indexes ๊ด€๋ฆฌ

Index ์ถ”๊ฐ€

  1. Indexes ์„น์…˜์œผ๋กœ ์Šคํฌ๋กค
  2. [+ Add Index] ๋ฒ„ํŠผ ํด๋ฆญ
  3. Index ์ •๋ณด ์ž…๋ ฅ:
ํ•„๋“œ์„ค๋ช…์˜ˆ์‹œ
Fields์ธ๋ฑ์Šค ๋Œ€์ƒ ํ•„๋“œ (๋ณต์ˆ˜ ์„ ํƒ ๊ฐ€๋Šฅ)email, created_at
Type์ธ๋ฑ์Šค ํƒ€์ž…index, unique, fulltext
Index ํƒ€์ž…:
  • index: ์ผ๋ฐ˜ ์ธ๋ฑ์Šค (๊ฒ€์ƒ‰ ์„ฑ๋Šฅ ํ–ฅ์ƒ)
  • unique: ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค (์ค‘๋ณต ๋ฐฉ์ง€)
  • fulltext: ์ „๋ฌธ ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค (ํ…์ŠคํŠธ ๊ฒ€์ƒ‰)

๋ณตํ•ฉ Index

์—ฌ๋Ÿฌ ํ•„๋“œ๋ฅผ ์„ ํƒํ•˜์—ฌ ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
indexes: [
  { fields: ["user_id", "created_at"], type: "index" },
  { fields: ["email"], type: "unique" },
]

Relations ๊ด€๋ฆฌ

belongsTo (N:1 ๊ด€๊ณ„)

์˜๋ฏธ: โ€œ์ด Entity๋Š” ๋‹ค๋ฅธ Entity์— ์†ํ•œ๋‹คโ€ ์˜ˆ์‹œ: Post๋Š” User์— ์†ํ•จ
  1. belongsTo ์„น์…˜์˜ [+ Add] ๋ฒ„ํŠผ ํด๋ฆญ
  2. ์ •๋ณด ์ž…๋ ฅ:
ํ•„๋“œ์„ค๋ช…์˜ˆ์‹œ
Entity์ฐธ์กฐํ•  EntityUser
As๊ด€๊ณ„ ๋ณ„์นญauthor
Foreign Key์™ธ๋ž˜ํ‚ค ํ•„๋“œ๋ช… (์„ ํƒ)author_id
์ƒ์„ฑ๋˜๋Š” ์ฝ”๋“œ:
belongsTo: [
  { entityId: "User", as: "author" }
]

hasMany (1:N ๊ด€๊ณ„)

์˜๋ฏธ: โ€œ์ด Entity๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋‹ค๋ฅธ Entity๋ฅผ ๊ฐ€์ง„๋‹คโ€ ์˜ˆ์‹œ: User๋Š” ์—ฌ๋Ÿฌ Post๋ฅผ ๊ฐ€์ง
  1. hasMany ์„น์…˜์˜ [+ Add] ๋ฒ„ํŠผ ํด๋ฆญ
  2. ์ •๋ณด ์ž…๋ ฅ:
ํ•„๋“œ์„ค๋ช…์˜ˆ์‹œ
Entity๋Œ€์ƒ EntityPost
As๊ด€๊ณ„ ๋ณ„์นญposts
์ƒ์„ฑ๋˜๋Š” ์ฝ”๋“œ:
hasMany: [
  { entityId: "Post", as: "posts" }
]

Enums ๊ด€๋ฆฌ

ํŠน์ • ํ•„๋“œ๊ฐ€ ์ œํ•œ๋œ ๊ฐ’๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์„ ๋•Œ Enum์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Enum ์ถ”๊ฐ€

  1. Enums ์„น์…˜์˜ [+ Add Enum] ๋ฒ„ํŠผ ํด๋ฆญ
  2. Enum ์ •๋ณด ์ž…๋ ฅ:
ํ•„๋“œ์„ค๋ช…์˜ˆ์‹œ
NameEnum ์ด๋ฆ„UserRole
Values๊ฐ’ ๋ชฉ๋ก (์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„)admin, user, guest
์ƒ์„ฑ๋˜๋Š” ์ฝ”๋“œ:
enums: [
  {
    name: "UserRole",
    values: ["admin", "user", "guest"]
  }
]
Property์—์„œ ์‚ฌ์šฉ:
{
  name: "role",
  type: "enum",
  enum: "UserRole",
  default: "user"
}

AI ์ง€์› Entity ์ƒ์„ฑ

์‚ฌ์ด๋“œ๋ฐ” ํ•˜๋‹จ์˜ [๐Ÿ’ฌ AI] ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด AI ์ฑ„ํŒ… ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—ด๋ฆฝ๋‹ˆ๋‹ค.

AI๋กœ Entity ์ƒ์„ฑ

์˜ˆ์‹œ ํ”„๋กฌํ”„ํŠธ:
๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€์„ ์œ„ํ•œ Post Entity๋ฅผ ๋งŒ๋“ค์–ด์ค˜.
์ œ๋ชฉ, ๋‚ด์šฉ, ์ž‘์„ฑ์ž, ์ž‘์„ฑ์ผ, ์กฐํšŒ์ˆ˜๊ฐ€ ํ•„์š”ํ•ด.
AI๊ฐ€ Entity ์ •์˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

AI๋กœ Entity ์ˆ˜์ •

์˜ˆ์‹œ ํ”„๋กฌํ”„ํŠธ:
User Entity์— ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค˜.
AI๊ฐ€ ๊ธฐ์กด Entity๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
๊ตฌ์ฒด์ ์œผ๋กœ ์š”์ฒญํ•˜์„ธ์š”: ํ•„๋“œ ํƒ€์ž…, ์ œ์•ฝ ์กฐ๊ฑด, ๊ด€๊ณ„ ๋“ฑ์„ ๋ช…ํ™•ํžˆ ์„ค๋ช…ํ• ์ˆ˜๋ก ๋” ์ •ํ™•ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ „ ์˜ˆ์ œ

์ „์ž์ƒ๊ฑฐ๋ž˜ Product Entity

export const ProductEntity = {
  properties: [
    { name: "id", type: "int", primaryKey: true, autoIncrement: true },
    { name: "title", type: "string", length: 255 },
    { name: "description", type: "text", nullable: true },
    { name: "price", type: "decimal", precision: 10, scale: 2 },
    { name: "stock", type: "int", default: 0 },
    { name: "category_id", type: "int" },
    { name: "status", type: "enum", enum: "ProductStatus" },
    { name: "created_at", type: "datetime", default: "CURRENT_TIMESTAMP" },
    { name: "updated_at", type: "datetime", onUpdate: "CURRENT_TIMESTAMP" },
  ],
  
  indexes: [
    { fields: ["category_id"] },
    { fields: ["title"], type: "fulltext" },
    { fields: ["status", "created_at"] },
  ],
  
  belongsTo: [
    { entityId: "Category", as: "category" }
  ],
  
  hasMany: [
    { entityId: "Review", as: "reviews" }
  ],
  
  enums: [
    {
      name: "ProductStatus",
      values: ["active", "inactive", "soldout"]
    }
  ],
} satisfies EntityType;

๋ณ€๊ฒฝ์‚ฌํ•ญ ์ ์šฉ

Entity๋ฅผ ์ˆ˜์ •ํ•œ ํ›„์—๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•ด์•ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

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

  1. Entity ํŽธ์ง‘: UI์—์„œ Entity ์ˆ˜์ •
  2. Migration ์ƒ์„ฑ: Migration ํƒญ์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ƒ์„ฑ
  3. Migration ์‹คํ–‰: ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹คํ–‰ํ•˜์—ฌ DB ๋ฐ˜์˜
  4. Scaffolding: Model๊ณผ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ƒ์„ฑ
Entity ํŒŒ์ผ(.entity.ts)์€ UI์—์„œ ์ˆ˜์ • ์‹œ ์ž๋™์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

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