Skip to content

odumag99/FastAPI-reference

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

1 Commit
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Review Assignment Due Date

FastAPI μ„Έλ―Έλ‚˜ 과제 2

μ„Έλ―Έλ‚˜ 2μ—μ„œλŠ” SQLAlchemy λ₯Ό μ‚¬μš©ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό λ‹€λ£¨λŠ” 방법을 λ°°μ› μŠ΅λ‹ˆλ‹€. 이번 κ³Όμ œμ—μ„œλŠ” λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ 과제 1μ—μ„œ κ΅¬ν˜„ν–ˆλ˜ API λ₯Ό κ³ λ„ν™”ν•˜κ³ , μΆ”κ°€ API λ₯Ό κ΅¬ν˜„ν•΄λ΄…λ‹ˆλ‹€.

μ°Έκ³ ) μ œκ°€ λ§Œλ“  μŠ€μΌˆλ ˆν†€ μ½”λ“œ 곳곳에 # TODO 주석을 λ‹¬μ•„λ†“μ•˜μŠ΅λ‹ˆλ‹€. κ°€λŠ₯ν•˜λ©΄ ν•΄λ‹Ή 주석듀을 λͺ¨λ‘ μ½μ–΄λ³΄μ‹œκΈΈ λ°”λΌμš”.

과제 λͺ©ν‘œ

  • ER λ‹€μ΄μ–΄κ·Έλž¨μ„ ν™œμš©ν•˜μ—¬ 도메인에 μ ν•©ν•œ λ°μ΄ν„°λ² μ΄μŠ€ λͺ¨λΈμ„ 섀계할 수 μžˆλ‹€.
  • FastAPI μ—μ„œ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ 영ꡬ적인 데이터λ₯Ό μ €μž₯ν•˜κ³  μ‘°νšŒν•  수 μžˆλ‹€.

μ€€λΉ„ 사항

  • λͺ¨λ“  κ³Όμ œλŠ” python 3.11 버전을 μ‚¬μš©ν•  것을 μ „μ œλ‘œ ν•©λ‹ˆλ‹€.
  • λ³Έ 과제의 κ°€μƒν™˜κ²½μ˜ 생성은 poetry λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
    • poetry λ₯Ό μ„€μΉ˜ν•œ λ’€, poetry env use -- 3.11 κ³Ό 같은 λͺ…λ Ήμ–΄λ₯Ό μ΄μš©ν•΄ κ°€μƒν™˜κ²½μ„ μƒμ„±ν•˜μ„Έμš”.
    • poetry install λͺ…λ Ήμ–΄λ₯Ό 톡해 νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•˜μ„Έμš”.
    • pyproject.toml κ³Ό poetry.lock νŒŒμΌμ€ μˆ˜μ •ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
      • 즉, μ™ΈλΆ€ 라이브러리λ₯Ό μž„μ˜λ‘œ μ„€μΉ˜ν•˜μ§€ λ§λΌλŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

과제 2-1

μ•„λž˜ ER λ‹€μ΄μ–΄κ·Έλž¨μ„ μ‚¬μš©ν•˜μ—¬ μ™€νŒ‘μ˜ λ°μ΄ν„°λ² μ΄μŠ€ λͺ¨λΈμ„ μ„€κ³„ν•΄λ΄…λ‹ˆλ‹€. 단, 이 λ‹€μ΄μ–΄κ·Έλž¨μ€ μ œκ°€ λ“œλ¦¬λŠ” μŠ€μΌˆλ ˆν†€μ˜ μΌλΆ€μ΄μž ν•˜λ‚˜μ˜ μ˜ˆμ‹œμΌ 뿐, μ™„λ²½ν•˜κ²Œ λ°˜μ˜ν•  ν•„μš”λŠ” μ—†μŠ΅λ‹ˆλ‹€. μ±„μ μ—λŠ” API κ°€ 잘 μž‘λ™ν•˜λŠ”μ§€λ§Œ ν™•μΈν•©λ‹ˆλ‹€.

ER Diagram

μΆ”κ°€μ μœΌλ‘œ 섀계에 ν•„μš”ν•œ μ •λ³΄λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • μœ μ €λŠ” id, username, email, password, address, phone_number 을 κ°€μ§€κ³  μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
    • μœ μ € ν…Œμ΄λΈ”μ€ μŠ€μΌˆλ ˆν†€μ˜ μΌλΆ€λ‘œ μ œκ³΅λ©λ‹ˆλ‹€.
  • μœ μ €λŠ” μ΅œλŒ€ ν•˜λ‚˜μ˜ μƒμ λ§Œ μ†Œμœ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 상점은 id, store_name, address, email, phone_number λ₯Ό κ°€μ§€κ³  μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • 상점은 μ—¬λŸ¬ 개의 μƒν’ˆμ„ νŒ” 수 있으며, 각각의 재고λ₯Ό 숫자둜 κ΄€λ¦¬ν•©λ‹ˆλ‹€.
  • μƒν’ˆμ€ id, item_name, price 을 κ°€μ§€κ³  μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • μœ μ €λŠ” μ—¬λŸ¬ 개의 주문을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 주문은 μ§„ν–‰ μƒνƒœμ— 따라 CANCELED, ORDERED, COMPLETE 쀑 ν•˜λ‚˜μ˜ μƒνƒœλ₯Ό κ°€μ§‘λ‹ˆλ‹€.
  • ν•œ μ£Όλ¬Έμ—λŠ” μ—¬λŸ¬ 개의 μƒν’ˆμ΄ 포함될 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μœ μ €λŠ” μƒν’ˆλ§ˆλ‹€ μ΅œλŒ€ ν•œ 개의 리뷰λ₯Ό 남길 수 μžˆμŠ΅λ‹ˆλ‹€.

과제 2-2

2-1 의 ER λ‹€μ΄μ–΄κ·Έλž¨μ„ λ°μ΄ν„°λ² μ΄μŠ€μ— λ§€ν•‘ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μƒμ„±ν•˜κ³ , FastAPI μ—μ„œ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ μ„€μ •ν•΄λ΄…λ‹ˆλ‹€.

RDS 생성

μ„Έλ―Έλ‚˜ 2 의 μ‹€μŠ΅μœΌλ‘œ λŒ€μ²΄ν•©λ‹ˆλ‹€.

alembic 으둜 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜

alembic 을 μ‚¬μš©ν•˜μ—¬ 2-1μ—μ„œ κ΅¬ν˜„ν•œ λͺ¨λΈμ„ 기반으둜 λ°μ΄ν„°λ² μ΄μŠ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. alembic 의 μ„€μ •κ³Ό μ„ΈνŒ…μ€ 이미 λ˜μ–΄μžˆμœΌλ©°, μ—¬λŸ¬λΆ„μ΄ ν•΄μ•Όν•  일을 λͺ¨λΈμ„ μ •μ˜ν•˜κ³  λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μˆ˜ν–‰ν•˜λŠ” 것 λΏμž…λ‹ˆλ‹€.

  • .env.local 에 λ‘œμ»¬μ—μ„œ ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•œ 정보가 λ°μ΄ν„°λ² μ΄μŠ€ 섀정이 사전 μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ›ν•œλ‹€λ©΄ 변경해도 μ’‹μŠ΅λ‹ˆλ‹€.
  • .env.test λŠ” 채점 μ‹œ μ‚¬μš©λ˜λ―€λ‘œ μ ˆλŒ€ κ±΄λ“œλ¦¬μ§€ λ§μ•„μ£Όμ„Έμš”.
  • .env.prod μ—μ„œλŠ” μ—¬λŸ¬λΆ„μ˜ EC2 와 RDS 에 맞좀으둜 μ‚¬μš©λ  섀정을 μž‘μ„±ν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€.
    • ν”„λ‘œλ•μ…˜μ—μ„œ 이 파일이 μ‚¬μš©λ˜κ²Œ ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Όν• κΉŒμš”?

과제 2-3

μ—¬λŸ¬λΆ„μ€ λ‘œμΌ“λ°°μ†‘μœΌλ‘œ 유λͺ…ν•œ μ™€νŒ‘μ˜ κ°œλ°œμžμž…λ‹ˆλ‹€. 과제 1에 이어, 상점과 μƒν’ˆ 관리 API λ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ΄λ²ˆμ—λŠ” λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ 상점과 μƒν’ˆ 정보λ₯Ό μ €μž₯ν•˜κ³ , μ‘°νšŒν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. λ”λΆˆμ–΄, 과제 1μ—μ„œ κ΅¬ν˜„ν–ˆλ˜ μœ μ € API 도 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λ„λ‘ μˆ˜μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

곡톡 사항

  • μš”μ²­ ν•„λ“œμ˜ ν˜•μ‹μ΄ μ˜¬λ°”λ₯΄μ§€ μ•Šμ€ 경우, 400 Bad Request μƒνƒœμ½”λ“œμ™€ ν•¨κ»˜ μ‘λ‹΅μœΌλ‘œ {"detail": "Invalid field format"} λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • e.g. price ν•„λ“œμ— λ¬Έμžμ—΄μ΄ λ“€μ–΄μ˜¨ 경우 (νƒ€μž… 뢈일치)
    • e.g. price ν•„λ“œμ— μŒμˆ˜κ°€ λ“€μ–΄μ˜¨ 경우 (κ°’ λ²”μœ„)
    • e.g. store_name ν•„λ“œμ— 2κΈ€μž 미만의 λ¬Έμžμ—΄μ΄ λ“€μ–΄μ˜¨ 경우 (κΈ€μž 수 μ œν•œ)
  • μš”μ²­ ν•„λ“œκ°€ λΉ„μ–΄μžˆλŠ” 경우, 400 Bad Request μƒνƒœμ½”λ“œμ™€ ν•¨κ»˜ μ‘λ‹΅μœΌλ‘œ {"detail": "Missing required fields"} λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • 둜그인이 ν•„μš”ν•œ 경우, μš”μ²­ ν—€λ”μ—λŠ” X-Wapang-Username, X-Wapang-Password ν•„λ“œλ₯Ό 포함해야 ν•©λ‹ˆλ‹€.
    • ν•΄λ‹Ή 헀더가 μ—†κ±°λ‚˜ μœ μ €λ₯Ό 찾을 수 μ—†λŠ” 경우, 401 Unauthorized μƒνƒœμ½”λ“œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

상점 μΆ”κ°€ API (CREATE)

  • 상점 μΆ”κ°€ API λŠ” POST λ©”μ„œλ“œλ‘œ /api/stores μ—”λ“œν¬μΈνŠΈμ— μš”μ²­μ„ 보내야 ν•©λ‹ˆλ‹€.

  • 둜그인이 ν•„μš”ν•©λ‹ˆλ‹€.

  • μš”μ²­ 본문은 JSON ν˜•μ‹μœΌλ‘œ, store_name, address, email, phone_number ν•„λ“œλ₯Ό 포함해야 ν•©λ‹ˆλ‹€.

    • store_name ν•„λ“œλŠ” 3κΈ€μž 이상 20κΈ€μž μ΄ν•˜μ˜ λ¬Έμžμ—΄μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€.
    • address, email, phone_numberκ°€ λΉ„μ–΄μžˆλ‹€λ©΄ μ‚¬μš©μžμ˜ 정보λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
  • ν•œ μœ μ €λŠ” μ΅œλŒ€ ν•˜λ‚˜μ˜ μƒμ λ§Œ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • 상점 좔가에 μ„±κ³΅ν•˜λ©΄ 201 Created μƒνƒœμ½”λ“œμ™€ ν•¨κ»˜ 상점 id λ₯Ό ν¬ν•¨ν•œ 상점 정보λ₯Ό JSON ν˜•μ‹μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • 상점 좔가에 μ‹€νŒ¨ν•˜λŠ” κ²½μš°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

    • store_name, address, email, phone_number ν•„λ“œ 쀑 1개 이상이 λΉ„μ–΄μžˆκ³  μœ μ €μ˜ μ •λ³΄λ‘œλ„ λŒ€μ²΄ν•  수 μ—†λŠ” 경우
      • 400 Bad Request μƒνƒœμ½”λ“œμ™€ ν•¨κ»˜ μ‘λ‹΅μœΌλ‘œ {"detail": "Missing required fields"}λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • 이미 상점을 μƒμ„±ν•œ μœ μ €κ°€ 상점을 μΆ”κ°€ν•˜λ €κ³  ν•  경우:
      • 403 Forbidden μƒνƒœμ½”λ“œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • 이미 μ‘΄μž¬ν•˜λŠ” store_name, email λ˜λŠ” phone_numberλ₯Ό μ‚¬μš©ν•˜λŠ” 경우:
      • 409 Conflict μƒνƒœμ½”λ“œμ™€ ν•¨κ»˜ μ‘λ‹΅μœΌλ‘œ {"detail": "Store already exists"}, {"detail": "Email already exists"}, λ˜λŠ” {"detail": "Phone number already exists"}λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

μš”μ²­ μ˜ˆμ‹œ

{
  "store_name": "store1",
  "address": "address1",
  "email": "minkyu97@wafflestudio.com",
  "phone_number": "010-1234-5678"
}

응닡 μ˜ˆμ‹œ

{
  "id": 1,
  "store_name": "store1",
  "address": "address1",
  "email": "minkyu97@wafflestudio.com",
  "phone_number": "010-1234-5678"
}

상점 쑰회 API (READ)

  • 상점 쑰회 APIλŠ” GET λ©”μ„œλ“œλ‘œ /api/stores/{store_id} μ—”λ“œν¬μΈνŠΈμ— μš”μ²­μ„ 보내야 ν•©λ‹ˆλ‹€.
  • {store_id}λŠ” μ‘°νšŒν•˜κ³ μž ν•˜λŠ” μƒμ μ˜ 번호 λ˜λŠ”
  • 상점이 μ‘΄μž¬ν•˜λŠ” 경우, 200 OK μƒνƒœμ½”λ“œμ™€ ν•¨κ»˜ id, store_name, address, email, phone_number ν•„λ“œλ₯Ό ν¬ν•¨ν•œ JSON 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • 상점이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우, 404 Not Found μƒνƒœμ½”λ“œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

응닡 μ˜ˆμ‹œ

{
  "id": 1,
  "store_name": "store1",
  "address": "address1",
  "email": "minkyu97@wafflestudio.com",
  "phone_number": "010-1234-5678"
}

μƒν’ˆ μΆ”κ°€ API (CREATE)

  • μƒν’ˆ μΆ”κ°€ APIλŠ” POST λ©”μ„œλ“œλ‘œ /api/items μ—”λ“œν¬μΈνŠΈμ— μš”μ²­μ„ 보내야 ν•©λ‹ˆλ‹€.
  • 둜그인이 ν•„μš”ν•©λ‹ˆλ‹€.
  • μš”μ²­ 본문은 JSON ν˜•μ‹μœΌλ‘œ, item_name, price, stock ν•„λ“œλ₯Ό λͺ¨λ‘ 포함해야 ν•©λ‹ˆλ‹€.
    • item_name ν•„λ“œλŠ” 2κΈ€μž 이상 50κΈ€μž μ΄ν•˜μ˜ λ¬Έμžμ—΄μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€.
    • price ν•„λ“œλŠ” 1 μ΄μƒμ˜ μ •μˆ˜μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€.
    • stock ν•„λ“œλŠ” 0 μ΄μƒμ˜ μ •μˆ˜μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • μƒν’ˆ 좔가에 μ„±κ³΅ν•˜λ©΄ 201 Created μƒνƒœμ½”λ“œμ™€ ν•¨κ»˜ μΆ”κ°€λœ μƒν’ˆ 정보λ₯Ό μƒν’ˆ id와 ν•¨κ»˜ JSON ν˜•μ‹μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • μƒν’ˆ 좔가에 μ‹€νŒ¨ν•˜λŠ” κ²½μš°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
    • λ‹€λ₯Έ μœ μ €μ˜ 상점에 μƒν’ˆμ„ μΆ”κ°€ν•˜λ €κ³  ν•  경우
      • 403 Forbidden μƒνƒœμ½”λ“œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • νšŒμ›κ°€μž…λ˜μ§€ μ•Šμ€ μœ μ €μ˜ 경우
      • 401 Unauthorized μƒνƒœμ½”λ“œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

μš”μ²­ μ˜ˆμ‹œ

{
  "item_name": "item1",
  "price": 15000,
  "stock": 10
}

응닡 μ˜ˆμ‹œ

{
  "id": 1,
  "item_name": "item1",
  "price": 15000,
  "stock": 10
}

μƒν’ˆ μˆ˜μ • API (UPDATE)

  • μƒν’ˆ μˆ˜μ • APIλŠ” PATCH λ©”μ„œλ“œλ‘œ /api/items/{item_id} μ—”λ“œν¬μΈνŠΈμ— μš”μ²­μ„ 보내야 ν•©λ‹ˆλ‹€.
  • 둜그인이 ν•„μš”ν•©λ‹ˆλ‹€.
  • μš”μ²­ 본문은 JSON ν˜•μ‹μœΌλ‘œ, item_name, price, stock ν•„λ“œ 쀑 ν•˜λ‚˜ 이상을 포함해야 ν•©λ‹ˆλ‹€.
    • item_name ν•„λ“œλŠ” 2κΈ€μž 이상 50κΈ€μž μ΄ν•˜μ˜ λ¬Έμžμ—΄μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€.
    • price ν•„λ“œλŠ” 0보닀 큰 μ •μˆ˜μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€.
    • stock ν•„λ“œλŠ” 0 μ΄μƒμ˜ μ •μˆ˜μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • μƒν’ˆ μˆ˜μ •μ— μ„±κ³΅ν•˜λ©΄ 200 OK μƒνƒœμ½”λ“œμ™€ ν•¨κ»˜ μˆ˜μ •λœ μƒν’ˆ 정보λ₯Ό μƒν’ˆ id와 ν•¨κ»˜ JSON ν˜•μ‹μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • μƒν’ˆ μˆ˜μ •μ— μ‹€νŒ¨ν•˜λŠ” κ²½μš°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
    • 상점 λ˜λŠ” μƒν’ˆμ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우
      • 404 Not Found μƒνƒœμ½”λ“œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • λ‹€λ₯Έ μœ μ € μƒμ μ˜ μƒν’ˆμ„ μˆ˜μ •ν•˜λ €κ³  ν•  경우
      • 403 Forbidden μƒνƒœμ½”λ“œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

μš”μ²­ μ˜ˆμ‹œ

{
  "item_name": "item1",
  "price": 15000,
  "stock": 10
}

응닡 μ˜ˆμ‹œ

{
  "id": 1,
  "item_name": "item1",
  "price": 15000,
  "stock": 10
}

μƒν’ˆ λͺ©λ‘ 쑰회 API (LIST)

  • μƒν’ˆ λͺ©λ‘ 쑰회 APIλŠ” GET λ©”μ„œλ“œλ‘œ /api/items μ—”λ“œν¬μΈνŠΈμ— μš”μ²­μ„ 보내야 ν•©λ‹ˆλ‹€.
  • 쿼리 νŒŒλΌλ―Έν„°λ₯Ό μ΄μš©ν•΄ λ‹€μŒκ³Ό 같이 필터링할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • store_name: νŠΉμ • μƒμ μ˜ μƒν’ˆλ§Œ μ‘°νšŒν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.
    • min_price: μ§€μ •λœ μ΅œμ†Œ 가격 μ΄μƒμ˜ μƒν’ˆμ„ μ‘°νšŒν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.
    • max_price: μ§€μ •λœ μ΅œλŒ€ 가격 μ΄ν•˜μ˜ μƒν’ˆμ„ μ‘°νšŒν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.
    • in_stock: μž¬κ³ κ°€ μžˆλŠ” μƒν’ˆλ§Œ μ‘°νšŒν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.
      • true둜 μ„€μ •ν•  경우, μž¬κ³ κ°€ μžˆλŠ” μƒν’ˆλ§Œ μ‘°νšŒν•©λ‹ˆλ‹€.
      • false둜 μ„€μ •ν•  경우, λͺ¨λ“  μƒν’ˆμ„ μ‘°νšŒν•©λ‹ˆλ‹€.
      • 기본값은 falseμž…λ‹ˆλ‹€.
    • λͺ¨λ“  쑰건은 AND μ‘°κ±΄μž…λ‹ˆλ‹€.
  • 쿼리 νŒŒλΌλ―Έν„°κ°€ μ—†μœΌλ©΄ 전체 μƒν’ˆ λͺ©λ‘μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • μš”μ²­μ΄ μ„±κ³΅ν•˜λ©΄ 200 OK μƒνƒœμ½”λ“œμ™€ ν•¨κ»˜ ν•„ν„°λ§λœ μƒν’ˆ λͺ©λ‘μ„ JSON ν˜•μ‹μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • μ‘λ‹΅μ—λŠ” 각 μƒν’ˆμ˜ id, item_name, price, quantity ν•„λ“œκ°€ ν¬ν•¨λ©λ‹ˆλ‹€.
    • μƒν’ˆμ΄ μ—†λŠ” 경우, 빈 배열을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • 상점이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우, 404 Not Found μƒνƒœμ½”λ“œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

응닡 μ˜ˆμ‹œ

[
  {
    "id": 1,
    "item_name": "item1",
    "price": 15000,
    "quantity": 10
  },
  {
    "id": 2,
    "item_name": "item2",
    "price": 20000,
    "quantity": 5
  }
]

μ£Όλ¬Έ API (CREATE)

  • μ£Όλ¬Έ APIλŠ” POST λ©”μ„œλ“œλ‘œ /api/orders μ—”λ“œν¬μΈνŠΈμ— μš”μ²­μ„ 보내야 ν•©λ‹ˆλ‹€.
  • 둜그인이 ν•„μš”ν•©λ‹ˆλ‹€.
  • μš”μ²­ 본문은 JSON ν˜•μ‹μœΌλ‘œ, items ν•„λ“œλ₯Ό 포함해야 ν•©λ‹ˆλ‹€.
    • items ν•„λ“œλŠ” item_id 와 quantity λ₯Ό ν¬ν•¨ν•˜λŠ” 배열이어야 ν•©λ‹ˆλ‹€.
    • μˆ˜λŸ‰μ€ 1 μ΄μƒμ˜ μ •μˆ˜μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • 주문에 μ„±κ³΅ν•˜λ©΄ 201 Created μƒνƒœμ½”λ“œμ™€ ν•¨κ»˜ μ£Όλ¬Έ 정보λ₯Ό JSON ν˜•μ‹μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • μ£Όλ¬Έ μ •λ³΄μ—λŠ” order_id, items, status ν•„λ“œκ°€ ν¬ν•¨λ©λ‹ˆλ‹€.
    • items ν•„λ“œλŠ” μš”μ²­μ˜ items ν•„λ“œμ™€ λ™μΌν•©λ‹ˆλ‹€.
    • 각 μƒν’ˆμ˜ μž¬κ³ λŠ” μ£Όλ¬Έν•œ μˆ˜λŸ‰λ§ŒνΌ κ°μ†Œν•©λ‹ˆλ‹€.
  • 주문에 μ‹€νŒ¨ν•˜λŠ” κ²½μš°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
    • μƒν’ˆμ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우
      • 404 Not Found μƒνƒœμ½”λ“œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • νšŒμ›κ°€μž…λ˜μ§€ μ•Šμ€ μœ μ €μ˜ 경우
      • 401 Unauthorized μƒνƒœμ½”λ“œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • μ£Όλ¬Έν•  μˆ˜λŸ‰μ΄ μž¬κ³ λ³΄λ‹€ λ§Žμ€ 경우
      • 400 Bad Request μƒνƒœμ½”λ“œμ™€ ν•¨κ»˜ μ‘λ‹΅μœΌλ‘œ {"detail": "Not enough stock"}λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

μš”μ²­ μ˜ˆμ‹œ

{
  "items": [
    {
      "item_id": 1,
      "quantity": 2
    },
    {
      "item_id": 2,
      "quantity": 1
    }
  ]
}

응닡 μ˜ˆμ‹œ

{
  "order_id": 1,
  "items": [
    {
      "item_id": 1,
      "quantity": 2
    },
    {
      "item_id": 2,
      "quantity": 1
    }
  ],
  "status": "CANCELED"
}

주문 쑰회 API (READ)

  • μ£Όλ¬Έ 쑰회 APIλŠ” GET λ©”μ„œλ“œλ‘œ /api/orders/{order_id} μ—”λ“œν¬μΈνŠΈμ— μš”μ²­μ„ 보내야 ν•©λ‹ˆλ‹€.
  • 둜그인이 ν•„μš”ν•©λ‹ˆλ‹€.
  • 주문이 μ‘΄μž¬ν•˜λŠ” 경우, 200 OK μƒνƒœμ½”λ“œμ™€ ν•¨κ»˜ μ£Όλ¬Έ 정보λ₯Ό JSON ν˜•μ‹μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • 주문이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우, 404 Not Found μƒνƒœμ½”λ“œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • λ‹€λ₯Έ μœ μ €μ˜ 주문을 μ‘°νšŒν•˜λ €κ³  ν•  경우, 403 Forbidden μƒνƒœμ½”λ“œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

응닡 μ˜ˆμ‹œ

{
  "order_id": 1,
  "items": [
    {
      "item_id": 1,
      "quantity": 2
    },
    {
      "item_id": 2,
      "quantity": 1
    }
  ],
  "status": "CANCELED"
}

μ£Όλ¬Έ μ·¨μ†Œ API (DELETE)

  • μ£Όλ¬Έ μ·¨μ†Œ APIλŠ” DELETE λ©”μ„œλ“œλ‘œ /api/orders/{order_id} μ—”λ“œν¬μΈνŠΈμ— μš”μ²­μ„ 보내야 ν•©λ‹ˆλ‹€.
  • 둜그인이 ν•„μš”ν•©λ‹ˆλ‹€.
  • μ£Όλ¬Έ μ·¨μ†Œμ— μ„±κ³΅ν•˜λ©΄ 204 No Content μƒνƒœμ½”λ“œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • μ£Όλ¬Έ μ·¨μ†Œμ— μ‹€νŒ¨ν•˜λŠ” κ²½μš°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
    • 주문이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우
      • 404 Not Found μƒνƒœμ½”λ“œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • λ‹€λ₯Έ μœ μ €μ˜ 주문을 μ·¨μ†Œν•˜λ €κ³  ν•  경우
      • 403 Forbidden μƒνƒœμ½”λ“œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • 이미 μ·¨μ†Œλœ 주문을 μ·¨μ†Œν•˜λ €κ³  ν•  경우
      • 400 Bad Request μƒνƒœμ½”λ“œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

ꡬ맀 ν™•μ • API (UPDATE)

  • ꡬ맀 ν™•μ • APIλŠ” POST λ©”μ„œλ“œλ‘œ /api/orders/{order_id}/complete μ—”λ“œν¬μΈνŠΈμ— μš”μ²­μ„ 보내야 ν•©λ‹ˆλ‹€.
  • 둜그인이 ν•„μš”ν•©λ‹ˆλ‹€.
  • ꡬ맀 확정에 μ„±κ³΅ν•˜λ©΄ 204 No Content μƒνƒœμ½”λ“œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • ꡬ맀 확정에 μ‹€νŒ¨ν•˜λŠ” κ²½μš°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
    • 주문이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우
      • 404 Not Found μƒνƒœμ½”λ“œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • λ‹€λ₯Έ μœ μ €μ˜ 주문을 ν™•μ •ν•˜λ €κ³  ν•  경우
      • 403 Forbidden μƒνƒœμ½”λ“œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • 이미 μ·¨μ†Œλœ 주문을 ν™•μ •ν•˜λ €κ³  ν•  경우
      • 400 Bad Request μƒνƒœμ½”λ“œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

채점 κΈ°μ€€

  • λ°μ΄ν„°λ² μ΄μŠ€ λͺ¨λΈμ΄ ER λ‹€μ΄μ–΄κ·Έλž¨μ„ 잘 λ°˜μ˜ν•˜κ³  있음
  • λ°μ΄ν„°λ² μ΄μŠ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μ„±κ³΅μ μœΌλ‘œ μˆ˜ν–‰ν•¨
  • API κ°€ μš”κ΅¬μ‚¬ν•­μ— 맞게 λ™μž‘ν•¨
  • API κ°€ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ λ™μž‘ν•¨
  • API κ°€ μ˜ˆμ™Έ 상황에 λŒ€ν•΄ μ μ ˆν•œ 응닡을 λ°˜ν™˜ν•¨

제좜 방법

과제 수락 μ‹œ μƒμ„±λœ λ ˆν¬μ§€ν„°λ¦¬μ˜ main λΈŒλžœμΉ˜μ— μ™„μ„±λœ μ½”λ“œλ₯Ό ν‘Έμ‹œν•˜μ„Έμš”.

(주의⚠️) Feedback PR 은 λ¨Έμ§€ν•˜μ§€ λ§ˆμ„Έμš”!

μ°Έκ³  λ¬Έμ„œ

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published