μ΄ μ μ₯μμ READMEλ νλ‘μ νΈ μ€ν λ°©λ²κ³Ό μ 체 ꡬ쑰λ₯Ό λΉ λ₯΄κ² νμ νκΈ° μν λ¬Έμμ λλ€. κ³Όμ μꡬμ¬νμ μ΄λ»κ² ν΄μνκ³ , μ΄λ€ κΈ°μ€μΌλ‘ ꡬννλμ§μ λν λ΄μ©μ ASSIGNMENT.mdμ μ 리λμ΄ μμ΅λλ€.
ν°μΌν λκΈ°μ΄ + κ²°μ νλ‘μ°λ₯Ό λ§λλ κ³Όμ μ λλ€. μ¬μ©μλ μ΄λ²€νΈ ν°μΌμ μλ§€ν©λλ€. (24μκ° μ΄λ΄ ꡬν)
ν°μΌ λͺ©λ‘ β ν°μΌ μμΈ β λκΈ°μ΄ (νμ μ) β μ’μ μ ν β μλ£μ νλ‘μ°λ‘ ꡬμ±λ©λλ€.
- ν°μΌ λͺ©λ‘λ€μ μΆλ ₯ν©λλ€.
- ν°μΌ νλͺ©μ ν΄λ¦νλ©΄ ν΄λΉ ν°μΌ μμΈ νμ΄μ§λ‘ μ΄λν©λλ€.
- ν°μΌμ μμΈ μ΄λ―Έμ§, μμΈ μ€λͺ , μ’μ κ°κ²© λ±μ μΆλ ₯ν©λλ€.
- μ
μ₯ λ²νΌμ΄ μ‘΄μ¬νλ©°, μ΄λ₯Ό ν΄λ¦νλ©΄
- μ μ₯ ν ν°μ λ°κΈλ°μ΅λλ€.
- λκΈ°μ΄μ΄ μμ κ²½μ° λκΈ°μ΄ μ μ₯ νμ΄μ§λ‘ μ΄λν©λλ€. κ·Έλ μ§ μμ κ²½μ° λ°λ‘ μ’μ μ ν νμ΄μ§λ‘ μ΄λν©λλ€.
- λκΈ°μ΄ μ§νλ₯ (0β100%)μ 보μ¬μ€λλ€.
- λκΈ°μ΄μ΄ ν΄μλμμ κ²½μ° μ’μ μ ν νμ΄μ§λ‘ μ΄λν©λλ€.
- λ§μ½ λ°κΈλ μ μ₯ ν ν°μ μ‘°ννμ λ, λκΈ°μ΄μ μλ ν ν°μ΄λΌλ©΄ λκΈ°μ΄ μ μ₯ νμ΄μ§λ‘ 리λ€μ΄λ μ ν©λλ€.
- λκΈ°μ΄ ν΅κ³Ό ν μ ν μκ° 1λΆ λ΄μ λ΄ μ’μμ μ ννμ§ μμΌλ©΄ λ§λ£ μ²λ¦¬ν©λλ€.
μ νν μ’μ, κ°κ²©μ μΆλ ₯νκ³ λλ λλ€.
APIλ MSW(Mock Service Worker)λ₯Ό μ΄μ©νμ¬ λͺ¨νΉλμ΄ μμ΅λλ€. μλμ μ 리λ API λͺ μΈλ₯Ό μ°Έκ³ ν΄ κΈ°λ₯μ ꡬνν΄μ£ΌμΈμ.
μ νν MSW λͺ¨νΉ λμμ νμΈν νμκ° μλ€λ©΄, src/mocks/handlers.tsλ₯Ό μ°Έκ³ ν΄μ£ΌμΈμ.
- Request: (none)
- Response 200
{
"success": true,
"data": [
{
"id": "string",
"title": "string",
"description": "string",
"image": "string",
"price": 0,
"totalSeats": 0,
"availableSeats": 0,
"eventDate": "YYYY-MM-DD",
"venue": "string"
}
]
}- Request Params:
id: string - Response 200
{ "success": true, "data": { /_ Ticket _/ } }- Response 404
{ "success": false, "message": "ν°μΌμ μ°Ύμ μ μμ΅λλ€." }- Request Params:
id: string - Request Body: (none)
- Response 200
{
"success": true,
"data": {
"tokenId": "string",
"hasQueue": true,
"expiresAt": 1730000000000
}
}- Response 404
{ "success": false, "message": "ν°μΌμ μ°Ύμ μ μμ΅λλ€." }- Request Params:
tokenId: string - Response 200
{
"success": true,
"data": {
"token": {
"id": "string",
"ticketId": "string",
"status": "waiting|ready|expired",
"position": 0,
"totalInQueue": 0,
"expiresAt": 1730000000000,
"createdAt": 1730000000000
},
"queueStatus": {
"position": 0,
"totalInQueue": 0,
"progress": 0,
"estimatedWaitTime": 0
}
}
}- Response 404
{ "success": false, "message": "μ ν¨νμ§ μμ ν ν°μ
λλ€." }- Response 410
{ "success": false, "message": "ν ν°μ΄ λ§λ£λμμ΅λλ€." }- Request Params:
id: string - Response 200
{
"success": true,
"data": [
{
"id": "string",
"row": "A",
"number": 1,
"price": 0,
"isAvailable": true
}
]
}- Request Body
{ "tokenId": "string", "seatId": "string" }- Response 200
{
"success": true,
"data": {
"id": "string",
"ticketId": "string",
"seatId": "string",
"price": 0,
"status": "completed",
"expiresAt": 1730000000000,
"createdAt": 1730000000000
}
}- Response 404
{ "success": false, "message": "μ ν¨νμ§ μμ ν ν°μ
λλ€." }// or
{ "success": false, "message": "μ’μμ μ°Ύμ μ μμ΅λλ€." }- Response 410 (ν ν° λ§λ£)
{ "success": false, "message": "ν ν°μ΄ λ§λ£λμμ΅λλ€." }- Response 400 (λκΈ°μ€/μ΄λ―Έ μμ½λ¨)
{ "success": false, "message": "μμ§ λκΈ°μ΄μ μμ΅λλ€." }// or
{ "success": false, "message": "μ΄λ―Έ μμ½λ μ’μμ
λλ€." }- Request Params:
id: string - Response 200
{
"success": true,
"data": {
"reservation": { /_ Reservation _/ },
"ticket": { /_ Ticket _/ },
"seat": { /_ Seat _/ }
}
}- Response 404
{ "success": false, "message": "μμ½μ μ°Ύμ μ μμ΅λλ€." }- shadcnκ³Ό κ°μ UI λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νκ±°λ κΈ°λ³Έ HTML νκ·Έλ§μ μ΄μ©ν΄ κ°λ°ν΄μ£ΌμΈμ.
- μλ¬ λ©μμ§, λ²νΌ νμ±ν μ¬λΆ λ±μ μ€μκ°μΌλ‘ λ°μνλλ‘ ν΄μ£ΌμΈμ.
- μκ° μ μ½μ μν΄ νμμ λ°λΌ μμ£Ό μ¬μ©νλ μ¨λνν° λΌμ΄λΈλ¬λ¦¬λ₯Ό μ€μΉνμ¬ μ¬μ©νλ κ²μ κΆμ₯ν©λλ€.
- TypeScript κΈ°λ°μ νλ‘μ νΈλ‘, νμ 건μ μ±μ μ§ν€λ λ°©ν₯μΌλ‘ μ½λλ₯Ό μμ±ν΄μ£ΌμΈμ.