Sam Baek, The Dev's Corner

๐Ÿš€ ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ ์•„ํ‚คํ…์ฒ˜ ์™„๋ฒฝ ๊ฐ€์ด๋“œ

01 Nov 2025

๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ ์•„ํ‚คํ…์ฒ˜๋ž€ ๋ฌด์—‡์ธ๊ฐ€


์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๋‹ค ๋ณด๋ฉด ๊ฐ‘์ž๊ธฐ ์‚ฌ์šฉ์ž๊ฐ€ ํญ์ฆํ•˜๋Š” ์ˆœ๊ฐ„์ด ์˜จ๋‹ค.
์‡ผํ•‘๋ชฐ์˜ ๋ธ”๋ž™ํ”„๋ผ์ด๋ฐ์ด, ํ‹ฐ์ผ“ ์˜ˆ๋งค ์˜คํ”ˆ, ์ด๋ฒคํŠธ ์‹œ์ž‘ ์‹œ์ ์ฒ˜๋Ÿผ
ํ‰์†Œ๋ณด๋‹ค ์ˆ˜์‹ญ ๋ฐฐ, ์ˆ˜๋ฐฑ ๋ฐฐ์˜ ํŠธ๋ž˜ํ”ฝ์ด ๋ชฐ๋ฆฌ๋Š” ์ƒํ™ฉ ๋ง์ด๋‹ค.

์ด๋Š” ๋งˆ์น˜ ์ž‘์€ ๊ณจ๋ชฉ๊ธธ์— ๊ฐ‘์ž๊ธฐ ์ˆ˜์ฒœ ๋ช…์ด ๋ชฐ๋ ค๋“œ๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.
์•„๋ฌด๋ฆฌ ์ข‹์€ ๊ฐ€๊ฒŒ๋ผ๋„ ๋ฌธ์ด ํ•˜๋‚˜๋ฐ–์— ์—†๊ณ ,
๊ณ„์‚ฐ์›์ด ํ•œ ๋ช…์ด๋ฉด ๊ธด ์ค„์ด ์ƒ๊ธฐ๊ณ 
๊ฒฐ๊ตญ ์†๋‹˜๋“ค์€ ๊ธฐ๋‹ค๋ฆฌ๋‹ค ์ง€์ณ ๋– ๋‚˜๋ฒ„๋ฆฐ๋‹ค.

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

์™œ ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ ๋Œ€๋น„๊ฐ€ ํ•„์š”ํ• ๊นŒ?


๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ์— ๋Œ€๋น„ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๋ฌธ์ œ 1: ์„œ๋ฒ„ ๋‹ค์šด
ํ•œ ๋Œ€์˜ ์„œ๋ฒ„๊ฐ€ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ์š”์ฒญ์—๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.
์ดˆ๊ณผํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ๋ฉˆ์ถ”๊ณ  ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘์† ๋ถˆ๊ฐ€ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

๋ฌธ์ œ 2: ๋А๋ฆฐ ์‘๋‹ต ์†๋„
์š”์ฒญ์ด ๋ชฐ๋ฆฌ๋ฉด ์ฒ˜๋ฆฌ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง„๋‹ค.
์‚ฌ์šฉ์ž๋Š” 3์ดˆ๋งŒ ๊ธฐ๋‹ค๋ ค๋„ ์ดํƒˆ๋ฅ ์ด ๊ธ‰์ฆํ•œ๋‹ค.

๋ฌธ์ œ 3: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ณผ๋ถ€ํ•˜
๋ชจ๋“  ์š”์ฒญ์ด DB์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋ฉด
DB๊ฐ€ ๋ณ‘๋ชฉ ์ง€์ ์ด ๋˜์–ด ์ „์ฒด ์‹œ์Šคํ…œ์ด ๋А๋ ค์ง„๋‹ค.

๋ฌธ์ œ 4: ๋น„์ฆˆ๋‹ˆ์Šค ์†์‹ค
์„œ๋น„์Šค ๋‹ค์šด์€ ๊ณง ๋งค์ถœ ์†์‹ค๊ณผ ์‹ ๋ขฐ๋„ ํ•˜๋ฝ์œผ๋กœ ์ด์–ด์ง„๋‹ค.

๊ธฐ๋ณธ ๊ฐœ๋… ์š”์•ฝ


๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ์ „๋žต์€
๋ถ„์‚ฐ(Distribution)๊ณผ ํšจ์œจํ™”(Optimization)์ด๋‹ค.

๐Ÿท๏ธ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ


1. ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ (Load Balancing)


๊ฐœ๋…: ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„์‚ฐ์‹œํ‚จ๋‹ค.

๋น„์œ :
์€ํ–‰ ์ฐฝ๊ตฌ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.
์ฐฝ๊ตฌ๊ฐ€ ํ•˜๋‚˜๋ฉด ์ค„์ด ๊ธธ์ง€๋งŒ,
์ฐฝ๊ตฌ๋ฅผ 10๊ฐœ๋กœ ๋Š˜๋ฆฌ๊ณ  ์ž…๊ตฌ์—์„œ ๋ฒˆํ˜ธํ‘œ๋ฅผ ๋‚˜๋ˆ ์ฃผ๋ฉด
๋Œ€๊ธฐ ์‹œ๊ฐ„์ด 1/10๋กœ ์ค„์–ด๋“ ๋‹ค.

์ฃผ์š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  • Round Robin: ์ˆœ์„œ๋Œ€๋กœ ๋Œ์•„๊ฐ€๋ฉฐ ๋ถ„๋ฐฐ
  • Least Connections: ํ˜„์žฌ ์—ฐ๊ฒฐ์ด ๊ฐ€์žฅ ์ ์€ ์„œ๋ฒ„๋กœ ๋ถ„๋ฐฐ
  • IP Hash: ๊ฐ™์€ ์‚ฌ์šฉ์ž๋Š” ํ•ญ์ƒ ๊ฐ™์€ ์„œ๋ฒ„๋กœ ์—ฐ๊ฒฐ
  • Weighted: ์„œ๋ฒ„ ์„ฑ๋Šฅ์— ๋”ฐ๋ผ ๊ฐ€์ค‘์น˜๋ฅผ ๋‘๊ณ  ๋ถ„๋ฐฐ


2. ์บ์‹ฑ (Caching)


๊ฐœ๋…: ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅธ ์ €์žฅ์†Œ์— ๋ฏธ๋ฆฌ ์ €์žฅํ•ด๋‘”๋‹ค.

๋น„์œ :
๋„์„œ๊ด€์—์„œ ์ฑ…์„ ์ฐพ์„ ๋•Œ๋งˆ๋‹ค ์„œ๊ณ ๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒƒ๋ณด๋‹ค,
์ธ๊ธฐ ๋„์„œ๋Š” ๋Œ€์ถœ ์นด์šดํ„ฐ ๊ทผ์ฒ˜์— ๋ฏธ๋ฆฌ ์Œ“์•„๋‘๋ฉด
์ฐพ๋Š” ์‹œ๊ฐ„์ด ํš๊ธฐ์ ์œผ๋กœ ์ค„์–ด๋“ ๋‹ค.

์บ์‹ฑ ๊ณ„์ธต:

  • CDN(Content Delivery Network) ์บ์‹ฑ: ์ •์  ํŒŒ์ผ์„ ์ „ ์„ธ๊ณ„์— ๋ถ„์‚ฐ ์ €์žฅ
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์บ์‹ฑ: Redis, Memcached๋กœ API ์‘๋‹ต ์ €์žฅ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์บ์‹ฑ: ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ
  • ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ: ์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ


3. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ™•์žฅ


Replication (๋ณต์ œ):

  • Master DB: ์“ฐ๊ธฐ ์ „๋‹ด
  • Slave DB: ์ฝ๊ธฐ ์ „๋‹ด
  • ์ฝ๊ธฐ ์š”์ฒญ์ด 80% ์ด์ƒ์ธ ์„œ๋น„์Šค์— ํšจ๊ณผ์ 

Sharding (์ƒค๋”ฉ):

  • ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ DB๋กœ ์ˆ˜ํ‰ ๋ถ„ํ• 
  • ์˜ˆ: ์‚ฌ์šฉ์ž ID ๋ฒ”์œ„๋ณ„๋กœ ๋ถ„์‚ฐ


4. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ


๊ฐœ๋…: ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์€ ๋‚˜์ค‘์— ์ฒ˜๋ฆฌํ•œ๋‹ค.

๋น„์œ :
์Œ์‹์ ์—์„œ ์ฃผ๋ฌธ์„ ๋ฐ›์„ ๋•Œ,
๋ชจ๋“  ์š”๋ฆฌ๊ฐ€ ์™„์„ฑ๋  ๋•Œ๊นŒ์ง€ ์†๋‹˜์„ ์„ธ์›Œ๋‘์ง€ ์•Š๊ณ 
์ฃผ๋ฌธ๋งŒ ๋ฐ›๊ณ  ์ž๋ฆฌ๋กœ ์•ˆ๋‚ดํ•œ ๋’ค ๋‚˜์ค‘์— ์Œ์‹์„ ๊ฐ€์ ธ๋‹ค์ค€๋‹ค.

ํ™œ์šฉ ์‚ฌ๋ก€: ์ด๋ฉ”์ผ ๋ฐœ์†ก, ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ, ๋ฐ์ดํ„ฐ ์ง‘๊ณ„, ์•Œ๋ฆผ ๋ฐœ์†ก

5. CDN (Content Delivery Network)


๊ฐœ๋…: ์ •์  ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉ์ž์™€ ๊ฐ€๊นŒ์šด ๊ณณ์—์„œ ์ œ๊ณตํ•œ๋‹ค.

ํšจ๊ณผ: ์‘๋‹ต ์†๋„ ํ–ฅ์ƒ, ์›๋ณธ ์„œ๋ฒ„ ๋ถ€ํ•˜ ๊ฐ์†Œ, DDoS ๋ฐฉ์–ด

๐Ÿท๏ธ ํ™•์žฅ์„ฑ์˜ ๋‘ ๊ฐ€์ง€ ๋ฐฉํ–ฅ


์ˆ˜์ง ํ™•์žฅ (Scale Up)


๋ฐฉ๋ฒ•: ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์„ ๋†’์ธ๋‹ค. (CPU, ๋ฉ”๋ชจ๋ฆฌ ์ฆ์„ค)
์žฅ์ : ๊ตฌํ˜„ ๊ฐ„๋‹จ, ์ฝ”๋“œ ์ˆ˜์ • ๋ถˆํ•„์š”
๋‹จ์ : ๋น„์šฉ ๊ธ‰์ฆ, ๋ฌผ๋ฆฌ์  ํ•œ๊ณ„ ์กด์žฌ, ์žฅ์•  ์‹œ ์ „์ฒด ์ค‘๋‹จ

์ˆ˜ํ‰ ํ™•์žฅ (Scale Out)


๋ฐฉ๋ฒ•: ์„œ๋ฒ„์˜ ๊ฐœ์ˆ˜๋ฅผ ๋Š˜๋ฆฐ๋‹ค.
์žฅ์ : ๋น„์šฉ ํšจ์œจ์ , ๋ฌดํ•œ ํ™•์žฅ ๊ฐ€๋Šฅ, ์žฅ์•  ์‹œ ์ผ๋ถ€๋งŒ ์˜ํ–ฅ
๋‹จ์ : ์„ค๊ณ„ ๋ณต์žก, ์„ธ์…˜ ๊ด€๋ฆฌ ๋ฌธ์ œ ๋ฐœ์ƒ

๊ฒฐ๋ก : ๋Œ€๋ถ€๋ถ„์˜ ๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค๋Š” ์ˆ˜ํ‰ ํ™•์žฅ์„ ๊ธฐ๋ณธ์œผ๋กœ ํ•œ๋‹ค.

์‹ค์ „ ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ


๋‹จ๊ณ„ 1: ๊ธฐ๋ณธ ๊ตฌ์„ฑ


[์‚ฌ์šฉ์ž] โ†’ [์›น ์„œ๋ฒ„] โ†’ [๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค]


๋ฌธ์ œ์ : ๋™์‹œ ์ ‘์†์ž 1,000๋ช… ์ด์ƒ์ด๋ฉด ๋ฒ„๊ฑฐ์›€

๋‹จ๊ณ„ 2: ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ์ถ”๊ฐ€


                     โ”Œโ”€โ†’ [์›น ์„œ๋ฒ„ 1] โ”€โ”
[์‚ฌ์šฉ์ž] โ†’ [๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ] โ”€โ”ผโ”€โ†’ [์›น ์„œ๋ฒ„ 2] โ”€โ”ผโ†’ [DB]
                     โ””โ”€โ†’ [์›น ์„œ๋ฒ„ 3] โ”€โ”˜


๊ฐœ์„ : ์ฒ˜๋ฆฌ๋Ÿ‰ 3๋ฐฐ, ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ๊ฐ€๋Šฅ

๋‹จ๊ณ„ 3: DB ๋ณต์ œ ์ถ”๊ฐ€


                                   โ”Œโ†’ [Master DB] (์“ฐ๊ธฐ)
[์‚ฌ์šฉ์ž] โ†’ [๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ] โ†’ [์›น ์„œ๋ฒ„๋“ค] โ”ผโ†’ [Slave DB 1] (์ฝ๊ธฐ)
                                   โ””โ†’ [Slave DB 2] (์ฝ๊ธฐ)


๊ฐœ์„ : ์ฝ๊ธฐ ๋ถ€ํ•˜ ๋ถ„์‚ฐ, ์ฝ๊ธฐ ์„ฑ๋Šฅ ๋Œ€ํญ ํ–ฅ์ƒ

๋‹จ๊ณ„ 4: ์บ์‹œ ์ถ”๊ฐ€


[์‚ฌ์šฉ์ž] โ†’ [๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ] โ†’ [์›น ์„œ๋ฒ„๋“ค] โ†’ [Redis ์บ์‹œ] โ†’ [DB]


๊ฐœ์„ : DB ๋ถ€ํ•˜ 80% ๊ฐ์†Œ, ์‘๋‹ต ์‹œ๊ฐ„ 10๋ฐฐ ๋‹จ์ถ•

๋‹จ๊ณ„ 5: ์™„์„ฑํ˜•


[์‚ฌ์šฉ์ž] โ†’ [CDN] โ†’ [๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ] โ†’ [์›น ์„œ๋ฒ„๋“ค] โ†’ [Redis] โ†’ [DB]
                                        โ†“
                                   [๋ฉ”์‹œ์ง€ ํ]
                                        โ†“
                                   [Worker ์„œ๋ฒ„๋“ค]


๊ฐœ์„ : ์ •์  ํŒŒ์ผ CDN ์ œ๊ณต, ๋ฌด๊ฑฐ์šด ์ž‘์—… ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

Nginx ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ์„ค์ • ์˜ˆ์‹œ


Round Robin ๋ฐฉ์‹


http {
    upstream backend {
        server 10.0.1.101:8080;
        server 10.0.1.102:8080;
        server 10.0.1.103:8080;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}


Least Connections ๋ฐฉ์‹


upstream backend {
    least_conn;
    server 10.0.1.101:8080;
    server 10.0.1.102:8080;
    server 10.0.1.103:8080;
}


๊ฐ€์ค‘์น˜ ์„ค์ •


upstream backend {
    server 10.0.1.101:8080 weight=3;
    server 10.0.1.102:8080 weight=2;
    server 10.0.1.103:8080 weight=1;
}


ํ—ฌ์Šค ์ฒดํฌ


upstream backend {
    server 10.0.1.101:8080 max_fails=3 fail_timeout=30s;
    server 10.0.1.102:8080 max_fails=3 fail_timeout=30s;
    server 10.0.1.103:8080 backup;
}


Redis ์บ์‹ฑ ์˜ˆ์‹œ


๊ธฐ๋ณธ ์บ์‹ฑ ํŒจํ„ด


import redis
import json

cache = redis.Redis(host='localhost', port=6379)

def get_user_profile(user_id):
    # 1. ์บ์‹œ ํ™•์ธ
    cache_key = f"user:{user_id}"
    cached = cache.get(cache_key)

    if cached:
        return json.loads(cached)

    # 2. DB ์กฐํšŒ
    data = db.query(f"SELECT * FROM users WHERE id={user_id}")

    # 3. ์บ์‹œ ์ €์žฅ (1์‹œ๊ฐ„)
    cache.setex(cache_key, 3600, json.dumps(data))

    return data


์ธ๊ธฐ ๊ฒŒ์‹œ๋ฌผ ์บ์‹ฑ


def get_popular_posts():
    cached = cache.get("posts:popular")
    if cached:
        return json.loads(cached)

    posts = db.query("SELECT * FROM posts ORDER BY views DESC LIMIT 10")
    cache.setex("posts:popular", 300, json.dumps(posts))

    return posts


์บ์‹œ ๋ฌดํšจํ™”


def update_user(user_id, data):
    db.update(f"UPDATE users SET ... WHERE id={user_id}")
    cache.delete(f"user:{user_id}")  # ์บ์‹œ ์‚ญ์ œ


๋ฉ”์‹œ์ง€ ํ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ


Producer (์ž‘์—… ์š”์ฒญ)


import pika
import json

def send_email_async(user_email):
    connection = pika.BlockingConnection()
    channel = connection.channel()
    channel.queue_declare(queue='email_queue')

    message = {'email': user_email, 'type': 'welcome'}
    channel.basic_publish(
        exchange='',
        routing_key='email_queue',
        body=json.dumps(message)
    )

    print("์ด๋ฉ”์ผ ์ž‘์—… ํ์— ์ถ”๊ฐ€")
    # ์ฆ‰์‹œ ๋ฆฌํ„ด!


Consumer (์ž‘์—… ์ฒ˜๋ฆฌ)


def process_email(ch, method, properties, body):
    message = json.loads(body)
    send_email(message['email'])  # ์‹ค์ œ ์ด๋ฉ”์ผ ๋ฐœ์†ก
    ch.basic_ack(delivery_tag=method.delivery_tag)

connection = pika.BlockingConnection()
channel = connection.channel()
channel.basic_consume(queue='email_queue', on_message_callback=process_email)
channel.start_consuming()


์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง


์ฃผ์š” ์ง€ํ‘œ


์„œ๋ฒ„ ์ง€ํ‘œ:

  • CPU ์‚ฌ์šฉ๋ฅ  (80% ์ด์ƒ โ†’ Scale Out)
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ  (90% ์ด์ƒ โ†’ ์œ„ํ—˜)
  • ๋””์Šคํฌ I/O
  • ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ง€ํ‘œ:

  • ์‘๋‹ต ์‹œ๊ฐ„ (ํ‰๊ท , p95, p99)
  • ์ฒ˜๋ฆฌ๋Ÿ‰ (RPS)
  • ์—๋Ÿฌ์œจ (5xx)
  • ๋™์‹œ ์ ‘์†์ž ์ˆ˜

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ง€ํ‘œ:

  • ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ๊ฐ„
  • ์ปค๋„ฅ์…˜ ํ’€ ์‚ฌ์šฉ๋ฅ 
  • Replication Lag
  • ๋ฝ ๋Œ€๊ธฐ ์‹œ๊ฐ„

์บ์‹œ ์ง€ํ‘œ:

  • ์บ์‹œ ํžˆํŠธ์œจ (80% ์ด์ƒ ๋ชฉํ‘œ)
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ 


์‹ค์ „ ์ฒดํฌ๋ฆฌ์ŠคํŠธ


โœ… ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ตœ์ ํ™”


  • ์ธ๋ฑ์Šค ์ถ”๊ฐ€
  • N+1 ์ฟผ๋ฆฌ ์ œ๊ฑฐ
  • ์ปค๋„ฅ์…˜ ํ’€ ์กฐ์ •
  • Replica ๋ถ„๋ฆฌ


โœ… ์บ์‹ฑ ์ ์šฉ


  • API ์‘๋‹ต ์บ์‹ฑ
  • ์ •์  ํŒŒ์ผ CDN
  • ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์บ์‹ฑ


โœ… ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ


  • Nginx/HAProxy ์„ค์ •
  • ํ—ฌ์Šค ์ฒดํฌ ๊ตฌ์„ฑ
  • ์„ธ์…˜ ๊ด€๋ฆฌ ์ „๋žต


โœ… ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ


  • ๋ฉ”์‹œ์ง€ ํ ๋„์ž…
  • Worker ์„œ๋ฒ„ ๊ตฌ์„ฑ
  • ์žฌ์‹œ๋„ ๋กœ์ง


โœ… ๋ชจ๋‹ˆํ„ฐ๋ง


  • Prometheus/Grafana ๊ตฌ์ถ•
  • ์•Œ๋ฆผ ์„ค์ •
  • ๋กœ๊ทธ ์ˆ˜์ง‘ (ELK)


์š”์•ฝ


๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ์€ ๋ถ„์‚ฐ๊ณผ ํšจ์œจํ™”๋‹ค.

๐Ÿ’Ž ํ•ต์‹ฌ ํฌ์ธํŠธ:

  1. ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋กœ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ๋ถ„์‚ฐ
  2. ์บ์‹ฑ์œผ๋กœ DB ๋ถ€ํ•˜๋ฅผ 80% ์ด์ƒ ๊ฐ์†Œ
  3. DB Replication์œผ๋กœ ์ฝ๊ธฐ ์„ฑ๋Šฅ ํ–ฅ์ƒ
  4. ๋ฉ”์‹œ์ง€ ํ๋กœ ๋ฌด๊ฑฐ์šด ์ž‘์—…์„ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
  5. CDN์œผ๋กœ ์ •์  ํŒŒ์ผ์„ ๋น ๋ฅด๊ฒŒ ์ œ๊ณต
  6. ๋ชจ๋‹ˆํ„ฐ๋ง์œผ๋กœ ๋ณ‘๋ชฉ ์ง€์ ์„ ์‹ค์‹œ๊ฐ„ ํŒŒ์•…


๐Ÿš€ ๋‹จ๊ณ„๋ณ„ ์ ์šฉ:

1๋‹จ๊ณ„: ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ + ์„œ๋ฒ„ ์ฆ์„ค
2๋‹จ๊ณ„: Redis ์บ์‹ฑ ์ ์šฉ
3๋‹จ๊ณ„: DB Replication ๊ตฌ์„ฑ
4๋‹จ๊ณ„: ๋ฉ”์‹œ์ง€ ํ ๋„์ž…
5๋‹จ๊ณ„: CDN ์ ์šฉ

์ฒ˜์Œ๋ถ€ํ„ฐ ์™„๋ฒฝํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋งŒ๋“ค ํ•„์š”๋Š” ์—†๋‹ค.
ํŠธ๋ž˜ํ”ฝ์ด ์ฆ๊ฐ€ํ•˜๋ฉด์„œ ๋‹จ๊ณ„์ ์œผ๋กœ ๊ฐœ์„ ํ•ด๋‚˜๊ฐ€๋Š” ๊ฒƒ์ด ํ˜„์‹ค์ ์ด๋‹ค.
์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ณ‘๋ชฉ ์ง€์ ์„ ํŒŒ์•…ํ•˜๊ณ  ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•ด ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค.