-
NestJS + Nestia
@nestia/core๋ฅผ ํ์ฉํ ํ์ ์์ ํ API ๊ฐ๋ฐ- OpenAPI ๊ธฐ๋ฐ ์๋ ๋ฌธ์ํ ์ง์
- DTO์
@TypedRoute,@TypedBody๋ฑ์ ํ์ ์์ ๊ธฐ๋ฅ ํ์ฉ
-
Prisma + PostgreSQL
- AWS PostgreSQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ฌ์ฉ
- UUID v7์ ๊ธฐ๋ณธ ID ํ์์ผ๋ก ์ฌ์ฉ
- ํธ๋์ญ์ ๊ณผ ํ์ด์ง๋ค์ด์ ์ฒ๋ฆฌ ์ง์
- JWT ๊ธฐ๋ฐ ์ธ์ฆ
- AccessToken์ ์ฟ ํค/ํค๋๋ก ์ฒ๋ฆฌ
- ํฅํ RefreshToken + ์ธ์ ๊ธฐ๋ฐ ํ์ฅ ๊ณ ๋ ค ์ค
erDiagram
"users" {
String id PK
String name "nullable"
String avatar "nullable"
DateTime created_at
DateTime updated_at
}
"accounts" {
String id PK
String user_id FK
String email UK
String password
DateTime created_at
DateTime updated_at
DateTime deleted_at "nullable"
}
"social_accounts" {
String id PK
String user_id FK
String provider
String provider_id UK
String email
String name "nullable"
String avatar "nullable"
Json metadata "nullable"
DateTime created_at
DateTime updated_at
}
"accounts" |o--|| "users" : user
"social_accounts" }o--|| "users" : user
- ๊ธฐ๋ณธ ์ฌ์ฉ์ ์ ๋ณด ๊ด๋ฆฌ
- ํ๋:
id: UUID v7name: ์ฌ์ฉ์ ์ด๋ฆ (nullable)avatar: ํ๋กํ ์ด๋ฏธ์ง URL (nullable)created_at: ์์ฑ ์๊ฐupdated_at: ์์ ์๊ฐ
- ์ด๋ฉ์ผ/๋น๋ฐ๋ฒํธ ๊ธฐ๋ฐ ๊ณ์ ๊ด๋ฆฌ
- ํ๋:
id: UUID v7user_id: users ํ ์ด๋ธ ์ฐธ์กฐemail: ์ด๋ฉ์ผ (unique)password: ์ํธํ๋ ๋น๋ฐ๋ฒํธcreated_at: ์์ฑ ์๊ฐupdated_at: ์์ ์๊ฐdeleted_at: ์ญ์ ์๊ฐ (nullable)
- ์์ ๋ก๊ทธ์ธ ๊ณ์ ๊ด๋ฆฌ
- ํ๋:
id: UUID v7user_id: users ํ ์ด๋ธ ์ฐธ์กฐprovider: ์์ ์ ๊ณต์ (์: google, github)provider_id: ์์ ์ ๊ณต์์ ์ฌ์ฉ์ IDemail: ์ด๋ฉ์ผname: ์ฌ์ฉ์ ์ด๋ฆ (nullable)avatar: ํ๋กํ ์ด๋ฏธ์ง URL (nullable)metadata: ์ถ๊ฐ ๋ฉํ๋ฐ์ดํฐ (JSON, nullable)created_at: ์์ฑ ์๊ฐupdated_at: ์์ ์๊ฐ
- ํ์ ์์ ์ฑ ์ต์ฐ์
- RESTful API ์ค๊ณ
- ๊ณตํต
HttpExceptionFilter๋ฅผ ํตํ ์๋ฌ ์ฒ๋ฆฌ - ์๋น์ค ๋ ์ด์ด์์ PrismaClient ์ง์ ์ฌ์ฉ
- ์ง์ ์ ์ธ SQL ์์ฑ ์ง์
- Fat Controller ์ง์
- ์ธ๋ฏธ์ฝ๋ก ์ฌ์ฉ (
semi: true) - ๋ชจ๋ ๊ณณ์ ํํ ์ผํ ์ฌ์ฉ (
trailingComma: "all") - ์์๋ฐ์ดํ ์ฌ์ฉ (
singleQuote: true) - ํ ์ค ์ต๋ ๊ธธ์ด 120์ (
printWidth: 120) - ๋ค์ฌ์ฐ๊ธฐ 2์นธ ์ฌ์ฉ (
tabWidth: 2) - ์ค ๋ ๋ฌธ์ ์๋ ์ฒ๋ฆฌ (
endOfLine: "auto")
- pnpm ์ฌ์ฉ
npm run format@TypedRoute.Post()
async createExpense(@TypedBody() body: CreateExpenseDto) {
return this.expenseService.create(body);
}