์์ํ๊ธฐ
Sonamu๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ก์ ํธ๋ฅผ ์์ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋์?
Sonamu๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ก์ ํธ๋ฅผ ์์ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋์?
๋ค์ ๋ช
๋ น์ด๋ก ์ ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค:๋ํํ ํ๋กฌํํธ์ ๋ฐ๋ผ ํ๋ก์ ํธ ์ค์ :ํ๋ก์ ํธ ์คํ:์ ์ ๊ฐ๋ฅํ URL:์๊ตฌ์ฌํญ:
Node.js >= 18, pnpm >= 10, DockerSonamu๋ ์ด๋ค ๊ธฐ์ ์คํ์ ์ฌ์ฉํ๋์?
Sonamu๋ ์ด๋ค ๊ธฐ์ ์คํ์ ์ฌ์ฉํ๋์?
๊ฐ๋ฐ ํ๊ฒฝ
pnpm dev ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด ์ ํํ ์ด๋ค ์ผ์ด ์ผ์ด๋๋์?
pnpm dev ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ์ ํํ ์ด๋ค ์ผ์ด ์ผ์ด๋๋์?
-
TypeScript ํ์ผ ์ฆ์ ์คํ
@sonamu-kit/ts-loader๋ก TypeScript ํ์ผ์ ๋ฐํ์์ ์ฆ์ ๋ณํ- Node.js์
--importํ๋๊ทธ๋ก ๋ฑ๋ก
-
Sonamu ์ด๊ธฐํ (
Sonamu.init)- DB ์ค์ ๋ก๋
- Entity ํ์ผ ๋ก๋
- Syncer ์์ฑ ๋ฐ Types/Models/APIs ์๋ ๋ก๋
- ์ด๊ธฐ ์ฑํฌ ์คํ (
syncer.sync()) - ํ์ผ ๊ฐ์ ์์ (
startWatcher())
-
Fastify ์๋ฒ ์์ฑ ๋ฐ ์ค์
- ํ๋ฌ๊ทธ์ธ ๋ฑ๋ก (
formbody,multipart,session๋ฑ) - Auth ์ค์ (ํ์์)
@api๋ฐ์ฝ๋ ์ดํฐ๊ฐ ๋ถ์ ๋ฉ์๋๋ค์ API ์๋ํฌ์ธํธ๋ก ๋ฑ๋ก
- ํ๋ฌ๊ทธ์ธ ๋ฑ๋ก (
-
์๋ฒ ๋ฆฌ์ค๋ ์์
- ์ค์ ๋ ํฌํธ์์ Fastify ์๋ฒ ์์
-
HMR ํ์ฑํ
- ํ์ผ ๋ณ๊ฒฝ ๊ฐ์ง ์ ์๋์ผ๋ก ํ์ ์ฌ์์ฑ ๋ฐ ๋ชจ๋ ๋ฆฌ๋ก๋
pnpm dev๋ฅผ ์คํํ๋๋ฐ "Port 1028 is already in use" ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค
pnpm dev๋ฅผ ์คํํ๋๋ฐ "Port 1028 is already in use" ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค
๋ฐฉ๋ฒ 1: ํฌํธ ๋ณ๊ฒฝ๋ฐฉ๋ฒ 2: ๊ธฐ์กด ํ๋ก์ธ์ค ์ข
๋ฃ (macOS/Linux)
ํ์ผ ์์ฑ
Sonamu๊ฐ ์์ฑํ๋ ์ฝ๋์๋ ์ด๋ค ๊ฒ๋ค์ด ์๋์?
Sonamu๊ฐ ์์ฑํ๋ ์ฝ๋์๋ ์ด๋ค ๊ฒ๋ค์ด ์๋์?
Sonamu๊ฐ ์์ฑํ๋ ๊ฐ ํ์ผ์ ๋ฌด์์ด๊ณ ์ธ์ ์์ฑ๋๋์?
Sonamu๊ฐ ์์ฑํ๋ ๊ฐ ํ์ผ์ ๋ฌด์์ด๊ณ ์ธ์ ์์ฑ๋๋์?
1. ์๋ ์์ฑ (Entity ์์ฑ/์์ ์)
-
{entity}.entity.json- Entity์ ํ ์ด๋ธ ๊ตฌ์กฐ, ํ๋, ๊ด๊ณ, ์ธ๋ฑ์ค, Subset ์ ์
- ์์ฑ: Sonamu UI์์ Entity ์์ฑ ์
-
{entity}.types.ts- Entity์ ์ปค์คํ ํ์ ์ ์
- ์์ฑ: Entity ์์ฑ ์ (์ด๊ธฐ ํ ํ๋ฆฟ๋ง, ์ดํ ๊ฐ๋ฐ์๊ฐ ์์ )
-
sonamu.generated.ts- ๋ชจ๋ Entity์
BaseSchema,Enum,Subsetํ์ ์๋ ์์ฑ - ์์ฑ: Entity ๋๋ ํ์ ํ์ผ ๋ณ๊ฒฝ ์๋ง๋ค ์๋ ์ฌ์์ฑ
- ๋ชจ๋ Entity์
-
sonamu.generated.sso.ts- Subset๋ณ ์ฟผ๋ฆฌ ๋น๋์ ์๋ฒ ์ ์ฉ ํ์
- ์์ฑ: Entity ๋ณ๊ฒฝ ์๋ง๋ค ์๋ ์ฌ์์ฑ
-
migrations/{timestamp}_{action}.ts- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๋ณ๊ฒฝ์ ์ํ ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ
- ์์ฑ: DB Migration ํญ์์ Generate ํด๋ฆญ ์
-
{entity}.model.ts- Entity์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ
@api๋ฐ์ฝ๋ ์ดํฐ๋ก API ์ ์ - ์์ฑ: Scaffolding ํญ์์ Model ํ ํ๋ฆฟ Generate ์ (1ํ๋ง)
- Entity์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ
-
{entity}.model.test.ts- Model ๋ฉ์๋์ ๋จ์ ํ ์คํธ ํ์ผ
- ์์ฑ: Scaffolding ํญ์์ Test ํ ํ๋ฆฟ Generate ์
-
*.view.tsx- React ๊ธฐ๋ฐ ๋ฐฑ์คํผ์ค UI ์ปดํฌ๋ํธ
- ์์ฑ: Scaffolding ํญ์์ View ํ ํ๋ฆฟ Generate ์
-
{entity}.service.ts- ๋ฐฑ์๋ API๋ฅผ ํธ์ถํ๋ ํ๋ก ํธ์๋ ํด๋ผ์ด์ธํธ ์ฝ๋
- ์์ฑ: Model ํ์ผ ๋ณ๊ฒฝ ๊ฐ์ง ์
-
sonamu.generated.http- VSCode REST Client์ฉ API ํ ์คํธ ํ ํ๋ฆฟ
- ์์ฑ:
@api๋ฐ์ฝ๋ ์ดํฐ๊ฐ ์๋ ๋ฉ์๋ ์ถ๊ฐ/๋ณ๊ฒฝ ์
-
ํ๋ก ํธ์๋ ํ์ผ ๋ณต์ฌ
types.ts,generated.ts๋ฑ์ดweb/src/services/๋ก ์๋ ๋ณต์ฌ- ์์ฑ: ๋ฐฑ์๋ ํ์ผ ๋ณ๊ฒฝ ์ sync.targets์ ์ ์๋ ๊ฒฝ๋ก๋ก ์๋ ๋ณต์ฌ
-
sonamu.lock- ํ์ผ ๋ณ๊ฒฝ ์ถ์ ์ ์ํ ์ฒดํฌ์ฌ ํ์ผ
- ์์ฑ: ํ์ผ ๋ณ๊ฒฝ ์ถ์ ์ ์ํด ์๋ ๊ฐฑ์
Sonamu์ ์ํด ์์ฑ๋ ์ฝ๋๋ฅผ ์ง์ ์์ ํ๋ฉด ์ด๋ป๊ฒ ๋๋์?
Sonamu์ ์ํด ์์ฑ๋ ์ฝ๋๋ฅผ ์ง์ ์์ ํ๋ฉด ์ด๋ป๊ฒ ๋๋์?
ํญ์ ๋ฎ์ด์ฐ๊ธฐ (overwrite: true)๋ค์ ํ์ผ๋ค์ ์ฌ์์ฑ ์ ํญ์ ๋ฎ์ด์ฐ๊ธฐ๋๋ฏ๋ก ์์ ํ์ง ๋ง์ธ์:
sonamu.generated.ts- Entity ๋ณ๊ฒฝ ์ ํญ์ ์ฌ์์ฑsonamu.generated.sso.ts- Entity ๋ณ๊ฒฝ ์ ํญ์ ์ฌ์์ฑ{entity}.service.ts- Model ๋ณ๊ฒฝ ์ ํญ์ ์ฌ์์ฑsonamu.generated.http-@api๋ฉ์๋ ๋ณ๊ฒฝ ์ ํญ์ ์ฌ์์ฑ
{entity}.types.ts- ์ปค์คํ ํ์ ์ถ๊ฐ ๊ฐ๋ฅ{entity}.model.ts- ๋น์ฆ๋์ค ๋ก์ง ์ถ๊ฐ/์์ ๊ฐ๋ฅ{entity}.model.test.ts- ํ ์คํธ ์ผ์ด์ค ์ถ๊ฐ/์์ ๊ฐ๋ฅ*.view.tsx- UI ์ปค์คํฐ๋ง์ด์ง ๊ฐ๋ฅ
- ์ปค์คํ
ํ์
์
{entity}.types.ts์ ์ถ๊ฐ - ๋น์ฆ๋์ค ๋ก์ง์
{entity}.model.ts์ ๊ตฌํ - Entity ์ ์๋ Sonamu UI ์ฌ์ฉ
Sonamu๊ฐ ๊ด๋ฆฌํ๋ lock ํ์ผ๊ณผ ์์ฑ ์ฝ๋๋ ๋ฒ์ ์ปจํธ๋กค์ ๋์์ธ๊ฐ์?
Sonamu๊ฐ ๊ด๋ฆฌํ๋ lock ํ์ผ๊ณผ ์์ฑ ์ฝ๋๋ ๋ฒ์ ์ปจํธ๋กค์ ๋์์ธ๊ฐ์?
๋ฐ๋์ ์ปค๋ฐํด์ผ ํ๋ ํ์ผ:
sonamu.lock- Entity ์คํค๋ง ๋ณ๊ฒฝ ์ถ์ , ํ ๋๊ธฐํsonamu.generated.ts- ํ์ ๋๊ธฐํ, ํ๋ก ํธ์๋์์ ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅ{entity}.types.ts- ์ปค์คํ ํ์ ์ ์migrations/*.ts- DB ์คํค๋ง ๋ณ๊ฒฝ ์ด๋ ฅ{entity}.model.ts- ๋น์ฆ๋์ค ๋ก์ง
- ํ์ ๋๊ธฐํ๋ก ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๊ฐ ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅ
- ๋น๋ ์๊ฐ ๋จ์ถ
- ์ฝ๋ ๋ฆฌ๋ทฐ ์ฉ์ด
์ค์บํด๋ฉ
์ค์บํด๋ฉ์ด๋ ๋ฌด์์ด๊ณ , ์ ํ์ํ๊ฐ์?
์ค์บํด๋ฉ์ด๋ ๋ฌด์์ด๊ณ , ์ ํ์ํ๊ฐ์?
ํ
ํ๋ฆฟ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ๋ณต์ ์ธ ๊ธฐ๋ณธ ์ฝ๋(๋ณด์ผ๋ฌํ๋ ์ดํธ)๋ฅผ ์๋ ์์ฑํ๋ ๊ธฐ๋ฅ์
๋๋ค.์์ฑ ๊ฐ๋ฅํ ๊ฒ:
- Model ํด๋์ค (
{entity}.model.ts) - Test ํ์ผ (
{entity}.model.test.ts) - View ์ปดํฌ๋ํธ (
*.view.tsx)
- Sonamu UI ์ ์
- Scaffolding ํญ ์ด๋
- Entity ์ ํ
- Template ์ ํ (model/model_test/view_list/view_form)
- Generate ํด๋ฆญ
- ๋ฐ๋ณต์ ์ธ CRUD ์ฝ๋ ์๋ ์์ฑ์ผ๋ก ๊ฐ๋ฐ ์๊ฐ ๋จ์ถ
- ์ผ๊ด๋ ์ฝ๋ ๊ตฌ์กฐ ์ ์ง
- ์คํ๋ ๋๋ฝ ๋ฐฉ์ง
- ์ด๋ณด์๋ ํ์ค ํจํด ํ์ต ๊ฐ๋ฅ
overwrite: false(๊ธฐ๋ณธ๊ฐ): ํ์ผ์ด ์ด๋ฏธ ์กด์ฌํ๋ฉด ์์ฑํ์ง ์์ (model, test, view ํ ํ๋ฆฟ)overwrite: true: ํ์ผ์ด ์กด์ฌํด๋ ํญ์ ๋ฎ์ด์ฐ๊ธฐ (generated, service ํ ํ๋ฆฟ)