Entity ๊ธฐ๋ณธ
Entity ์ด๋ฆ์ product๋ก ์ง์ผ๋ฉด ์๋์ผ๋ก ์์ฑ๋๋ ์ด๋ฆ๋ค์ ๋ฌด์์ธ๊ฐ์?
Entity ์ด๋ฆ์ product๋ก ์ง์ผ๋ฉด ์๋์ผ๋ก ์์ฑ๋๋ ์ด๋ฆ๋ค์ ๋ฌด์์ธ๊ฐ์?
-
Entity ID (id)
Product(์ ๋ ฅ๊ฐ ๊ทธ๋๋ก)- ๊ฒ์ฆ:
/^[A-Z][a-zA-Z0-9]*$/(CamelCase ํ์)
-
ํ
์ด๋ธ๋ช
(table)
products(์๋ ๋ณต์ํ ๋ณํ)- ์ปค์คํ ๊ฐ๋ฅ (Sonamu UI์์ ์ง์ ์ ๋ ฅ)
-
ํ์ผ/๋๋ ํฐ๋ฆฌ๋ช
(
names.fs)product(์๋ฌธ์ + ๋์)- ์ฌ์ฉ: ๋๋ ํฐ๋ฆฌ๋ช , ํ์ผ๋ช
-
๋ชจ๋๋ช
(
names.module)Product(์ ๋ ฅ๊ฐ ๊ทธ๋๋ก)- ์ฌ์ฉ: ํด๋์ค๋ช , ํ์ ๋ช
-
ID โ
table:inflection.underscore(inflection.pluralize(id))ProductโproductsOrderItemโorder_items
-
ID โ
fs:inflection.dasherize(inflection.underscore(id)).toLowerCase()ProductโproductOrderItemโorder-item
- Entity ID๋ ๋ฐ๋์ ๋๋ฌธ์๋ก ์์ (CamelCase)
- ํ ์ด๋ธ๋ช ์ ์๋ ์์ฑ๋์ง๋ง ์ปค์คํ ๊ฐ๋ฅ
Entity๋ฅผ ์์ ํ์ ๋ ๋ง์ด๊ทธ๋ ์ด์
์ด ์๋ ์์ฑ๋๋ ์กฐ๊ฑด์?
Entity๋ฅผ ์์ ํ์ ๋ ๋ง์ด๊ทธ๋ ์ด์ ์ด ์๋ ์์ฑ๋๋ ์กฐ๊ฑด์?
- ํ๋กญ ์ถ๊ฐ/์ญ์
- ํ๋กญ ํ์
๋ณ๊ฒฝ (
stringโnumeric๋ฑ) StringProp๊ธธ์ด ๋ณ๊ฒฝ (length)nullable๋ณ๊ฒฝdbDefault๋ณ๊ฒฝNumberProp์ดnumberType: "numeric"์ธ ๊ฒฝ์ฐprecision,scale๋ณ๊ฒฝ
- BelongsToOne ์ถ๊ฐ/์ญ์ (FK ์ปฌ๋ผ ์์ฑ/์ญ์ )
- OneToOne ์ถ๊ฐ/์ญ์ (
hasJoinColumn: true์ธ ๊ฒฝ์ฐ) - ManyToMany ์ถ๊ฐ/์ญ์ (์กฐ์ธ ํ ์ด๋ธ ์์ฑ/์ญ์ )
- onUpdate, onDelete ๋ณ๊ฒฝ
- ์ธ๋ฑ์ค ์ถ๊ฐ/์ญ์
- unique, index, fulltext ํ์ ๋ณ๊ฒฝ
- ์ธ๋ฑ์ค ์ปฌ๋ผ ๋ณ๊ฒฝ
- ํ ์ด๋ธ๋ช ๋ณ๊ฒฝ
- Subset ์ถ๊ฐ/์์ /์ญ์
- Enum labels ๋ณ๊ฒฝ
- Virtual ํ๋กญ ์ถ๊ฐ/์์ /์ญ์
- HasMany ๊ด๊ณ ์ถ๊ฐ/์์ (FK๊ฐ ์๋ํธ์ ์์)
- Title, Description ๋ณ๊ฒฝ
- Entity ์์ ํ ์๋์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ์ด ์์ฑ๋์ง ์์
- DB Migration ํญ โ Prepared Migration Codes ํ์ธ
- Generate ๋ฒํผ ํด๋ฆญํ์ฌ ์๋ ์์ฑ ํ์
Sonamu UI์์ ์ Entity๋ฅผ ๋ง๋ค๋ฉด ์ด๋ค ์์๋ก ํ์ผ๋ค์ด ์์ฑ๋๋์?
Sonamu UI์์ ์ Entity๋ฅผ ๋ง๋ค๋ฉด ์ด๋ค ์์๋ก ํ์ผ๋ค์ด ์์ฑ๋๋์?
{entity}.entity.json- ์์น:
api/src/application/{entity}/{entity}.entity.json
{entity}.types.ts- ์์น:
api/src/application/{entity}/{entity}.types.ts
sonamu.generated.sso.tssonamu.generated.ts- ์์น:
api/src/application/
user.types.tsโweb/src/services/user/user.types.tssonamu.generated.tsโweb/src/services/sonamu.generated.ts
sonamu.lock ๊ฐฑ์ - ์๋ก ์์ฑ๋ ํ์ผ๋ค์ ์ฒดํฌ์ฌ ์ ์ฅ
- ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ์ ์๋ ์์ฑ๋์ง ์์
- DB Migration ํญ์์ ๋ณ๋๋ก Generate ํด๋ฆญ ํ์
model,model_test,view๋ Scaffolding ํญ์์ ๋ณ๋ ์์ฑ
Entity ํ๋กํผํฐ
Entity์ enums๋ ์ด๋ป๊ฒ ์ ์ํ๋์?
Entity์ enums๋ ์ด๋ป๊ฒ ์ ์ํ๋์?
enums ๊ฐ์ฒด์ enum ID๋ฅผ ํค๋ก, ๊ฐ-๋ผ๋ฒจ ์์ ๊ฐ์ฒด๋ก ์ ์ํฉ๋๋ค:- ํค (
normal,admin): DB์ ์ ์ฅ๋๋ ์ค์ ๊ฐ - ๊ฐ (๋ ธ๋ฉ, ๊ด๋ฆฌ์): UI์ ํ์๋๋ ๋ผ๋ฒจ
- enum ID (
UserRole): TypeScript ํ์ ๋ช ์ผ๋ก ์ฌ์ฉ๋จ
- DB ๊ฐ์ ์๋ฌธ์ผ๋ก (๊ตญ์ ํ์ ๋ง์ด๊ทธ๋ ์ด์ ์ฉ์ด์ฑ)
- UI ๋ผ๋ฒจ์ ์ฌ์ฉ์ ์ธ์ด๋ก ์์ฑ
virtual ํ๋๋ ๋ฌด์์ด๊ณ ์ธ์ ์ฌ์ฉํ๋์?
virtual ํ๋๋ ๋ฌด์์ด๊ณ ์ธ์ ์ฌ์ฉํ๋์?
- Entity ์์ธ โ Add a prop ํด๋ฆญ
- Type:
virtual์ ํ - Name: ํ๋๋ช
์
๋ ฅ (์:
company_stats) Nullable: true์ฒดํฌ- CustomType ID: ํ์
์ ํ (์:
CompanyStatsType)
{entity}.types.ts):- ๊ด๊ณ ๋ฐ์ดํฐ ์ง๊ณ (์ง์ ์, ๋๊ธ ์)
- ๋ณต์กํ ํต๊ณ ๊ฐ์ฒด (๋ถ์๋ณ ํต๊ณ, ํ์ฌ ๋์๋ณด๋)
- ์ฌ์ฉ์๋ณ ์ํ (์ข์์ ์ฌ๋ถ, ๊ถํ ์ ๋ณด)
- ์ค์ฒฉ๋ JSON ๊ตฌ์กฐ (๋ฉํ๋ฐ์ดํฐ, ์ค์ ๊ฐ์ฒด)
SaveParams์์.omit({ virtual_field: true })ํ์- Enhancer์์ ๊ณ์ฐ ๋ก์ง ๊ตฌํ
- ๋ณต์กํ ๊ณ์ฐ์ ์ฑ๋ฅ ๊ณ ๋ ค ํ์
Entity ๊ด๊ณ
Entity ๊ฐ ๊ด๊ณ๋ ์ด๋ป๊ฒ ์ ์ํ๋์?
Entity ๊ฐ ๊ด๊ณ๋ ์ด๋ป๊ฒ ์ ์ํ๋์?
relation ํ์
์ ํ๋๋ก ์ ์ํฉ๋๋ค:OneToOne: 1:1 ๊ด๊ณhasJoinColumn์ผ๋ก FK ์์ ์ง์
- FK ํค๋ฅผ ๊ฐ์ง Entity์์ ์ ์
- virtual ๊ด๊ณ (FK๊ฐ ์๋ํธ์ ์์)
joinTableํ์
onUpdate, onDelete ์ต์
์ผ๋ก ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์ ์ค์ ํ ์ ์์ต๋๋ค.BelongsToOne ๊ด๊ณ๋ ์ด๋ป๊ฒ ์ ์ํ๋์?
BelongsToOne ๊ด๊ณ๋ ์ด๋ป๊ฒ ์ ์ํ๋์?
- Entity ์์ธ โ Add a prop ํด๋ฆญ
- Type:
relation์ ํ - Relation Type:
BelongsToOne์ ํ - Name: ๊ด๊ณ ํ๋๋ช
(์:
department) - With: ์ฐ๊ฒฐํ Entity ID (์:
Department) - Nullable: ์ ํ์ ๊ด๊ณ๋ฉด
true - ON UPDATE/ON DELETE:
CASCADE,SET NULL,RESTRICT,NO ACTION๋ฑ ์ ํ
- ์ธ๋ํค ์ปฌ๋ผ ์๋ ์์ฑ (์:
department_id) - ํ์
์
department?: Departmentํฌํจ
Model ํด๋์ค
DB์ ์ฐ๊ฒฐ๋ Entity ์์ด ๋จ๋
์ผ๋ก API route๋ฅผ ๋ง๋ค๋ ค๋ฉด?
DB์ ์ฐ๊ฒฐ๋ Entity ์์ด ๋จ๋ ์ผ๋ก API route๋ฅผ ๋ง๋ค๋ ค๋ฉด?
BaseFrameClass์์getDB(),getUpsertBuilder()๋ฉ์๋ ์ ๊ณต- Entity, Subset, Model ๋ฉ์๋ ์์
- ํ์ผ๋ช
:
{name}.frame.ts
- ๊ธฐ์กด Entity์ ๊ด๋ จ: ํด๋น Model์ ๋ฉ์๋ ์ถ๊ฐ
- ์์ ํ ๋ ๋ฆฝ์ : Frame ํด๋์ค ์์ฑ
Model ํด๋์ค๊ฐ ๋น๋ํด์ง๋ฉด ์ด๋ป๊ฒ ๋ฆฌํฉํ ๋งํ๋ ๊ฒ์ด ์ถ์ฒ๋๋์?
Model ํด๋์ค๊ฐ ๋น๋ํด์ง๋ฉด ์ด๋ป๊ฒ ๋ฆฌํฉํ ๋งํ๋ ๊ฒ์ด ์ถ์ฒ๋๋์?
- User Entity์ ์ง์ ์ฐ๊ด:
user.model.ts์ ์ ์ง - ์ ํธ๋ฆฌํฐ์ฑ ๊ธฐ๋ฅ:
user-util.frame.ts๋ก ๋ถ๋ฆฌ - ์์ ํ ๋ ๋ฆฝ์ : ๋ณ๋ Frame ํด๋์ค ์์ฑ
EntityManager ํด๋์ค๋ ๋ฌด์์ ํ๋ ํด๋์ค์ธ๊ฐ์?
EntityManager ํด๋์ค๋ ๋ฌด์์ ํ๋ ํด๋์ค์ธ๊ฐ์?
- Entity ์กฐํ
- ์ด๋ฆ ์๋ ์์ฑ (table, fs, module)
- ์คํค๋ง ๊ฒ์ฆ
- Subset ์กฐํ
- Subset ํ๋ ์ ๊ฐ
- Model ํด๋์ค
- API ๋ฐ์ฝ๋ ์ดํฐ
- Syncer
- ๋ง์ด๊ทธ๋ ์ด์ ์์ฑ๊ธฐ
Entity์ ์คํค๋ง๋ฅผ ๊ฒ์ฆํ๋ ค๋ฉด ์ด๋ป๊ฒ ํ๋์?
Entity์ ์คํค๋ง๋ฅผ ๊ฒ์ฆํ๋ ค๋ฉด ์ด๋ป๊ฒ ํ๋์?
- Entity ํธ์ง ์ ์ค์๊ฐ ์ค๋ฅ ํ์
pnpm dev์คํ ์ ์๋ ๊ฒ์ฆ ๋ฐ ์๋ฌ ์ถ๋ ฅ
- ํ์ ํ๋ ์กด์ฌ
- ํ์ ์ ํจ์ฑ
- Subset ์ฐธ์กฐ
- Enum ์ ํจ์ฑ