์ด ํ๋ก์ ํธ๋ team, cloud, health ๊ณต๊ฐ API๋ฅผ ์ ๊ณตํ๋ TypeScript + Fastify ๋ฐฑ์๋์
๋๋ค.
ํ์ฌ๋ ์ค์ DB ์ฐ๋์ ๋ฃ๊ธฐ ์ ์ด๋ฏ๋ก, ๊ธฐ์กด ์๋ต์ ์ ์งํ๋ฉด์ ๋น์ฆ๋์ค ๋ก์ง์ ์ถ๊ฐํ ์ ์๋ ๊ตฌ์กฐ๋ก ์ค๊ณ๋์ด ์์ต๋๋ค.
ํนํ team ๋ชจ๋์ Notion์ ์์ฒ ๋ฐ์ดํฐ์์ค๋ก ์ฌ์ฉํ๋ฉด์, ์กฐํ ๋ก์ง๊ณผ ๋ฐ์ดํฐ ํด์ ๋ก์ง์ ๋ถ๋ฆฌํ๋ ๋ฐฉํฅ์ผ๋ก ๋ฆฌํฉํฐ๋ง ์ค์
๋๋ค.
ํ๋ก์ ํธ๋ฅผ ์ฒ์ ์ด์์ ๋, ์ด๋ค ํ์ผ์ด ๋ฌด์์ ํ๋์ง ํ ๋ฒ์ ์ดํดํ ์ ์๋๋ก ์์ฑํ์ต๋๋ค. ์๋ ๊ทธ๋ฆผ์ ์์ฒญ์ด ์๋ฒ์์ ์ฒ๋ฆฌ๋๋ ์์๋ฅผ ๋ณด์ฌ์ค๋๋ค.
์ฌ์ฉ์ ์์ฒญ
โโ> Route(API ์๋ํฌ์ธํธ)
โโ> Service(์ ์ค์ผ์ด์ค/๋น์ฆ๋์ค ๊ท์น)
โโ> Repository(์กฐํ ์๋๋ฆฌ์ค ์กฐํฉ)
โโ> Fetcher(์ธ๋ถ API / DB ํธ์ถ)
โโ> Extractor(์์ ํจ์ ๊ธฐ๋ฐ ๊ฐ ์ถ์ถ)
โโ> ์๋ต ๋ฐํ
src/ ๋ฃจํธ๋ ์๋์ ๊ฐ์ด ์ญํ ๋ณ๋ก ๋๋ฉ๋๋ค.
src/
common/
config/
env.ts
constants/
team.ts
cloud.ts
schemas.ts
routes/
health.ts
team.ts
cloud.ts
modules/
team/
services/
repositories/
datasources/
notion/
fetchers/
extractors/
parsers/
assemblers/
cloud/
services/
repositories/
datasources/
internal-example/
routes/
services/
repositories/
datasources/
server.ts
prisma/
schema.prisma
README์์ ๋ฌธ์๊ฐ ๊ธธ์ด์ง๋ ๋์ , ์ค์ ๋์์ ๊ธฐ์ค์ผ๋ก ํ์ผ์ ์ฝ์ผ๋ฉด ์ดํด๊ฐ ๋น ๋ฆ ๋๋ค.- ๊ณต๊ฐ API๋
routes์ ์ ์ธ๋์ด ์๊ณ , ์ค์ ๋์์modules์์ ์ฒ๋ฆฌ๋ฉ๋๋ค.
src/server.ts- ์ฑ์ ์์ฑํ๊ณ , ํ๋ฌ๊ทธ์ธ(CORS, Swagger), ๋ผ์ฐํธ ๋ฑ๋ก, ํ๊ฒฝ๋ณ์ ๋ก๊น ์ ๋ด๋นํฉ๋๋ค.
src/routes/*- HTTP ์์ฒญ์ ๋ฐ์ ๋ฌธ์ํ(Swagger)ํ๊ณ , Service๋ฅผ ํธ์ถํด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
- ์ด๊ณณ์ DB/API ์ง์ ์ ๊ทผ์ ํ์ง ์์ต๋๋ค.
src/modules/<๋๋ฉ์ธ>/services/*ํ ์กฐํ,ํด๋ผ์ฐ๋ ์กฐํ๊ฐ์ ์ ๋ฌด ๊ท์น์ด ๋ฐฐ์น๋ ์ฅ์์ ๋๋ค.- ํ์ฌ๋ Repository ํธ์ถ๋ง ๋ํํ๊ณ , ํฅํ ์ ์ฑ /๊ฒ์ฆ ๋ก์ง์ ๋ฃ์ ์์ ์ ๋๋ค.
src/modules/<๋๋ฉ์ธ>/repositories/*- ๋ฐ์ดํฐ ์กฐํ ๊ณ์ฝ(์ธํฐํ์ด์ค)์ ๋๋ค.
- Service๋ ์ด ๊ณ์ฝ๋ง ์๋ฉด ๋๊ณ , ์ค์ ๊ตฌํ์ฒด๋ ๋ฐ๋์ด๋ ์๋น์ค๋ ์ํฅ์ด ์ ์ต๋๋ค.
src/modules/<๋๋ฉ์ธ>/datasources/*mock์ ํ์ฌ ๋๋ฏธ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค.prisma๋ ๋์ค์ ์ค์ DB ์กฐํ๋ก ๊ต์ฒดํ ์ ์๋ ์ค๋น๋ถ์ ๋๋ค.
src/modules/team/notion/fetchers/*- Notion SDK ํธ์ถ๋ง ๋ด๋นํฉ๋๋ค.
dataSources.query,blocks.children.list๊ฐ์ I/O๋ฅผ ์ด ๊ณ์ธต์ ๋ก๋๋ค.CrewFetcher๋page + profileImageUrl + description๊ฐ์ raw source๋ง ๋ฐํํฉ๋๋ค.ActivityFetcher๋ project/study datasource๋ฅผ ๊ฐ๊ฐ ์กฐํํ ๋ค, repository๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ๋ณํฉํ ์ ์๋๋กpage๊ธฐ๋ฐ raw source๋ฅผ ๋ฐํํฉ๋๋ค.- ์์ lookup์ฒ๋ผ ๋ณ๋ ๋ณด์กฐ ๋ฐ์ดํฐ์์ค๋ ์ ์ฉ fetcher๋ก ๋ถ๋ฆฌํด ์กฐํฉํฉ๋๋ค.
src/modules/team/notion/extractors/*- ์ด๋ฏธ ์กฐํํ
page/block์์ ํ์ํ ๊ฐ์ ์ฝ๋ ์์ ํจ์ ๊ณ์ธต์ ๋๋ค. - ๋คํธ์ํฌ ํธ์ถ ์์ด ์ ๋ ฅ๊ฐ๋ง ๋ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
- ์ด๋ฏธ ์กฐํํ
src/modules/team/notion/parsers/*- Notion์ raw page๋ฅผ ํ ๋๋ฉ์ธ์์ ์ฐ๊ธฐ ์ฌ์ด ์ค๊ฐ ํํ๋ก ํด์ํฉ๋๋ค.
- ์: activity page์ ์ํ๊ฐ, ์์ํ๊ธฐ, activity type ํ๋ณ
src/modules/team/notion/assemblers/*- parser/fetcher ๊ฒฐ๊ณผ๋ฅผ ์ต์ข REST ์๋ต ํํ๋ก ์กฐ๋ฆฝํฉ๋๋ค.
- ์ด ๊ณ์ธต์ ์๋ต shape๋ฅผ ์์ง๋ง, ์ง์ ์ธ๋ถ API๋ฅผ ํธ์ถํ์ง ์์ต๋๋ค.
crew์ ๊ฒฝ์ฐ repository๊ฐ ์ฌ๋ฌ source์ supplement๋ฅผ aggregate๋ก ๋ฌถ๊ณ , assembler๊ฐ ๊ทธ aggregate๋ฅผ ์๋ต DTO๋ก ๋ณํํฉ๋๋ค.activity/project๋ parser๊ฐ page๋ฅผ ํด์ํ๊ณ , repository๊ฐ mock supplement์ aggregate๋ฅผ ์กฐํฉํ ๋ค assembler๊ฐ ์๋ต์ ๋ง๋ญ๋๋ค.
prisma/schema.prisma- Prisma ์คํค๋ง ํ์ผ์ ๋๋ค.
- ํ์ฌ๋
CrewProfileImageCache,TeamActivityMetadata๊ฐ์ ์ด์ ๋ณด์กฐ ํ ์ด๋ธ์ด ํฌํจ๋์ด ์์ต๋๋ค. TeamActivityMetadata๋ team ํ๋์ ์์ ์ ์ธactivityId์ ๊ด๋ฆฌ์ ๋ณด์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ฉ๋์ ๋๋ค.
src/constants/*- ํ์ฌ ๊ณต๊ฐ API ์๋ต ํ์(์คํ์ ํค ํฌํจ)์ ๋ณด์กดํ๊ธฐ ์ํ ๊ณ ์ ์์ ๋ฐ์ดํฐ/์คํค๋ง์ ๋๋ค.
ํ์ฌ ๊ณต๊ฐ API๋ ๋ฐ๋๋ฉด ์ ๋ฉ๋๋ค. ํ์ง๋ง ๋ด๋ถ ๊ตฌํ์ ๋ฐ๋์ด์ผ ํฉ๋๋ค. ์ด๋ ๋ฐ๋ก๊ฐ๊ธฐ์ ํ์ํ ๊ตฌ์กฐ์ ๋๋ค.
- ๊ณต๊ฐ API ํธํ์ฑ์
routes์constants์๋ต ์ํ ๊ธฐ์ค์ผ๋ก ์ ์ง๋ฉ๋๋ค. - ์ค์ ๋ฐ์ดํฐ ์์ค๋
datasource๋ง ๋ฐ๊พธ๋ฉด ๋๋๋ก ๊ณ์ธต์ ๋ถ๋ฆฌํ์ต๋๋ค. USE_MOCK_DATA๋ฅผ ํตํด ๊ณต๊ฐ ์๋ต ์ ์ง ์ํ์์ ์ ์ง์ ์ผ๋ก ์ ํ ๊ฐ๋ฅํฉ๋๋ค.
ํ์ฌ team ๋ชจ๋์ ์๋ ๋ฐฉํฅ์ผ๋ก ๊ตฌ์กฐ๋ฅผ ์ ๋ฆฌํ๊ณ ์์ต๋๋ค.
fetcher๋ Notion API๋ฅผ ํธ์ถํฉ๋๋ค.fetcher๋ ์ต์ข ์๋ต์ด ์๋๋ผ raw source๋ฅผ ๋ฐํํฉ๋๋ค.extractor๋ Notion page/block์์ ํ์ํ ๊ฐ์ ์ฝ์ต๋๋ค.parser๋ raw Notion ๊ฐ์ฒด๋ฅผ ๋๋ฉ์ธ ์นํ์ ์ธ ๊ฐ์ผ๋ก ํด์ํฉ๋๋ค.assembler๋ ์ต์ข REST ์๋ต์ ์กฐ๋ฆฝํฉ๋๋ค.repository๋ ์ฌ๋ฌ fetch ๊ฒฐ๊ณผ๋ฅผ ์กฐํฉํด ํ๋์ ์กฐํ ํ๋ฆ์ ๋ง๋ญ๋๋ค.repository๋ cross-source ๊ฐ์ด๋ ์์ง ๋ฏธ์ฐ๋๋ ๊ฐ์ mock supplement๋ ์ด ๋จ๊ณ์์ ๊ด๋ฆฌํฉ๋๋ค.activity/project์activityId,en,brief,description์TeamActivityMetadataํ ์ด๋ธ์ source of truth๋ก ์ฌ์ฉํ๊ณ , Notion์ ํ๋ ์กด์ฌ ์ฌ๋ถ์ live ์ํ ํ๋ ํ์ธ์ฉ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.crewLog๋Crew Book ๊ณ์ (ํ๋กํ) people -> ์์ lookup datasource์ people ํ๋๋งค์นญ์ผ๋ก role์ ์กฐํฉํฉ๋๋ค.crewLog.department๋Crew Book ์์ฑ๊ธฐ์ -> ํ๋ํ๊ธฐ/๊ธฐ์ ๋งคํ datasource -> ํด๋น ๊ธฐ์์ Crew Book ํ ํ๋ํ๋ฆ์ผ๋ก ๊ณ์ฐํฉ๋๋ค.- lookup์ ์๋ ๊ธฐ์๋ ์ผ๋ฐ ํ๋ํ์ ์ด๋ ฅ์ผ๋ก fallback ํฉ๋๋ค.
- ํ์ฌ role ์ฝ๋๋
ํ์ฅ -> CREW_ROLE/P,๋ถํ์ฅ -> CREW_ROLE/VP,์ด๋ฌด -> CREW_ROLE/EA,์ผ๋ฐ ํฌ๋ฃจ์ -> CREW_ROLE/CREW๋ก ๋งคํํฉ๋๋ค. - ํ์ฌ department ์ฝ๋๋
์์์ง -> DEPARTMENT_TYPE/CLEVEL,๊ฐ๋ฐํ -> DEPARTMENT_TYPE/DEV,์ธํ๋ผ๊ฐ๋ฐํ -> DEPARTMENT_TYPE/INFRA_DEV,์ธํ๋ผํ -> DEPARTMENT_TYPE/INFRA,์ด์์ง์ํ -> DEPARTMENT_TYPE/GA,๋์์ธํ -> DEPARTMENT_TYPE/DESIGN์ผ๋ก ๋งคํํฉ๋๋ค.
์๋ฅผ ๋ค์ด GET /team/crew๋ ๋ค์๊ณผ ๊ฐ์ ํ๋ฆ์ผ๋ก ์ฝ์ผ๋ฉด ๋ฉ๋๋ค.
route/team.ts
-> TeamQueryService
-> TeamRealRepository
-> CrewFetcher
-> crew-page.extractor / notion-block.extractor
-> repository aggregate composition
-> crew-response.assembler
GET /team/activity, GET /team/project๋ ๋ค์์ฒ๋ผ ์กฐ๊ธ ๋ ์ธ๋ถํ๋ฉ๋๋ค.
route/team.ts
-> TeamQueryService
-> TeamRealRepository
-> ActivityFetcher(raw sources from project datasource)
-> ActivityFetcher(raw sources from study datasource)
-> repository merge in memory
-> repository aggregate composition
-> activity-page.parser
-> activity-response.assembler or project-response.assembler
ํ์ฌ ์ค์ ํธ์ถ์คํ์ ์๋์ฒ๋ผ ์ดํดํ๋ฉด ๊ฐ์ฅ ์ ํํฉ๋๋ค.
GET /team/crewroute -> service -> TeamRealRepository -> CrewFetcher(raw sources) -> extractors -> repository aggregate composition -> crew-response.assembler
GET /team/activityroute -> service -> TeamRealRepository -> project/study ActivityFetcher(raw sources) -> repository merge in memory -> activity-page.parser -> repository aggregate composition -> activity-response.assembler
GET /team/projectroute -> service -> TeamRealRepository -> project/study ActivityFetcher(raw sources) -> repository merge in memory -> activity-page.parser -> repository aggregate composition -> project-response.assembler
์ฆ ํ์ฌ activity list๋ project datasource์ study datasource๋ฅผ ๊ฐ๊ฐ ์ฝ์ ๋ค ๋ฉ๋ชจ๋ฆฌ์์ ๋ณํฉํ๊ณ , project list๋ ๊ทธ ๋ณํฉ ๊ฒฐ๊ณผ ์ค ACTIVITY_TYPE/PROJECT๋ก ํ๋ณ๋ ํญ๋ชฉ๋ง ์ถ๋ ค ๊ตฌ์ฑํฉ๋๋ค.
GET /team/crew- ์๋ต์๋
total,keys,data๊ฐ ํจ๊ป ๋ด๋ ค๊ฐ๋ฉฐ,keys์๋ ํด๋น ์๋ต์์ ์ค์ ์ฌ์ฉ๋crewLog.department/crewLog.typekey-value ๋งคํ์ด ํฌํจ๋ฉ๋๋ค.
- ์๋ต์๋
GET /team/department- ์ ์ฒด
crewLog.departmentkey-value ์ฌ์ ์ ๋ฐํํฉ๋๋ค.
- ์ ์ฒด
GET /team/crewtype- ์ ์ฒด
crewLog.typekey-value ์ฌ์ ์ ๋ฐํํฉ๋๋ค.
- ์ ์ฒด
GET /team/activityPATCH /team/activity/:activity_id/metadataenName,briefName,description์ DB ๋ฉํ๋ฐ์ดํฐ ๊ธฐ์ค์ผ๋ก ์์ ํฉ๋๋ค.- ํ์ฌ๋ ์ธ์ฆ/์ธ๊ฐ๊ฐ ๋ถ์ง ์์ ์ํ์ด๋ฏ๋ก ์ด์ ์ ์ฉ ์ ๋ณดํธ ์ฅ์น๊ฐ ํ์ํฉ๋๋ค.
GET /team/crew/:crew_idGET /team/projectGET /team/project/:project_id
GET /cloud/briefGET /cloud/use_projectGET /cloud/qnaGET /cloud/noticeGET /cloud/notice/:notice_idGET /cloud/productGET /cloud/product/:product_id
GET /health
GET /internal/example/architecture-checkNODE_ENV=development์ผ ๋๋ง ๋ ธ์ถ๋ฉ๋๋ค.
- Node.js:
20.x - npm ์ค์น
npm installnpm run devnpm run typechecknpm run buildnpm run start๊ธฐ๋ณธ ํฌํธ: 8001
์ฌ์ฉ ๊ฐ๋ฅํ ์๋ํฌ์ธํธ
http://localhost:8001/docs
http://localhost:8001/openapi.json
NODE_ENVdevelopment๋ฉด ๋ด๋ถ ์์ API๊ฐ ๋ ธ์ถ๋ฉ๋๋ค.
CORS_ALLOW_ORIGINS- ์ผํ ๊ตฌ๋ถ ๋ฌธ์์ด
CORS_ALLOW_METHODSCORS_ALLOW_HEADERSCORS_ALLOW_CREDENTIALSUSE_MOCK_DATAtrue: mock datasource ์ฌ์ฉ(๊ธฐ๋ณธ)false: prisma datasource ์ฌ์ฉ(ํ์ฌ๋ ๋์ผ ๋๋ฏธ ๋ฐํ)
DATABASE_URL- PostgreSQL ์ฐ๊ฒฐ ๋ฌธ์์ด
- ํ์ฌ๋
crewํ๋กํ ์ด๋ฏธ์ง URL ์บ์์team activity๋ฉํ๋ฐ์ดํฐ ์ ์ฅ์๋ก ์ฌ์ฉํฉ๋๋ค.
NOTION_API_KEY- Notion API ํธ์ถ์ฉ integration secret
NOTION_TEAM_DB_IDScrew:<id>,activity:<id>,study:<id>,project:<id>,crew_role_lookup:<id>,crew_profile:<id>ํ์์ key-value ๋ฌธ์์ด- ํ์ฌ ๊ตฌํ ๊ธฐ์ค ํ์๊ฐ์
crew,activity์ ๋๋ค. study๋ฅผ ๋ฃ์ผ๋ฉด/team/activity๋ณํฉ ์ ํด๋น datasource๋ฅผ ์ฌ์ฉํ๊ณ , ์์ผ๋ฉด ์ฝ๋์ ๋ด์ฅ๋ ๊ธฐ๋ณธ study datasource ID๋ฅผ ์ฌ์ฉํฉ๋๋ค.project๋ ํฅํ project detail ๊ตฌํ์ฉ ์์ฝ ํค๋ก ๋ณด๊ณ ์์ผ๋ฉฐ, ํ ์์ ์ project list ํธ์ถ์๋ ์ฌ์ฉํ์ง ์์ต๋๋ค.crew_role_lookup๋ crewLog ์์ ์ ๋ณด lookup์ฉ ๋ณด์กฐ ๋ฐ์ดํฐ์์ค์ ๋๋ค.crew_profile์ ํ์๋ชฉ๋ก์univDepartment/univJoinedYear๋ณด๊ฐ์ฉ ๋ณด์กฐ ๋ฐ์ดํฐ์์ค์ ๋๋ค. ์์ผ๋ฉด ์ฝ๋์ ๋ด์ฅ๋ ๊ธฐ๋ณธ datasource ID๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์์:
NODE_ENV=development \
USE_MOCK_DATA=true \
CORS_ALLOW_ORIGINS=http://localhost:3000,http://localhost:5173 \
CORS_ALLOW_METHODS=GET,POST,OPTIONS \
CORS_ALLOW_HEADERS=Content-Type,Authorization \
CORS_ALLOW_CREDENTIALS=true \
npm run dev๋ชจ๋ Origin ํ์ฉ(๊ฐ๋ฐ ํธ์):
CORS_ALLOW_ORIGINS=* npm run dev์์ ์ ๋ก๊ทธ๋ก ๋ค์์ด ์ถ๋ ฅ๋ฉ๋๋ค.
- ํ์ฉ๋ env ํค ๋ชฉ๋ก
- ์ค์ ์ ์ฉ๋ env ๊ฐ
ํ์ฌ๋ ์ค๋น ๋จ๊ณ์ด๋ฏ๋ก ์ต์ ์์ ๋ชจ๋ธ๋ง ์กด์ฌํฉ๋๋ค.
npm run prisma:generate
npm run prisma:push
npm run prisma:migrate:dev
npm run prisma:studioํ๋กํ ์ด๋ฏธ์ง ์บ์๋ฅผ ์๋์ผ๋ก ํ ๋ฒ ๋๊ธฐํํ๋ ค๋ฉด:
npm run team:profile-image:syncUSE_MOCK_DATA=false ์ด๊ณ DATABASE_URL์ด ์ค์ ๋์ด ์์ผ๋ฉด, ์๋ฒ๋ ์์ ํ ์ฆ์ ํ ๋ฒ ๋๊ธฐํํ๊ณ ์ดํ 12์๊ฐ๋ง๋ค ํ๋กํ ์ด๋ฏธ์ง URL ์บ์๋ฅผ ๊ฐฑ์ ํฉ๋๋ค.
๊ด๋ฆฌ์ ์ฝ์์ Notion ์์ง๊ฐ๊ณผ ๊ด๋ฆฌ์ ์ค์ ๊ฐ์ ๋ถ๋ฆฌํด์ ๊ด๋ฆฌํฉ๋๋ค.
Notion -> admin content sync -> *Source ํ
์ด๋ธ
๊ด๋ฆฌ์ ์ฝ์ -> *AdminProfile / Visibility / Override ํ
์ด๋ธ
๊ณต๊ฐ API -> DB read model -> response
http://localhost:8001/admin
์ด๊ธฐ ๊ด๋ฆฌ์ ๊ณ์ ์ DB์ ๊ด๋ฆฌ์ ๊ณ์ ์ด ํ๋๋ ์์ ๋ ์๋ ์์ฑ๋ฉ๋๋ค.
email: admin
password: admin
์ด์์์๋ ์ฒซ ๋ก๊ทธ์ธ ์ดํ ๋ฐ๋์ ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋, ADMIN_DEFAULT_EMAIL / ADMIN_DEFAULT_PASSWORD๋ฅผ ๋ณ๋ ๊ฐ์ผ๋ก ์ค์ ํ์ธ์.
ADMIN_DEFAULT_EMAIL- ๊ธฐ๋ณธ๊ฐ:
admin
- ๊ธฐ๋ณธ๊ฐ:
ADMIN_DEFAULT_PASSWORD- ๊ธฐ๋ณธ๊ฐ:
admin
- ๊ธฐ๋ณธ๊ฐ:
ADMIN_SESSION_SECRET- ๊ด๋ฆฌ์ Bearer token HMAC ์๋ช ์ฉ secret
NOTION_TEAM_DB_IDS- ๊ธฐ์กด ํค์ ๋ํด
blog:<id>๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. - ์:
crew:<id>,activity:<id>,project:<id>,blog:<id>
- ๊ธฐ์กด ํค์ ๋ํด
CLI:
npm run admin:content:syncAdmin API:
POST /admin/sync/notion
Authorization: Bearer <admin token>
๋๊ธฐํ ๋์:
CrewSource,CrewTermTeamSourceProjectSourceBlogPostSource
์๋ก ์์ง๋ ํฌ๋ฃจ/ํ๋ก์ ํธ/๋ธ๋ก๊ทธ๋ ๊ธฐ๋ณธ ๋น๊ณต๊ฐ์ ๋๋ค.
POST /admin/login
GET /admin/me
GET /admin/crews
GET /admin/crews/:id
PATCH /admin/crews/:id
PUT /admin/crews/:id/term-teams
PUT /admin/crews/:id/projects
PUT /admin/crews/:id/blogs
GET /admin/projects
GET /admin/projects/:id
PATCH /admin/projects/:id
PUT /admin/projects/:id/periods
PUT /admin/projects/:id/participants
PUT /admin/projects/:id/featured-blogs
GET /admin/blogs
POST /admin/sync/notion
PUT /admin/crews/:id/term-teams๋ ๊ด๋ฆฌ์ ์ค์ ๊ฐ์ DB์ ์ ์ฅํ ๋ค, Notion crew datasource์์ ์์ฑ๊ธฐ์์ ๊ณ์ (ํ๋กํ) people id๊ฐ ์ผ์นํ๋ ํ์ด์ง๋ฅผ ์ฐพ์ ํ select๋ฅผ ์์ ํฉ๋๋ค.
npm run prisma:generatenpm run prisma:migrate:deploy- ์๋ฒ ๊ธฐ๋
/admin๋ก๊ทธ์ธPOST /admin/sync/notion๋๋npm run admin:content:sync- ๊ด๋ฆฌ์ ์ฝ์์์ ๊ณต๊ฐ ์ฌ๋ถ์ override ๊ฐ์ ์ ์ฅ
์ด์ manifest์๋ backend presync migration Job์ด ์์ผ๋ฏ๋ก, ์ migration์ด ๋จผ์ ์ ์ฉ๋ ๋ค ์๋ฒ๊ฐ ์ฌ๋ผ์ค๋ ํ๋ฆ์ ์ ์งํ์ธ์.
repositories์์ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํฉ๋๋ค.datasources์ mock/prisma ๊ตฌํ์ฒด๋ฅผ ์ถ๊ฐํฉ๋๋ค.services์์ ๋น์ฆ๋์ค ๊ท์น์ ์์ฑํฉ๋๋ค.routes์์ ์๋ํฌ์ธํธ์ Swagger ์๋ต ํ์์ ๋ฑ๋กํฉ๋๋ค.server.ts์์ ์ฌ์ฉํ datasource์ ์๋น์ค๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค.typecheck์build๋ก ํ์ /์ปดํ์ผ๋ง ๋จผ์ ํต๊ณผ์ํต๋๋ค.
- ๊ณต๊ฐ API ์๋ต ํค๋ ๋ฌธ์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋๋ก ์ ์งํ์ธ์.
- ํ์ฌ ์ฝ๋์๋ ์คํ์ ํค(์:
attatchments,RECRIUTING,__________)๊ฐ ์ค์ ์๋ต ๊ท์น์ ์ผ๋ถ๋ก ๋ค์ด๊ฐ ์์ต๋๋ค.
- ํ์ฌ ์ฝ๋์๋ ์คํ์ ํค(์:
- ๋ด๋ถ ๋ก์ง์ ํ์ฅํ ๋๋ ๋ฐ๋ก
datasource๋ง ๊ต์ฒดํ๋ ๋ฐฉ์์ผ๋ก ์ ๊ทผ ๋ฒ์๋ฅผ ์ขํ์ธ์. - ์ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ ค๋ฉด ๋จผ์
server.ts -> routes -> services -> repositories -> datasources์์ผ๋ก ์ถ์ ํ๋ฉด ์ ์ฒด ํ๋ฆ์ด ๋ณด์ ๋๋ค.