Cloud SLI,SLO - 100-hours-a-week/KTB4-5th-wiki GitHub Wiki

๋‹ค๋จน์ž SLIยทSLO ์„ค๊ณ„

์ž‘์„ฑ์ผ: 2026-09-30 ยท ์ˆ˜์ •์ผ: 2026-10-01
์ ์šฉ ๋ฒ”์œ„: v1 (v2ยทv3๋Š” 6. ํ–ฅํ›„ ๋ฒ„์ „ ๊ณ„ํš ์ฐธ๊ณ )

1. ๊ฐœ์š”

ํ•ต์‹ฌ ์‚ฌ์šฉ์ž ์—ฌ์ •์˜ ํ’ˆ์งˆ์„ ์ธก์ •ํ•˜๊ณ , ๋ชฉํ‘œ ์ˆ˜์ค€๊ณผ ์žฅ์•  ๋Œ€์‘ ๊ธฐ์ค€์„ ์ •ํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ธฐ๋Œ€์™€ ์šด์˜ ์—ฌ๊ฑด์„ ๊ณ ๋ คํ•ด ์†Œ์ˆ˜์˜ ์ง€ํ‘œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋… ์˜๋ฏธ
CUJ(ํ•ต์‹ฌ ์‚ฌ์šฉ์ž ์—ฌ์ •) ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ชฉ์ ์„ ๋‹ฌ์„ฑํ•ด ๋‚˜์•„๊ฐ€๋Š” ๊ณผ์ •
SLI(์„œ๋น„์Šค ์ˆ˜์ค€ ์ง€ํ‘œ) ์‚ฌ์šฉ์ž ์—ฌ์ •์˜ ํ’ˆ์งˆ์„ ์‹ค์ œ๋กœ ์ธก์ •ํ•œ ๊ฐ’
SLO(์„œ๋น„์Šค ์ˆ˜์ค€ ๋ชฉํ‘œ) ์ •ํ•ด์ง„ ๊ธฐ๊ฐ„ ๋™์•ˆ ์ง€ํ‘œ๊ฐ€ ๋งŒ์กฑํ•ด์•ผ ํ•  ์ˆ˜์ค€
์˜ค๋ฅ˜ ์˜ˆ์‚ฐ SLO๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ์‹คํŒจ ๋ฒ”์œ„๋กœ, ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ๊ณผ ์•ˆ์ •์„ฑ ๊ฐœ์„ ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•˜๋Š” ๊ธฐ์ค€

2. ์‚ฌ์šฉ์ž ์—ฌ์ •๊ณผ ์šด์˜ ๊ธฐ์ค€

๋‹ค๋จน์ž์˜ ํ•ต์‹ฌ ์‚ฌ์šฉ์ž ์—ฌ์ •์€ ์žฌ๊ณ  ๋“ฑ๋ก โ†’ ์•„์นจ ์œ ํ†ต๊ธฐํ•œ ์•Œ๋ฆผ โ†’ ์žฌ๊ณ  ์กฐํšŒ โ†’ ์ง์ ‘ ์†Œ๋น„ ๋˜๋Š” ์ถ”์ฒœ ์š”๋ฆฌ ํ™œ์šฉ์ž…๋‹ˆ๋‹ค.

flowchart TD
    manual["์ˆ˜๋™ ๋“ฑ๋ก ยท v1"] --> inventory["์žฌ๊ณ  ์ €์žฅ"]
    receipt["์˜์ˆ˜์ฆ ์ดฌ์˜ยทAI ๋“ฑ๋ก ยท v2"] --> inventory
    photo["์‹ค๋ฌผ ์ดฌ์˜ยทAI ๋“ฑ๋ก ยท v3"] --> inventory
    inventory --> morning["์•„์นจ ์œ ํ†ต๊ธฐํ•œ ์•Œ๋ฆผ ยท v1"]
    morning --> gen["08:00 ์•Œ๋ฆผ ์ƒ์„ฑ ยท v1"]
    gen --> v1poll["v1 ยท ํด๋ง์œผ๋กœ ์•Œ๋ฆผ ํ™•์ธ"]
    gen --> v1push["v1 ยท Push ์ˆ˜์‹ "]
    morning -.-> v2["v2 ยท SSE + Push, ์žฌ์ ‘์† ์‹œ Catch-up"]
    v1poll --> notice["์ž„๋ฐ•ยท๋งŒ๋ฃŒ ๋ฌผํ’ˆ ํ™•์ธ"]
    v1push --> notice
    v2 -.-> notice
    notice --> list["์˜ค๋Š˜๊นŒ์ง€์ธ ์žฌ๊ณ  ์กฐํšŒ ยท v1"]
    list --> choice{"์žฌ๊ณ  ํ™œ์šฉ ๋ฐฉ๋ฒ•"}
    choice -->|"๋ฐ”๋กœ ์†Œ๋น„"| direct["๊ณผ์žยท์Œ๋ฃŒ ๋“ฑ ์ง์ ‘ ์†Œ๋น„"]
    choice -->|"์š”๋ฆฌ์— ํ™œ์šฉ ยท v3"| recommend["์žฌ๊ณ  ๊ธฐ๋ฐ˜ ์š”๋ฆฌ ์ถ”์ฒœ"]
    recommend --> recipe["๋ ˆ์‹œํ”ผ ํ™•์ธยท์š”๋ฆฌ ์ ์šฉ"]
    recipe --> consume["๋ ˆ์‹œํ”ผ ๊ธฐ์ค€ ์žฌ๊ณ  ์†Œ๋น„ ์ฒ˜๋ฆฌ"]
    classDef base fill:#e8f1ff,stroke:#4175b5,color:#172b4d;
    classDef added fill:#e8f5e9,stroke:#4b8651,color:#16391a;
    classDef future fill:#fff1dc,stroke:#ad7927,color:#51340a;
    class manual,inventory,morning,gen,v1poll,v1push,notice,list,choice,direct base;
    class receipt,v2 added;
    class photo,recommend,recipe,consume future;
Loading
ํ•ญ๋ชฉ ์šด์˜ ๊ธฐ์ค€
์‹œ๊ฐ„ ๊ธฐ์ค€ ์„œ๋น„์Šค ๋Œ€์ƒ์€ ํ•œ๊ตญ์ด๋ฉฐ, ์„œ๋ฒ„์˜ ์—…๋ฌด ๋‚ ์งœยท์‹œ๊ฐ„์€ Asia/Seoul(KST, UTC+9) ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋ณ„ ์‹œ๊ฐ„๋Œ€ ์„ค์ •์€ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์œ ํ†ต๊ธฐํ•œ ๋‹จ๊ณ„ D-3~D-day(๋‹น์ผ)๋Š” โ€˜์ž„๋ฐ•โ€™, ์œ ํ†ต๊ธฐํ•œ์ด ์ง€๋‚œ ์žฌ๊ณ ๋Š” โ€˜๋งŒ๋ฃŒโ€™์ž…๋‹ˆ๋‹ค. ์žฌ๊ณ  ์ƒํƒœยท๋ชฉ๋ก ํ•„ํ„ฐยท์•Œ๋ฆผ ์œ ํ˜•์ด ๋ชจ๋‘ ๊ฐ™์€ ๊ธฐ์ค€์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์•„์นจ ์•Œ๋ฆผ ์‹œ๊ฐ ๋งค์ผ 08:00์— ๋ฐœ์†กํ•˜๋ฉฐ, ํ—ˆ์šฉ ์ง€์—ฐ 1๋ถ„์„ ๋‘์–ด 08:01๊นŒ์ง€ ์„œ๋ฒ„๊ฐ€ ์•Œ๋ฆผ ์ƒ์„ฑยท์ „์†ก์„ ๋งˆ์น˜๋ฉด ์ •์‹œ๋กœ ๋ด…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ธฐ๊ธฐ์˜ ์ˆ˜์‹  ์‹œ๊ฐ์ด ์•„๋‹Œ ์„œ๋ฒ„์˜ ๋ฐœ์†ก ์‹œ๊ฐ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค.
์•Œ๋ฆผ ์ฑ„๋„ Polling + Web Push. ํด๋ผ์ด์–ธํŠธ๋Š” 30์ดˆ๋งˆ๋‹ค ์ตœ์‹  ์•Œ๋ฆผ ID์™€ ๋ฏธ์ฝ์Œ ์ˆ˜๋ฅผ ์กฐํšŒํ•˜๊ณ , ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ์•Œ๋ฆผ ๋ชฉ๋ก์„ ๋‹ค์‹œ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค(ํƒญ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์ด๋ฉด ์ค‘์ง€, ๋ณต๊ท€ ์‹œ ์ฆ‰์‹œ ์กฐํšŒ). ๋™์‹œ์— ์„œ๋ฒ„๊ฐ€ Web Push(VAPID ์„œ๋ช…, ํ‘œ์ค€ Web Push ํ”„๋กœํ† ์ฝœ)๋ฅผ ๋ฐœ์†กํ•ฉ๋‹ˆ๋‹ค.
์•Œ๋ฆผ ๋Œ€์ƒ ์ž„๋ฐ•ยท๋งŒ๋ฃŒ ์žฌ๊ณ ๊ฐ€ ์žˆ๋Š” ๋ƒ‰์žฅ๊ณ ์˜ ํ™œ์„ฑ ๋ฉค๋ฒ„์ž…๋‹ˆ๋‹ค. ํƒˆํ‡ดยท๋น„ํ™œ์„ฑ ์‚ฌ์šฉ์ž, ๋ƒ‰์žฅ๊ณ ์—์„œ ๋‚˜๊ฐ„ ๋ฉค๋ฒ„, ์‚ญ์ œ๋œ ๋ƒ‰์žฅ๊ณ ๋Š” ๋Œ€์ƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

3. SLI

3.1 ์ธก์ • ๋Œ€์ƒ

R = /api/v1/refrigerators/{refrigerator-id} ๋กœ ์ค„์—ฌ ์”๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ API๊ฐ€ ๋ƒ‰์žฅ๊ณ  ๊ฒฝ๋กœ ์•„๋ž˜์— ์žˆ์–ด ๊ฐ™์€ ์ ‘๋‘ ๊ฒฝ๋กœ๊ฐ€ ๋ฐ˜๋ณต๋˜๋ฏ€๋กœ, ํ‘œ๋ฅผ ์งง๊ฒŒ ํ•ด API๋ณ„ ์ฐจ์ด(๋ ๊ฒฝ๋กœ)๊ฐ€ ์ž˜ ๋ณด์ด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  ์‹ค์ œ ํ˜ธ์ถœ ๊ฒฝ๋กœ๋Š” R์„ ํŽผ์ณ ์ฝ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ž‘์—… ์ธก์ • APIยท๊ธฐ๋ก ์„ฑ๊ณต ํŒ์ •
์ˆ˜๋™ ์žฌ๊ณ  ๋“ฑ๋ก POST R/ingredients 201
์˜ค๋Š˜๊นŒ์ง€์ธ ์žฌ๊ณ  ์กฐํšŒ GET R/ingredients, GET /api/v1/ingredients/{ingredient-id} 200. ๋‹น์ผ ์žฌ๊ณ ๋Š” โ€˜์ž„๋ฐ•โ€™ ํ•„ํ„ฐ์— ํฌํ•จ
์•Œ๋ฆผ ํ™•์ธ(ํด๋ง) GET R/notifications/stream, GET R/notifications/unread-count, GET R/notifications 200
์•„์นจ ์•Œ๋ฆผ ๋ฐœ์†ก ์•Œ๋ฆผยทPush ๋ฐœ์†ก ๊ธฐ๋ก(์‚ฌ์šฉ์ž ํ˜ธ์ถœ API ์•„๋‹˜) 3.3 ์•„์นจ ์•Œ๋ฆผ ํŒ์ • ์ฐธ๊ณ 

์—ฌ๋Ÿฌ API๋กœ ์ด์–ด์ง€๋Š” ์‚ฌ์šฉ์ž ์ž‘์—…์€ ํ•œ ๊ฑด์œผ๋กœ ์ง‘๊ณ„ํ•ฉ๋‹ˆ๋‹ค.

์ธก์ •ํ•˜์ง€ ์•Š๋Š” API

  • ๋‹จ๊ฑด ์žฌ๊ณ  ๋“ฑ๋ก(POST R/ingredient): API๋Š” ์žˆ์ง€๋งŒ FE์—์„œ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„ ์ •์ƒ ์‚ฌ์šฉ์ž์˜ ์—ฌ์ •์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 5xx๋Š” ์ผ๋ฐ˜ ์˜ค๋ฅ˜ ๋ชจ๋‹ˆํ„ฐ๋ง์œผ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณด์กฐ ๊ด€์ธก ๋Œ€์ƒ: ์ง์ ‘ ์†Œ๋น„(POST /api/v1/ingredients/{ingredient-id}), Push ๊ตฌ๋…(POST /api/v1/push-subscriptions)์€ ๋ชฉํ‘œ ์—†์ด ์„ฑ๊ณต๋ฅ ยท์‘๋‹ต์‹œ๊ฐ„๋งŒ ๊ด€์ฐฐํ•ฉ๋‹ˆ๋‹ค.

3.2 ์„ฑ๊ณตยท์‹คํŒจ ํŒ์ •

๊ณตํ†ต ๊ณ„์‚ฐ ๊ธฐ์ค€

  • ์„ฑ๊ณต๋ฅ ์€ ์„ฑ๊ณต ๊ฑด์ˆ˜ รท ํ‰๊ฐ€ ๋Œ€์ƒ ๊ฑด์ˆ˜๋กœ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ๊ตฌ๊ฐ„์„ ํ•ฉ์น  ๋•Œ๋Š” ๊ตฌ๊ฐ„๋ณ„ ๋น„์œจ์„ ํ‰๊ท ํ•˜์ง€ ์•Š๊ณ , ์„ฑ๊ณต ๊ฑด์ˆ˜์™€ ํ‰๊ฐ€ ๋Œ€์ƒ ๊ฑด์ˆ˜๋ฅผ ๊ฐ๊ฐ ๋”ํ•œ ๋’ค ๋‚˜๋ˆ•๋‹ˆ๋‹ค. p95ยทp99๋„ ๊ตฌ๊ฐ„๋ณ„ ๊ฐ’์„ ํ‰๊ท ํ•˜์ง€ ์•Š๊ณ  ์ „์ฒด ์ธก์ •๊ฐ’์—์„œ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  • ํŒ์ •์€ HTTP ์‘๋‹ต ์ฝ”๋“œ๋กœ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์‘๋‹ต ๋‚ด์šฉ์ด ๋งž๋Š”์ง€๋Š” ํŒ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํŒ์ • ์‘๋‹ต ์ฝ”๋“œ ๊ธฐ์ค€
์„ฑ๊ณต 2xx (์žฌ๊ณ  API: INGREDIENT-200-001\~006, INGREDIENT-201-001\~002) ์š”์ฒญ์ด ์ •์ƒ ์ฒ˜๋ฆฌ๋œ ๊ฒฝ์šฐ
์‹คํŒจ ๋ชจ๋“  5xx (BE์˜ 500: GLOBAL-500-001, Nginx์˜ 502ยท503ยท504 ํฌํ•จ) ์šฐ๋ฆฌ ์„œ๋น„์Šค ์ชฝ ์žฅ์• ๋กœ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ
ํ‰๊ฐ€ ์ œ์™ธ ๋ชจ๋“  4xx (400ยท401ยท403ยท404ยท409ยท412ยท422ยท428 ํฌํ•จ) ์„ฑ๊ณต ๊ฑด์ˆ˜์—๋„, ํ‰๊ฐ€ ๋Œ€์ƒ ๊ฑด์ˆ˜์—๋„ ๋„ฃ์ง€ ์•Š์Œ

4xx ์ œ์™ธ

4xx ์š”์ฒญ์€ ์—†์—ˆ๋˜ ์š”์ฒญ์ฒ˜๋Ÿผ ๋ณด๊ณ  ์„ฑ๊ณต๋ฅ ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ: ํ•œ ๋‹ฌ ์š”์ฒญ 1,000๊ฑด ๊ฑด์ˆ˜
์„ฑ๊ณต(2xx) 950๊ฑด
4xx 40๊ฑด โ†’ ๊ณ„์‚ฐ์—์„œ ์ œ์™ธ
์‹คํŒจ(5xx) 10๊ฑด
์„ฑ๊ณต๋ฅ  950 รท (1,000 โˆ’ 40) = 950 รท 960 โ‰ˆ 98.96%

4xx๋ฅผ ์‹คํŒจ๋กœ ์„ธ๋ฉด 95%, ์„ฑ๊ณต์œผ๋กœ ์„ธ๋ฉด 99%๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ œ์™ธํ•˜๋ฉด 4xx๋Š” ์„ฑ๊ณต๋ฅ ์„ ์˜ฌ๋ฆฌ์ง€๋„ ๋‚ด๋ฆฌ์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์ด์œ : 4xx๋Š” ์ž˜๋ชป๋œ ์ž…๋ ฅยท๊ถŒํ•œ ์—†์Œ ๋“ฑ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์—์„œ ๋น„๋กฏ๋˜๋ฉฐ, ์•…์˜์ ์œผ๋กœ ๋ถ€ํ•˜๋ฅผ ๋„ฃ์€ ์š”์ฒญ์ฒ˜๋Ÿผ ์˜๋„๋œ ์‹คํŒจ๋„ 4xx๋กœ ๋Œ์•„์˜ต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์ •์ƒ ์‚ฌ์šฉ์ž์˜ ์‹ค์ˆ˜์™€ ์˜๋„๋œ ์‹คํŒจ๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, 4xx๋ฅผ ์‹คํŒจ๋กœ ์„ธ๋ฉด ์„œ๋น„์Šค ํ’ˆ์งˆ๊ณผ ๋ฌด๊ด€ํ•œ ์š”์ฒญ์ด SLO๋ฅผ ๊นŽ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ํŠธ๋ ˆ์ด๋“œ์˜คํ”„: ์™ธ๋ถ€ ์š”์ธ์œผ๋กœ SLO๊ฐ€ ํ”๋“ค๋ฆฌ์ง€ ์•Š๋Š” ๋Œ€์‹ , ์„œ๋ฒ„ ๋ฒ„๊ทธ๋‚˜ ์ธ์ฆ ์žฅ์• ๋กœ ์ž˜๋ชป ๋ฐœ์ƒํ•œ 4xx(์˜ˆ: ์ •์ƒ ์‚ฌ์šฉ์ž์—๊ฒŒ 401ยท404 ๋Œ€๋Ÿ‰ ๋ฐœ์ƒ)๋„ SLO์— ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 4xx๋Š” ์ฝ”๋“œ๋ณ„ ๊ฑด์ˆ˜๋ฅผ ๋ณ„๋„๋กœ ์ง‘๊ณ„ํ•˜๊ณ , ํ‰์†Œ๋ณด๋‹ค ๊ธ‰์ฆํ•˜๋ฉด ์›์ธ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์‹œ๊ฐ„ ์ดˆ๊ณผยท์—ฐ๊ฒฐ ์‹คํŒจ

flowchart LR
    U(["์‚ฌ์šฉ์ž"]) --- Z1["์‚ฌ์šฉ์ž โ†” Nginx<br/>ํšŒ์„  ๋ถˆ๋Ÿ‰ ยท DNSยทTLS ์‹คํŒจ ยท AWS ์žฅ์• <br/>ํ‰๊ฐ€ ์ œ์™ธ (Sentry๋กœ ๊ฑด์ˆ˜๋งŒ ๊ด€์ธก)"]
    Z1 --- N(["Nginx"])
    N --- Z2["Nginx โ†” BE<br/>502 BE ๋‹ค์šดยท์žฌ๋ฐฐํฌ<br/>504 BE ์‘๋‹ต ์ง€์—ฐ<br/>์‹คํŒจ"]
    Z2 --- BE(["BE"])
    BE --- Z3["BE ๋‚ด๋ถ€<br/>500 DB ์—ฐ๊ฒฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ ยท ์ฒ˜๋ฆฌ ์ค‘ ์˜ˆ์™ธ<br/>์‹คํŒจ"]
    Z3 --- DB(["DB"])
    classDef excluded fill:#eeeeee,stroke:#888888,color:#333333;
    classDef failure fill:#fde2e1,stroke:#c0504d,color:#5a1a18;
    class Z1 excluded;
    class Z2,Z3 failure;
Loading
  • ์‚ฌ์šฉ์ž โ†” Nginx ๊ตฌ๊ฐ„์„ ์ œ์™ธํ•˜๋Š” ์ด์œ : v1์€ Route 53์—์„œ Nginx๋กœ ๋ฐ”๋กœ ์—ฐ๊ฒฐ๋˜๋ฏ€๋กœ ์ด ๊ตฌ๊ฐ„์—์„œ ์šฐ๋ฆฌ ์ชฝ ์ฑ…์ž„์ธ ์žฅ์• ๋Š” AWS ์žฅ์•  ๋ฟ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ์ด ๊ตฌ๊ฐ„์˜ ์‹คํŒจ๋Š” ๋Œ€๋ถ€๋ถ„ ์‚ฌ์šฉ์ž์˜ ์ธํ„ฐ๋„ท ๋ฏธ์—ฐ๊ฒฐยท์•ฝํ•œ ํšŒ์„  ๊ฐ™์€ ์™ธ๋ถ€ ์š”์ธ์ด๋ฉฐ, ํด๋ผ์ด์–ธํŠธ ๊ธฐ๋ก๋งŒ์œผ๋กœ๋Š” ๋‘˜์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
  • ํŠธ๋ ˆ์ด๋“œ์˜คํ”„: ์„œ๋ฒ„ ๊ธฐ๋ก(NginxยทBE)๋งŒ์œผ๋กœ ํŒ์ •ํ•ด ๊ธฐ์ค€์ด ๋ช…ํ™•ํ•˜๊ณ  ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ ๋ฌธ์ œ๊ฐ€ ์„ž์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์š”์ฒญ์ด ์„œ๋ฒ„๊นŒ์ง€ ์˜ค์ง€ ๋ชปํ•˜๋Š” ๋“œ๋ฌธ ์žฅ์• ๋Š” ์„ฑ๊ณต๋ฅ ์— ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์œผ๋ฏ€๋กœ, Sentry์—์„œ ์งง์€ ์‹œ๊ฐ„์— ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž์˜ ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๊ฐ€ ๋™์‹œ์— ๋Š˜์–ด๋‚˜๋Š”์ง€๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์‘๋‹ต ์ฝ”๋“œ ๊ธฐ๋ฐ˜ ํŒ์ •์˜ ํ•œ๊ณ„

์„œ๋ฒ„๊ฐ€ 2xx๋กœ ์‘๋‹ตํ–ˆ์ง€๋งŒ ๊ฒฐ๊ณผ๊ฐ€ ์ž˜๋ชป๋œ ๊ฒฝ์šฐ๋Š” ์„ฑ๊ณต์œผ๋กœ ์ง‘๊ณ„๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์‘๋‹ต ์‹ค์ œ ๊ฒฐ๊ณผ
์žฌ๊ณ  ๋“ฑ๋ก 201 ์‹œ๊ฐ„๋Œ€ ๋ณ€ํ™˜ ์˜ค๋ฅ˜๋กœ ์œ ํ†ต๊ธฐํ•œ์ด ํ•˜๋ฃจ ๋ฐ€๋ ค ์ €์žฅ๋จ
์žฌ๊ณ  ๋“ฑ๋ก 201 5๊ฐœ ์ค‘ 3๊ฐœ๋งŒ ์ €์žฅ๋จ
์žฌ๊ณ  ์กฐํšŒ 200 ๋‹น์ผ ์žฌ๊ณ ๊ฐ€ ๋ชฉ๋ก์—์„œ ๋น ์ง
  • ํŠธ๋ ˆ์ด๋“œ์˜คํ”„: ์„œ๋ฒ„ ๊ธฐ๋ก์œผ๋กœ ๋ฐ”๋กœ ์ง‘๊ณ„ํ•  ์ˆ˜ ์žˆ์–ด ๊ธฐ์ค€์ด ๋ช…ํ™•ํ•˜๊ณ  ๊ตฌํ˜„ ๋ถ€๋‹ด์ด ์ ์€ ๋Œ€์‹ , ์กฐ์šฉํžˆ ํ‹€๋ฆฌ๋Š” ๋ฌธ์ œ๋Š” SLO์— ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์•„ ํ…Œ์ŠคํŠธยทQAยท์‚ฌ์šฉ์ž ์ œ๋ณด๋กœ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณ ๋„ํ™” ์—ฌ์ง€: ๊ฒฐ๊ณผ๋ฅผ ๋Œ€์กฐํ•˜๊ธฐ ์‰ฌ์šด ํ•ญ๋ชฉ๋ถ€ํ„ฐ ํŒ์ •์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์•„์นจ ์•Œ๋ฆผ ๋Œ€์ƒ ์ˆ˜์™€ ์‹ค์ œ ์ƒ์„ฑ ์ˆ˜, ๋“ฑ๋ก ์š”์ฒญ ๊ฑด์ˆ˜์™€ ์‹ค์ œ ์ €์žฅ ๊ฑด์ˆ˜ ๋น„๊ต).

3.3 ์•„์นจ ์•Œ๋ฆผ ํŒ์ •

ํŒ์ • ๊ธฐ์ค€

  • ์„œ๋ฒ„ ๊ธฐ๋ก์œผ๋กœ ํŒ์ •ํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž ๊ธฐ๊ธฐ๊ฐ€ ์•Œ๋ฆผ์„ ๋ฐ›๊ฑฐ๋‚˜ ํ™•์ธํ•œ ์‹œ๊ฐ์€ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 08:01๊นŒ์ง€ ๊ณ„ํšํ•œ ๋ฐœ์†ก์„ ์ง€ํ‚ค์ง€ ๋ชปํ•˜๋ฉด ์‹คํŒจ์ž…๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๋ณ„ ์•Œ๋ฆผ์„ ํ•œ ๊ฑด์œผ๋กœ ์„ธ๊ณ , ์—ฌ๋Ÿฌ ๊ธฐ๊ธฐ ์ค‘ ํ•˜๋‚˜๋งŒ Push ์ ‘์ˆ˜์— ์„ฑ๊ณตํ•ด๋„ ์„ฑ๊ณต์ž…๋‹ˆ๋‹ค.
  • Push ๋Œ€์ƒ ์‚ฌ์šฉ์ž(ํ™œ์„ฑ Push ๊ธฐ๊ธฐ๊ฐ€ ์žˆ๊ณ  ๋งŒ๋ฃŒ ์•Œ๋ฆผ ์ˆ˜์‹ ์„ ์ผ  ์‚ฌ์šฉ์ž)๋Š” ์•Œ๋ฆผ ์ƒ์„ฑ๊ณผ Push ์ ‘์ˆ˜๊ฐ€ ๋ชจ๋‘ ์„ฑ๊ณตํ•ด์•ผ ์„ฑ๊ณต์ž…๋‹ˆ๋‹ค. ๊ทธ ์™ธ ์‚ฌ์šฉ์ž๋Š” ์•Œ๋ฆผ ์ƒ์„ฑ๋งŒ์œผ๋กœ ํŒ์ •ํ•ฉ๋‹ˆ๋‹ค.
flowchart TD
    A{"08:01๊นŒ์ง€ ์•Œ๋ฆผ ์ƒ์„ฑ?"} -->|์•„๋‹ˆ์˜ค| F["์‹คํŒจ"]
    A -->|์˜ˆ| B{"Push ๋Œ€์ƒ ์‚ฌ์šฉ์ž?<br/>ํ™œ์„ฑ Push ๊ธฐ๊ธฐ + ๋งŒ๋ฃŒ ์•Œ๋ฆผ ์ˆ˜์‹  ์ผฌ"}
    B -->|์•„๋‹ˆ์˜ค| S["์„ฑ๊ณต"]
    B -->|์˜ˆ| C{"Push ๋ฐœ์†ก ๊ฒฐ๊ณผ<br/>์‚ฌ์šฉ์ž์˜ ๊ธฐ๊ธฐ ์ค‘ ํ•˜๋‚˜๋ผ๋„"}
    C -->|"ACCEPTED (08:01๊นŒ์ง€ ์ ‘์ˆ˜)"| S
    C -->|"CANCELLED (๊ตฌ๋… ๋งŒ๋ฃŒ ยท ์ˆ˜์‹ ์ž ์‚ฌ์šฉ ๋ถˆ๊ฐ€)"| X["ํ‰๊ฐ€ ์ œ์™ธ"]
    C -->|"FAILED ๋˜๋Š” 08:01 ์ดํ›„ ์ ‘์ˆ˜"| F
    classDef ok fill:#e3f2e1,stroke:#4b8651,color:#16391a;
    classDef ng fill:#fde2e1,stroke:#c0504d,color:#5a1a18;
    classDef ex fill:#eeeeee,stroke:#888888,color:#333333;
    class S ok;
    class F ng;
    class X ex;
Loading
  • ์•Œ๋ฆผ ์ƒ์„ฑ ์„ฑ๊ณต: 08:01๊นŒ์ง€ ์•Œ๋ฆผ์ด ์ƒ์„ฑ๋˜์–ด ํด๋ง์œผ๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ
  • Push ์ ‘์ˆ˜ ์„ฑ๊ณต: ๋ธŒ๋ผ์šฐ์ € ํ‘ธ์‹œ ์„œ๋น„์Šค(Chrome์€ FCM, Safari๋Š” Apple, Firefox๋Š” Mozilla)๊ฐ€ 2xx๋กœ ์ ‘์ˆ˜ํ•œ ์ƒํƒœ. ๊ธฐ๊ธฐ ๋„์ฐฉ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

ํŠธ๋ ˆ์ด๋“œ์˜คํ”„: ์„œ๋ฒ„ ๋ฐœ์†ก ๊ธฐ๋ก๋งŒ์œผ๋กœ ํŒ์ •ํ•ด ๊ธฐ์ค€์ด ๋ช…ํ™•ํ•˜๊ณ  Push ์žฅ์• ๊ฐ€ SLO์— ๋ฐ”๋กœ ๋“œ๋Ÿฌ๋‚ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ๋ธŒ๋ผ์šฐ์ € ํ‘ธ์‹œ ์„œ๋น„์Šค ์ž์ฒด์˜ ์žฅ์• ์ฒ˜๋Ÿผ ์šฐ๋ฆฌ ์ชฝ ์›์ธ์ด ์•„๋‹Œ ์ ‘์ˆ˜ ์‹คํŒจ๋„ ์‹คํŒจ๋กœ ์ง‘๊ณ„๋˜๊ณ , ์„œ๋ฒ„๊ฐ€ ์ œ์‹œ๊ฐ„์— ๋ณด๋ƒˆ๋”๋ผ๋„ ์‚ฌ์šฉ์ž๊ฐ€ ๋Šฆ๊ฒŒ ๋ฐ›๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Push ๋ฐœ์†ก ๊ธฐ๋ก๋ณ„ ํŒ์ •

๋ฐœ์†ก ๊ธฐ๋ก(push_notifications) ์˜๋ฏธ ํŒ์ •
ACCEPTED ํ‘ธ์‹œ ์„œ๋น„์Šค๊ฐ€ 2xx๋กœ ์ ‘์ˆ˜ ์„ฑ๊ณต
FAILED + SEND_FAILEDยทSEND_WINDOW_EXPIRED ์ „์†ก ์˜ค๋ฅ˜ยท์‹œ๊ฐ„ ์ดˆ๊ณผ(์ตœ๋Œ€ 10์ดˆ), ์ •์˜ค๊นŒ์ง€ ๋ฐœ์†กํ•˜์ง€ ๋ชปํ•จ ์‹คํŒจ
CANCELLED + SUBSCRIPTION_UNAVAILABLE ๊ตฌ๋… ๋งŒ๋ฃŒ(404ยท410) ๋˜๋Š” ์ž‘์—… ์ƒ์„ฑ ํ›„ ๊ตฌ๋… ๋ณ€๊ฒฝ ํ‰๊ฐ€ ์ œ์™ธ
CANCELLED + RECIPIENT_UNAVAILABLE ๋ฐœ์†ก ์ง์ „ ํƒˆํ‡ดยท๋ƒ‰์žฅ๊ณ  ๋‚˜๊ฐยท์ˆ˜์‹  ๋” ํ‰๊ฐ€ ์ œ์™ธ
  • ์ œ์™ธ ์ด์œ : 4xx๋ฅผ ํ‰๊ฐ€์—์„œ ์ œ์™ธํ•˜๋Š” ์›์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๊ตฌ๋…์€ ์‚ฌ์šฉ์ž๊ฐ€ ์•Œ๋ฆผ ๊ถŒํ•œ์„ ํ•ด์ œํ•˜๊ฑฐ๋‚˜ ๋ธŒ๋ผ์šฐ์ € ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์šฐ๋Š” ๋“ฑ ์‚ฌ์šฉ์ž ์ชฝ ์›์ธ์œผ๋กœ ์‚ฌ๋ผ์ง€๊ณ , ๋ฐœ์†ก ์ง์ „ ํƒˆํ‡ดยท์ˆ˜์‹  ๋”์€ ์‚ฌ์šฉ์ž์˜ ์„ ํƒ์ž…๋‹ˆ๋‹ค.
  • ํŠธ๋ ˆ์ด๋“œ์˜คํ”„: ์‚ฌ์šฉ์ž ์ชฝ ์›์ธ์ด ์˜ค๋ฅ˜ ์˜ˆ์‚ฐ์„ ๊นŽ์ง€ ์•Š๋Š” ๋Œ€์‹ , VAPID ํ‚ค๋ฅผ ์ž˜๋ชป ๊ต์ฒดํ•˜๋Š” ๋“ฑ ์šฐ๋ฆฌ ์‹ค์ˆ˜๋กœ ๊ตฌ๋…์ด ๋Œ€๋Ÿ‰ ๋ฌดํšจํ™”๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. SUBSCRIPTION_UNAVAILABLE ๊ฑด์ˆ˜๋ฅผ ๋ณ„๋„๋กœ ์ง‘๊ณ„ํ•˜๊ณ  ๊ธ‰์ฆํ•˜๋ฉด ์›์ธ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ํ•œ๊ณ„: ๋ฐœ์†ก ๊ธฐ๋ก์— ํ‘ธ์‹œ ์„œ๋น„์Šค์˜ HTTP ์ƒํƒœ ์ฝ”๋“œ๋Š” ์ €์žฅ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, 404ยท410 ์™ธ์˜ 4xx(์˜ˆ: 400ยท403)๋Š” 5xx์™€ ๊ฐ™์€ SEND_FAILED๋กœ ๊ธฐ๋ก๋˜์–ด ์‹คํŒจ๋กœ ์ง‘๊ณ„๋ฉ๋‹ˆ๋‹ค.

๋ฐœ์†ก ํ๋ฆ„๊ณผ ์ง‘๊ณ„ ์‹œ ์œ ์˜์ 

flowchart LR
    subgraph ONTIME["์ •์‹œ ๊ตฌ๊ฐ„ (08:00 ~ 08:01): ์„ฑ๊ณต ์ธ์ •"]
        T0["08:00<br/>๋ฐฐ์น˜ ์‹œ์ž‘"] --> T1["์•Œ๋ฆผ ์ƒ์„ฑ<br/>๋ƒ‰์žฅ๊ณ ๋ณ„"] --> T2["Push 1์ฐจ ๋ฐœ์†ก<br/>๊ธฐ๊ธฐ๋ณ„"]
    end
    T2 --> CUT{{"08:01<br/>์ •์‹œ ๊ธฐ์ค€"}}
    subgraph LATE["์ •์‹œ ์ดํ›„: ์ ‘์ˆ˜๋ผ๋„ ์ •์‹œ ๊ธฐ์ค€์œผ๋กœ๋Š” ์‹คํŒจ"]
        R1["์žฌ์‹œ๋„ 1<br/>์•ฝ 08:05"] --> R2["์žฌ์‹œ๋„ 2<br/>์•ฝ 08:20"] --> R3["์žฌ์‹œ๋„ 3<br/>์•ฝ 08:50"] --> DL["12:00<br/>๋ฐœ์†ก ๋งˆ๊ฐ"]
    end
    CUT -->|"1์ฐจ ์‹คํŒจ ์‹œ"| R1
    classDef cut fill:#fff1dc,stroke:#ad7927,color:#51340a;
    class CUT cut;
    style ONTIME fill:#e3f2e1,stroke:#4b8651
    style LATE fill:#fde2e1,stroke:#c0504d
Loading
  • 08:00 ๋ฐฐ์น˜๊ฐ€ ๋ƒ‰์žฅ๊ณ ๋ณ„๋กœ ์•Œ๋ฆผ์„ ์ƒ์„ฑํ•œ ๋’ค, ์ƒ์„ฑ๋œ ์•Œ๋ฆผ์„ ๊ธฐ์ค€์œผ๋กœ ๊ธฐ๊ธฐ๋ณ„ Push๋ฅผ ๋ฐœ์†กํ•ฉ๋‹ˆ๋‹ค. ์•Œ๋ฆผ ์ƒ์„ฑ์— ์‹คํŒจํ•˜๋ฉด Push๋„ ๋ฐœ์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Push ์‹คํŒจ ์‹œ ์ง์ „ ์‹คํŒจ ์‹œ์ ๋ถ€ํ„ฐ 5๋ถ„ยท15๋ถ„ยท30๋ถ„ ๋’ค์— ์ฐจ๋ก€๋กœ ์žฌ์‹œ๋„ํ•˜๊ณ (1์ฐจ ์‹คํŒจ๊ฐ€ 08:00์ด๋ฉด ์•ฝ 08:05ยท08:20ยท08:50), ์ •์˜ค๊ฐ€ ์ง€๋‚˜๋ฉด ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ์žฌ์‹œ๋„๊ฐ€ 5๋ถ„ ๋’ค์ด๋ฏ€๋กœ ์žฌ์‹œ๋„๋กœ ์ ‘์ˆ˜๋ผ๋„ ์ •์‹œ ๊ธฐ์ค€์œผ๋กœ๋Š” ์‹คํŒจ์ž…๋‹ˆ๋‹ค.
  • ์•Œ๋ฆผ ์ƒ์„ฑ์— ์‹คํŒจํ•œ ๋ƒ‰์žฅ๊ณ ๋Š” DB์— ๋‚จ์ง€ ์•Š๊ณ  ๋ฐฐ์น˜ ๋กœ๊ทธ(failedRefrigeratorCount)์—๋งŒ ๋‚จ์Šต๋‹ˆ๋‹ค. ๋ฐœ์†ก ์‹œ๋„ ๊ฑด์ˆ˜๋งŒ ํ‰๊ฐ€ ๋Œ€์ƒ์œผ๋กœ ์žก์œผ๋ฉด ๋Œ€์ƒ ๋ˆ„๋ฝ์„ ๋†“์น˜๋ฏ€๋กœ, ์ „์ฒด ๋Œ€์ƒ ์ˆ˜๋Š” ๋ฐฐ์น˜ ๋กœ๊ทธ์—์„œ ํ•จ๊ป˜ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์•Œ๋ฆผ ๋Œ€์ƒ ์žฌ๊ณ 

  • ์œ ํ†ต๊ธฐํ•œ์ด ์ง€๋‚œ ์žฌ๊ณ ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์น˜์šธ ๋•Œ๊นŒ์ง€ ๋งค์ผ ๋งŒ๋ฃŒ ์•Œ๋ฆผ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์น˜์šฐ์ง€ ์•Š์€ ์žฌ๊ณ ๋ฅผ ์น˜์šฐ๋„๋ก ์•Œ๋ฆฌ๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ž…๋‹ˆ๋‹ค.
  • ์ˆ˜๋Ÿ‰์ด 0์ธ ์žฌ๊ณ ๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚จ์€ ์–‘์ด 0์ด ๋˜๋ฉด ์žฌ๊ณ ๊ฐ€ ์‚ญ์ œ๋˜๊ณ , ๋“ฑ๋กยท์ˆ˜์ • ์‹œ์—๋„ ์ˆ˜๋Ÿ‰์€ 1 ์ด์ƒ(๋ฌด๊ฒŒ๋Š” 0 ์ดˆ๊ณผ)๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์•Œ๋ฆผ์€ 08:00 ๋ฐฐ์น˜๊ฐ€ ์กฐํšŒํ•œ ์‹œ์ ์˜ ์žฌ๊ณ ๋กœ ๋งŒ๋“ค๋ฉฐ, ์ดํ›„์˜ ์žฌ๊ณ  ๋ณ€๊ฒฝ์€ ๋‹น์ผ ์•Œ๋ฆผ์— ๋ฐ˜์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐœ์†ก ์ง์ „ ์žฌ๊ณ ๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•˜๋Š” ๋“ฑ ๊ณ ๋„ํ™” ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ๋ ค์ง„ ํ•œ๊ณ„ (ํด๋ผ์ด์–ธํŠธ)

  • ํ™”๋ฉด ํ‘œ์‹œ ์ง€์—ฐ: ํด๋ง ๊ฐ„๊ฒฉ์ด 30์ดˆ์ด๋ฏ€๋กœ ์•Œ๋ฆผ์ด ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๊ธฐ๊นŒ์ง€ ์ตœ๋Œ€ ์•ฝ 30์ดˆ๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์„œ๋ฒ„ ๊ธฐ์ค€ SLO์— ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํด๋ง ์ค‘๋‹จ: ํด๋ง ์š”์ฒญ์ด ์žฌ์‹œ๋„ ํ›„์—๋„ ์‹คํŒจํ•˜๋ฉด ํด๋ง์ด ๋ฉˆ์ถ”๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ํƒญ์„ ์ „ํ™˜ํ•ด ๋Œ์•„์˜ฌ ๋•Œ ์žฌ๊ฐœ๋ฉ๋‹ˆ๋‹ค. ๋ฐœ์†ก ์ง์ „ ์„œ๋ฒ„๊ฐ€ ์ž ๊น 5xx๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด, ์„œ๋ฒ„๊ฐ€ ์ •์‹œ์— ์•Œ๋ฆผ์„ ์ƒ์„ฑํ–ˆ๋”๋ผ๋„ ํƒญ ์ „ํ™˜ ์ „๊นŒ์ง€ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.4 ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๊ณผ ๊ณ„์‚ฐ

EC2์˜ ๋กœ๊ทธ๋ฅผ CloudWatch Logs๋กœ ์ˆ˜์ง‘ํ•˜๊ณ , ์ง€ํ‘œ ํ•„ํ„ฐ(Metric Filter)๋กœ ์‹ค์‹œ๊ฐ„ ์ง‘๊ณ„ํ•ฉ๋‹ˆ๋‹ค.

flowchart LR
    subgraph EC2["EC2"]
        NG["Nginx ์ ‘๊ทผ ๋กœ๊ทธ"]
        BL["BE ๋กœ๊ทธ"]
        BT["08:00 ๋ฐฐ์น˜ ๋กœ๊ทธ"]
    end
    NG & BL & BT --> AG["CloudWatch Agent"]
    AG -->|"์•ฝ 5์ดˆ"| CL["CloudWatch Logs"]
    CL -->|"์ง€ํ‘œ ํ•„ํ„ฐ ยท 1๋ถ„"| CM["CloudWatch ์ง€ํ‘œ<br/>์‘๋‹ต ์ฝ”๋“œ๋ณ„ ๊ฑด์ˆ˜"]
    DB[("DB<br/>์•Œ๋ฆผยทPush ๋ฐœ์†ก ๊ธฐ๋ก")]
    SE["Sentry<br/>๋ธŒ๋ผ์šฐ์ € ์‘๋‹ต์‹œ๊ฐ„"]
    CM -->|"์ž‘์—… ์„ฑ๊ณต๋ฅ "| M["์›” ํ•ฉ์‚ฐ ยท SLO ํŒ์ •"]
    CL -->|"์•Œ๋ฆผ ๋Œ€์ƒ ์ˆ˜"| M
    DB -->|"์•„์นจ ์•Œ๋ฆผ"| M
    SE -->|"์‘๋‹ต์‹œ๊ฐ„"| M
Loading
  • 1๋ถ„ ์ฃผ๊ธฐ๋ฅผ ์„ ํƒํ•œ ์ด์œ : ์ง€ํ‘œ ํ•„ํ„ฐ๋Š” ๋กœ๊ทธ๊ฐ€ ๋„์ฐฉํ•  ๋•Œ๋งˆ๋‹ค ํ‰๊ฐ€ํ•˜์ง€๋งŒ ์ง€ํ‘œ ๊ฐ’์€ 1๋ถ„ ๋‹จ์œ„๋กœ ๊ธฐ๋กํ•˜๋ฏ€๋กœ, ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์งง์€ ์ฃผ๊ธฐ์ž…๋‹ˆ๋‹ค. ์žฅ์• ๊ฐ€ ๋‚˜๋ฉด ์•ฝ 1~2๋ถ„ ์•ˆ์— ์ง€ํ‘œ์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
  • ํŠธ๋ ˆ์ด๋“œ์˜คํ”„: 1์ดˆ ๋‹จ์œ„ ์ง‘๊ณ„๋Š” BE ๋กœ๊ทธ ํ˜•์‹์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜(EMF) ์ง€ํ‘œ๋ฅผ ์ง์ ‘ ๋ณด๋‚ด์•ผ(PutMetricData) ํ•˜๋ฏ€๋กœ ์ฑ„ํƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ง€ํ‘œ ํ•„ํ„ฐ๋Š” ์กฐ๊ฑด๋ณ„ ๊ฑด์ˆ˜๋งŒ ์…€ ์ˆ˜ ์žˆ์–ด, 4xx ์ œ์™ธยทAPI๋ณ„ ๋ถ„๋ฆฌ์ฒ˜๋Ÿผ ์กฐ๊ฑด์ด ๋Š˜์–ด๋‚˜๋ฉด ํ•„ํ„ฐ๋„ ๊ทธ๋งŒํผ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.
  • ๋ณด๊ด€: CloudWatch๋Š” ์ง€ํ‘œ๋ฅผ 15์ผ ์ด๋‚ด 1๋ถ„, 63์ผ ์ด๋‚ด 5๋ถ„, 455์ผ ์ด๋‚ด 1์‹œ๊ฐ„ ํ•ด์ƒ๋„๋กœ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค. ํ•ด์ƒ๋„๊ฐ€ ์ค„์–ด๋„ ํ•ฉ๊ณ„๋Š” ์œ ์ง€๋˜๋ฏ€๋กœ ์›”๊ฐ„ ํ•ฉ์‚ฐ์—๋Š” ์˜ํ–ฅ์ด ์—†์Šต๋‹ˆ๋‹ค.

4. SLO

ํ‰๊ฐ€ ๊ธฐ๊ฐ„์€ **ํ•œ๊ตญ ์‹œ๊ฐ„ ๊ธฐ์ค€ ๋‹ฌ๋ ฅ ์›”(๋งค์›” 1์ผ 00:00 ์ด์ƒ, ๋‹ค์Œ ๋‹ฌ 1์ผ 00:00 ๋ฏธ๋งŒ)**์ž…๋‹ˆ๋‹ค. ์›”๊ฐ„ ๋น„์œจ์€ ์ผ๋ณ„ ๋น„์œจ์˜ ํ‰๊ท ์ด ์•„๋‹ˆ๋ผ ๊ฑด์ˆ˜๋ฅผ ํ•ฉ์‚ฐํ•ด ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

๋Œ€์ƒ ๋ชฉํ‘œ
์•„์นจ ์•Œ๋ฆผ ํ•ด๋‹น ์›” ํ‰๊ฐ€ ๋Œ€์ƒ ์•Œ๋ฆผ์˜ 95% ์ด์ƒ์ด ๊ฐ ๋ฐœ์†ก์ผ KST 08:01๊นŒ์ง€ ์„ฑ๊ณต (3.3 ๊ธฐ์ค€)
์ž‘์—… ์„ฑ๊ณต๋ฅ  ์ˆ˜๋™ ์žฌ๊ณ  ๋“ฑ๋กยท์žฌ๊ณ  ์กฐํšŒยท์•Œ๋ฆผ ์กฐํšŒ(ํด๋ง) ๊ฐ๊ฐ ์›”๊ฐ„ 95% ์ด์ƒ
์‘๋‹ต์‹œ๊ฐ„ ์ˆ˜๋™ ์žฌ๊ณ  ๋“ฑ๋กยท์žฌ๊ณ  ์กฐํšŒ ๊ฐ๊ฐ p95 โ‰ค 1์ดˆ, p99 โ‰ค 10์ดˆ

์‘๋‹ต์‹œ๊ฐ„์€ ํ‰๊ฐ€ ๋Œ€์ƒ์˜ 95% ์ด์ƒ์ด 1์ดˆ ์ด๋‚ด, 99% ์ด์ƒ์ด 10์ดˆ ์ด๋‚ด๋ผ๋Š” ๋‘ ์กฐ๊ฑด์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ, ๋“ฑ๋ก๊ณผ ์กฐํšŒ๋ฅผ ๊ฐ๊ฐ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์‘๋‹ต์‹œ๊ฐ„ ๋ชฉํ‘œ์™€ ์„ฑ๊ณต๋ฅ  ๋ชฉํ‘œ๋Š” ์„œ๋กœ ๋Œ€์‹ ํ•˜์ง€ ์•Š๊ณ  ๊ฐ๊ฐ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

4xx ์‘๋‹ต์€ ์„ฑ๊ณต๋ฅ ๊ณผ ๊ฐ™์ด ์‘๋‹ต์‹œ๊ฐ„ ์ง‘๊ณ„์—์„œ๋„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

  • ์ด์œ : ์•…์˜์ ์œผ๋กœ ๋ถ€ํ•˜๋ฅผ ๋„ฃ์€ ์š”์ฒญ์€ ๋Œ€๋ถ€๋ถ„ 4xx๋กœ ๋Œ์•„์˜ค๋ฉฐ, ์„œ๋ฒ„๋Š” ์ด๋ฅผ ์ •์ƒ ์š”์ฒญ๊ณผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 4xx๋ฅผ ํฌํ•จํ•˜๋ฉด ์ด๋Ÿฐ ์š”์ฒญ ๋•Œ๋ฌธ์— ์‘๋‹ต์‹œ๊ฐ„ ์ง€ํ‘œ๊ฐ€ ์–ด์ฉ” ์ˆ˜ ์—†์ด ๋‚˜๋น ์ง€๋ฏ€๋กœ ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.
  • ํŠธ๋ ˆ์ด๋“œ์˜คํ”„: ์™ธ๋ถ€ ์š”์ฒญ์œผ๋กœ ์ง€ํ‘œ๊ฐ€ ํ”๋“ค๋ฆฌ์ง€ ์•Š๋Š” ๋Œ€์‹ , ์ •์ƒ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ›์€ 4xx ์‘๋‹ต์ด ๋А๋ ธ๋˜ ๊ฒฝ์šฐ(์˜ˆ: ์ธ์ฆ ์ฒ˜๋ฆฌ ์ง€์—ฐ ํ›„ 401)๋Š” ์‘๋‹ต์‹œ๊ฐ„ ์ง€ํ‘œ์— ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

4.1 ์•„์นจ ์•Œ๋ฆผยท์ž‘์—… ์„ฑ๊ณต๋ฅ  ๋ชฉํ‘œ(95%) ๊ทผ๊ฑฐ

์ดˆ๊ธฐ ์„œ๋น„์Šค ๋‹จ๊ณ„์—์„œ๋Š” ์šด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ณ  ํŠธ๋ž˜ํ”ฝ์ด ์ ์œผ๋ฏ€๋กœ ํ˜„์‹ค์ ์œผ๋กœ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋Š” 95%์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์šด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์Œ“์ด๋ฉด ์‹ค์ œ ์„ฑ๊ณต๋ฅ ์„ ๋ณด๊ณ  ๋ชฉํ‘œ๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค.

  • ํŠธ๋ ˆ์ด๋“œ์˜คํ”„: ๋ชฉํ‘œ๊ฐ€ ๋А์Šจํ•ด ์ดˆ๊ธฐ ์žฅ์• ๋‚˜ ์žฌ๋ฐฐํฌ ์ค‘๋‹จ์œผ๋กœ SLO๊ฐ€ ์‰ฝ๊ฒŒ ๊นจ์ง€์ง€ ์•Š๊ณ , ์˜ค๋ฅ˜ ์˜ˆ์‚ฐ์„ ์‹ค์ œ ๊ฐœ์„  ์šฐ์„ ์ˆœ์œ„ ํŒ๋‹จ์— ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์›” 1,000๊ฑด์ด๋ฉด ์‹คํŒจ 50๊ฑด๊นŒ์ง€ ํ—ˆ์šฉ). ๋Œ€์‹  ์›” 5%์˜ ์‹คํŒจ๊นŒ์ง€ ํ—ˆ์šฉํ•˜๋ฏ€๋กœ ์ž‘์€ ํ’ˆ์งˆ ์ €ํ•˜๋Š” SLO์— ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด 5xx ๊ฑด์ˆ˜๋Š” ๋ณ„๋„๋กœ ๊ด€์ฐฐํ•˜๊ณ , ๋ชฉํ‘œ๋Š” ์šด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋‹จ๊ณ„์ ์œผ๋กœ ๋†’์ž…๋‹ˆ๋‹ค.
  • ์ฐธ๊ณ : IBM์€ ๋†’์€ ์ค‘์š”๋„์˜ ์‹œ์Šคํ…œ์—์„œ 99.9% ๋˜๋Š” 99.99% ๊ฐ€์šฉ์„ฑ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋จน์ž๋Š” ์ดˆ๊ธฐ ๋‹จ๊ณ„์ด๋ฏ€๋กœ ์ด ์ˆ˜์ค€์„ ์žฅ๊ธฐ ๋ชฉํ‘œ๋กœ ๋‘๊ณ , ์ฒ˜์Œ์—๋Š” ๋‚ฎ์€ ๋ชฉํ‘œ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

4.2 ์‘๋‹ต์‹œ๊ฐ„ ๋ชฉํ‘œ(1์ดˆยท10์ดˆ) ๊ทผ๊ฑฐ

Jakob Nielsen์ด ์ •๋ฆฌํ•œ ์‘๋‹ต์‹œ๊ฐ„ ํ•œ๊ณ„(Usability Engineering, 1993)๋ฅผ ๊ทผ๊ฑฐ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

ํ•œ๊ณ„ ์‚ฌ์šฉ์ž ์ธ์ง€ ๋‹ค๋จน์ž ๋ชฉํ‘œ
1์ดˆ ์ง€์—ฐ์€ ๋А๋ผ์ง€๋งŒ ์ƒ๊ฐ์˜ ํ๋ฆ„์ด ๋Š๊ธฐ์ง€ ์•Š๋Š” ํ•œ๊ณ„ p95 โ‰ค 1์ดˆ: ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์—… ํ๋ฆ„์„ ์œ ์ง€
10์ดˆ ์ž‘์—…์— ์ฃผ์˜๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ๊ณ„ p99 โ‰ค 10์ดˆ: ๊ฑฐ์˜ ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์—…์„ ์ดํƒˆํ•˜์ง€ ์•Š์Œ
  • ํŠธ๋ ˆ์ด๋“œ์˜คํ”„: ์‚ฌ์šฉ์ž ์ธ์ง€์— ๊ทผ๊ฑฐํ•ด "์™œ 1์ดˆ์ธ๊ฐ€"๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์›นยท๋ชจ๋ฐ”์ผ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์„ ์ „์ œ๋กœ ํ•œ ์—ฐ๊ตฌ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์ ์šฉ ๋น„์œจ(95%, 99%)์€ ํ”„๋กœ์ ํŠธ์˜ ์„ค๊ณ„ ๊ฒฐ์ •์ž…๋‹ˆ๋‹ค.
  • ๊ฒ€์ฆ: ์ธก์ • ์‹œ์ž‘ ํ›„ 2~4์ฃผ๊ฐ„์˜ ์‹ค์ œ ์‘๋‹ต์‹œ๊ฐ„์œผ๋กœ ๋ชฉํ‘œ๊ฐ€ ํ˜„์‹ค์ ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ธก์ •๊ฐ’์ด ๊ธฐ์ค€๋ณด๋‹ค ๋‚˜์˜๋ฉด ๋ชฉํ‘œ๋ฅผ ๋‚ฎ์ถ”๊ธฐ๋ณด๋‹ค ๊ฐœ์„  ๊ณผ์ œ๋กœ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
  • ์ฐธ๊ณ : Google Core Web Vitals์˜ INP๋Š” ์ž…๋ ฅ ํ›„ ์ฒซ ๋ฐ˜์‘์ด ๊ทธ๋ ค์ง€๊ธฐ๊นŒ์ง€๋ฅผ p75 ๊ธฐ์ค€ 200ms ์ดํ•˜๋ฉด "์ข‹์Œ"์œผ๋กœ ๋ด…๋‹ˆ๋‹ค. ๋‹ค๋จน์ž ๋ชฉํ‘œ(API ์š”์ฒญ๋ถ€ํ„ฐ ์‘๋‹ต ์ˆ˜์‹ ๊นŒ์ง€)์™€ ์ธก์ • ๋ฒ”์œ„๊ฐ€ ๋‹ฌ๋ผ ๋ชฉํ‘œ ์ˆ˜์น˜๋กœ๋Š” ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

4.3 ์‘๋‹ต์‹œ๊ฐ„ ์ธก์ • ๋ฐฉ์‹

FE์— ์„ค์ •๋œ Sentry์˜ ์„ฑ๋Šฅ ์ธก์ •(Tracing)์ด ์ž๋™์œผ๋กœ ๊ธฐ๋กํ•˜๋Š” API ์š”์ฒญ ๊ตฌ๊ฐ„(http.client)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ ๋‚ด์šฉ
์‹œ์ž‘ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ API ์š”์ฒญ์„ ๋ณด๋‚ธ ์‹œ์ 
์™„๋ฃŒ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ API ์‘๋‹ต์„ ๋ฐ›์€ ์‹œ์ 
๋Œ€์ƒ ์ˆ˜๋™ ์žฌ๊ณ  ๋“ฑ๋ก(POST R/ingredients), ์žฌ๊ณ  ์กฐํšŒ(GET R/ingredients ๋“ฑ)
์ƒ˜ํ”Œ๋ง prod 10%, dev 100% (์˜ค๋ฅ˜ ์ด๋ฒคํŠธ๋Š” ์ „๋ถ€ ์ˆ˜์ง‘)

์•„๋ž˜ ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ ํŒŒ๋ž€ ์˜์—ญ์ด ์ธก์ • ๊ตฌ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ˆ˜๋™ ์žฌ๊ณ  ๋“ฑ๋ก์„ ์˜ˆ๋กœ ๋“ค์—ˆ์œผ๋ฉฐ, ์žฌ๊ณ  ์กฐํšŒ๋„ ๊ฐ™์€ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

sequenceDiagram
    actor U as ์‚ฌ์šฉ์ž
    participant B as ๋ธŒ๋ผ์šฐ์ €(FE)
    participant N as Nginx
    participant BE as BE
    participant DB as DB

    U->>B: ๋“ฑ๋ก ๋ฒ„ํŠผ ํด๋ฆญ
    Note over U,B: ์ธก์ • ์ œ์™ธ: ์ž…๋ ฅ ์ฒ˜๋ฆฌ

    rect rgba(66, 133, 244, 0.18)
        Note over B,DB: ์ธก์ • ๊ตฌ๊ฐ„ (Sentry http.client)
        B->>N: POST R/ingredients ์š”์ฒญ ์ „์†ก โ‘  ์ธก์ • ์‹œ์ž‘
        Note over B,N: DNS ์กฐํšŒยทTLS ์—ฐ๊ฒฐยท๋„คํŠธ์›Œํฌ ์ „์†ก
        N->>BE: ์š”์ฒญ ์ „๋‹ฌ
        BE->>DB: ์žฌ๊ณ  ์ €์žฅ
        DB-->>BE: ์ €์žฅ ์™„๋ฃŒ
        BE-->>N: 201 ์‘๋‹ต
        N-->>B: 201 ์‘๋‹ต ์ˆ˜์‹  โ‘ก ์ธก์ • ์™„๋ฃŒ
    end

    B->>U: ๋“ฑ๋ก ์™„๋ฃŒ ํŒ์—… ํ‘œ์‹œ
    Note over U,B: ์ธก์ • ์ œ์™ธ: ํ™”๋ฉด ๊ทธ๋ฆฌ๊ธฐ
Loading
๊ตฌ๊ฐ„ ์ธก์ • ์—ฌ๋ถ€ ์„ค๋ช…
๋ฒ„ํŠผ ํด๋ฆญ โ†’ ์š”์ฒญ ์ „์†ก ์ œ์™ธ ์ž…๋ ฅ ์ฒ˜๋ฆฌยท์š”์ฒญ ์ค€๋น„ ์‹œ๊ฐ„
โ‘  ์š”์ฒญ ์ „์†ก โ†’ โ‘ก ์‘๋‹ต ์ˆ˜์‹  ์ธก์ • DNSยทTLS ์—ฐ๊ฒฐ, ๋„คํŠธ์›Œํฌ ์™•๋ณต, NginxยทBEยทDB ์ฒ˜๋ฆฌ ์‹œ๊ฐ„
์‘๋‹ต ์ˆ˜์‹  โ†’ ํŒ์—… ํ‘œ์‹œ ์ œ์™ธ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ์‹œ๊ฐ„
  • ์™„๋ฃŒ ์‹œ์ ์„ ์‘๋‹ต ์ˆ˜์‹ ์œผ๋กœ ์ •ํ•œ ์ด์œ : ๋“ฑ๋ก ์š”์ฒญ์— ์‘๋‹ต์ด ์˜ค๋ฉด ๊ณง๋ฐ”๋กœ ๋“ฑ๋ก ์™„๋ฃŒ ํŒ์—…์ด ๋œจ๋ฏ€๋กœ, ์‘๋‹ต ์ˆ˜์‹ ์ด ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๋Š” ์‹œ์ ๊ณผ ๊ฑฐ์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉฐ, FE์— ๊ธฐ๋Šฅ๋ณ„ ์ธก์ • ๊ตฌ๊ฐ„์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํ™”๋ฉด ๋ฐ˜์˜ ์™„๋ฃŒ๊นŒ์ง€ ์ธก์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์žฅ์ : ์‚ฌ์šฉ์ž ๊ธฐ๊ธฐ์—์„œ ์žฌ๋ฏ€๋กœ DNSยทTLS ์—ฐ๊ฒฐ, ๋„คํŠธ์›Œํฌ ์™•๋ณต, BE ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ๋ชจ๋‘ ํฌํ•จ๋˜๊ณ , ๊ฐ™์€ ๊ธฐ๊ธฐ์˜ ์‹œ๊ณ„๋กœ ์žฌ๋ฏ€๋กœ ์„œ๋ฒ„์™€์˜ ์‹œ๊ณ„ ์ฐจ์ด ์˜ํ–ฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์„ค์ •๋œ Sentry๋ฅผ ์“ฐ๋ฏ€๋กœ ์ˆ˜์ง‘ ์„œ๋ฒ„๋‚˜ ์ฝ”๋“œ ์ˆ˜์ •์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.
  • ๋‹จ์ : prod๋Š” 10%๋งŒ ์ƒ˜ํ”Œ๋งํ•˜๋ฏ€๋กœ ํŠธ๋ž˜ํ”ฝ์ด ์ ์€ ์ดˆ๊ธฐ์—๋Š” ์ธก์ •๊ฐ’์ด ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ Sentry ์•ˆ์— ์žˆ์–ด 4xx ์ œ์™ธ ๊ฐ™์€ ๊ณ„์‚ฐ ๊ทœ์น™์„ ์ž์œ ๋กญ๊ฒŒ ์ ์šฉํ•˜๊ธฐ ์–ด๋ ต๊ณ , ์ธก์ •๊ฐ’์„ ๋ณด๋‚ด๊ธฐ ์ „์— ํƒญ์„ ๋‹ซ๊ฑฐ๋‚˜ ์˜คํ”„๋ผ์ธ์ด ๋˜๋ฉด ๊ฐ’์ด ๋น ์ง‘๋‹ˆ๋‹ค.
  • ์šด์˜์ƒ ํ•œ๊ณ„: Sentry๋Š” 14์ผ ๋ฌด๋ฃŒ ์ฒดํ—˜ ๊ณ„์ • ํ•˜๋‚˜๋ฅผ ํŒ€์›์ด ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋น„์šฉ ๋ฌธ์ œ๋กœ ๋ฉค๋ฒ„ ์ดˆ๋Œ€๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด ์ƒ๊ธด ํ•œ๊ณ„๋กœ, ๋ˆ„๊ฐ€ ์„ค์ •์„ ๋ฐ”๊ฟจ๋Š”์ง€ ์ถ”์ ํ•  ์ˆ˜ ์—†๊ณ  ์ฒดํ—˜ ๊ธฐ๊ฐ„์ด ๋๋‚˜๋ฉด ๋ฌด๋ฃŒ ํ”Œ๋žœ์˜ ์‚ฌ์šฉ๋Ÿ‰ยท๋ณด๊ด€ ๊ธฐ๊ฐ„ ์ œํ•œ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

๊ฒ€ํ† ํ–ˆ์ง€๋งŒ ์ฑ„ํƒํ•˜์ง€ ์•Š์€ ๋ฐฉ์‹

๋ฐฉ์‹ ์ฑ„ํƒํ•˜์ง€ ์•Š์€ ์ด์œ 
๋ธŒ๋ผ์šฐ์ € ์ธก์ • ์ง์ ‘ ๊ตฌํ˜„ ๊ณ„์‚ฐ ๊ทœ์น™์„ ์ž์œ ๋กญ๊ฒŒ ์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ˆ˜์ง‘ APIยท์ €์žฅ์†Œยท๊ณ„์‚ฐ ์ฟผ๋ฆฌ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ์šด์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
BE์—์„œ ์š”์ฒญ ๋„์ฐฉ ์‹œ๊ฐ„ ร— 2 + ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์œผ๋กœ ์ถ”์ • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ์‹œ๊ณ„๊ฐ€ ๋งž์ง€ ์•Š์•„ ์š”์ฒญ ๋„์ฐฉ ์‹œ๊ฐ„์„ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์—†๊ณ , ์š”์ฒญ๊ณผ ์‘๋‹ต์˜ ํฌ๊ธฐยทํšŒ์„  ์†๋„๊ฐ€ ๋‹ฌ๋ผ ์™•๋ณต์ด ๋Œ€์นญ์ด ์•„๋‹™๋‹ˆ๋‹ค.
Nginx ๋กœ๊ทธ ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด BE ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์„ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ, DNS ์กฐํšŒยท์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ ๋“ฑ ์„œ๋ฒ„ ๋ฐ– ๊ตฌ๊ฐ„์ด ๋น ์ ธ ์‹ค์ œ๋ณด๋‹ค ์งง๊ฒŒ ์ธก์ •๋ฉ๋‹ˆ๋‹ค. ์›์ธ ๋ถ„์„์šฉ ๋ณด์กฐ ์ง€ํ‘œ๋กœ๋Š” ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
ํ•ฉ์„ฑ ๋ชจ๋‹ˆํ„ฐ๋ง ์‚ฌ์šฉ์ž๊ฐ€ ์—†์–ด๋„ ์ธก์ •๋˜์ง€๋งŒ, ๊ณ ์ •๋œ ์œ„์น˜ยท๊ธฐ๊ธฐ์—์„œ ์‹คํ–‰๋˜์–ด ์‹ค์ œ ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์„ ๋Œ€ํ‘œํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

5. ์˜ค๋ฅ˜ ์˜ˆ์‚ฐ๊ณผ ์šด์˜ ์•Œ๋ฆผ

๋Œ€์ƒ ์›”๊ฐ„ ์˜ค๋ฅ˜ ์˜ˆ์‚ฐ
์•„์นจ ์•Œ๋ฆผ ํ‰๊ฐ€ ๋Œ€์ƒ ์•Œ๋ฆผ ์ˆ˜ ร— 5% (์˜ˆ: 1,000๊ฑด์ด๋ฉด 50๊ฑด)
์ž‘์—… ์„ฑ๊ณต๋ฅ  ์ž‘์—…๋ณ„ ํ‰๊ฐ€ ๋Œ€์ƒ ๊ฑด์ˆ˜ ร— 5%
์‘๋‹ต์‹œ๊ฐ„ 1์ดˆ ์ดˆ๊ณผ 5%, 10์ดˆ ์ดˆ๊ณผ 1%๋ฅผ ๊ฐ๊ฐ ํ‰๊ฐ€ํ•˜๋ฉฐ ํ•ฉ์‚ฐํ•˜์ง€ ์•Š์Œ

SLO ๋ฏธ๋‹ฌ์„ ๋Œ€์‘ ๊ธฐ์ค€์œผ๋กœ ์‚ผ๋˜, ์šด์˜์ž ์•Œ๋ฆผ์˜ ๋ฐœ์ƒ ์กฐ๊ฑดยท์‹ฌ๊ฐ๋„ยท์ˆ˜์‹ ์žยท๋Œ€์‘ยท๋ณต๊ตฌ ์กฐ๊ฑด์€ ๋ณ„๋„ ์•Œ๋ฆผ ์„ค๊ณ„์—์„œ ์ •ํ•ฉ๋‹ˆ๋‹ค. ์›”๋ง ์ตœ์ข… ํŒ์ •๊ณผ ์šด์˜ ์ค‘ ์กฐ๊ธฐ ๊ฒฝ๋ณด๋Š” ๊ตฌ๋ถ„ํ•˜๋ฉฐ, ์›”๊ฐ„ SLO๊ฐ€ ๊นจ์งˆ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

6. ํ–ฅํ›„ ๋ฒ„์ „ ๊ณ„ํš

์•„๋ž˜๋Š” v2ยทv3 ์„ค๊ณ„ ๋ฐฉํ–ฅ์ด๋ฉฐ, ์„ธ๋ถ€ ๊ธฐ์ค€์€ ํ•ด๋‹น ๋ฒ„์ „ ์ฐฉ์ˆ˜ ์‹œ ํ™•์ •ํ•ฉ๋‹ˆ๋‹ค.

v2 ์•„์นจ ์•Œ๋ฆผ: SSE + Web Push + Catch-up

์ฑ„๋„ ์„ฑ๊ณตยท์‹คํŒจ ํŒ์ •
SSE ์ „์†ก ์„œ๋ฒ„๊ฐ€ Redis๋กœ ๋ณด๋‚ด๋Š” ACK๊ฐ€ ํŒ์ • ๋ฒ”์œ„ ๋‚ด ์ •ํ™•ํžˆ 1๊ฐœ์ด๋ฉด ์„ฑ๊ณต, 0๊ฐœ ๋˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์ด๋ฉด ์‹คํŒจ
Web Push v1๊ณผ ๋™์ผ
Catch-up ์žฌ์ ‘์† ์‹œ GET R/notifications๋กœ ๋ˆ„๋ฝ ์•Œ๋ฆผ์„ ๋ณต๊ตฌํ•˜๋ฉด ์„ฑ๊ณต. 08:01 ์ดํ›„ ๋ณต๊ตฌ๋Š” ์ •์‹œ ์„ฑ๊ณต์— ํฌํ•จํ•˜์ง€ ์•Š๊ณ  ๋ณ„๋„ ์ธก์ •

๋ชฉํ‘œ๋Š” v1๊ณผ ๊ฐ™์ด ์›”๊ฐ„ 95%, KST 08:01 ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค. ๋ฐฐ์น˜ยทPub/Sub ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐœ์†กํ•˜๋ฉฐ, ACK ์‹๋ณ„ ๋ฒ”์œ„ยท๋Œ€๊ธฐ ์‹œ๊ฐ„๊ณผ SSEยทPush ๊ฒฐ๊ณผ์˜ ํŒ์ • ๊ทœ์น™์„ ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

AI ์žฌ๊ณ  ๋“ฑ๋ก(์˜์ˆ˜์ฆ v2, ์‹ค๋ฌผ v3)

POST /api/v1/image-analyses โ†’ GET /api/v1/image-analyses/{analysisId} โ†’ POST R/ingredients ํ๋ฆ„์„ ํ•˜๋‚˜์˜ ๋“ฑ๋ก ๊ธฐ๋Šฅ์œผ๋กœ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค. ์ ‘์ˆ˜(202)ยท์กฐํšŒ(200)๋งŒ์œผ๋กœ ์„ฑ๊ณต ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ์ธ์‹ ๊ฒฐ๊ณผ์™€ ์ตœ์ข… ์ €์žฅ๊นŒ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ๋ถ„ ์ธก์ • ๋ฐฉ๋ฒ• ์šฉ๋„
์ฒ˜๋ฆฌ ์„ฑ๊ณต๋ฅ  ์œ ํšจํ•œ ์‚ฌ์ง„ ๋“ฑ๋ก ์ค‘ ์ธ์‹๋ถ€ํ„ฐ ์žฌ๊ณ  ์ €์žฅ๊นŒ์ง€ ์™„๋ฃŒ๋œ ๋น„์œจ ์šด์˜ SLO
์‹œ๊ฐ„ ๋‚ด ์„ฑ๊ณต๋ฅ  ํ ๋Œ€๊ธฐยท์ถ”๋ก ยทํ›„์ฒ˜๋ฆฌยท์ €์žฅ์„ ๊ฑฐ์ณ T์ดˆ ์•ˆ์— ์žฌ๊ณ ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๋น„์œจ ์šด์˜ SLO
ํ•„๋“œ๋ณ„ ์ •๋ฐ€๋„ยท์žฌํ˜„์œจ ์ •๋‹ต ์ž๋ฃŒ ๋Œ€๋น„ ์ด๋ฆ„ยท์ˆ˜๋Ÿ‰ยท์œ ํ†ต๊ธฐํ•œ ์ถ”์ถœ ์ •ํ™•๋„ AI ํ’ˆ์งˆ ๋ชฉํ‘œ

ํ’ˆ์งˆ ํ‰๊ฐ€์—๋Š” ๋Œ€ํ‘œ ์‚ฌ์ง„, ์‚ฌ๋žŒ์ด ํ™•์ธํ•œ ์ •๋‹ต, ๊ฐ’์˜ ์ •๊ทœํ™” ๊ทœ์น™์ด ํ•„์š”ํ•˜๋ฉฐ, ํ‰๊ฐ€์…‹ยท๋ชจ๋ธยทํ”„๋กฌํ”„ํŠธ ๋ฒ„์ „์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. confidence๋‚˜ ์‚ฌ์šฉ์ž ๋ฌด์ˆ˜์ • ๋น„์œจ์„ ์ •๋‹ต๋ฅ ๋กœ ๋Œ€์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์š”๋ฆฌ ์ถ”์ฒœยท๋ ˆ์‹œํ”ผ ๊ธฐ๋ฐ˜ ์†Œ๋น„ ์ฒ˜๋ฆฌ(v3)

์ž‘์—… ์ธก์ • API ํŒ์ • ๋ฐฉํ–ฅ
์š”๋ฆฌ ์ถ”์ฒœ POST R/recommendation-jobs โ†’ GET R/recommendations โ†’ GET R/recipes/{recipeId} ์ƒ์„ฑ ์ ‘์ˆ˜์™€ ๊ฒฐ๊ณผ ์ œ๊ณต์„ ๊ตฌ๋ถ„ํ•˜๊ณ , ์œ ํšจํ•œ ์ถ”์ฒœยท์ƒ์„ธ ์ œ๊ณต๊นŒ์ง€ ํ™•์ธ
๋ ˆ์‹œํ”ผ ๊ธฐ๋ฐ˜ ์†Œ๋น„ ์ฒ˜๋ฆฌ POST R/cooking-records ์„ ํƒ ๋ ˆ์‹œํ”ผ์˜ ์กฐ๋ฆฌ ๊ธฐ๋กยท์ฐจ๊ฐ์ด ํ•œ ๋ฒˆ๋งŒ ๋ฐ˜์˜๋˜๋Š”์ง€ ํ™•์ธ

๋ ˆ์‹œํ”ผ ๊ธฐ๋ฐ˜ ์†Œ๋น„ ์ฒ˜๋ฆฌ๋Š” ์ถ”์ฒœ ๋ ˆ์‹œํ”ผ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์žฌ๊ณ ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๊ณ  ๊ฐ„์ฃผํ•˜๋ฉฐ, ์‹ค์ œ ์กฐ๋ฆฌยท์„ญ์ทจ ์—ฌ๋ถ€์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์š”๋ฆฌํ•˜๊ฑฐ๋‚˜ ์„ญ์ทจํ•˜์ง€ ์•Š์•„ ์ƒ๊ธฐ๋Š” ์ƒํ™ฉ์€ ์„œ๋น„์Šค ์žฅ์• ์— ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

7. ์ถœ์ฒ˜

โš ๏ธ **GitHub.com Fallback** โš ๏ธ