๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Java & Spring ์‹ค์ „ ๊ฐœ๋ฐœ

5ํŽธ. ์‹ค์ „ ์šด์˜ ์žฅ์•  ์‚ฌ๋ก€ 10์„  + ์žฅ์•  ๋ณต๊ตฌ ํ”Œ๋ ˆ์ด๋ถ

๋ฐ˜์‘ํ˜•

 

์‹ค์ „ ์šด์˜ ์žฅ์•  ์‚ฌ๋ก€ 10์„ 

๐ŸŸฆ 5ํŽธ. ์‹ค์ „ ์šด์˜ ์žฅ์•  ์‚ฌ๋ก€ 10์„  + ์žฅ์•  ๋ณต๊ตฌ ํ”Œ๋ ˆ์ด๋ถ

์šด์˜ ํ™˜๊ฒฝ์—์„œ ์žฅ์• ๋Š” ์ ˆ๋Œ€ ํ”ผํ•  ์ˆ˜ ์—†๋‹ค.
๋ฌธ์ œ๋Š” ์žฅ์• ๋ฅผ ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ๊ฐ์ง€ํ•˜๊ณ , ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ์ •์ƒํ™”ํ•˜๋А๋ƒ๋‹ค.

์ด๋ฒˆ ํŽธ์—์„œ๋Š” ์‹ค์ œ ์šด์˜์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฐœ์ƒํ–ˆ๋˜ ์žฅ์• ๋“ค์„ ์œ ํ˜•๋ณ„๋กœ ์ •๋ฆฌํ•˜๊ณ ,
๊ฐ ์žฅ์• ๋งˆ๋‹ค ์ฆ‰์‹œ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณต๊ตฌ ํ”Œ๋ ˆ์ด๋ถ(Playbook) ์„ ์ œ๊ณตํ•œ๋‹ค.


โ–  1) ์žฅ์•  ์œ ํ˜• 10์„  — ๊ฐ€์žฅ ์ž์ฃผ ํ„ฐ์ง€๋Š” ์‹ค์ œ ์‚ฌ๋ก€


๐ŸŸฆ ์žฅ์•  01 — DB Connection Pool ๊ณ ๊ฐˆ (HikariCP)

์ฆ์ƒ:

  • API ์‘๋‹ต 3~10์ดˆ ์ฆ๊ฐ€
  • Hikari: “Connection not available” ๊ฒฝ๊ณ  ๋ฐ˜๋ณต

์›์ธ:

  • ํŠน์ • ์ฟผ๋ฆฌ ์ง€์—ฐ
  • ํ’€ ์‚ฌ์ด์ฆˆ ๋ถ€์กฑ
  • ์ปค๋„ฅ์…˜ ๋ˆ„์ˆ˜(leak)

์ฆ‰์‹œ ๋ณต๊ตฌ:

  1. ๋ชจ๋‹ˆํ„ฐ๋ง์—์„œ active connection ๊ธ‰์ฆ ํ™•์ธ
  2. DB slow query ์กฐํšŒ
  3. ์žฅ์•  ๊ตฌ๊ฐ„ ํŠธ๋ž˜ํ”ฝ ์šฐํšŒ or scale-out

๊ทผ๋ณธ ์กฐ์น˜:

  • maxLifetime → DB wait_timeout ๋งž์ถ”๊ธฐ
  • ์ปค๋„ฅ์…˜ ๋ˆ„์ˆ˜ ๋กœ๊ทธ ์ถ”๊ฐ€
  • ๋ฌธ์ œ SQL ์‹คํ–‰๊ณ„ํš ํŠœ๋‹

๐ŸŸฆ ์žฅ์•  02 — Redis ์žฅ์•  (timeout, cluster failover)

์ฆ์ƒ:

  • ์ธ์ฆ API ํญ๋ฐœ
  • ์„ธ์…˜/ํ† ํฐ ๋‹ค์ˆ˜ invalid ๋ฐœ์ƒ
  • ์บ์‹œ ์กฐํšŒ ์‹œ๊ฐ„ ํƒ€์ž„์•„์›ƒ ์ฆ๊ฐ€

์›์ธ:

  • Redis ๋‹จ์ผ ๋…ธ๋“œ ๋ถ€ํ•˜ ์ง‘์ค‘
  • cluster failover
  • slow command(MGET, KEYS ๋“ฑ)

์ฆ‰์‹œ ๋ณต๊ตฌ:

  • Redis client timeout ํ™•๋Œ€
  • ์ž„์‹œ๋กœ ์บ์‹œ ์‚ฌ์šฉ off (fallback)
  • ์žฅ์•  ๊ตฌ๊ฐ„ ๋ฐ์ดํ„ฐ ์บ์‹œ flush

๊ทผ๋ณธ ์กฐ์น˜:

  • key ํŒจํ„ด ์ตœ์ ํ™”
  • TTL ์ •์ฑ… ์žฌ์„ค๊ณ„
  • ์บ์‹œ ๋ฏธ์Šค ๋Œ€์‘ ๋กœ์ง ์ ์šฉ(์บ์‹œ ์Šคํƒฌํ”ผ๋“œ ๋ฐฉ์ง€)

๐ŸŸฆ ์žฅ์•  03 — MQ(Kafka) Consumer Lag ํญ์ฃผ

์ฆ์ƒ:

  • ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ์ง€์—ฐ
  • ๋ฐฐ์น˜์„ฑ ๊ธฐ๋Šฅ์ด ์ˆ˜ ์‹œ๊ฐ„ ์ง€์—ฐ
  • lag ์ˆ˜๋งŒ~์ˆ˜์‹ญ๋งŒ ๋ฐœ์ƒ

์›์ธ:

  • consumer ์ค‘ ์ผ๋ถ€ ์ธ์Šคํ„ด์Šค ์ฃฝ์Œ
  • ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ๋ฉ”์‹œ์ง€ ์ƒ์„ฑ ์†๋„๋ฅผ ๋ชป ๋”ฐ๋ผ๊ฐ
  • partition ๋ถˆ๊ท ํ˜•

์ฆ‰์‹œ ๋ณต๊ตฌ:

  • consumer scale-out
  • ๋А๋ฆฐ partition๋งŒ ์žฌ๋ฐฐ์น˜
  • consumer group ์žฌ์‹œ์ž‘

๊ทผ๋ณธ ์กฐ์น˜:

  • ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ๋กœ์ง ๋ณ‘๋ ฌํ™”
  • ํŒŒํ‹ฐ์…˜ ์žฌ์„ค๊ณ„
  • ack ๋ชจ๋“œ ๋ฐ commit ์ •์ฑ… ์กฐ์ •

๐ŸŸฆ ์žฅ์•  04 — WAS OOM(OutOfMemory) ๋ฐœ์ƒ → ์„œ๋น„์Šค ์ค‘๋‹จ

์ฆ์ƒ:

  • pod/container ์žฌ์‹œ์ž‘ ๋ฐ˜๋ณต
  • GC pause ์ฆ๊ฐ€
  • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๊ฒฝ๊ณ 

์›์ธ:

  • ๋Œ€๋Ÿ‰ ๊ฐ์ฒด ๋ฉ”๋ชจ๋ฆฌ ์ถ•์ 
  • ์บ์‹œ oversize
  • Jackson/JSON huge payload

์ฆ‰์‹œ ๋ณต๊ตฌ:

  • ์ธ์Šคํ„ด์Šค ์ฆ‰์‹œ ์žฌ๊ธฐ๋™
  • ๋ฉ”๋ชจ๋ฆฌ ๋คํ”„ ํ™•๋ณด
  • ์žฅ์•  API ์ž„์‹œ ์ฐจ๋‹จ

๊ทผ๋ณธ ์กฐ์น˜:

  • heap dump ๋ถ„์„
  • ๊ฐ์ฒด ๋ผ์ดํ”„์‚ฌ์ดํด ์ •๋ฆฌ
  • ์บ์‹œ ํฌ๊ธฐ ์ •์ฑ…ํ™”
  • DTO projection์œผ๋กœ ์ง๋ ฌํ™” ์ตœ์†Œํ™”

๐ŸŸฆ ์žฅ์•  05 — JVM Thread Pool ๊ณ ๊ฐˆ (Tomcat/Netty)

์ฆ์ƒ:

  • API ํ˜ธ์ถœ์ด ๋ฌดํ•œ Pending
  • thread count max ๋„๋‹ฌ
  • 503 or timeout ๋‹ค๋Ÿ‰ ๋ฐœ์ƒ

์›์ธ:

  • Blocking IO ๋Œ€๋Ÿ‰ ๋ฐœ์ƒ
  • DB ์ง€์—ฐ → thread ์žฅ๊ธฐ ์ ์œ 
  • async thread pool misconfiguration

์ฆ‰์‹œ ๋ณต๊ตฌ:

  • thread dump ๋ถ„์„
  • ํญ์ฃผ์‹œํ‚จ API ํ ์ฐจ๋‹จ
  • ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค scale-out

๊ทผ๋ณธ ์กฐ์น˜:

  • ๋น„๋™๊ธฐ ์ „ํ™˜
  • connection pool, thread pool ์‚ฌ์ด์ฆˆ ์žฌ์„ค๊ณ„
  • DB ํŠœ๋‹

๐ŸŸฆ ์žฅ์•  06 — ๋ฐฐ์น˜(Job) ๋ฌดํ•œ ๋Œ€๊ธฐ / Deadlock

์ฆ์ƒ:

  • ๋ฐฐ์น˜๊ฐ€ “RUNNING” ์ƒํƒœ๋กœ ๋ฉˆ์ถค
  • ๋‹ค์Œ ์ž‘์—…์ด ์‹คํ–‰๋˜์ง€ ์•Š์Œ
  • DB lock wait ์ฆ๊ฐ€

์›์ธ:

  • DB ํŠธ๋žœ์žญ์…˜ lock
  • ์Šค์ผ€์ค„๋ง ์ถฉ๋Œ
  • ์ค‘๋ณต ์‹คํ–‰

์ฆ‰์‹œ ๋ณต๊ตฌ:

  • lock session kill
  • ๋ฐฐ์น˜ ์ž‘์—… ๊ฐ•์ œ ์ข…๋ฃŒ
  • ์Šค์ผ€์ค„ ๊ฐ„ ์ถฉ๋Œ ์‹œ๊ฐ„๋Œ€ ์กฐ์ •

๊ทผ๋ณธ ์กฐ์น˜:

  • ๋ฐฐ์น˜ idempotent ์„ค๊ณ„
  • chunk size ์กฐ์ •
  • ๋ถ„์‚ฐ๋ฝ(Redis Lock) ๋„์ž…

๐ŸŸฆ ์žฅ์•  07 — ์™ธ๋ถ€ API ์žฅ์•  → ์šฐ๋ฆฌ API๊นŒ์ง€ ์ „ํŒŒ

์ฆ์ƒ:

  • ์™ธ๋ถ€ API timeout
  • ์šฐ๋ฆฌ ์„œ๋ฒ„ thread ์ ์œ  ์ฆ๊ฐ€
  • ์ „์ฒด ์‘๋‹ต ์ง€์—ฐ

์›์ธ:

  • ํšŒ๋กœ ์ฐจ๋‹จ ๋ฏธ์ ์šฉ
  • Connection timeout ๊ณผ๋„ํ•˜๊ฒŒ ๊น€
  • retry ๊ณผ๋„ ๋ฐœ์ƒ

์ฆ‰์‹œ ๋ณต๊ตฌ:

  • timeout ์ฆ‰์‹œ ์ค„์ด๊ธฐ
  • fallback ํ™œ์„ฑํ™”
  • ์™ธ๋ถ€ API ์ฝœ์„ ์ž„์‹œ ์ฐจ๋‹จ

๊ทผ๋ณธ ์กฐ์น˜:

  • Resilience4j CircuitBreaker ์ ์šฉ
  • retry, bulkhead, timeout ์ •์ฑ… ์ •๋ฆฝ
  • ๋น„๋™๊ธฐ/queue ๋ฐฉ์‹ ์ „ํ™˜

๐ŸŸฆ ์žฅ์•  08 — ํŒŒ์ผ ์—…๋กœ๋“œ ์ €์žฅ์†Œ ์žฅ์•  (NFS, S3)

์ฆ์ƒ:

  • ์—…๋กœ๋“œ/๋‹ค์šด๋กœ๋“œ ์ง€์—ฐ
  • WAS thread ๋Œ€๊ธฐ ์ฆ๊ฐ€
  • time-wait ์ˆ˜ ํญ์ฆ

์›์ธ:

  • ๋„คํŠธ์›Œํฌ ์ง€์—ฐ
  • ํŒŒ์ผ ์„œ๋ฒ„ ์žฅ์• 
  • ๋Œ€๋Ÿ‰ ์š”์ฒญ์œผ๋กœ IOPS ๋ถ€์กฑ

์ฆ‰์‹œ ๋ณต๊ตฌ:

  • ์—…๋กœ๋“œ ๊ธฐ๋Šฅ ์ž„์‹œ ์ค‘๋‹จ
  • ํŒŒ์ผ ์„œ๋ฒ„ failover
  • ์บ์‹ฑ๋œ ํŒŒ์ผ๋กœ ๋Œ€์ฒด ์ œ๊ณต

๊ทผ๋ณธ ์กฐ์น˜:

  • ํŒŒ์ผ CDN ๋ถ„๋ฆฌ
  • ๋น„๋™๊ธฐ ์—…๋กœ๋“œ๋กœ ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„ 
  • pre-signed URL ํ™œ์šฉ

๐ŸŸฆ ์žฅ์•  09 — DB ์Šคํ† ๋ฆฌ์ง€ Full ๋˜๋Š” I/O ํญ์ฃผ

์ฆ์ƒ:

  • insert/update ์‹คํŒจ
  • ํ…Œ์ด๋ธ” lock
  • write latency ๊ธ‰์ฆ

์›์ธ:

  • ๋กœ๊ทธ/๋ฐฑ์—… ํŒŒ์ผ ๋ˆ„์ 
  • stat/index file ํญ์ฆ
  • ์žฅ๊ธฐ๊ฐ„ ๋ฐฐ์น˜๋กœ ์ธํ•œ I/O ํญ์ฃผ

์ฆ‰์‹œ ๋ณต๊ตฌ:

  • ๊ธด๊ธ‰ ์Šคํ† ๋ฆฌ์ง€ ํ™•์žฅ
  • ๋ถˆํ•„์š”ํ•œ ๋กœ๊ทธ ์‚ญ์ œ
  • index rebuild

๊ทผ๋ณธ ์กฐ์น˜:

  • ์ž๋™ purge ์ •์ฑ…
  • partition table ์ ์šฉ
  • archive ํ…Œ์ด๋ธ” ๋ถ„๋ฆฌ

๐ŸŸฆ ์žฅ์•  10 — ALB/Nginx Rate Limit ๋˜๋Š” ๋„คํŠธ์›Œํฌ ์žฅ์• 

์ฆ์ƒ:

  • 429 Too Many Requests
  • ํŠน์ • ๊ตฌ๊ฐ„ API๋งŒ ํƒ€์ž„์•„์›ƒ
  • health check ์‹คํŒจ

์›์ธ:

  • ๊ธ‰๊ฒฉํ•œ ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€
  • ์ž˜๋ชป๋œ rate limit ์„ค์ •
  • ๋„คํŠธ์›Œํฌ ๋ผ์šฐํŒ… ์žฅ์• 

์ฆ‰์‹œ ๋ณต๊ตฌ:

  • rate limit ์ž„์‹œ ์™„ํ™”
  • ํŠธ๋ž˜ํ”ฝ ์ผ๋ถ€๋ฅผ ์„œ๋ธŒ ๋„๋ฉ”์ธ์œผ๋กœ ๋ถ„๋ฆฌ
  • ์ธ์Šคํ„ด์Šค scale-out

๊ทผ๋ณธ ์กฐ์น˜:

  • API ๋ณ„ rate limit ์ •์ฑ…ํ™”
  • CDN ์‚ฌ์šฉ
  • ๋„คํŠธ์›Œํฌ ๊ตฌ๊ฐ„ ์žฅ์•  ๊ฐ์‹œ ์ž๋™ํ™”

โ–  ๐Ÿ”ฅ ์šด์˜ํŒ€์ด ๊ผญ ๊ฐ€์ ธ์•ผ ํ•  “์žฅ์•  ๋ณต๊ตฌ ํ”Œ๋ ˆ์ด๋ถ(Playbook)”

์šด์˜ ๋ณต๊ตฌ์—๋Š” ์ •ํ•ด์ง„ ์ˆœ์„œ๊ฐ€ ์žˆ๋‹ค.
๋ชจ๋“  ์žฅ์•  ํ˜„์žฅ์—์„œ ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ์ •์ƒํ™”ํ•˜๋Š” ํŒ€๋“ค์˜ ๊ณตํ†ต ์ „๋žต์„ ์•„๋ž˜์— ์ •๋ฆฌํ–ˆ๋‹ค.


โœ” 1๋‹จ๊ณ„ — ๋ฌธ์ œ ๊ฐ์ง€ (Detection)

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ธฐ์ค€์€ ์ง€ํ‘œ ์ด์ƒ๊ฐ์ง€(alert) ์ด๋‹ค.

  • API latency
  • DB connection usage
  • CPU/Memory spike
  • error rate
  • Kafka consumer lag
  • Redis ops count ๋ณ€๋™

โœ” 2๋‹จ๊ณ„ — ๋น ๋ฅธ ์›์ธ ๋‹จ์„œ ์ˆ˜์ง‘ (Gather Clues)

5๋ถ„ ์•ˆ์— ํ•ด์•ผ ํ•  ํ–‰๋™:

โ— 1) thread dump

โ— 2) DB active session / slow query

โ— 3) redis/mq ์ง€ํ‘œ

โ— 4) network latency

โ— 5) ์ตœ๊ทผ ๋ฐฐํฌ ์—ฌ๋ถ€


โœ” 3๋‹จ๊ณ„ — ์„œ๋น„์Šค ์ฆ‰์‹œ ์•ˆ์ •ํ™” (Mitigation)

์ด ๋‹จ๊ณ„์—์„œ “์ •์ƒํ™” ์‹œ๊ฐ„”์ด ๊ฐˆ๋ฆฐ๋‹ค.

  • ํŠธ๋ž˜ํ”ฝ ์ฐจ๋‹จ or ๋ฆฌ๋ฐ‹
  • scale-out
  • ์žฅ์•  API ๊ฒฉ๋ฆฌ
  • ํŠน์ • ๊ธฐ๋Šฅ ๊ฐ•์ œ OFF
  • ์บ์‹œ fallback ์ ์šฉ

์šด์˜ํŒ€์ด ๊ฐ€์žฅ ๋‘๋ ค์›Œํ•˜๋Š” ๊ฑด ์‚ฌ์šฉ์ž ์œ ์ž…์„ ๋ฒ„ํ‹ฐ์ง€ ๋ชปํ•ด ์ „์ฒด ์žฅ์• ๋กœ ํ™•๋Œ€๋˜๋Š” ์ƒํ™ฉ์ด๋‹ค.


โœ” 4๋‹จ๊ณ„ — ๊ทผ๋ณธ ์›์ธ ์ œ๊ฑฐ (Root Cause)

ํ‰์ƒ์‹œ์— ํ•ด๋‘์ง€ ์•Š์œผ๋ฉด ๋ถˆ๊ฐ€๋Šฅํ•œ ๋‹จ๊ณ„.

  • ์ฟผ๋ฆฌ ํŠœ๋‹
  • ์ธ๋ฑ์Šค ์žฌ์„ค๊ณ„
  • ์บ์‹œ ์ •์ฑ… ์žฌ์ •๋ฆฝ
  • thread pool ์žฌ์„ค์ •
  • ๋ฐฐ์น˜ ๊ตฌ์กฐ ๊ฐœ์„ 
  • retry/circuit breaker ์ •์ฑ…ํ™”

โœ” 5๋‹จ๊ณ„ — ์žฌ๋ฐœ ๋ฐฉ์ง€ ์ž๋™ํ™” (Prevention)

์šด์˜ํŒ€์˜ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๋ ˆ๋ฒจ์ด ์—ฌ๊ธฐ์„œ ๊ฒฐ์ •๋œ๋‹ค.

  • SLA ๊ธฐ๋ฐ˜ alert ์žฌ์„ค๊ณ„
  • chaos engineering
  • canary ๋ฐฐํฌ
  • ์ž๋™ rollback
  • traffic shadowing
  • ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ์ •๊ธฐํ™”

โ–  ๋งˆ๋ฌด๋ฆฌ

์šด์˜ ์žฅ์• ๋Š” ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ๋ฐœ์ƒํ•˜์ง€๋งŒ,
๊ฐ ์žฅ์• ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ณต๊ตฌํ•˜๊ณ  ์žฌ๋ฐœ๊นŒ์ง€ ๋ง‰๋Š” ํŒ€์€ ์•„์ฃผ ๋“œ๋ฌผ๋‹ค.

ํ•ต์‹ฌ์€ ๋‹ค์Œ ํ•œ ์ค„๋กœ ์š”์•ฝ๋œ๋‹ค.

“์žฅ์• ๋Š” ์ค€๋น„๋œ ํŒ€์—๊ฒŒ๋Š” ๋‹จ์ˆœํ•œ ์ด๋ฒคํŠธ์ด๊ณ , ์ค€๋น„๋˜์ง€ ์•Š์€ ํŒ€์—๊ฒŒ๋Š” ์žฌ๋‚œ์ด๋‹ค.”

๋‹ค์Œ ํŽธ์—์„œ๋Š” ์šด์˜ ์žฅ์•  ๋ณต๊ตฌ์— ์ด์–ด

“ํŠธ๋ž˜ํ”ฝ ๊ธ‰์ฆ์— ๋ฒ„ํ‹ฐ๋Š” ์‹œ์Šคํ…œ ์„ค๊ณ„ — ์Šค์ผ€์ผ๋ง ์ „๋žต ์ •๋ฆฌ”

ํŽธ์œผ๋กœ ์ด์–ด๊ฐ€๊ฒ ๋‹ค.


๐Ÿ”– Tags

Java, SpringBoot, SpringPerformance, RealWorldTips, BackendEngineering, ProductionIssue, SystemDesign, ArchitecturePatterns, Database, Redis, Kafka, Resilience4j, DevOps, Troubleshooting, Playbook

๋ฐ˜์‘ํ˜•