Skip to content

๐Ÿ”ง [๊ธฐ๋Šฅ๊ฐœ์„ ][์žฅ๋ฐ”๊ตฌ๋‹ˆ] ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ˆ˜๋Ÿ‰ ์ฒ˜๋ฆฌ API๋ฅผ SET/DELTA๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  DELTA ๋ฉฑ๋“ฑ์„ฑ(Idempotency-Key) ์ง€์›ย #59

@Chuseok22

Description

@Chuseok22

๐Ÿ“ ํ˜„์žฌ ๋ฌธ์ œ์ 

ํ˜„์žฌ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ฉ”๋‰ด ์ถ”๊ฐ€ API๋Š” quantity๊ฐ€ โ€œํ•ด๋‹น ๋ฉ”๋‰ด์˜ ์ตœ์ข…(๋ˆ„์ ) ์ˆ˜๋Ÿ‰โ€ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ
    • menuId (Long, required): ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด์„ ๋ฉ”๋‰ด ID
    • quantity (int, required)
      • 1 ์ด์ƒ: ํ•ด๋‹น ์ˆ˜๋Ÿ‰์œผ๋กœ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ถ”๊ฐ€ ๋˜๋Š” ์ˆ˜์ •(= ์ตœ์ข… ์ˆ˜๋Ÿ‰ SET)
      • 0: ํ•ด๋‹น ๋ฉ”๋‰ด๋ฅผ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์—์„œ ์‚ญ์ œ
  • ์‘๋‹ต ๋ฐ์ดํ„ฐ
    • cartId (Long): ์žฅ๋ฐ”๊ตฌ๋‹ˆ ID
    • items (List): ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ธด ๋ฉ”๋‰ด ๋ชฉ๋ก
    • totalPrice (int): ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ „์ฒด ๊ธˆ์•ก
  • ํŠน์ง•
    • quantity=0 ์ „๋‹ฌ ์‹œ ํ•ด๋‹น ๋ฉ”๋‰ด ์‚ญ์ œ
    • ์žฅ๋ฐ”๊ตฌ๋‹ˆ๊ฐ€ ๋น„์›Œ์ง€๋ฉด ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์—”ํ‹ฐํ‹ฐ ์ž๋™ ์‚ญ์ œ(์ด ๊ฒฝ์šฐ ์‘๋‹ต์— cartId๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ)

์ด ๊ตฌ์กฐ์—์„œ๋Š” โ€œ์ถ”๊ฐ€ํ•˜๊ธฐ(+N)โ€ UX๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ํ”„๋ก ํŠธ์—์„œ

  • ํ˜„์žฌ ์ˆ˜๋Ÿ‰ ํŒŒ์•…(์กฐํšŒ/์ƒํƒœ ๋ณด์œ )
  • ์ถ”๊ฐ€ํ•  ์ˆ˜๋Ÿ‰ ์ž…๋ ฅ
  • ์ตœ์ข… ์ˆ˜๋Ÿ‰ ๊ณ„์‚ฐ(ํ˜„์žฌ + ์ถ”๊ฐ€) ํ›„ quantity๋กœ ์ „์†ก
    ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ์ ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํ”„๋ก ํŠธ ๋กœ์ง ๋ณต์žก๋„ ์ฆ๊ฐ€
  • โ€œ๋‹ด๊ธฐโ€ ๊ธฐ๋Šฅ์ด ๋‹จ์ˆœํžˆ +N์„ ์˜๋ฏธํ•จ์—๋„, ํ•ญ์ƒ ํ˜„์žฌ ์ˆ˜๋Ÿ‰์„ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ๊ตฌํ˜„/์ƒํƒœ ๋™๊ธฐํ™” ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  1. ๋™์‹œ์„ฑ(๋ฉ€ํ‹ฐ ํƒญ/๋ฉ€ํ‹ฐ ๋””๋ฐ”์ด์Šค)์—์„œ ๋ฎ์–ด์“ฐ๊ธฐ ์œ„ํ—˜
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์˜ค๋ž˜๋œ โ€œํ˜„์žฌ ์ˆ˜๋Ÿ‰โ€์„ ๊ธฐ์ค€์œผ๋กœ ์ตœ์ข… ์ˆ˜๋Ÿ‰์„ ๊ณ„์‚ฐํ•ด ์ „์†กํ•˜๋ฉด, ์„œ๋ฒ„๊ฐ€ ์ด๋ฅผ ๊ทธ๋Œ€๋กœ SETํ•˜์—ฌ ์˜๋„์น˜ ์•Š๊ฒŒ ๋ฎ์–ด์”Œ์šฐ๋Š”(lost update) ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. API ์˜๋ฏธ ํ˜ผํ•ฉ์œผ๋กœ ์ธํ•œ ํ™•์žฅ์„ฑ ์ €ํ•˜
  • ๋‹จ์ผ quantity ๊ฐ’์œผ๋กœ โ€œ์ถ”๊ฐ€/์„ค์ •/์‚ญ์ œโ€ ์˜๋ฏธ๋ฅผ ๋ชจ๋‘ ํ‘œํ˜„ํ•˜๊ณ  ์žˆ์–ด ํด๋ผ์ด์–ธํŠธ ์ธก ํ•ด์„ ํ˜ผ์„ ์ด ๋ฐœ์ƒํ•˜๋ฉฐ, ํ–ฅํ›„ ๊ธฐ๋Šฅ ํ™•์žฅ(๊ฐ์†Œ, ์ฆ๊ฐํ˜• UX, ์žฌ์‹œ๋„ ์•ˆ์ •์„ฑ)์—๋„ ์ œ์•ฝ์ด ์ƒ๊น๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ / ์ œ์•ˆ ๊ธฐ๋Šฅ

๋ณธ ์ด์Šˆ์—์„œ๋Š” A์•ˆ(๊ถŒ์žฅ)์œผ๋กœ SET(์ตœ์ข… ์ˆ˜๋Ÿ‰ ์„ค์ •) API ์™€ DELTA(์ฆ๊ฐ) API ๋ฅผ ๋ถ„๋ฆฌ ์ œ๊ณตํ•˜๊ณ ,
DELTA API์— ๋Œ€ํ•ด Idempotency-Key ๊ธฐ๋ฐ˜ ๋ฉฑ๋“ฑ์„ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

1) SET API(์ตœ์ข… ์ˆ˜๋Ÿ‰์œผ๋กœ ๋งž์ถ”๊ธฐ, ๋ฉฑ๋“ฑ)

  • ๋ชฉ์ : ์žฅ๋ฐ”๊ตฌ๋‹ˆ ํ™”๋ฉด์—์„œ ์ˆ˜๋Ÿ‰์„ ์ง์ ‘ ํŽธ์ง‘(์Šคํ…ํผ/์ง์ ‘ ์ž…๋ ฅ)ํ•˜๊ฑฐ๋‚˜, ํŠน์ • ์ˆ˜๋Ÿ‰์œผ๋กœ โ€œ์ •ํ™•ํžˆ ๋งž์ถ”๋Š”โ€ ๋™์ž‘
  • ํŠน์ง•: ๋™์ผ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณด๋‚ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋™์ผ(๋ฉฑ๋“ฑ)
  • ๋™์ž‘ ๊ทœ์น™
    • quantity >= 1 โ†’ ํ•ด๋‹น menu์˜ ์ˆ˜๋Ÿ‰์„ ํ•ด๋‹น ๊ฐ’์œผ๋กœ ์„ค์ •
    • quantity == 0 โ†’ ํ•ด๋‹น menu ์‚ญ์ œ (์‚ญ์ œ๋Š” ๋ณ„๋„ DELETE๋กœ ๋ถ„๋ฆฌ๋„ ๊ฐ€๋Šฅํ•˜๋‚˜, ๋ณธ ์ด์Šˆ์—์„œ๋Š” ๊ธฐ์กด ์ •์ฑ… ์œ ์ง€ ๊ฐ€๋Šฅ)

2) DELTA API(์ถ”๊ฐ€/๊ฐ์†Œ, ์„œ๋ฒ„๊ฐ€ ๋ˆ„์  ๊ณ„์‚ฐ)

  • ๋ชฉ์ : โ€œ๋‹ด๊ธฐ(+N)โ€, โ€œํ•œ ๊ฐœ ๋”(+1)โ€, โ€œํ•œ ๊ฐœ ๋นผ๊ธฐ(-1)โ€ ๊ฐ™์€ ์ฆ๊ฐํ˜• UX๋ฅผ ๋‹จ์ˆœํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์ง€์›
  • ํŠน์ง•: ํด๋ผ์ด์–ธํŠธ๋Š” โ€œ์ถ”๊ฐ€/๊ฐ์†Œํ•  ์ˆ˜๋Ÿ‰(delta)โ€๋งŒ ์ „๋‹ฌ, ์„œ๋ฒ„๊ฐ€ ๊ธฐ์กด ์ˆ˜๋Ÿ‰์„ ์กฐํšŒํ•ด ๋ˆ„์  ๋ฐ˜์˜
  • ๋™์ž‘ ๊ทœ์น™
    • delta > 0 โ†’ ๊ธฐ์กด ์ˆ˜๋Ÿ‰ + delta
    • delta < 0 โ†’ ๊ธฐ์กด ์ˆ˜๋Ÿ‰ + delta (0 ์ดํ•˜๊ฐ€ ๋˜๋ฉด ํ•ด๋‹น menu ์‚ญ์ œ)
    • ๊ฒฐ๊ณผ์ ์œผ๋กœ ์žฅ๋ฐ”๊ตฌ๋‹ˆ๊ฐ€ ๋น„๋ฉด cart ์—”ํ‹ฐํ‹ฐ ์‚ญ์ œ(๊ธฐ์กด ์ •์ฑ…๊ณผ ๋™์ผ)

3) DELTA ๋ฉฑ๋“ฑ์„ฑ ๋ณด์žฅ: Idempotency-Key ์ง€์›(ํ•„์ˆ˜)

DELTA๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„๋ฉฑ๋“ฑ(์ค‘๋ณต ์š”์ฒญ ์‹œ ์ˆ˜๋Ÿ‰์ด ์ค‘๋ณต ์ฆ๊ฐ€)ํ•˜๋ฏ€๋กœ, ์•„๋ž˜ ์ •์ฑ…์„ ๋ฐ˜๋“œ์‹œ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ๋Š” DELTA ์š”์ฒญ ์‹œ ํ—ค๋”๋กœ Idempotency-Key(์š”์ฒญ ๊ณ ์œ ํ‚ค)๋ฅผ ์ „์†ก
  • ์„œ๋ฒ„๋Š” (userId(or cartOwner), menuId, idempotencyKey) ๋‹จ์œ„๋กœ ์š”์ฒญ์„ ๊ธฐ๋กํ•˜๊ณ ,
    ๋™์ผ ํ‚ค ์žฌ์š”์ฒญ ์‹œ ์ตœ์ดˆ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ(์‘๋‹ต ๋ฐ”๋””)๋ฅผ ๊ทธ๋Œ€๋กœ ์žฌ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ค‘๋ณต ๋ฐ˜์˜์„ ๋ฐฉ์ง€
  • ์ €์žฅ/๋งŒ๋ฃŒ ์ •์ฑ…(TTL)์€ ์šด์˜ ์ •์ฑ…์— ๋”ฐ๋ผ ์„ค์ •(์˜ˆ: 24์‹œ๊ฐ„ ๋“ฑ)ํ•˜๋˜, ์ •ํ™•ํ•œ ๊ฐ’์€ ๋ณธ ์ด์Šˆ์—์„œ ํ™•์ • ํ•„์š”

๊ธฐ๋Œ€ํšจ๊ณผ

  • ํ”„๋ก ํŠธ๋Š” โ€œ์ถ”๊ฐ€ํ•˜๊ธฐโ€์—์„œ ๋ˆ„์  ์ˆ˜๋Ÿ‰์„ ๊ณ„์‚ฐํ•  ํ•„์š” ์—†์ด delta๋งŒ ์ „์†ก
  • ๋ชจ๋ฐ”์ผ/๋ถˆ์•ˆ์ • ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ ์žฌ์‹œ๋„/์ค‘๋ณต ํด๋ฆญ์ด ๋ฐœ์ƒํ•ด๋„ ์ค‘๋ณต ๋ฐ˜์˜ ๋ฐฉ์ง€
  • โ€œํŽธ์ง‘(SET)โ€๊ณผ โ€œ์ถ”๊ฐ€/๊ฐ์†Œ(DELTA)โ€๊ฐ€ ๋ชฉ์ ๋ณ„๋กœ ๋ถ„๋ฆฌ๋˜์–ด API ์˜๋ฏธ๊ฐ€ ๋ช…ํ™•ํ•ด์ง

โš™๏ธ ์ž‘์—… ๋‚ด์šฉ

1) ๋ฐฑ์—”๋“œ(JAVA + Spring Boot)

  • SET API ์ŠคํŽ™ ํ™•์ • ๋ฐ ๊ตฌํ˜„
    • ์š”์ฒญ/์‘๋‹ต DTO ์ •์˜(menuId, quantity)
    • quantity==0 ์‚ญ์ œ ์ฒ˜๋ฆฌ ๋ฐ ๋งˆ์ง€๋ง‰ ์•„์ดํ…œ ์‚ญ์ œ ์‹œ cart ์—”ํ‹ฐํ‹ฐ ์‚ญ์ œ ์ฒ˜๋ฆฌ(๊ธฐ์กด ์ •์ฑ… ์ค€์ˆ˜)
  • DELTA API ์ŠคํŽ™ ํ™•์ • ๋ฐ ๊ตฌํ˜„
    • ์š”์ฒญ DTO ์ •์˜(menuId, delta)
    • delta < 0 ๊ฐ์†Œ ์‹œ 0 ์ดํ•˜๊ฐ€ ๋˜๋ฉด cartItem ์‚ญ์ œ ์ฒ˜๋ฆฌ
    • ๊ฒฐ๊ณผ์ ์œผ๋กœ cart๊ฐ€ ๋น„๋ฉด cart ์—”ํ‹ฐํ‹ฐ ์‚ญ์ œ ์ฒ˜๋ฆฌ
  • DELTA ๋ฉฑ๋“ฑ์„ฑ(Idempotency-Key) ๊ตฌํ˜„
    • ํ—ค๋” Idempotency-Key ํŒŒ์‹ฑ ๋ฐ ํ•„์ˆ˜ ์—ฌ๋ถ€ ๊ฒฐ์ •(DELTA์—์„œ๋งŒ ํ•„์ˆ˜ ๊ถŒ์žฅ)
    • ์ €์žฅ์†Œ ์„ค๊ณ„
      • key: (userId, menuId, idempotencyKey) (์ •ํ™•ํ•œ ์‹๋ณ„์ž ๊ตฌ์„ฑ์€ ๋ณธ ์ด์Šˆ์—์„œ ํ™•์ •)
      • value: ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ(์ตœ์†Œ: ์ฒ˜๋ฆฌ ์™„๋ฃŒ ์—ฌ๋ถ€ + ์‘๋‹ต ๋ฐ”๋”” ๋˜๋Š” ์žฌ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ)
      • TTL/๋งŒ๋ฃŒ ์ •์ฑ… ์ ์šฉ
    • ๋™์ผ ํ‚ค ์žฌ์š”์ฒญ ์‹œ ์ตœ์ดˆ ์‘๋‹ต ๋ฐ˜ํ™˜
  • ์˜ˆ์™ธ/์‘๋‹ต ๊ทœ์น™ ์ •๋ฆฌ
    • menuId ์—†์Œ, ์ž˜๋ชป๋œ delta/quantity, ํ’ˆ์ ˆ/์žฌ๊ณ  ์ •์ฑ… ๋“ฑ(ํ˜„์žฌ ์กด์žฌํ•˜๋Š” ๊ทœ์น™์ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๊ทœ์น™์— ๋งž์ถฐ ํ™•์ •)
    • cart ๋น„์›€์œผ๋กœ cart ์—”ํ‹ฐํ‹ฐ ์‚ญ์ œ๋˜๋Š” ๊ฒฝ์šฐ ์‘๋‹ต(cartId nullable) ์ •์ฑ… ๋ช…ํ™•ํ™”
  • ํ…Œ์ŠคํŠธ
    • SET: ๋ฉฑ๋“ฑ์„ฑ(๋™์ผ quantity ๋ฐ˜๋ณต), 0 ์‚ญ์ œ, ๋งˆ์ง€๋ง‰ ์‚ญ์ œ ์‹œ cart ์‚ญ์ œ
    • DELTA: +N ๋ˆ„์ , -1 ๊ฐ์†Œ, 0 ์ดํ•˜ ์‚ญ์ œ, ๋งˆ์ง€๋ง‰ ์‚ญ์ œ ์‹œ cart ์‚ญ์ œ
    • DELTA: Idempotency-Key ๋™์ผ ์š”์ฒญ ๋ฐ˜๋ณต ์‹œ ์ค‘๋ณต ๋ฐ˜์˜ ์—†์ด ๋™์ผ ์‘๋‹ต ๋ฐ˜ํ™˜
    • DELTA: ํ‚ค ๋ฏธ์ „๋‹ฌ/์ž˜๋ชป๋œ ํ‚ค์˜ ์ฒ˜๋ฆฌ ๊ทœ์น™ ๊ฒ€์ฆ

2) ํ”„๋ก ํŠธ(์›น: TypeScript + Next.js App Router / ์•ฑ: ReactNative + EXPO)

  • โ€œ๋‹ด๊ธฐ(+N)โ€ ๋ฐ ์ฆ๊ฐ ๋ฒ„ํŠผ์€ DELTA API ์‚ฌ์šฉ
    • ํด๋ผ์ด์–ธํŠธ๋Š” ์ถ”๊ฐ€ํ•  ๊ฐœ์ˆ˜๋งŒ delta๋กœ ์ „๋‹ฌ
    • ์š”์ฒญ๋งˆ๋‹ค Idempotency-Key ์ƒ์„ฑ/์ „์†ก(์ค‘๋ณต ํด๋ฆญ/์žฌ์‹œ๋„ ๋Œ€๋น„)
  • โ€œ์ˆ˜๋Ÿ‰ ์ง์ ‘ ํŽธ์ง‘(์ตœ์ข… ์ˆ˜๋Ÿ‰ ์ง€์ •)โ€์€ SET API ์‚ฌ์šฉ
  • ์‘๋‹ต(items/totalPrice)์„ ๊ธฐ์ค€์œผ๋กœ UI ์ƒํƒœ๋ฅผ ํ•ญ์ƒ ๊ฐฑ์‹ (์„œ๋ฒ„ ์‘๋‹ต์„ ์†Œ์Šค ์˜ค๋ธŒ ํŠธ๋ฃจ์Šค๋กœ)
  • cart๊ฐ€ ๋น„์–ด cartId๊ฐ€ ๋ˆ„๋ฝ๋  ์ˆ˜ ์žˆ๋Š” ์ผ€์ด์Šค ์ฒ˜๋ฆฌ(์‘๋‹ต items ๊ธฐ์ค€์œผ๋กœ empty ์ƒํƒœ ์ฒ˜๋ฆฌ)

3) ๋ฌธ์„œํ™”/์ŠคํŽ™ ์ •๋น„

  • SET/DELTA ๊ฐ๊ฐ์˜ ๋ชฉ์ , ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค, ์š”์ฒญ/์‘๋‹ต ์˜ˆ์‹œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ฌธ์„œํ™”
  • DELTA์˜ Idempotency-Key ๊ทœ์•ฝ(์ƒ์„ฑ ๋ฐฉ๋ฒ•, ์žฌ์‚ฌ์šฉ ๋ฒ”์œ„, TTL, ์ค‘๋ณต ์ฒ˜๋ฆฌ)์„ ๋ฌธ์„œํ™”
  • โ€œcart ๋น„์›€ โ†’ cart ์—”ํ‹ฐํ‹ฐ ์‚ญ์ œ โ†’ cartId ๋ˆ„๋ฝ ๊ฐ€๋Šฅโ€ ์ผ€์ด์Šค๋ฅผ ์˜ˆ์‹œ/์ฃผ์˜์‚ฌํ•ญ์œผ๋กœ ๋ช…ํ™•ํžˆ ๊ธฐ์žฌ

โœ… ์™„๋ฃŒ ์กฐ๊ฑด(AC)

  • SET API๋กœ ์ตœ์ข… ์ˆ˜๋Ÿ‰ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋™์ผ ์š”์ฒญ ์žฌ์‹œ๋„ ์‹œ ๊ฒฐ๊ณผ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค(๋ฉฑ๋“ฑ).
  • DELTA API๋กœ ์ฆ๊ฐ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ํ”„๋ก ํŠธ๋Š” ๋ˆ„์  ์ˆ˜๋Ÿ‰ ๊ณ„์‚ฐ ์—†์ด delta๋งŒ ์ „์†กํ•œ๋‹ค.
  • DELTA ์š”์ฒญ์— ๋™์ผ Idempotency-Key๋กœ ์ค‘๋ณต ์š”์ฒญ์ด ๋ฐœ์ƒํ•ด๋„ ์ˆ˜๋Ÿ‰์ด ์ค‘๋ณต ๋ฐ˜์˜๋˜์ง€ ์•Š๊ณ  ๋™์ผ ์‘๋‹ต์ด ๋ฐ˜ํ™˜๋œ๋‹ค.
  • delta ๊ฐ์†Œ๋กœ 0 ์ดํ•˜๊ฐ€ ๋˜๋ฉด ํ•ด๋‹น menu๊ฐ€ ์‚ญ์ œ๋˜๋ฉฐ, cart๊ฐ€ ๋น„๋ฉด cart ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์‚ญ์ œ๋œ๋‹ค(๊ธฐ์กด ์ •์ฑ… ์ค€์ˆ˜).
  • ๋ฌธ์„œ/์˜ˆ์‹œ๊ฐ€ ์‹ค์ œ ๋™์ž‘๊ณผ ์ผ์น˜ํ•˜์—ฌ ํ”„๋ก ํŠธ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜ผ์„  ์—†์ด ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.

๐Ÿ“Œ ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ(์ถ”์ธก ์—†์ด ์ŠคํŽ™ ํ™•์ • ์œ„ํ•ด ์š”์ฒญ)

์•„๋ž˜ ์ •๋ณด๊ฐ€ ์žˆ์–ด์•ผ API Path/Method ๋ฐ ๋ฉฑ๋“ฑ์„ฑ ์ €์žฅ ์ „๋žต์„ ์ •ํ™•ํžˆ ํ™•์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๊ด€๋ จ API์˜ HTTP Method / Path ๋ชฉ๋ก(๊ธฐ์กด โ€œmenu ์ถ”๊ฐ€/์ˆ˜์ •โ€ ์—”๋“œํฌ์ธํŠธ ํฌํ•จ)
  • ์‚ฌ์šฉ์ž ์‹๋ณ„ ๋ฐฉ์‹(์ธ์ฆ: JWT ๋“ฑ) ๋ฐ โ€œcart ์†Œ์œ ์žโ€ ๊ฒฐ์ • ๋ฐฉ์‹
  • DB ๋ชจ๋ธ ์ •๋ณด
    • cartItem ์œ ๋‹ˆํฌ ์ œ์•ฝ(์˜ˆ: cartId+menuId unique ์—ฌ๋ถ€)
    • cart/cartItem์— version ์ปฌ๋Ÿผ ๋˜๋Š” ๊ณตํ†ต audit ์ปฌ๋Ÿผ ์กด์žฌ ์—ฌ๋ถ€
  • Idempotency-Key๋ฅผ ์ด๋ฏธ ์‚ฌ์šฉํ•˜๋Š” ๊ณตํ†ต ๊ทœ์•ฝ/๋ฏธ๋“ค์›จ์–ด ์กด์žฌ ์—ฌ๋ถ€(์žˆ๋‹ค๋ฉด ํ—ค๋”๋ช…/TTL/์ €์žฅ์†Œ)
  • quantity=0 ์‚ญ์ œ ์ •์ฑ…์„ SET์—์„œ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ• ์ง€, DELETE๋กœ ๋ถ„๋ฆฌํ• ์ง€์˜ ํŒ€ ์ปจ๋ฒค์…˜

๐Ÿ™‹โ€โ™‚๏ธ ๋‹ด๋‹น์ž

  • ๋ฐฑ์—”๋“œ: ์ด๋ฆ„
  • ํ”„๋ก ํŠธ์—”๋“œ: ์ด๋ฆ„
  • ๋””์ž์ธ: ์ด๋ฆ„

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancement๊ธฐ๋Šฅ ๊ฐœ์„ /ํ–ฅ์ƒ (Enhancement)์ž‘์—… ์ „์ž‘์—… ์‹œ์ž‘ ์ „ ์ค€๋น„ ์ƒํƒœ

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions