Cloud Design 4th - 100-hours-a-week/KTB4-1st-wiki GitHub Wiki

4๋‹จ๊ณ„. ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค ํ™•์žฅ ๋ฐ ์šด์˜ ์ž๋™ํ™” ์„ค๊ณ„

1. ์„œ๋น„์Šค ์„ฑ์žฅ

1.1 ์„œ๋น„์Šค ์„ฑ์žฅ ์ƒํ™ฉ ๊ฐ€์ •

4๋‹จ๊ณ„์—์„œ๋Š” ๋ฐ”๊พธ๊นŒ v1 ์ถœ์‹œ ํ›„ ์งง์€ ๊ธฐ๊ฐ„์— ๋งŽ์€ ์‚ฌ์šฉ์ž๋“ค์ด ๋ชฐ๋ฆฐ ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•œ๋‹ค.

  1. ์‚ฌ์šฉ์ž ๊ธ‰์ฆ
  2. ํŒ€์› ์ˆ˜๋Š” ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์Œ
ํ•ญ๋ชฉ v1 ์ƒํ™ฉ ์„ฑ์žฅ ์ƒํ™ฉ
ํƒ€๊ฒŸ ์œ ์ € ์นดํ…Œ๋ถ€ ๊ต์œก์ƒ (20๋Œ€ ์ค‘๋ฐ˜-30๋Œ€ ์ดˆ๋ฐ˜) ๋Œ€ํ•™๊ต ๊ธฐ์ˆ™์‚ฌ์ƒ, 20-30๋Œ€ 1์ธ ๊ฐ€๊ตฌ
SOM(๋ชฉํ‘œ ์‹œ์žฅ) 120๋ช… 220๋งŒ ๋ช…
MAU 30๋ช… 20๋งŒ ๋ช…
DAU 30๋ช… 4๋งŒ ๋ช…
Peak ๋™์‹œ ์‚ฌ์šฉ์ž - 2,000
์ฒด๋ฅ˜ ์‹œ๊ฐ„ - 300์ดˆ
์„ธ์…˜ ํ‰๊ท  ์š”์ฒญ์ˆ˜ - 11.95
Peak RPS ํ‰๊ท  RPS 0.076 80
ํŠธ๋ž˜ํ”ฝ ์ง‘์ค‘ ์‹œ๊ฐ„ ํ‰์ผ ์‰ฌ๋Š” ์‹œ๊ฐ„(9:00โ€“18:00 ์ค‘ ๋งค์‹œ 50๋ถ„โ€“์ •๊ฐ) + ์ ์‹ฌ์‹œ๊ฐ„(12:00โ€“13:00) 20-23์‹œ
ํŠธ๋ž˜ํ”ฝ/์ž์› ์‚ฌ์šฉ๋Ÿ‰ ํฐ ๊ธฐ๋Šฅ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ, ๋ฌผํ’ˆ ๋“ฑ๋ก ๊ฒ€์ฆ ์‹œ AI API ํ˜ธ์ถœ v1 ๋™์ผ + ์Šค๋งˆํŠธ ๊ฒ€์ƒ‰
๋ฌผํ’ˆ ๋“ฑ๋ก ๊ฒ€์ฆ ์‹œ AI API ํ˜ธ์ถœ
2์ฐจ ๋ฐฐํฌ RPS ๊ณ„์‚ฐ (ํด๋ฆญํ•ด์„œ ํŽผ์น˜๊ธฐ)

์ž„์˜ ๊ฐ’

  • MAU/DAU ๋น„์œจ 20%
  • Peak ๋™์‹œ ์‚ฌ์šฉ์ž = DAU์˜ 5%
  • ์ฒด๋ฅ˜ ์‹œ๊ฐ„: 300์ดˆ

peak RPS ๊ณ„์‚ฐ

  1. user flow์˜ ์š”์ฒญ ์ˆ˜ ๊ณ„์‚ฐ
  2. ์„ธ์…˜ ๋ณ„ user flow ํ™•๋ฅ ์„ ์„ค์ •ํ•ด ์„ธ์…˜๋ณ„ ์š”์ฒญ ์ˆ˜ ๊ณ„์‚ฐ
  3. ์„ธ์…˜๋ณ„ ์š”์ฒญ ์ˆ˜ ๊ณ„์‚ฐ์„ ์ฒด๋ฅ˜ ์‹œ๊ฐ„์œผ๋กœ ๋‚˜๋ˆ  ์„ธ์…˜์˜ ์ดˆ๋‹น ์š”์ฒญ ์ˆ˜ ๊ณ„์‚ฐ
  4. ์„ธ์…˜ RPS๋ฅผ Peak ๋™์‹œ ์‚ฌ์šฉ์ž์™€ ๊ณฑํ•ด Peak ์‹œ๊ฐ„์˜ RPS๋ฅผ ๊ตฌํ•จ
์„ธ์…˜ ์‹œ์ž‘๋ฅ  = Peak ๋™์‹œ ์‚ฌ์šฉ์ž(์„ธ์…˜) ์ˆ˜ 2,000 / ์ฒด๋ฅ˜ ์‹œ๊ฐ„ 300์ดˆ = ์•ฝ 6.7 ์„ธ์…˜/์ดˆ
6.7 ์„ธ์…˜/์ดˆ x 11.95 ์š”์ฒญ/์„ธ์…˜ =  ์•ฝ 80

2์ฐจ ๋ฐฐํฌ ํ•ต์‹ฌ User Flow

๋ฒˆํ˜ธ User Flow ์š”์ฒญ ์š”์ฒญ ์ˆ˜ flow ๋น„์ค‘ ๊ฐ€์ค‘ ์š”์ฒญ ์ˆ˜
1 ์นด์นด์˜ค ๋กœ๊ทธ์ธ โ†’ ํ™ˆ์—์„œ ๋ฌผ๊ฑด ๋ชฉ๋ก ํƒ์ƒ‰ โ†’ ๋ฌผ๊ฑด ์ƒ์„ธ ๋กœ๊ทธ์ธ 2, ํ™ˆ ๋ชฉ๋ก 2, ์ƒ์„ธ 3 7 100% 7
2 ๋ฌผ๊ฑด ๋“ฑ๋ก(์‚ฌ์ง„ ์—…๋กœ๋“œ) ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ 3, ๋“ฑ๋ก ์ €์žฅ 1, ๋“ฑ๋ก์™„๋ฃŒ ์ƒ์„ธ์กฐํšŒ 1 5 30% 1.5
3 ๋ฌผ๊ฑด ์ƒ์„ธ โ†’ ๊ตํ™˜ ์š”์ฒญ โ†’ ์ฑ„ํŒ…๋ฐฉ ์ƒ์„ฑ โ†’ ๊ตํ™˜ ์ˆ˜๋ฝ/๊ฑฐ์ ˆ ๋‚ด ๋ฌผ๊ฑด ์„ ํƒ ์กฐํšŒ 1, ๊ตํ™˜์š”์ฒญ ์ƒ์„ฑ 1, ์ฑ„ํŒ…๋ฐฉ ์ƒ์„ฑ 1, ์ฑ„ํŒ… ํžˆ์Šคํ† ๋ฆฌ ์กฐํšŒ 1, ๋ฉ”์‹œ์ง€ ์†ก์ˆ˜์‹ (์‹œ๊ฐ„/์žฅ์†Œ ์กฐ์œจ ์™•๋ณต) 7, ๊ตํ™˜ ์™„๋ฃŒ/๊ฑฐ์ ˆ 1 12 15% 1.8
4 ๊ฒ€์ƒ‰ โ†’ ๋ฌผ๊ฑด ์ƒ์„ธ โ†’ ๊ด€์‹ฌ ๋ฌผํ’ˆ ๋“ฑ๋ก ๊ฒ€์ƒ‰ API 1, ์ƒ์„ธ์กฐํšŒ 2, ๊ด€์‹ฌ๋“ฑ๋ก 1 4 30% 1.2
5 ์Šค๋งˆํŠธ ๊ฒ€์ƒ‰ โ†’ ๋ฌผ๊ฑด ์ƒ์„ธ โ†’ ๊ด€์‹ฌ ๋ฌผํ’ˆ ๋“ฑ๋ก ์Šค๋งˆํŠธ๊ฒ€์ƒ‰(LLM ํ˜ธ์ถœยท๋‹ค์ค‘๋ฌผ๊ฑด+ํ…์ŠคํŠธ) 1, ์ƒ์„ธ์กฐํšŒ 3, ๊ด€์‹ฌ๋“ฑ๋ก 1 5 5% 0.25
6 ๊ด€์‹ฌ ๋ชฉ๋ก โ†’ ๊ด€์‹ฌ ๋ฌผํ’ˆ ์ƒ์„ธ ๊ด€์‹ฌ ๋ชฉ๋ก ๋ถˆ๋Ÿฌ์˜ค๊ธฐ 1 1 20% 0.2
ํ•ฉ๊ณ„ 11.95
2์ฐจ ๋ฐฐํฌ ํƒ€๊ฒŸ ์‹œ์žฅ (ํด๋ฆญํ•ด์„œ ํŽผ์น˜๊ธฐ)

TAM ์ „์ฒด ์ž ์žฌ ์‹œ์žฅ

์˜จ๋ผ์ธ ๋Œ€๋Ÿ‰๊ตฌ๋งค ํ›„ ์†Œ์•ก ์ƒํ•„ํ’ˆ ์ฒ˜์น˜์— ๊ณค๋ž€์„ ๊ฒช์„ ์ˆ˜ ์žˆ๋Š” 1์ธ ์ƒํ™œ ์ธ๊ตฌ

  • ๋Œ€ํ•™์ƒ 301๋งŒ ๋ช… + 20-30๋Œ€ 1์ธ๊ฐ€๊ตฌ ์•ฝ 289๋งŒ ๊ฐ€๊ตฌ(์ „์ฒด 1์ธ๊ฐ€๊ตฌ 805๋งŒ ์ค‘ 20-30๋Œ€ 35.6%)
  • ๋‹จ์ˆœ ํ•ฉ์‚ฐ ์‹œ ์•ฝ 590๋งŒ ๋ช… ๊ทœ๋ชจ์ง€๋งŒ, ์ž์ทจํ•˜๋Š” ๋Œ€ํ•™์ƒ์€ 1์ธ๊ฐ€๊ตฌ ํ†ต๊ณ„์—๋„ ์ผ๋ถ€ ์ค‘๋ณต ์ง‘๊ณ„๋˜๋ฏ€๋กœ ์ค‘๋ณต๋ถ„ 20% ์•ˆํŒŽ(๊ฐ€์ •) ์ œ์™ธํ•˜๋ฉด ์•ฝ 500๋งŒ ๋ช…
  • ์ด ์ธ๊ตฌ ์ „์ฒด๊ฐ€ "ํ˜ผ์ž ์‚ด๋ฉด์„œ ์ƒํ•„ํ’ˆ ์žฌ๊ณ ๋ฅผ ์Šค์Šค๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”" ๊ณตํ†ต์ ์ธ ์ƒํ™ฉ์„ ๊ฐ€์ง

SAM ์œ ํšจ ์‹œ์žฅ

๋ฌผ๋ฆฌ์  ๊ฒฝ๊ณ„๊ฐ€ ๋šœ๋ ทํ•œ ๋ฐ€์ง‘ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์‹ค์ œ๋กœ ๊ฑฐ์ฃผ/์†Œ์†๋œ ์‚ฌ๋žŒ

  • ๋Œ€ํ•™๊ต ๊ธฐ์ˆ™์‚ฌ์ƒ 66๋งŒ๋ช…(4๋…„์žฌ ๋Œ€ํ•™๊ต ๊ธฐ์ˆ™์‚ฌ ์ˆ˜์šฉ๋ฅ  22%)
  • ์•„ํŒŒํŠธ, ์˜คํ”ผ์Šคํ…”์— ์ž์ทจํ•˜๋Š” 20-30๋Œ€: 20๋Œ€ 1์ธ ๊ฐ€๊ตฌ(์•ฝ 150๋งŒ ๊ฐ€๊ตฌ, ์ „์ฒด 824๋งŒ ร— 17.8%) ์ค‘ 50% 75๋งŒ๋ช…(20% ์•„ํŒŒํŠธ + 30% ๋‹ค๊ฐ€๊ตฌ๋‹จ๋…) + 30๋Œ€ 1์ธ ๊ฐ€๊ตฌ(143๋งŒ ๊ฐ€๊ตฌ, 824๋งŒ ร— 17.4%) ์ค‘ 55.3%(์•„ํŒŒํŠธ 36.1% + ๋‹ค๊ฐ€๊ตฌ๋‹จ๋… 19.2%) 79๋งŒ๋ช… = 154๋งŒ๋ช…
  • ํ•ฉ๊ณ„ 220๋งŒ๋ช…

SOM ๋ชฉํ‘œ ์‹œ์žฅ

์šฐ๋ฆฌ ์„œ๋น„์Šค๋Š” ์œ ํšจ ์‹œ์žฅ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์„ ๋ชฉํ‘œ ์‹œ์žฅ์œผ๋กœ ๋‘”๋‹ค.

์š”์ฒญ ์„ฑ๊ฒฉ๋ณ„(R/W) ๋ถ„๋ฅ˜ (ํด๋ฆญํ•ด์„œ ํŽผ์น˜๊ธฐ)

Peak RPS 80์€ ํ•˜๋‚˜์˜ ๋ฉ์–ด๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์–ด๋–ค ์š”์ฒญ์ด ์–ผ๋งˆ๋‚˜ ๋ฐœ์ƒํ•˜๋Š”์ง€์— ๋”ฐ๋ผ ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ, ์œ„ User Flow๋ฅผ ์š”์ฒญ ์„ฑ๊ฒฉ๋ณ„๋กœ ๋ถ„ํ•ดํ•œ๋‹ค.

  • ์„ธ์…˜๋‹น ์š”์ฒญ ์ˆ˜ = flow๋ณ„ ์š”์ฒญ ์ˆ˜ x flow ๋น„์ค‘ ์„ ํ•ฉ์‚ฐํ•œ ๊ฐ’
  • Peak RPS = ์„ธ์…˜๋‹น ์š”์ฒญ ์ˆ˜ x ์„ธ์…˜ ์‹œ์ž‘๋ฅ  6.7 ์„ธ์…˜/์ดˆ
    • ๋™์‹œ์— 2,000๊ฐœ์˜ ์„ธ์…˜์ด ์žˆ๊ณ , ๊ฐ ์„ธ์…˜์˜ ์ฒด๋ฅ˜ ์‹œ๊ฐ„์ด 300์ด๋ฏ€๋กœ ์ดˆ๋‹น 2,000/300๊ฐœ์˜ ์„ธ์…˜์ด ์ƒ๊ธฐ๊ณ  ์‚ฌ๋ผ์ง
  • ์•„๋ž˜ ํ‘œ๋Š” Nginx๋ฅผ ๊ฑฐ์ณ ๋ฐฑ์—”๋“œ(Spring Boot)๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ๋งŒ ์ง‘๊ณ„ํ•œ๋‹ค. ์ด๋ฏธ์ง€ ํŒŒ์ผ ์ž์ฒด๋Š” presigned URL๋กœ S3์— ์ง์ ‘ ์—…๋กœ๋“œ๋˜์–ด Nginx/๋ฐฑ์—”๋“œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ง‘๊ณ„์—์„œ ์ œ์™ธ๋œ๋‹ค.
  • APP ์ดํ›„๋Š” ๋ฐฑ์—”๋“œ๊ฐ€ ์ฒ˜๋ฆฌํ•œ ๋‹ค์Œ ์ด์–ด์ง€๋Š” ๊ฒฝ๋กœ๋ฅผ ๋œปํ•œ๋‹ค.
์„ฑ๊ฒฉ ์š”์ฒญ ์„ธ์…˜๋‹น ์š”์ฒญ ์ˆ˜ Peak RPS APP(Spring) ์ฒ˜๋ฆฌ APP ์ดํ›„
์ฝ๊ธฐ ๋ฌผ๊ฑด ์ƒ์„ธ ์กฐํšŒ 4.05 27.1 ์กฐํšŒ API DB ์ฝ๊ธฐ
์ฝ๊ธฐ ํ™ˆ ๋ชฉ๋ก ์กฐํšŒ 2.00 13.4 ์กฐํšŒ API DB ์ฝ๊ธฐ
์ฝ๊ธฐ ๊ฒ€์ƒ‰ 0.30 2.0 ์กฐํšŒ API DB ์ฝ๊ธฐ
์ฝ๊ธฐ ๊ด€์‹ฌ ๋ชฉ๋ก ์กฐํšŒ 0.20 1.3 ์กฐํšŒ API DB ์ฝ๊ธฐ
์ฝ๊ธฐ ์ฑ„ํŒ… ํžˆ์Šคํ† ๋ฆฌ ์กฐํšŒ 0.15 1.0 ์กฐํšŒ API DB ์ฝ๊ธฐ
์ฝ๊ธฐ ๋‚ด ๋ฌผ๊ฑด ์„ ํƒ ์กฐํšŒ 0.15 1.0 ์กฐํšŒ API DB ์ฝ๊ธฐ
์ฝ๊ธฐ ์Šค๋งˆํŠธ ๊ฒ€์ƒ‰ 0.05 0.3 ๊ฐ€๊ฒฉ ํ•„ํ„ฐ๋งยท์ทจํ–ฅ ์กฐํšŒ ํ›„ AI ์„œ๋ฒ„ ํ˜ธ์ถœ DB ์ฝ๊ธฐ + AI ์„œ๋ฒ„
์ฝ๊ธฐ ์†Œ๊ณ„ 6.90 46.2 (57.7%)
์“ฐ๊ธฐ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ 0.90 6.0 presigned URL ๋ฐœ๊ธ‰(์žฅ๋‹น 1ํšŒ) FE โ†’ S3 ์ง์ ‘ ์—…๋กœ๋“œ โ†’ AI ์„œ๋ฒ„๊ฐ€ presigned URL๋กœ ์ด๋ฏธ์ง€ ์กฐํšŒยท๊ฒ€์ฆ
์“ฐ๊ธฐ ๊ด€์‹ฌ ๋“ฑ๋ก 0.35 2.3 ๋“ฑ๋ก API DB ์“ฐ๊ธฐ
์“ฐ๊ธฐ ๋ฌผ๊ฑด ๋“ฑ๋ก ์ €์žฅ 0.30 2.0 ๋“ฑ๋ก ๊ฒ€์ฆ ๋Œ€๊ธฐ AI ์„œ๋ฒ„ ์ˆœ์ฐจ 3ํšŒ โ†’ DB ์“ฐ๊ธฐ
์“ฐ๊ธฐ ๊ตํ™˜ ์š”์ฒญ ์ƒ์„ฑ 0.15 1.0 ๋“ฑ๋ก API DB ์“ฐ๊ธฐ
์“ฐ๊ธฐ ์ฑ„ํŒ…๋ฐฉ ์ƒ์„ฑ 0.15 1.0 ๋“ฑ๋ก API DB ์“ฐ๊ธฐ
์“ฐ๊ธฐ ๊ตํ™˜ ์™„๋ฃŒ/๊ฑฐ์ ˆ 0.15 1.0 ์ƒํƒœ ๋ณ€๊ฒฝ API DB ์“ฐ๊ธฐ
์“ฐ๊ธฐ ์†Œ๊ณ„ 2.00 13.4 (16.7%)
์ธ์ฆ ์นด์นด์˜ค ๋กœ๊ทธ์ธ(๋ฆฌ๋‹ค์ด๋ ‰ํŠธ + ์ฝœ๋ฐฑ) 2.00 13.4 ์ฝœ๋ฐฑ ์ฒ˜๋ฆฌ, ์‚ฌ์šฉ์ž ์กฐํšŒ, ์„ธ์…˜ ๋ฐœ๊ธ‰ ์™ธ๋ถ€ ์นด์นด์˜ค OAuth + ์„ธ์…˜ ์ €์žฅ์†Œ
์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ์†ก์ˆ˜์‹  1.05 7.0 WebSocket ์—ฐ๊ฒฐ ์œ ์ง€, ๋ฉ”์‹œ์ง€ ์ค‘๊ณ„ DB ์“ฐ๊ธฐ
ํ•ฉ๊ณ„ 11.95 80.1

1.2 v1 ๋ฐฐํฌ ๊ตฌ์กฐ

v1์€ ์ ์€ ๋น„์šฉ๊ณผ ๋น ๋ฅธ ๋ฐฐํฌ ๋‘ ๊ฐ€์ง€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ค๊ณ„ํ–ˆ๊ณ , ๊ทธ ๊ฒฐ๊ณผ EC2 t4g.small(2 vCPU / 2 GiB) ๋‹จ์ผ ์ธ์Šคํ„ด์Šค ํ•œ ๋Œ€์— ์„œ๋น„์Šค์˜ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ฐฐํฌํ–ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ ๋„๊ตฌ๋Š” Docker Compose๋‹ค.

flowchart TB
    U["์‚ฌ์šฉ์ž"]

    subgraph AWS["AWS ์„œ์šธ ๋ฆฌ์ „ ยท ๋‹จ์ผ AZ"]
        subgraph EC2["EC2 t4g.small ยท 2 vCPU / 2 GiB ยท ๋‹จ์ผ ์ธ์Šคํ„ด์Šค"]
            NG["Nginx<br/>SSL ์ข…๋ฃŒ ยท ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ"]
            FE["Next.js<br/>ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋ฒ„"]
            BE["Spring Boot<br/>๋ฐฑ์—”๋“œ API"]
            AI["FastAPI<br/>AI ์„œ๋ฒ„<br/>+ ChromaDB(์ธ๋ฉ”๋ชจ๋ฆฌ)"]
            DB[("MySQL")]
        end
        EBS[("EBS<br/>DB ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ")]
        S3[("S3<br/>์—…๋กœ๋“œ ์ด๋ฏธ์ง€")]
    end

    LLM["Claude API"]
    MODAL["Modal ์„œ๋ฒ„๋ฆฌ์Šค"]

    U -->|HTTPS 443| NG
    NG -->|/| FE
    NG -->|/api<br/>WebSocket ์—ฐ๊ฒฐ| BE
    FE -->|SSR ๋ Œ๋”๋ง์šฉ API ํ˜ธ์ถœ| BE
    BE -->|presigned URL ๋ฐœ๊ธ‰| FE
    FE -->|์ด๋ฏธ์ง€ ์—…๋กœ๋“œ<br/>presigned URL| S3
    BE -->|์ด๋ฏธ์ง€ URLยทํ…์ŠคํŠธยท์‹œ์„ธยท๊ฒ€์ƒ‰| AI
    AI -->|์ด๋ฏธ์ง€ ์กฐํšŒ<br/>presigned URL| S3
    BE --> DB
    AI --> LLM
    AI --> MODAL
    DB --- EBS
Loading
๊ตฌ์„ฑ ์š”์†Œ ๋ฐฐํฌ ํ˜•ํƒœ ํ• ๋‹น ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ(State) ๋ณด์œ 
Nginx ์ปจํ…Œ์ด๋„ˆ 50 MB ์—†์Œ
Next.js ์ปจํ…Œ์ด๋„ˆ 256 MB ์—†์Œ
Spring Boot ์ปจํ…Œ์ด๋„ˆ 1 GB WebSocket ์—ฐ๊ฒฐ
FastAPI(AI ์„œ๋ฒ„) ์ปจํ…Œ์ด๋„ˆ 256 MB ์ •์ฑ…๋ฌธ์„œ ๋ฒกํ„ฐ ์ธ๋ฑ์Šค(ChromaDB, ์ธ๋ฉ”๋ชจ๋ฆฌ)
MySQL ์ปจํ…Œ์ด๋„ˆ + EBS ๋ณผ๋ฅจ ๋งˆ์šดํŠธ 384 MB ์„œ๋น„์Šค ๋ฐ์ดํ„ฐ ์ „์ฒด

v1 ๊ตฌ์กฐ ์ „์ œ์™€ ์ด์œ 

ํ•ญ๋ชฉ v1์˜ ์ „์ œ v1์—์„œ ๊ทธ๋ ‡๊ฒŒ ์ •ํ•œ ์ด์œ 
ํŠธ๋ž˜ํ”ฝ ์ง‘์ค‘ ์‹œ๊ฐ„๋Œ€ ํ‰๊ท  0.076 RPS DAU 30๋ช…, ์‚ฌ์šฉ ์‹œ๊ฐ„๋Œ€๊ฐ€ ๊ณ ์ •๋จ
์žฅ์•  ํ—ˆ์šฉ ์ˆ˜์ค€ ์„œ๋น„์Šค๊ฐ€ ์ž ์‹œ ์ค‘๋‹จ๋˜์–ด๋„ ๊ดœ์ฐฎ๋‹ค ๋ถ€ํŠธ์บ ํ”„ ๋‚ด๋ถ€์—์„œ๋งŒ ์“ฐ๋Š” ํ์‡„์  ์„œ๋น„์Šค
ํ™•์žฅ ๋ฐฉ์‹ ์ธ์Šคํ„ด์Šค ์ฒด๊ธ‰์„ ์˜ฌ๋ฆฌ๋Š” Scale-Up๋งŒ ๊ฐ€๋Šฅ DB๊ฐ€ ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€์— ์žˆ์–ด ์„œ๋ฒ„ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ณต์œ  ๋ถˆ๊ฐ€
์ง„์ž…์  Nginx ์ปจํ…Œ์ด๋„ˆ๊ฐ€ SSL ์ข…๋ฃŒ์™€ ๋ผ์šฐํŒ…์„ ๋ชจ๋‘ ๋‹ด๋‹น ALB ๋น„์šฉ(์›” $16~22)์„ ์“ฐ์ง€ ์•Š๊ธฐ ์œ„ํ•ด
๋ฐฐํฌ ์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘ ๋ฐฉ์‹, ๋ฐฐํฌ ์ค‘ ๋‹ค์šดํƒ€์ž„ ๋ฐœ์ƒ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•œ ๋Œ€๋ฟ์ด๋ผ ์ „ํ™˜ํ•  ๋Œ€์ƒ์ด ์—†์Œ

v1์˜ ์ด ์ „์ œ๋“ค์€ ๋‹น์‹œ ์ƒํ™ฉ์—์„œ๋Š” ๋งž๋Š” ์„ ํƒ์ด์—ˆ๋‹ค. 2์žฅ์—์„œ๋Š” 1.1์—์„œ ๊ฐ€์ •ํ•œ v2 ํŠธ๋ž˜ํ”ฝ์ด ์ด ๊ตฌ์กฐ์— ๊ทธ๋Œ€๋กœ ๋“ค์–ด์™”์„ ๋•Œ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค.

2. ์„œ๋น„์Šค ์„ฑ์žฅ ์ƒํ™ฉ์—์„œ ๋“œ๋Ÿฌ๋‚œ v1 ๊ตฌ์กฐ์˜ ํ•œ๊ณ„

์•ž์„œ ๊ฐ€์ •ํ•œ ํŠธ๋ž˜ํ”ฝ(Peak RPS 80, ๋™์‹œ ์‚ฌ์šฉ์ž 2,000)์ด v1 ๊ตฌ์กฐ์— ๊ทธ๋Œ€๋กœ ๋“ค์–ด์˜ค๋ฉด, ์•„๋ž˜ ๋ฌธ์ œ๋“ค์ด ๋ฐœ์ƒํ•œ๋‹ค.

  1. ์ธ์Šคํ„ด์Šค ํ•œ ๋Œ€์˜ ์„ฑ๋Šฅ์ด ๊ณง ์ฒ˜๋ฆฌ๋Ÿ‰ ์ƒํ•œ
  2. ์„œ๋น„์Šค Scale-Out ๋ถˆ๊ฐ€๋Šฅ
    • ๋กœ๊ทธ์ธ ์„ธ์…˜์ด ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€์—์„œ ๊ด€๋ฆฌ๋˜๋ฉฐ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๊ฐ€ ๋™์ผ ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ๋™์ž‘๋˜๋ฏ€๋กœ, ๋‘ ๋ฒˆ์งธ ์„œ๋ฒ„๋ฅผ ๋„์›Œ๋„ ๊ฐ™์€ ์ƒํƒœ๋ฅผ ๋ณด์ง€ ๋ชปํ•จ
  3. ๋‹จ์ผ ์žฅ์• ์ (SPOF)
    • ๋ชจ๋“  ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ํ•œ ์ธ์Šคํ„ด์Šค์— ํฌํ•จ๋˜์–ด ์žˆ์–ด ์ธ์Šคํ„ด์Šค ์ •์ง€, ์ปค๋„ ํŒจ๋‹‰, OOM ๋ฐœ์ƒ ์‹œ ์„œ๋น„์Šค ์ „์ฒด ์ค‘๋‹จ
  4. Tomcat Thread Pool ๋ฐ Connection ๊ณ ๊ฐˆ
    • ๊ธฐ๋ณธ ์ž„๋ฒ ๋””๋“œ Tomcat Thread๋Š” 200๊ฐœ
    • FastAPI๋ฅผ ๊ฑฐ์ณ LLM์„ ๋™๊ธฐ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์–ด ์‘๋‹ต ๋Œ€๊ธฐ ์‹œ๊ฐ„ ๋™์•ˆ Thread ๋ฏธ๋ฐ˜ํ™˜
    • Peak ์‹œ Thread ๊ณ ๊ฐˆ๋กœ ์ธํ•ด ์ „์ฒด API ์ค‘๋‹จ
  5. ๋‹จ์ผ ํ˜ธ์ŠคํŠธ I/O ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ณ‘๋ชฉ
    • ๊ธฐ์กด MySQL ์„ค์ •(buffer-pool-size=128M, max-connections=30)์€ Peak ์‹œ Connection ์—๋Ÿฌ ๋ฐœ์ƒ
    • MySQL, MongoDB, OS ๋กœ๊ทธ๊ฐ€ ํ•˜๋‚˜์˜ EBS ๋””์Šคํฌ I/O๋ฅผ ๊ณต์œ ํ•˜์—ฌ I/O ๋ณ‘๋ชฉ์œผ๋กœ ์ธํ•ด ์ „์ฒด ์‹œ์Šคํ…œ ์ค‘๋‹จ
  6. ๋ฐฐํฌ ์‹œ ์ค‘๋‹จ ๋ฐœ์ƒ
    • DAU 4๋งŒ ๋ช…์˜ ์„œ๋น„์Šค๋Š” ์ƒ์‹œ ํŠธ๋ž˜ํ”ฝ์ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ฃผ 1ํšŒ ์ •๊ธฐ ๋ฐฐํฌ ์‹œ ์ตœ๋Œ€ 5๋ถ„์˜ In-Place ๋‹ค์šดํƒ€์ž„์œผ๋กœ ์‚ฌ์šฉ์ž ์ดํƒˆ ๋ฐœ์ƒ

3. v2 ํ™•์žฅ ๊ธฐ์ค€

v2์—์„œ๋Š” v1๊ณผ ๋‹ฌ๋ฆฌ, MAU๊ฐ€ 20๋งŒ๋ช…, peak RPS๊ฐ€ 80์œผ๋กœ ์‚ฌ์šฉ์ž์ธต๊ณผ ํŠธ๋ž˜ํ”ฝ์ด ๋งค์šฐ ์„ฑ์žฅํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž์ธต์ด ํ™•์žฅ๋˜๋ฉด์„œ, ์šฐ๋ฆฌ ์‚ฌ์šฉ์ž๋“ค์€ ๋”์ด์ƒ ์„œ๋น„์Šค ์ค‘๋‹จ์„ ์šฉ๋‚ฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ v1์˜ "์ ์€ ๋น„์šฉ"๊ณผ "๋น ๋ฅธ ๋ฐฐํฌ" ๋ผ๋Š” ๊ธฐ์ค€์„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ v2์˜ ๊ธฐ์ค€์„ ์ƒˆ๋กœ ์ •๋ฆฌํ•œ๋‹ค.

์ˆœ์„œ ๊ธฐ์ค€ ์„ค๋ช… ํ•˜ํ•œ์„ 
1 ์ตœ์†Œ ๋น„์šฉ ๊ฐ‘์ž‘์Šค๋Ÿฌ์šด ์„œ๋น„์Šค ์„ฑ์žฅ ์ƒํ™ฉ์œผ๋กœ ์ธํ•ด, ํšŒ์‚ฌ๋Š” ์•„์ง ์ธํ”„๋ผ์— ํˆฌ์žํ•  ๋น„์šฉ์ด ํฌ์ง€ ์•Š๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์—ฌ, ์ ์€ ๋น„์šฉ์„ ๋“ค์ด๋Š” ๊ฒƒ์„ ๊ฐ€์žฅ ์šฐ์„ ํ•œ๋‹ค -
2 ๊ฐ€์šฉ์„ฑ ํ•˜๋‚˜์˜ ์žฅ์• ๊ฐ€ ์„œ๋น„์Šค ์ค‘๋‹จ์œผ๋กœ ์ด์–ด์ง€์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค ์ธ์Šคํ„ด์Šค ํ•œ ๋Œ€์˜ ์žฅ์• ๊ฐ€ ์„œ๋น„์Šค ์ค‘๋‹จ์œผ๋กœ ์ด์–ด์ง€์ง€ ์•Š๋Š”๋‹ค
3 ํ™•์žฅ์„ฑ ์‚ฌ์šฉ์ž๊ฐ€ ๋Š˜์–ด๋‚ฌ์„ ๋•Œ ํฐ ๊ตฌ์กฐ์˜ ๋ณ€ํ™” ์—†์ด ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค ์ฒ˜๋ฆฌ๋Ÿ‰ ์ฆ์„ค์ด ์ธ์Šคํ„ด์Šค๋‚˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค
4 ๋ฐ์ดํ„ฐ ๋ณด์กด ์žฅ์• ๊ฐ€ ๋‚˜๋„ ๊ฑฐ๋ž˜ ๊ธฐ๋ก์ด ์‚ฌ๋ผ์ง€์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค ์žฅ์•  ์‹œ์  ์ง์ „๊นŒ์ง€ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค
5 ์šด์˜ ๋ณต์žก๋„ ๊ฐ‘์ž‘์Šค๋Ÿฌ์šด ์„œ๋น„์Šค ์„ฑ์žฅ์—์„œ, ํŒ€์ด ์•„์ง ์ปค์ง€์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ธํ”„๋ผ ๋‹ด๋‹น 2์ธ์ด ์šด์˜ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค -
6 ๋ณด์•ˆ์„ฑ ์ธํ”„๋ผ์™€ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ตœ์†Œํ•œ์˜ ๋ณด์•ˆ์„ฑ์„ ํ™•๋ณดํ•ด์•ผ ํ•œ๋‹ค -
7 ์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ ์žฅ์• ์— ๋Œ€ํ•ด ํ™•์ธํ•˜๊ณ  ์กฐ์น˜ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์†Œํ•œ์˜ ๊ด€์ธก์„ฑ์„ ํ™•๋ณดํ•ด์•ผ ํ•œ๋‹ค -
  • ๊ฐ€์šฉ์„ฑ์€ ๋ชจ๋“  ๊ธฐ๋Šฅ์— ๊ฐ™์€ ์ˆ˜์ค€์œผ๋กœ ์ ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ธฐ๋Šฅ๋งˆ๋‹ค ์‚ฌ์šฉ์ž๊ฐ€ ๋А๋ผ๋Š” ์‹คํŒจ์˜ ๋ฌด๊ฒŒ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋ฐ์ดํ„ฐ ๋ณด์กด์„ ๊ฐ€์šฉ์„ฑ๊ณผ ๋ถ„๋ฆฌํ•œ ์ด์œ : ์„œ๋น„์Šค๊ฐ€ ์ž ์‹œ ๋ฉˆ์ถ”๋Š” ๊ฒƒ๊ณผ ๊ฑฐ๋ž˜ ๊ธฐ๋ก์ด ์‚ฌ๋ผ์ง€๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ๋ฌธ์ œ์ด๋‹ค.
  • ํ•˜ํ•œ์„ ์— ๋ฏธ๋‹ฌํ•˜๋Š” ์„ ํƒ์ง€๋Š” ๋‹ค๋ฅธ ๊ธฐ์ค€์„ ์•„๋ฌด๋ฆฌ ์ž˜ ๋งŒ์กฑํ•ด๋„ ์„ ํƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ํ•˜ํ•œ์„ ์ด ์—†๋Š” ๊ธฐ์ค€์€ ๋น„๊ต ๊ธฐ์ค€์ด๋‹ค. ํ•˜ํ•œ์„ ์„ ํ†ต๊ณผํ•œ ์„ ํƒ์ง€๊ฐ€ ์—ฌ๋Ÿฟ ๋‚จ์•˜์„ ๋•Œ ์ˆœ์„œ๋Œ€๋กœ ์ ์šฉํ•ด ๊ณ ๋ฅธ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ™์€ ๊ธฐ์ค€์„ ๋งŒ์กฑํ•œ๋‹ค๋ฉด ๋น„์šฉ์ด ์ ์€ ์ชฝ์„ ์„ ํƒํ•œ๋‹ค.
  • ํ•˜๋‚˜์˜ ๊ธฐ์ค€๋งŒ์œผ๋กœ ์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์—ฌ๋Ÿฌ ๊ธฐ์ค€์„ ๋™์‹œ์— ๊ณ ๋ คํ•œ๋‹ค.

4. APP ํ™•์žฅ ๋ฐฉํ–ฅ

v1 ์ธํ”„๋ผ๋Š” ํŠธ๋ž˜ํ”ฝ์ด ๊ธ‰์ฆํ•œ ์ƒํ™ฉ์„ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ์ด ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๋„๋ก ์ธํ”„๋ผ ๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์ธ์Šคํ„ด์Šค ์„ฑ๋Šฅ์„ ๋†’์ด๋Š” Scale-up๊ณผ ์ธ์Šคํ„ด์Šค ๊ฐœ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๋Š” Scale-out ์ „๋žต์ด ์žˆ๋‹ค.

4.1 Scale-Up

MySQL, MongoDB

  • ์ธ๋ฑ์‹ฑ๊ณผ ํŠœ๋‹(์ฟผ๋ฆฌ, ์ž์›) ์ž‘์—…์„ ํ†ตํ•ด 2,000 QPS๋„ ์ถฉ๋ถ„ํžˆ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ถ„์‚ฐ DB, ์ƒค๋”ฉ์€ ์šด์˜ ๋ณต์žก๋„(๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜, ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ)๊ฐ€ ๋†’์•„์ง€๋Š” ๋ฐ ๋น„ํ•ด Peak RPS๊ฐ€ 80์ธ ์ƒํ™ฉ์—๋Š” ํ•„์ˆ˜์ ์ด์ง€ ์•Š๋‹ค.
  • ์„œ๋ฒ„ 1๋Œ€์— ์˜์กดํ•˜๋ฉด ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์ „์ฒด ์„œ๋น„์Šค๊ฐ€ ์ค‘๋‹จ๋˜๊ธฐ ๋•Œ๋ฌธ์— Read Replica๋ฅผ 1๋Œ€ ์ถ”๊ฐ€๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.
    => ์‚ฌ์šฉ์ž ์ˆ˜๊ฐ€ ๊ธ‰๊ฒฉํžˆ ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์Šคํ…œ ์ค‘๋‹จ์œผ๋กœ ์ธํ•œ UX ์ €ํ•˜๋Š” ์น˜๋ช…์ ์ด๊ธฐ์— ๋ณต์ œ๋ณธ 1๋Œ€ ์ •๋„์˜ ์ถ”๊ฐ€ ๋น„์šฉ์€ ๊ฐ์ˆ˜ํ•œ๋‹ค.

4.2 Scale-Out

Important

WAS์™€ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋Š” Scale-out ์ „๋žต์œผ๋กœ App ์„œ๋น„์Šค๋ฅผ ํ™•์žฅํ•œ๋‹ค.

๋ฐฑ์—”๋“œ ์„œ๋ฒ„

  • Scale-up ์ „๋žต์€ v1์˜ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค ๊ตฌ์„ฑ์œผ๋กœ ์ธํ•ด, v2 ํ™•์žฅ ๊ธฐ์ค€ ์ค‘์—์„œ ๊ฐ€์šฉ์„ฑ ํ•˜ํ•œ์„ (ํ•˜๋‚˜์˜ ์žฅ์• ๊ฐ€ ์„œ๋น„์Šค ์ค‘๋‹จ์œผ๋กœ ์ด์–ด์ง€์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค)์— ๋„๋‹ฌํ•˜์ง€ ๋ชปํ•œ๋‹ค.

WAS(Stateless)

  • ์žฅ์•  ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ณ , ๋ถ„์‚ฐ์œผ๋กœ ์ธํ•œ ์šด์˜ ๋ณต์žก๋„๊ฐ€ ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์•„ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค์— ๋ณต์ œ๋ณธ์„ ๋ฐฐ์น˜ํ•œ๋‹ค.
  • [๋ฐ”๊พธ๊นŒ]์˜ ํ•ต์‹ฌ ์œ ์ €ํ”Œ๋กœ์šฐ์ธ ๋ฌผ๋ฌผ๊ตํ™˜์„ ์œ„ํ•ด์„œ๋Š” ์ฑ„ํŒ…์„ ๊ฑฐ์ณ์•ผ๋งŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฑ„ํŒ…(์›น์†Œ์ผ“) ์š”์ฒญ๋Ÿ‰์˜ ๋น„์ค‘์ด ๋งค์šฐ ํฌ๋‹ค. ๋”ฐ๋ผ์„œ API ์„œ๋ฒ„์™€ ์›น์†Œ์ผ“ ์„œ๋ฒ„๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค.

4.3 App ํ™•์žฅ ๋‹จ์œ„ - Multi AZ

Important

์šฐ๋ฆฌ ์„œ๋น„์Šค๋Š” ๊ตญ๋‚ด์—๋งŒ ๋ฐฐํฌํ•˜๋ฉฐ, AZ์žฅ์• ๊ฐ€ ์„œ๋น„์Šค ์ค‘๋‹จ์œผ๋กœ ์ด์–ด์ง€์ง€ ์•Š๋„๋ก ๋™์ผ ๋ฆฌ์ „์—์„œ 2๊ฐœ ์ด์ƒ์˜ AZ์— ์ธ์Šคํ„ด์Šค๋ฅผ ํ™•์žฅํ•œ๋‹ค.

Scale out ์ „๋žต์œผ๋กœ ์„œ๋น„์Šค๋ฅผ ํ™•์žฅํ•  ๋•Œ, ๋™์ผ AZ ํ˜น์€ ๋‹ค๋ฅธ AZ์— ์ธ์Šคํ„ด์Šค๋ฅผ ๋Š˜๋ฆฌ๋Š” ๊ฒฝ์šฐ์˜ ๊ฐ€์šฉ์„ฑ ๋ฒ”์œ„์™€ ํ•œ๊ณ„๋ฅผ ์ •๋ฆฌํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๋‹จ์œ„ ํ™•์žฅ ๋ฐฉ์‹ ๋ง‰๋Š” ์žฅ์•  ํ•œ๊ณ„ ๋น„์šฉ
๋™์ผ AZ, ์ธ์Šคํ„ด์Šค ๋‹จ์œ„ EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ๋Œ€ ๊ฐœ๋ณ„ ์ธ์Šคํ„ด์Šค ์žฅ์•  ์ธ์Šคํ„ด์Šค๊ฐ€ ์†ํ•œ AZ ๋‹จ์œ„ ์žฅ์•  ์ธ์Šคํ„ด์Šค ์ˆ˜์— ๋น„๋ก€
๋™์ผ ๋ฆฌ์ „, AZ ๋‹จ์œ„ 2๊ฐœ ์ด์ƒ AZ์— ์ธ์Šคํ„ด์Šค ๋ถ„์‚ฐ AZ ๋‹จ์œ„ ์žฅ์•  AZ๊ฐ€ ์†ํ•œ ๋ฆฌ์ „ ๋‹จ์œ„ ์žฅ์•  ์ธ์Šคํ„ด์Šค ๋น„์šฉ + AZ ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก ๋น„์šฉ(๋ฐฉํ–ฅ๋‹น $0.01/GB)

์šฐ๋ฆฌ์˜ ์„œ๋น„์Šค๋Š” "์ธ์Šคํ„ด์Šค ํ•œ ๋Œ€์˜ ์žฅ์• ๊ฐ€ ์„œ๋น„์Šค ์ค‘๋‹จ์œผ๋กœ ์ด์–ด์ง€์ง€ ์•Š๋Š”๋‹ค"๋ผ๋Š” ๊ฐ€์šฉ์„ฑ ํ•˜ํ•œ์„ ์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด์„œ, ์ตœ์†Œ ๋™์ผ AZ์—์„œ Scale-out์ด ํ•„์š”ํ•˜๋‹ค.

๋™์ผ AZ์—์„œ ๋” ๋‚˜์•„๊ฐ€, AZ ๋ถ„์‚ฐ์„ ์„ ํƒํ•˜๋Š” ์ด์œ ๋Š” ๋‘ ๊ฐ€์ง€๋‹ค.

  • ์ฒซ์งธ, EC2 ์ธ์Šคํ„ด์Šค ์š”๊ธˆ์€ ์–ด๋А AZ์— ๋‘๋“  ๋™์ผํ•˜๋ฏ€๋กœ ๊ฐ€์šฉ์„ฑ์„ ํ•œ ๋‹จ๊ณ„ ์˜ฌ๋ฆฌ๋Š” ๋ฐ ์ธ์Šคํ„ด์Šค ๋น„์šฉ์ด ์ถ”๊ฐ€๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋‘˜์งธ, AWS๋Š” ๋‹จ์ผ AZ ๊ตฌ์„ฑ์— 99.5%๋งŒ ๋ณด์žฅํ•˜๊ณ , 2๊ฐœ ์ด์ƒ AZ์— ๋ฐฐํฌ๋œ ๊ฒฝ์šฐ์—๋งŒ 99.99% SLA๋ฅผ ์ ์šฉํ•œ๋‹ค. ์ฆ‰ ์ตœ์†Œ ๋น„์šฉ ๊ธฐ์ค€์„ ํ•ด์น˜์ง€ ์•Š์œผ๋ฉด์„œ ์—ฐ๊ฐ„ ์ตœ๋Œ€ ๋‹ค์šดํƒ€์ž„ ๋ณด์žฅ์„ 43.8์‹œ๊ฐ„์—์„œ 52.6๋ถ„์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

์šฐ๋ฆฌ ์„œ๋น„์Šค๋Š” ๊ตญ๋‚ด์—์„œ๋งŒ ๋ฐฐํฌํ•˜๋ฏ€๋กœ, ๋ฆฌ์ „์€ AWS ์„œ์šธ ๋ฆฌ์ „๋งŒ์„ ์„ ํƒํ•œ๋‹ค. AWS SLA์— ๋”ฐ๋ฅด๋ฉด, ๋ฉ€ํ‹ฐ AZ์˜ ์—…ํƒ€์ž„ ๋ณด์žฅ ์ˆ˜์ค€์ด 99.99%์ด๋ฏ€๋กœ, ๋‹จ์ผ ๋ฆฌ์ „ AZ ๋‹จ์œ„ ํ™•์žฅ๋„ ์ถฉ๋ถ„ํ•œ ๊ฐ€์šฉ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

AWS Compute SLA (ํด๋ฆญํ•ด์„œ ํŽผ์น˜๊ธฐ)

AWS Compute SLA์— ๋”ฐ๋ฅด๋ฉด ๋‹จ์ผ EC2 ์ธ์Šคํ„ด์Šค์™€ ๋ฉ€ํ‹ฐ AZ EC2 ์ธ์Šคํ„ด์Šค์˜ ์„ฑ๋Šฅ ๊ธฐ์ค€์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ตฌ์„ฑ AWS SLA ๊ธฐ์ค€ ์ ์šฉ ์กฐ๊ฑด
๋‹จ์ผ EC2 ์ธ์Šคํ„ด์Šค (Instance-Level SLA) 99.5% ์ธ์Šคํ„ด์Šค 1๋Œ€, ์™ธ๋ถ€ ์—ฐ๊ฒฐ ๋ถˆ๊ฐ€ ์ƒํƒœ๋ฅผ ์žฅ์• ๋กœ ์ •์˜
๋ฉ€ํ‹ฐ AZ EC2 (Region-Level SLA) 99.99% 2๊ฐœ ์ด์ƒ AZ์— ๋™์‹œ ๋ฐฐํฌ๋œ ๊ฒฝ์šฐ

์ด ๊ฐ’์œผ๋กœ ์›” ๋‹ค์šดํƒ€์ž„์„ ๊ณ„์‚ฐํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๊ตฌ์„ฑ ๊ณ„์‚ฐ (30์ผ ๊ธฐ์ค€) ์›” ๋‹ค์šดํƒ€์ž„ ์—ฐ ๋‹ค์šดํƒ€์ž„
๋‹จ์ผ ์ธ์Šคํ„ด์Šค (99.5%) 43,200๋ถ„ ร— 0.5% 216๋ถ„(3.6์‹œ๊ฐ„) 43.8์‹œ๊ฐ„
๋ฉ€ํ‹ฐ AZ (99.99%) 43,200๋ถ„ ร— 0.01% 4.32๋ถ„ 52.6๋ถ„

์ˆ˜์ง ํ™•์žฅ์œผ๋กœ ๋” ์ข‹์€ ์‚ฌ์–‘์˜ ์ธ์Šคํ„ด์Šค๋กœ ์˜ฌ๋ ค๋„ ์œ„ ๊ธฐ์ค€์€ ๋™์ผํ•˜๋‹ค.

5. v2 ํ•ต์‹ฌ ์ „ํ™˜ ์ „๋žต

5.1 VPC ๋ฐ ๋ณด์•ˆ๊ทธ๋ฃน

  • Public Subnet: ์ธํ”„๋ผ ๊ด€๋ฆฌ์ž๊ฐ€ 2๋ช…์ธ ์ƒํƒœ์—์„œ ๊ธ‰ํ•˜๊ฒŒ ์„ค๊ณ„๋ฅผ ํ™•์žฅํ•˜๋Š” ์ƒํ™ฉ์—์„œ ๋ณต์žกํ•œ ํ†ต์‹  ๊ตฌ์กฐ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๊ณ , ๋ฏผ๊ฐ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋Š” ์„œ๋น„์Šค๊ฐ€ ์•„๋‹ˆ๋‹ค.
    • ALB
    • Frontend EC2(์ธ๋ฐ”์šด๋“œ ALB ๋ณด์•ˆ๊ทธ๋ฃน๋งŒ ํ—ˆ์šฉ / ์•„์›ƒ๋ฐ”์šด๋“œ Backend ๋ณด์•ˆ๊ทธ๋ฃน๋งŒ ํ—ˆ์šฉ)
    • Backend EC2(์ธ๋ฐ”์šด๋“œ ALB, Frontend ๋ณด์•ˆ๊ทธ๋ฃน๋งŒ ํ—ˆ์šฉ / ์•„์›ƒ๋ฐ”์šด๋“œ DB, AI ๋ณด์•ˆ๊ทธ๋ฃน ๋ฐ OAuth์šฉ 443 ํฌํŠธ๋งŒ ํ—ˆ์šฉ)
    • AI EC2(์ธ๋ฐ”์šด๋“œ Backend ๋ณด์•ˆ๊ทธ๋ฃน๋งŒ ํ—ˆ์šฉ / ์•„์›ƒ๋ฐ”์šด๋“œ ์™ธ๋ถ€ LLM API ํ˜ธ์ถœ์šฉ 443ํฌํŠธ ์ „์ฒด ํ—ˆ์šฉ)
    • DB(์ธ๋ฐ”์šด๋“œ Backend ๋ณด์•ˆ๊ทธ๋ฃน๋งŒ ํ—ˆ์šฉ / ์•„์›ƒ๋ฐ”์šด๋“œ ์ „์ฒด ์ฐจ๋‹จ)

5.2 SSR ์ „ํ™˜ ๋ฐ ํ˜ธ์ŠคํŒ…

  • ์™ธ๋ถ€ ์œ ์ €๋ฅผ ์œ ์ž…ํ•˜๊ฒŒ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋น„์Šค ์„ฑ์žฅ์„ ์œ„ํ•ด ๊ฒ€์ƒ‰ ์—”์ง„ ๋…ธ์ถœ์„ ๋ชฉ์ ์œผ๋กœ SSR๋กœ ์ „ํ™˜ํ•œ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜ Next.js Standalone ๊ตฌ๋™์„ ํ†ตํ•ด ๊ฒฝ๋Ÿ‰ ์ด๋ฏธ์ง€๋กœ ์ธ์Šคํ„ด์Šค ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ง์ ‘ ์„œ๋น™ํ•œ๋‹ค.
  • CPU ๋‚ญ๋น„๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด CloudFront๋ฅผ ์ „๋ฉด์— ๋ฐฐ์น˜ํ•˜์—ฌ ๊ณตํ†ต ์ •์  ํŽ˜์ด์ง€ ๋ฐ ์—์…‹์„ ์—ฃ์ง€์— ํฌํ•จํ•˜๊ณ , ๋™์  ๋ Œ๋”๋ง ์š”์ฒญ๋งŒ SSR ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „๋‹ฌํ•œ๋‹ค.

6. ํ”„๋ก ํŠธ์—”๋“œ ๊ตฌ์กฐ ์„ค๊ณ„

Vercel

Vercel์ด๋ž€?
ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ(Next.js ํŠนํ™”)๋ฅผ Git ์ €์žฅ์†Œ์™€ ์—ฐ๋™ํ•˜์—ฌ ๋ฐฐํฌ, ํ˜ธ์ŠคํŒ…, ์ธํ”„๋ผ ๊ด€๋ฆฌ ์ž๋™ํ™” ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ
์ •์  ํŒŒ์ผ์„ ์บ์‹ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋™์  ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋“ฑ ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋น™์„ ์ตœ์†Œํ•œ์˜ ์„ค์ •์œผ๋กœ ์ž๋™ํ™”
* Functions
- ์ƒ์‹œ ๊ฐ€๋™๋˜์ง€ ์•Š๊ณ  ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜
- ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜๋ฉด ์š”์ฒญ ๋‹จ์œ„๋กœ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋–ด๋‹ค๊ฐ€ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๋ฉด ์œ ํœด ์ƒํƒœ๋กœ ์ „ํ™˜(์ผ์ • ์‹œ๊ฐ„ ์š”์ฒญ์ด ์—†์œผ๋ฉด ์ž์› ๋ฐ˜ํ™˜)
- App Router์˜ Dynamic Server Components๋ฅผ ๋ฐฐํฌํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ SSR ๋กœ์ง์ด ํ•˜๋‚˜์˜ Function์œผ๋กœ ํŒจํ‚ค์ง•๋˜์–ด ์‹คํ–‰

* ์ฝœ๋“œ ์Šคํƒ€ํŠธ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€ ์‹œ ๋‹ค๋ฅธ ์„œ๋น„์Šค์— ๋น„ํ•ด ๋น„์šฉ์ด ๊ฐ€ํŒŒ๋ฅด๊ฒŒ ์ƒ์Šนํ•˜๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
- ์œ ์ € ์ฆ๊ฐ€ ์ถ”์ด๋ฅผ ๊ณ ๋ คํ•˜๋ฉด Function ํ˜ธ์ถœ ๋น„์šฉ์ด ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•˜๊ธฐ์— ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•  ์‹œ๊ธฐ๊ฐ€ ๊ธธ์ง€ ์•Š๋‹ค.
=> ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

AWS Lambda(Serverless Next.js)

Lambda๋ž€?
์„œ๋ฒ„๋ฅผ ์ง์ ‘ ํ”„๋กœ๋น„์ €๋‹ํ•˜๊ฑฐ๋‚˜ ๊ด€๋ฆฌํ•  ํ•„์š” ์—†์ด ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์„œ๋ฒ„๋ฆฌ์Šค ์ปดํ“จํŒ… ์„œ๋น„์Šค(Vercel Functions์™€ ์œ ์‚ฌ)
- ์ƒ์‹œ ๊ฐ€๋™๋˜์ง€ ์•Š๊ณ  ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ์ƒŒ๋“œ๋ฐ•์Šค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ฆ‰์‹œ ํ”„๋กœ๋น„์ €๋‹๋˜์–ด ์ฝ”๋“œ ์‹คํ–‰ ํ›„ ์œ ํœด ์ƒํƒœ๋กœ ์ „ํ™˜(์ผ์ • ์‹œ๊ฐ„ ์š”์ฒญ์ด ์—†์œผ๋ฉด ์ž์› ๋ฐ˜ํ™˜)
- ์‹ค์ œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ ์‹คํ–‰ ์‹œ๊ฐ„(ms ๋‹จ์œ„)๊ณผ ํ• ๋‹น ๋ฉ”๋ชจ๋ฆฌ ์šฉ๋Ÿ‰์— ๋Œ€ํ•ด ๋น„์šฉ ๋ถ€๊ณผ
- Lambda๋ฅผ VPC์— ๋ฐฐ์น˜ํ•˜๋ฉด ์ง์ ‘ ํ”„๋ผ์ด๋น— ํ†ต์‹  ๊ฐ€๋Šฅ
- SSR: Next.js์˜ ๋™์  ๋ Œ๋”๋ง ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค Lambda ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜์–ด HTML ์ƒ์„ฑํ•ด ๋ฐ˜ํ™˜

* ๋‹จ์ 
- ์ฝœ๋“œ ์Šคํƒ€ํŠธ ์ง€์—ฐ
- Next.js์™€ ํ˜ธํ™˜์„ ์œ„ํ•ด OpenNext ๋“ฑ ๋ณ„๋„ ๋„๊ตฌ ๋˜๋Š” AWS Lambda Web Adapter ํ™œ์šฉ์œผ๋กœ ์ธํ•ด ๋””๋ฒ„๊น… ๋ณต์žก๋„ ์ƒ์Šน ๋ฐ ์ดˆ๊ธฐ ๊ตฌ๋™ ์‹œ๊ฐ„ ์ฆ๊ฐ€
  • Vercel์— ๋น„ํ•ด ๋น„์šฉ์ด ํšจ์œจ์ ์ด์ง€๋งŒ, OpenNext ๋ณ€ํ™˜ ๋ ˆ์ด์–ด ๊ด€๋ฆฌ ๋ถ€๋‹ด์ด ์ƒ๊ธด๋‹ค.
  • Next.js ๋ฒ„์ „์„ ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜ ๋นŒ๋“œ ์„ค์ •์„ ๋ฐ”๊ฟ€ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ(์ฒญํฌ ๋ˆ„๋ฝ, ๋ฏธ๋“ค์›จ์–ด ์—๋Ÿฌ ๋“ฑ)๋ฅผ ์ธํ”„๋ผ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง์œผ๋กœ ๋””๋ฒ„๊น…ํ•ด์•ผ ํ•œ๋‹ค.
  • ์ˆœ๊ฐ„์ ์œผ๋กœ ํŠธ๋ž˜ํ”ฝ์ด ์ƒ์Šนํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์‹ ๊ทœ ์ƒŒ๋“œ๋ฐ•์Šค๊ฐ€ ๋™์‹œ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ์š”์ฒญ๋Ÿ‰์ด ์ผ๊ด€์ ์ด์ง€ ์•Š์œผ๋ฉด ์ฝœ๋“œ์Šคํƒ€ํŠธ๋กœ ์ธํ•ด ๋กœ๋”ฉ ์ง€์—ฐ๊ณผ ํƒ€์ž„์•„์›ƒ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Provisioned Concurrency๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ƒ์‹œ ๊ฐ€๋™ ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜์—ฌ ์ตœ๋Œ€ ์žฅ์ ์ธ ๋น„์šฉ ์ ˆ๊ฐ์ด ์‚ฌ๋ผ์ง€๊ณ , ๊ณ ์ • ๋น„์šฉ์ด EC2๋ณด๋‹ค ๋น„์‹ธ์ง„๋‹ค.

Lambda vs EC2(t4g.small*2)

  • ์ˆ˜์น˜ ์‚ฐ์ •
    • Peak 80 RPS ์ค‘ ์ •์  ํŒŒ์ผ ์บ์‹œ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋™์  SSR ์š”์ฒญ 50 RPS
    • ์ผ์ผ SSR ์š”์ฒญ ์ˆ˜ 20๋งŒ(DAU 4๋งŒ * ์œ ์ €๋‹น ํ‰๊ท  5๊ฐœ ํŽ˜์ด์ง€ ์ด๋™ ๊ฐ€์ •)
    • ์›”๊ฐ„ SSR ์š”์ฒญ ์ˆ˜ 600๋งŒ
    • 1ํšŒ ๋ Œ๋”๋ง 200ms
    • ๋ฉ”๋ชจ๋ฆฌ 1GB
  • Lambda
    • ์ด ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค: 600๋งŒ * 0.2s * 1GB = 120๋งŒ GB-s
    • ๋งค์›” 100๋งŒ ๊ฑด ํ˜ธ์ถœ, 400๋งŒGB-s ์ปดํ“จํŒ… ๋ฌด๋ฃŒ
    • ๋น„์šฉ: 11.67$(๋ฌด๋ฃŒ ํ‹ฐ์–ด ์—†์œผ๋ฉด 17.2$)/์›”
    • ์š”์ฒญ ์ˆ˜: (600๋งŒ ๊ฑด - 100๋งŒ ๊ฑด) * 0.2$/100๋งŒ = 1$
    • ์ปดํ“จํŒ…: (120๋งŒGB-s - 40๋งŒGB-s) * 0.0000133334$ = 10.67$
    • [๋ฐ”๊พธ๊นŒ]๋Š” ์ ์‹ฌ์‹œ๊ฐ„(12-13์‹œ)์ด๋‚˜ 18์‹œ-21์‹œ์— ํŠธ๋ž˜ํ”ฝ์ด ์ƒ์Šนํ•˜์ง€๋งŒ, ์ด๋ฒคํŠธ์„ฑ ์„œ๋น„์Šค๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝœ๋“œ ์Šคํƒ€ํŠธ๋กœ ์ธํ•œ ์ง€์—ฐ์„ ์ฒด๊ฐํ•  ์ •๋„์˜ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํŠธ๋ž˜ํ”ฝ ์ˆ˜์น˜๋กœ ์ƒ์Šนํ•  ํ™•๋ฅ ์ด ๋งค์šฐ ๋‚ฎ๋‹ค.
      => Provisioned Concurrency๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • EC2
    • ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋Š” ์žฅ์•  ์‹œ ์„œ๋น„์Šค ์ „์ฒด๊ฐ€ ์ค‘๋‹จ๋˜๊ธฐ ๋•Œ๋ฌธ์— t4g.small 2๋Œ€๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ AZ์— ๋ฐฐ์น˜ํ•œ๋‹ค.
    • ALB๋ฅผ ํ†ตํ•ด health check๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„์‚ฐํ•œ๋‹ค.
    • CPU ์‚ฌ์šฉ๋ฅ ์ด 70% ์ดˆ๊ณผ ์‹œ ์ตœ๋Œ€ 4๋Œ€๊นŒ์ง€ ์Šค์ผ€์ผ์•„์›ƒ๋˜๋„๋ก ASG๋ฅผ ์—ฐ๋™ํ•œ๋‹ค.
    • ๋น„์šฉ: t4g.small 15.18$ * 2 = 30.36$์›” + ALB ๋น„์šฉ

EC2 Container ์„ ์ •

  • Lambda๊ฐ€ ๋น„์šฉ์ ์œผ๋กœ ์šฐ์„ธ(1/3 ๊ฐ€๊ฒฉ)ํ•˜๊ณ  ์ž๋™์œผ๋กœ ๊ด€๋ฆฌ(๊ณ ๊ฐ€์šฉ์„ฑ)ํ•ด์ฃผ๋Š” ์žฅ์ ์ด ์žˆ์œผ๋‚˜, ์ฝœ๋“œ ์Šคํƒ€ํŠธ๋Š” ์šฐ๋ฆฌ ์„œ๋น„์Šค์— ๋งค์šฐ ์น˜๋ช…์ ์ด๊ธฐ์— 20$์˜ ๊ฐ€์น˜๋ณด๋‹ค UX ์ €ํ•˜๋กœ ์ธํ•œ ์†ํ•ด๊ฐ€ ๋” ํฌ๋‹ค.
  • ๊ณ ์ • ๋น„์šฉ ์ง€์ถœ๋กœ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ธฐ์— ๋น„์šฉ ์ƒํ•œ์„ ์„ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋™์ผํ•œ ํ™˜๊ฒฝ์—์„œ ๋ฐฐํฌํ•˜๊ธฐ์— ๋ณ„๋„์˜ ๋ฐฐํฌ ํ™˜๊ฒฝ์„ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ํ•™์Šต์ด ๋ถˆํ•„์š”ํ•˜๋‹ค.

CDN ๋„์ž…

  • ๊ตญ๋‚ด ํ•œ์ • ์„œ๋น„์Šค๋ผ ๊ธ€๋กœ๋ฒŒ ์บ์‹ฑ์€ ๋ถˆํ•„์š”ํ•˜์ง€๋งŒ, ์ •์  ํŒŒ์ผ ์š”์ฒญ์„ ์ปจํ…Œ์ด๋„ˆ๊นŒ์ง€ ์ „๋‹ฌํ•˜๊ณ  ์‘๋‹ตํ•˜๋Š” ๊ฑด ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๋‹ค.
  • Next.js ๋Ÿฐํƒ€์ž„์€ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •์  ํŒŒ์ผ ์š”์ฒญ์ด ์œ ์ž…๋˜๋ฉด CPU ๋ Œ๋”๋ง ์ž์›์„ ๋บ๊ฒจ ์‘๋‹ต ์†๋„๊ฐ€ ์ €ํ•˜๋œ๋‹ค.
  • ์ •์  ํŒŒ์ผ๊นŒ์ง€ Next.js์—์„œ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  RPS๋ฅผ ๋” ๋†’๊ฒŒ ์‚ฐ์ •ํ•˜๊ณ  ์ž์›์„ ๋” ๋งŽ์ด ํ• ๋‹นํ•˜์—ฌ ๋น„์šฉ์ด ์ƒ์Šนํ•œ๋‹ค.
  • CloudFront๋Š” ์›” ๋ฐ์ดํ„ฐ ์ „์†ก๋Ÿ‰ 1TB์™€ 1000๋งŒ ๊ฑด์˜ ์š”์ฒญ์„ ์˜๊ตฌ์ ์œผ๋กœ ๋ฌด๋ฃŒ ์ œ๊ณตํ•œ๋‹ค. ๋ฌด๋ฃŒ ๋ฒ”์œ„๋ฅผ ์ดˆ๊ณผํ•ด๋„ 0.085$/GB์ด๋ฏ€๋กœ ๋น„์šฉ์ด ํ•ฉ๋ฆฌ์ ์ด๊ณ , ์‘๋‹ต ์‹œ๊ฐ„์ด ๋งค์šฐ ๋น ๋ฅด๊ธฐ์— CloudFront Edge ์บ์‹ฑ์„ ํ™œ์šฉํ•œ๋‹ค.
  • CloudFront๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ •์  ํŒŒ์ผ์„ ์ €์žฅํ•  ์ €์žฅ์†Œ๋กœ AWS S3 ๋ฒ„ํ‚ท์„ ํ™œ์šฉํ•œ๋‹ค.
    • ๋นŒ๋“œ ์‹œ์ ์— .next/static ๊ฒฐ๊ณผ๋ฌผ์„ S3๋กœ ๊ฐฑ์‹ ํ•˜๋Š” CI/CD ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค.
    • ๊ฒฝ๋กœ ํŒจํ„ด์ด _next/static/*, /public/*์ด๋ฉด AWS S3 ๋ฒ„ํ‚ท์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ณ  ์บ์‹ฑํ•˜์—ฌ ์ •์  ํŒŒ์ผ์„ ์„œ๋น™ํ•œ๋‹ค.
    • Next.js๋Š” BE์™€ ํ†ต์‹ ํ•˜์—ฌ ๋™์ ์œผ๋กœ HTML์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ์—๋งŒ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

BE ํ†ต์‹ 

๊ตฌ๋ถ„ ํ†ต์‹  ์ฃผ์ฒด ์ฃผ ์‚ฌ์šฉ ๋ชฉ์  ๋ณด์•ˆ/ํ† ํฐ ์€๋‹‰ Next.js ์„œ๋ฒ„ ๋ถ€ํ•˜ CORS ๊ณ ๋ ค
Server Components Next.js ๋Ÿฐํƒ€์ž„ โž” ๋ฐฑ์—”๋“œ ์ดˆ๊ธฐ ๋ Œ๋”๋ง(SSR), SEO, ์ •์  ํŽ˜์ด์ง€ ์ƒ์„ฑ(SSG/ISR) ์€๋‹‰ (์„œ๋ฒ„ ๊ฐ„ ํ†ต์‹ ) ๋‚ฎ์Œ (๋‹จ์ˆœ ํ”„๋ก์‹œ ๋ฐ HTML ์ŠคํŠธ๋ฆฌ๋ฐ) ๋ถˆํ•„์š” (Server-to-Server)
Client ์ง์ ‘ ํ†ต์‹  ๋ธŒ๋ผ์šฐ์ € โž” ๋ฐฑ์—”๋“œ ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ, ๋ฌดํ•œ ์Šคํฌ๋กค ๋ธŒ๋ผ์šฐ์ €์— ๋…ธ์ถœ (์ฟ ํ‚ค/์Šคํ† ๋ฆฌ์ง€) ์—†์Œ (Next.js ๊ฑฐ์น˜์ง€ ์•Š์Œ) ํ•„์ˆ˜ (CORS ๋˜๋Š” ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ)
BFF (Route Handlers / Server Actions) ๋ธŒ๋ผ์šฐ์ € โž” Next.js ์„œ๋ฒ„ โž” ๋ฐฑ์—”๋“œ ํŒŒ์ผ ์—…๋กœ๋“œ ์ „์ฒ˜๋ฆฌ, ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต/๋ณ€ํ™˜ ์€๋‹‰ ๊ฐ€๋Šฅ ๋†’์Œ ๋ถˆํ•„์š” (๋™์ผ ๋„๋ฉ”์ธ ์ฒ˜๋ฆฌ ์‹œ)
  • Reverse Proxy(ALB)๋ฅผ ํ†ตํ•œ Same-Origin ๊ตฌ์„ฑ์œผ๋กœ CORS ๋ฌธ์ œ ํ•ด๊ฒฐ
    • bakkucca.com/api/*: Backend API target group
    • bakkucca.com/ws/*: Backend WebSocket target group
    • bakkucca.com/*: Next.js target group
  • SSR ํ™˜๊ฒฝ์—์„œ VPC ๋‚ด๋ถ€ ํ†ต์‹ 
    • VPC ๋‚ด๋ถ€ DNS๋กœ ์š”์ฒญ(์˜ˆ: http://backend.internal:8080)
    • ๋ถˆํ•„์š”ํ•œ ํŒจํ‚ท ์ง€์—ฐ ๋‹จ์ถ•

7. ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ๊ตฌ์กฐ ์„ค๊ณ„

๋‹จ์ผ App ์„œ๋ฒ„์˜ ํ•œ๊ณ„์™€ ๋ฌธ์ œ ํ•ด๊ฒฐ

ํ•ต์‹ฌ ์ •๋ฆฌ

  1. ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋Š” ๋…๋ฆฝ๋œ ์ธ์Šคํ„ด์Šค๋กœ ํ™•์žฅ, ๋ฐฐํฌํ•œ๋‹ค.
  2. ๋ฐฑ์—”๋“œ ์ƒํƒœ ๋ถ„๋ฆฌ๋ฅผ ์œ„ํ•ด Redis๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์ด๋ฅผ ์œ„ํ•œ ์ธํ”„๋ผ๋กœ ElastiCache Serverless(Valkey)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์›” ์•ฝ $8~12๋กœ ์„ ํƒ์ง€ ์ค‘ ๊ฐ€์žฅ ์ €๋ ดํ•˜๊ณ , ์—ฌ๋Ÿฌ AZ ๋ณต์ œ์™€ ์ž๋™ ์ „ํ™˜์ด ๊ธฐ๋ณธ์œผ๋กœ ํฌํ•จ๋œ๋‹ค.
  3. ๋‹ค์ค‘ ์ธ์Šคํ„ด์Šค ๊ฐ„ ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ์ค‘๊ณ„๋„ ๋™์ผํ•˜๊ฒŒ ElastiCache Serverless(Valkey)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, Redis Pub/Sub ๊ธฐ์ˆ ์„ ๋„์ž…ํ•œ๋‹ค.

8. DB

์ •๋Ÿ‰์  ๋ถ€ํ•˜ ๋ชจ๋ธ ์—ญ์‚ฐ (์›Œํฌ๋กœ๋“œ ์‚ฐ์ •)

$QPS_{peak} = RPS_{peak} \times (\text{์š”์ฒญ๋‹น ํ‰๊ท  DB ์ฟผ๋ฆฌ ์ˆ˜})$

  • Peak RPS: 80 RPS ์ค‘ ์ •์  ์บ์‹ฑ(S3/CloudFront)์„ ์ œ์™ธํ•˜๊ณ  ๋ฐฑ์—”๋“œ๋กœ ์œ ์ž…๋˜๋Š” ๋™์  API ์š”์ฒญ์€ ์•ฝ 50~70 RPS
  • ์š”์ฒญ๋‹น ์ฟผ๋ฆฌ ์ˆ˜: ์ผ๋ฐ˜์ ์ธ CRUD ๋ฐ ์ธ์ฆ ํ™•์ธ์„ ๊ฑฐ์น˜๋Š” ์›น ํŠธ๋žœ์žญ์…˜์€ ์š”์ฒญ 1ํšŒ๋‹น ํ‰๊ท  3~5๊ฐœ์˜ ์ฟผ๋ฆฌ ์œ ๋ฐœ (JPA Fetch Join ๋ฐ N+1 ์ตœ์ ํ™” ์ „์ œ)
  • ์‚ฐ์ถœ๋œ ์š”๊ตฌ ์„ฑ๋Šฅ
    • Peak Read QPS: $70 \times 4 \times 0.8 \approx 224 \sim 300\ \text{QPS}$
    • Peak Write TPS: $70 \times 0.2 \approx 14 \sim 25\ \text{TPS}$
  • Active Working Set (๋ฉ”๋ชจ๋ฆฌ ์ ์žฌ ๋Œ€์ƒ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ):DAU 4๋งŒ ๋ช…์˜ ์œ ์ € ์„ธ์…˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, ์ตœ๊ทผ ๋“ฑ๋ก๋œ ๋ฌผ๋ฌผ๊ตํ™˜ ๊ฒŒ์‹œ๊ธ€ 10,000๊ฑด, ํ™œ์„ฑ ์ฑ„ํŒ…๋ฐฉ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฐ ์นดํ…Œ๊ณ ๋ฆฌ ์ธ๋ฑ์Šค์˜ ์ดํ•ฉ์€ ์•ฝ 1.5GB ~ 2.2GB.
๋น„๊ต ํ•ญ๋ชฉ AWS RDS MySQL (db.t4g.medium ๊ธฐ์ค€) EC2 Docker ์ง์ ‘ ์„ค์น˜ (t4g.medium ๊ธฐ์ค€)
์›” ์˜ˆ์ƒ ๋น„์šฉ ์•ฝ $38 (Single-AZ) ~ $76 (Multi-AZ) ์•ฝ $19 (์ธ์Šคํ„ด์Šค + EBS)
๋ฐฑ์—… / ๋ณต๊ตฌ ์ž๋™ ์Šค๋ƒ…์ƒท ๋ฐ ํŠน์ • ์‹œ์  ๋ณต๊ตฌ(PITR) ๊ธฐ๋ณธ ์ œ๊ณต cron, shell script, S3 ์—…๋กœ๋“œ ํŒŒ์ดํ”„๋ผ์ธ ์ง์ ‘ ๊ตฌ์ถ•
๊ณ ๊ฐ€์šฉ์„ฑ (HA) Multi-AZ ํด๋ฆญ ํ•œ ๋ฒˆ์œผ๋กœ ์ž๋™ ๋™๊ธฐํ™” ๋ฐ ์ž๋™ Failover MHA, Orchestrator ๋˜๋Š” ์ˆ˜๋™ ๋ณต๊ตฌ ์Šคํฌ๋ฆฝํŠธ ์šด์˜ ํ•„์š”
์šด์˜ ๊ณต์ˆ˜ ๋งค์šฐ ๋‚ฎ์Œ (์ธํ”„๋ผ ์ธ์› 2๋ช… ํ™˜๊ฒฝ์— ์ตœ์ ) ๋งค์šฐ ๋†’์Œ (OS ํŒจ์น˜, ๋””์Šคํฌ ์šฉ๋Ÿ‰ ์ฆ์„ค, ์—”์ง„ ์žฅ์•  ๋Œ€์‘)
์ตœ์ข… ํŒ์ • ๋„์ž… X
Point-In-Time Recovery

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์‹œ์Šคํ…œ์„ ๊ณผ๊ฑฐ ํŠน์ • ์ˆœ๊ฐ„(์ดˆ ๋‹จ์œ„)์˜ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ ๊ธฐ์ˆ 

  • Amazon RDS๋Š” ํŠธ๋žœ์žญ์…˜ ๋กœ๊ทธ๋ฅผ 5๋ถ„๋งˆ๋‹ค ์ง€์†์ ์œผ๋กœ ๋ฐฑ์—…ํ•œ๋‹ค.
  • ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ด์ „ ์ „์ฒด ๋ฐฑ์—…์„ ๋ณต์›ํ•œ ๋’ค, ํŠธ๋žœ์žญ์…˜ ๋กœ๊ทธ(๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ธฐ๋ก)๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ replayํ•˜์—ฌ ๋ชฉํ‘œ ์‹œ์ ์„ ๋งž์ถ˜๋‹ค.
  • ๊ธฐ์กด DB์— ๋ฎ์–ด์”Œ์›Œ์ง€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ƒˆ๋กœ์šด ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ฐ€์ง„ DB ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
    => ๋ณต๊ตฌ ํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—”๋“œํฌ์ธํŠธ ์„ค์ •์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•„์š” ์ƒํ™ฉ
    • ์‹ค์ˆ˜๋กœ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ–ˆ์„ ๋•Œ
    • ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ ์ˆ˜์ •์ด๋‚˜ ๋ฐฐํฌ ์˜ค๋ฅ˜๋กœ ์‹œ์Šคํ…œ ์†์ƒ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ
    • ์™ธ๋ถ€ ๊ณต๊ฒฉ ์ง์ „์˜ ์•ˆ์ „ํ•œ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆด ๋•Œ

DB ์ „๋ฌธ๊ฐ€๊ฐ€ ์—†๊ณ , ์ธํ”„๋ผ ๊ด€๋ฆฌ์ž๊ฐ€ 2๋ช…์ธ ์ƒํ™ฉ์—์„œ EC2 ์œ„์— ๋„์ปค๋กœ DB๋ฅผ ๋„์šฐ๋ฉด, ์ปจํ…Œ์ด๋„ˆ ๋น„์ •์ƒ ์ข…๋ฃŒ, ๋ฐ์ดํ„ฐ ํŒŒ์ผ ๊นจ์ง, Disk Full ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์‹ค์‹œ๊ฐ„ ๋ณต๊ตฌ(MTTR)๊ฐ€ ์–ด๋ ค์›Œ์„œ ์„œ๋น„์Šค ์žฅ์• ๋กœ ์ง๊ฒฐ๋œ๋‹ค.
EC2 ๋Œ€๋น„ ์›” 15$~30$ ์ถ”๊ฐ€ ์ง€์ถœ์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ, RDS๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ž๋™ํ™”๋œ ํŠน์ • ์‹œ์  ๋ณต๊ตฌ(PITR)์™€ ๋ฐฑ์—…, ์Šคํ† ๋ฆฌ์ง€ ์ž๋™ ํ™•์žฅ, ํŒŒ๋ผ๋ฏธํ„ฐ ํ…œํ”Œ๋ฆฟ ๊ด€๋ฆฌ๋Š” 2์ธ ์ธํ”„๋ผ ํŒ€์ด ๋ถ€๋‹ดํ•ด์•ผ ํ•  ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์„ 90% ์ด์ƒ ํก์ˆ˜ํ•˜๊ธฐ์— ๋‹น์žฅ ์ถ”๊ฐ€ ์ธ์› ๋ณด์ถฉ์ด ์–ด๋ ค์šด ์ƒํ™ฉ์—์„œ๋Š” ๊ฐ€์น˜ ๋Œ€๋น„ ์ ์€ ๋น„์šฉ์ด๋‹ค.

Read Replica ๋Œ€์‹  Multi-AZ Standby ์šฐ์„  ๋„์ž…

  • ๋‹จ์ˆœ Read Replica(๋น„๋™๊ธฐ ๋ณต์ œ)๋Š” Primary DB๊ฐ€ ์ฃฝ์—ˆ์„ ๋•Œ ์ž๋™์œผ๋กœ Primary๋กœ ์Šน๊ฒฉ(failover)๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์Šน๊ฒฉ์‹œํ‚ค๊ณ , Spring Boot์˜ DB ์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝํ•ด ์žฌ๋ฐฐํฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋‹ค์šดํƒ€์ž„์ด ์ˆ˜์‹ญ ๋ถ„ ์ด์ƒ ๋ฐœ์ƒํ•œ๋‹ค.
  • ๋น„๋™๊ธฐ ๋ณต์ œ ํŠน์„ฑ์ƒ Primary ์žฅ์•  ์ง์ „ ํŠธ๋žœ์žญ์…˜์ด ์œ ์‹ค๋  ์ˆ˜ ์žˆ๋‹ค.

Peak 80 RPS ์ˆ˜์ค€์—์„œ๋Š” ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋กœ๋„ Read/Write ์ฒ˜๋ฆฌ๊ฐ€ ์ถฉ๋ถ„ํ•˜๋‹ค.
ํ˜„์žฌ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ฝ๊ธฐ ํŠธ๋ž˜ํ”ฝ ๋ถ„์‚ฐ์ด ์•„๋‹ˆ๋ผ ๋‹จ์ผ ์žฅ์• ์ (SPOF) ์ œ๊ฑฐ ๋ฐ ๋ฐ์ดํ„ฐ ์œ ์‹ค ์—†๋Š” ๋ฌด์ค‘๋‹จ ๋ณต๊ตฌ์ด๋ฏ€๋กœ Multi-AZ Standby๋ฅผ ์šฐ์„  ๋„์ž…ํ•œ๋‹ค.
=> ํ‰์†Œ์— Read ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š” Hot Standby ์ƒํƒœ์ด๋ฏ€๋กœ ๋น„์šฉ์ด 2๋ฐฐ๋กœ ์ฆ๊ฐ€ํ•œ๋‹ค. => Standby์™€ Primary ์ „ํ™˜(failover) ์ค‘ ์•ฝ 1๋ถ„์˜ ์ค‘๋‹จ์ด ๋ฐœ์ƒํ•œ๋‹ค.

์ธ์Šคํ„ด์Šค ๋ฐ ์Šคํ† ๋ฆฌ์ง€

์ธ์Šคํ„ด์Šค ์‚ฌ์–‘ vCPU / RAM Sysbench OLTP Read/Write QPS (p95 < 5ms) Buffer Pool ๊ฐ€์šฉ๋Ÿ‰ ์›” ๋น„์šฉ (Single-AZ / Multi-AZ) ํŒ์ •
db.t4g.small 2 vCPU / 2GB ~800 QPS ์•ฝ 1.3GB (OS ๊ฒฝํ•ฉ ์œ„ํ—˜) $19 / $38 ์šฉ๋Ÿ‰ ๋ถ€์กฑ (Working Set ์ดˆ๊ณผ)
db.t4g.medium 2 vCPU / 4GB ~2,200 QPS ์•ฝ 2.8GB (์•ˆ์ •์  ์ ์žฌ) $38 / $76 ์ตœ์  (๊ถŒ์žฅ)
db.t4g.large 2 vCPU / 8GB ~4,500 QPS ์•ฝ 5.8GB (์ดˆ๊ณผ ์ŠคํŽ™) $76 / $152 ์˜ˆ์‚ฐ ์—ฌ์œ  ์‹œ ๊ณ ๋ ค
db.m7g.large 2 vCPU / 8GB (์ „์šฉ ์ฝ”์–ด) ~6,000+ QPS ์•ฝ 6.0GB $124 / $248 ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง

์ธ์Šคํ„ด์Šค: db.t4g.medium(2vCPU, 4GB RAM)

  • db.t4g.medium์˜ 4GB ๋ฉ”๋ชจ๋ฆฌ ์ค‘ 70-75%์ธ ์•ฝ 2.8GB๋ฅผ innodb_buffer_pool_size๋กœ ํ• ๋‹นํ•˜๋ฉด, ๋ฐ”์šด๋”ฉ๋œ Working Set(1.5-2.2GB) ์ „์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์ฃผํ•˜์—ฌ Buffer Pool Hit Ratio๋ฅผ 95% ์ด์ƒ์œผ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ตœ๋Œ€ 2,200 QPS๋ฅผ ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํ˜„์žฌ ์š”๊ตฌ์น˜์ธ 300 QPS๋Š” ํ•œ๊ณ„์น˜์˜ ์•ฝ 14%์ด๊ธฐ์— ํŠธ๋ž˜ํ”ฝ ์ŠคํŒŒ์ดํฌ์— ์•ˆ์ •์ ์œผ๋กœ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • burstable ์ธ์Šคํ„ด์Šค ํŠน์„ฑ์ƒ CPU ํฌ๋ ˆ๋”ง ๊ณ ๊ฐˆ ์‹œ ์„ฑ๋Šฅ์ด 20%๋กœ ์ €ํ•˜๋  ์œ„ํ—˜์ด ์žˆ๋‹ค. 14% ์‚ฌ์šฉ๋ฅ ์ด๋ฉด ์ƒ์‹œ ํฌ๋ ˆ๋”ง์ด ์ถ•์ ๋˜์–ด ํ˜„์žฌ ์šด์˜ ํ™˜๊ฒฝ์—์„œ ํšจ์œจ์ ์ด๋‹ค.

์Šคํ† ๋ฆฌ์ง€: AWS EBS gp3(๊ธฐ๋ณธ 50GB, 3,000 IOPS, 125 MB/s)

  • ๋‹ค๋ฅธ ์š”์†Œ(๊ธฐ์กด ๊ตฌ์„ฑ์˜ ํƒ€ DB, OS ๋“ฑ)๋“ค๊ณผ ์™„์ „ํžˆ ๊ฒฉ๋ฆฌํ•œ๋‹ค.
  • I/O ์š”๊ตฌ๋Ÿ‰
    • Read I/O:
    • Write I/O:
    • ํ•ฉ์‚ฐ:
  • ๊ธฐ๋ณธ ์ œ๊ณต๊ฑ์ธ 3,000 IOPS๋Š” 80 RPS์˜ ์“ฐ๊ธฐ ์ž‘์—…์— ์ถฉ๋ถ„ํ•˜๋‹ค.

HikariCP ๋ฐ ์ปค๋„ฅ์…˜ ์ตœ์ ํ™”

์ปค๋„ฅ์…˜ ์ˆ˜๊ฐ€ CPU ์ฝ”์–ด ์ˆ˜๋ฅผ ์ดˆ๊ณผํ•ด ๊ณผ๋„ํ•ด์ง€๋ฉด Context Switching๊ณผ CPU ์บ์‹œ ๋ผ์ธ ๋ฌดํšจํ™”๋กœ ์ธํ•ด ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๊ธ‰๊ฐํ•œ๋‹ค.

๋™์‹œ ์ปค๋„ฅ์…˜ ์ˆ˜ ์ฆ๋ช…

WAS 1๋Œ€๋‹น ์ดˆ๋‹น 40๊ฑด์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ํŠœ๋‹๋œ ์ฟผ๋ฆฌ์˜ ํ‰๊ท  ์‹คํ–‰ ์‹œ๊ฐ„์ด 2ms(0.002s)์ด๋ฉฐ ์š”์ฒญ๋‹น ์ฟผ๋ฆฌ๊ฐ€ 3ํšŒ ์‹คํ–‰๋œ๋‹ค๊ณ  ๊ฐ€์ •
$$L = \lambda \times W = (40 \times 3) \times 0.002 = 0.24$$
์‹ค์ œ DB ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ปค๋„ฅ์…˜์€ ํ‰๊ท  0.24๊ฐœ

  • MySQL ์—”์ง„์ด CPU/๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ˆœ์ˆ˜ํ•˜๊ฒŒ SQL์„ ํŒŒ์‹ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ์‹œ๊ฐ„์€ ํ‰๊ท  0.24์ดˆ.
  • Spring Boot์˜ @Transactional ํ™˜๊ฒฝ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด HikariCP ์ปค๋„ฅ์…˜์„ ์ ์œ ํ•˜๊ณ  ๋†“์ง€ ์•Š๋Š” ์‹œ๊ฐ„(Connection Hold Time)์€ Java ํž™ ๋ฉ”๋ชจ๋ฆฌ์—์„œ์˜ ๊ฐ์ฒด ๋งคํ•‘, ๋น„์ฆˆ๋‹ˆ์Šค - ์—ฐ์‚ฐ, ๋„คํŠธ์›Œํฌ ์™•๋ณต ์‹œ๊ฐ„(RTT)์ด ๋”ํ•ด์ ธ ์‹ค์ œ 1ํšŒ ํŠธ๋žœ์žญ์…˜ ๋™์•ˆ ์ปค๋„ฅ์…˜์„ ์ฅ๊ณ  ์žˆ๋Š” ์‹œ๊ฐ„์€ 20ms๊นŒ์ง€ ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค.
  • ์ ์œ  ์‹œ๊ฐ„์ด 2ms์—์„œ 20ms๋กœ 10๋ฐฐ ๋Š˜์–ด๋‚˜๋ฉด, ๋ฆฌํ‹€์˜ ๋ฒ•์น™์— ์˜ํ•ด ํŠน์ • ์ˆœ๊ฐ„ ์ปค๋„ฅ์…˜์„ ๋ฌผ๊ณ  ์žˆ๋Š” ํ‰๊ท  ๊ฐœ์ˆ˜๋„ $0.24 \times 10 = \mathbf{2.4\text{๊ฐœ}}$๋กœ ๋Š˜์–ด๋‚œ๋‹ค.
  • ์—ฌ๊ธฐ์— ํ”ผํฌ ์‹œ ํŠธ๋ž˜ํ”ฝ ๋ฒ„์ŠคํŠธ๊ฐ€ ํŠ€๋ฉด ์ˆœ๊ฐ„์ ์œผ๋กœ 10~15๊ฐœ์˜ ์ปค๋„ฅ์…˜์ด ๋™์‹œ์— ํ™œ์„ฑํ™”๋  ์ˆ˜ ์žˆ๋‹ค.
  • MySQL์€ ํ•ด๋‹น ์ปค๋„ฅ์…˜์—์„œ ์ง€๊ธˆ ๋‹น์žฅ ์ฟผ๋ฆฌ๊ฐ€ ๋Œ๊ณ  ์žˆ๋Š”์ง€(Active), ์•„๋‹ˆ๋ฉด HikariCP ํ’€ ์•ˆ์—์„œ ๋Œ€๊ธฐ ์ค‘์ธ์ง€(Sleep/Idle) ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ๋˜‘๊ฐ™์ด max_connections ์Šฌ๋กฏ 1๊ฐœ๋กœ ๊ณ„์‚ฐํ•œ๋‹ค.

=> ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ’€ ์‚ฌ์ด์ฆˆ๋ฅผ 10๊ฐœ๋ณด๋‹ค ๋” ๋Š˜๋ฆด ํ•„์š”๊ฐ€ ์—†๋‹ค.
=> 2๊ฐœ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ๋™ํ•˜๋‹ค๊ฐ€ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ์ง„ํ–‰ ์‹œ 2๋ฐฐ๋กœ ๋Š˜์–ด๋‚˜ 40๊ฐœ์˜ ์ปค๋„ฅ์…˜์ด ํ•„์š”ํ•˜๋‹ค.

[ ๋ฐฐํฌ ์ „ํ™˜ ์ˆœ๊ฐ„ ]
- ๊ตฌ๋ฒ„์ „ WAS 1 (Hikari: 10๊ฐœ) โ”€โ”€โ”
- ๊ตฌ๋ฒ„์ „ WAS 2 (Hikari: 10๊ฐœ) โ”€โ”€โ”ผโ”€โ”€โ–บ MySQL ์ปค๋„ฅ์…˜ ์ผ์‹œ์  40๊ฐœ ์ ์œ 
- ์‹ ๋ฒ„์ „ WAS 1 (Hikari: 10๊ฐœ) โ”€โ”€โ”ค
- ์‹ ๋ฒ„์ „ WAS 2 (Hikari: 10๊ฐœ) โ”€โ”€โ”˜

=> AWS RDS ๊ด€๋ฆฌ ๋ฐ๋ชฌ, ์—”์ง€๋‹ˆ์–ด ์šด์˜ ํˆด ๋“ฑ ๋ณ„๋„ ์ปค๋„ฅ์…˜์ด ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•˜๋‹ค.
=> ์ด 60๊ฐœ ์ด์ƒ์˜ max_connections ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.
=> MySQL์˜ ๊ธฐ๋ณธ ์„ค์ •๊ฐ’์ด 151๋กœ, ๋ถ€์กฑํ•จ์ด ์—†๋‹ค.
=> max_connectoins ์™ธ์—๋„ ๋ณ„๋„ ์„ธ๋ถ€ ์„ค์ • ํŠœ๋‹์ด ํ˜„์žฌ ํ™˜๊ฒฝ์—์„œ๋Š” ํ•„์ˆ˜์ ์ด์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค.

v2 ์•„ํ‚คํ…์ฒ˜์˜ ์›”๊ฐ„ ์˜ˆ์ƒ ๋น„์šฉ ์ดํ•ฉ

  • DB
    • RDS(Multi-AZ): 76$
  • FE
    • CDN: ๋ฌด๋ฃŒ
    • NextJS ์ธ์Šคํ„ด์Šค ์ปจํ…Œ์ด๋„ˆ(t4g.small * 2): 30.36$
  • Load Balancer
    • ALB: ๊ธฐ๋ณธ 16.2$ + LCU 20(~30)$
  • BE
    • ECS on EC2(t4g.small * 2): 30.36$
    • EBS 30GB * 2: 5.5$

=> ์ดํ•ฉ 178.42$

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