LogoSkills

serverpod-model-agent

Serverpod Model expert. Use for .spy.yaml model definition, field types, and index tasks

ํ•ญ๋ชฉ๋‚ด์šฉ
Invoke/serverpod:model
Aliases/backend:model, /model:create
ToolsRead, Edit, Write, Glob, Grep
Modelsonnet
Skillsserverpod

/serverpod:model โ€” ๋ฐ์ดํ„ฐ ์„ค๊ณ„๋„ ๋งŒ๋“ค๊ธฐ ๋„์šฐ๋ฏธ#

ํ•œ๋งˆ๋””๋กœ#

์ƒˆ ๊ธฐ๋Šฅ์— ํ•„์š”ํ•œ "๋ฐ์ดํ„ฐ ๋ณด๊ด€ ์–‘์‹(์„ค๊ณ„๋„)"์„ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๋„์šฐ๋ฏธ์ž…๋‹ˆ๋‹ค. ๋ฌผ๊ฑด์„ ๋„ฃ์„ ์„œ๋ž์žฅ์„ ์งค ๋•Œ "์ด ์นธ์—” ์ œ๋ชฉ, ์ด ์นธ์—” ์ž‘์„ฑ์ž, ์ด ์นธ์—” ์ž‘์„ฑ ๋‚ ์งœ"์ฒ˜๋Ÿผ ์นธ์„ ๋ฏธ๋ฆฌ ์ •ํ•ด ๋‘๋Š” ์ผ๊ณผ ๊ฐ™์•„์š”.

๋ˆ„๊ฐ€ยท์–ธ์ œ ์“ฐ๋‚˜์š”#

  • ์ƒˆ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๋ฉด์„œ ์–ด๋–ค ์ •๋ณด๋ฅผ ์ €์žฅํ• ์ง€ ์ •์˜ํ•ด์•ผ ํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž
  • /serverpod:model ๋ช…๋ น์„ ์ง์ ‘ ์‹คํ–‰ํ•  ๋•Œ
  • ์ „์ฒด ๊ธฐ๋Šฅ ์ƒ์„ฑ(/feature:create)์˜ ์ฒซ ๋‹จ๊ณ„์—์„œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋  ๋•Œ

๋ฌด์—‡์„ ํ•ด์ฃผ๋‚˜์š”#

๋ฐ์ดํ„ฐ ์–‘์‹ ํŒŒ์ผ(.spy.yaml)์„ ์ •ํ•ด์ง„ ํด๋”์— ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ๋Š”:

  • Entity ํŒŒ์ผ โ€” ์‹ค์ œ๋กœ ์ €์žฅํ•  ์ •๋ณด์˜ ๋ณธ์ฒด ์–‘์‹ (์˜ˆ: {entity_name}.spy.yaml)
  • DTO ํŒŒ์ผ โ€” ๋งŒ๋“ค๊ธฐ/์ˆ˜์ •ํ•˜๊ธฐ/๋ชฉ๋ก ๋ณด๊ธฐ ๊ฐ™์€ ์ž‘์—…์— ์“ฐ๋Š” ์š”์ฒญยท์‘๋‹ต ์–‘์‹ (์ƒ์„ฑยท์ˆ˜์ •ยท๋ชฉ๋ก ์‘๋‹ต์šฉ)
  • Enum ํŒŒ์ผ โ€” "์ƒํƒœ๊ฐ’" ๊ฐ™์€ ์ •ํ•ด์ง„ ์„ ํƒ์ง€ ๋ชฉ๋ก (ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ)

๋งŒ๋“ค์–ด์ง„ ๋’ค์—๋Š” ์ด ์–‘์‹์„ ์‹ค์ œ ์ฝ”๋“œ๋กœ ๋ฐ”๊พธ๋Š” ์ž‘์—…(์ฝ”๋“œ ์ƒ์„ฑ)๊ณผ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ˜์˜(๋งˆ์ด๊ทธ๋ ˆ์ด์…˜)๊นŒ์ง€ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์“ฐ๋‚˜์š”#

# ๋ช…๋ น ์‹คํ–‰ (๋ณ„์นญ์œผ๋กœ๋„ ํ˜ธ์ถœ ๊ฐ€๋Šฅ)
/serverpod:model
/backend:model
/model:create

์‹คํ–‰ํ•  ๋•Œ๋Š” ์•„๋ž˜ ๊ฐ’์„ ํ•จ๊ป˜ ๋„˜๊น๋‹ˆ๋‹ค. (โœ… ํ‘œ์‹œ๋Š” ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๊ฐ’)

  • feature_name โœ… โ€” ๊ธฐ๋Šฅ ๋ชจ๋“ˆ ์ด๋ฆ„ (snake_case, ์˜ˆ: community_post)
  • entity_name โœ… โ€” ์ €์žฅํ•  ์ •๋ณด์˜ ์ด๋ฆ„ (PascalCase, ์˜ˆ: Post)
  • fields โœ… โ€” ์–ด๋–ค ์นธ(ํ•„๋“œ)๋“ค์„ ๋‘˜์ง€ ๋ชฉ๋ก
  • has_crud โ€” ๋งŒ๋“ค๊ธฐ/์ˆ˜์ • ๊ฐ™์€ ์ž‘์—…์šฉ ์–‘์‹(CRUD DTO)์„ ์ž๋™ ์ƒ์„ฑํ• ์ง€ (๊ธฐ๋ณธ๊ฐ’: ์ผœ์ง)

์•ˆ์—์„œ ๋ฌด์Šจ ์ผ์ด ๋ฒŒ์–ด์ง€๋‚˜์š”#

  1. ์ •ํ•ด์ง„ ํด๋” ๊ตฌ์กฐ์— ๋งž์ถฐ Entity, DTO, Enum ์–‘์‹ ํŒŒ์ผ(.spy.yaml)์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. ๊ฐ ์นธ์—๋Š” ํ•œ๊ตญ์–ด ์„ค๋ช…, ์ž‘์„ฑยท์ˆ˜์ • ๋‚ ์งœ, ํ•„์š”ํ•œ ์ƒ‰์ธ(index), ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์™€์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„, ๊ธฐ๋ณธ๊ฐ’(์กฐํšŒ์ˆ˜ยท์ƒํƒœ ๋“ฑ)์„ ๋น ์ง์—†์ด ์ฑ„์›๋‹ˆ๋‹ค.
  3. ์–‘์‹์„ ๋‹ค ๋งŒ๋“  ๋’ค ์ฝ”๋“œ ์ƒ์„ฑ(backend:pod:generate)์„ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋›ฐ๋ฉด ์ƒˆ ์–‘์‹์ด ํ”„๋ก ํŠธ์—”๋“œ์— ๋ฐ˜์˜๋˜์ง€ ์•Š์•„ ๋นŒ๋“œ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค.
  4. Entity๊ฐ€ ๋ฐ”๋€ ๊ฒฝ์šฐ์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ˜์˜์šฉ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๋งŒ๋“ค๊ณ  ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

โš™๏ธ ์ƒ์„ธ ์˜ต์…˜ยท์‹คํ–‰ ๋ช…์„ธ (๊ฐœ๋ฐœ์ž / AI ์—์ด์ „ํŠธ์šฉ)

Role#

Generates model files (.spy.yaml) for the Serverpod backend. Creates Entity, DTO, and Enum types in consistent patterns.


Activation Conditions#

  • Activated on /serverpod:model command invocation
  • Called in Step 1 of /feature:create orchestration

Parameters#

ParameterRequiredDescription
feature_nameโœ…Feature module name (snake_case)
entity_nameโœ…Entity name (PascalCase)
fieldsโœ…Field definition list
has_crudโŒAuto-generate CRUD DTOs (default: true)

Generated Files#

backend/kobic_server/lib/src/feature/{feature_name}/model/
โ”œโ”€โ”€ entities/
โ”‚   โ””โ”€โ”€ {entity_name}.spy.yaml
โ”œโ”€โ”€ dto/
โ”‚   โ”œโ”€โ”€ {entity_name}_create_request.spy.yaml
โ”‚   โ”œโ”€โ”€ {entity_name}_update_request.spy.yaml
โ”‚   โ””โ”€โ”€ {entity_name}_list_response.spy.yaml
โ””โ”€โ”€ enum/
    โ””โ”€โ”€ {entity_name}_status.spy.yaml (if needed)

Core Pattern Summary#

Entity Definition#

### Entity description
class: EntityName
table: table_name

fields:
  ### Unique identifier
  id: int?
  ### Field description
  fieldName: Type
  ### Created timestamp
  createdAt: DateTime
  ### Updated timestamp
  updatedAt: DateTime?

indexes:
  field_idx:
    fields: field

DTO Definition#

### Request DTO
class: EntityCreateRequest
fields:
  requiredField: Type
  optionalField: Type?

Enum Definition#

enum: EnumName
serialized: byName
values:
  - value1
  - value2

Field Type Rules#

TypeExample
String, String?title: String
int, int?count: int
doubleprice: double
boolisActive: bool
DateTime, DateTime?createdAt: DateTime
List<T>tags: List<String>
Default valueviewCount: int, default=0
Foreign keyuserId: int, relation(parent=user)

Common Field Patterns#

Required Fields#

createdAt: DateTime
updatedAt: DateTime?

User-Generated Content#

authorId: int
authorName: String
authorProfileUrl: String?

Counters (Performance Optimization)#

viewCount: int, default=0
likeCount: int, default=0

State Management#

status: EntityStatus, default=active
isDeleted: bool, default=false

Required Post-Generation Steps#

After generating model files (.spy.yaml), you must run the following commands:

# 1. [Required] Code generation - Convert new models to Dart code
melos run backend:pod:generate

# 2. Commit
git add .
git commit -m  " chore(backend): code generation " 

 # 3. (For Entity changes) Create migration
melos run backend:pod:create-migration

# 4. (For Entity changes) Apply migration
melos run backend:pod:run-migration

Important#

If backend:pod:generate is skipped:

  • New models will not be reflected in kobic_client
  • Frontend cannot use new Entities/DTOs
  • Build errors will occur

This agent automatically runs backend:pod:generate after model file generation.


Checklist#

  • Add Korean comments (###) on all fields
  • Include createdAt, updatedAt fields
  • Define necessary indexes
  • Define foreign key relations (if needed)
  • Set default values (counters, status fields)
  • Generate DTO files (for CRUD)
  • Generate Enum files (if needed)