๐Ÿš€ spring boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ดˆ๋‹น 100๋งŒ ๊ฑด์˜ ์š”์ฒญ ์ฒ˜๋ฆฌํ•˜๊ธฐ

ยท5 min readยท2ยท
๐Ÿš€ Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ดˆ๋‹น 100๋งŒ ๊ฑด์˜ ์š”์ฒญ ์ฒ˜๋ฆฌํ•˜๊ธฐ

๐Ÿš€ Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ดˆ๋‹น 100๋งŒ ๊ฑด์˜ ์š”์ฒญ ์ฒ˜๋ฆฌํ•˜๊ธฐ

์‰ฌ์šด ๋‹จ๊ณ„๋ณ„ ๊ฐ€์ด๋“œ โœจ

Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฒ˜์Œ ์‹œ์ž‘ํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์›ํ™œํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์—์„œ๋Š” ๊ธฐ๋ณธ ์„ค์ •๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ดˆ๋‹น 100๋งŒ ๊ฑด์˜ ์š”์ฒญ(RPS) ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์ •๋ฐ€ํ•œ ํŠœ๋‹, ํšจ์œจ์ ์ธ ์ฝ”๋”ฉ, ๊ทธ๋ฆฌ๊ณ  ์‹ ์ค‘ํ•œ ์ธํ”„๋ผ ์„ค๊ณ„๊ฐ€ ํ•„์š”ํ•œ ๋†’์€ ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค. ๐Ÿ’ช

์ด ๊ฐ€์ด๋“œ๋Š” Spring Boot๋ฅผ ๊ทนํ•œ์˜ ์ˆ˜์ค€์œผ๋กœ ํ™•์žฅํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ค‘์š”ํ•œ ์ตœ์ ํ™”๋ฅผ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์€ ์ „์ž์ƒ๊ฑฐ๋ž˜ ์ด๋ฒคํŠธ, ๊ธ€๋กœ๋ฒŒ SaaS ์›Œํฌ๋กœ๋“œ ๋˜๋Š” ๋ฏธ์…˜ ํฌ๋ฆฌํ‹ฐ์ปฌ API๋ฅผ ์ค€๋น„ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์—ฌ๊ธฐ์—์„œ ์‹ค์šฉ์ ์ธ ์ธ์‚ฌ์ดํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


1๏ธโƒฃ ๊ทœ๋ชจ ๋ฌธ์ œ ์ดํ•ดํ•˜๊ธฐ

100๋งŒ RPS๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํžˆ Spring Boot๋งŒ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ „์ฒด ์‹œ์Šคํ…œ์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด ์ˆ˜์น˜์— ๋„๋‹ฌํ•˜๋ ค๋ฉด ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  • ํšจ์œจ์ ์ธ ์ฝ”๋“œ ์‹คํ–‰ ๐ŸŽฏ - ์š”์ฒญ๋‹น ๋‚ฎ์€ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ
  • ์ตœ์ ํ™”๋œ I/O โšก - ๊ฐ€๋Šฅํ•œ ํ•œ ๋…ผ๋ธ”๋กœํ‚น ๋ฐฉ์‹
  • ์ˆ˜ํ‰ ํ™•์žฅ์„ฑ ๐Ÿ“ˆ - ์—ฌ๋Ÿฌ ๋…ธ๋“œ, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ
  • ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๐Ÿ’พ - ์บ์‹ฑ, ๋น„๋™๊ธฐ ์ž‘์—…, ์ตœ์†Œํ•œ์˜ DB ๋ณ‘๋ชฉ ํ˜„์ƒ

Spring Boot๋ฅผ ํผ์ฆ์˜ ํ•œ ์กฐ๊ฐ์œผ๋กœ ์ƒ๊ฐํ•˜์„ธ์š”. ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ, JVM ๋ฐ ์ธํ”„๋ผ๋„ ๋˜‘๊ฐ™์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.


2๏ธโƒฃ ์˜ฌ๋ฐ”๋ฅธ Spring Boot ์•„ํ‚คํ…์ฒ˜ ์„ ํƒํ•˜๊ธฐ

๊ธฐ๋ณธ์ ์œผ๋กœ Spring Boot๋Š” ๋‚ด์žฅ๋œ Tomcat ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Tomcat์€ ๋ธ”๋กœํ‚น I/O(BIO) ๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ์—์„œ๋Š”:

  • Netty๋กœ ์ „ํ™˜ํ•˜๊ธฐ ๐Ÿ”„ - Spring WebFlux๋ฅผ ํ†ตํ•ด Netty๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. Netty๋Š” ๋…ผ๋ธ”๋กœํ‚น I/O๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๋” ๋‚ฎ์€ ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ํ›จ์”ฌ ๋” ๋งŽ์€ ๋™์‹œ ์—ฐ๊ฒฐ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณ ์ˆ˜ํ•˜๊ธฐ โš›๏ธ - Mono, Flux ๋ฐ ๋ฐฑํ”„๋ ˆ์…”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋ ˆ๋“œ ๊ณ ๊ฐˆ์„ ๋ฐฉ์ง€ํ•˜์„ธ์š”.

Tomcat์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋งŽ์ด ํŠœ๋‹ํ•ด์•ผ ํ•˜์ง€๋งŒ, ์ง„์ •ํ•œ 100๋งŒ RPS๋ฅผ ์œ„ํ•ด์„œ๋Š” WebFlux + Netty๊ฐ€ ๋” ํ˜„๋ช…ํ•œ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.


3๏ธโƒฃ ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ ์ตœ์ ํ™”ํ•˜๊ธฐ

Spring Boot์˜ ์„ฑ๋Šฅ์€ ์Šค๋ ˆ๋“œ ๊ตฌ์„ฑ๊ณผ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:

๐Ÿ”ง Tomcat ํŠœ๋‹ (Tomcat ์‚ฌ์šฉ ์‹œ):

server.tomcat.max-threads=1000
server.tomcat.accept-count=10000
server.tomcat.connection-timeout=20000

โš™๏ธ Netty ํŠœ๋‹ (WebFlux):

Netty๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„๋กœ ์Šค๋ ˆ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ๋” ์ ์€ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ๋ธ”๋กœํ‚น ํ˜ธ์ถœ์„ ํ”ผํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•˜์„ธ์š”.

โš ๏ธ ์ปจํŠธ๋กค๋Ÿฌ ๋‚ด๋ถ€์—์„œ ๋ธ”๋กœํ‚น ํ˜ธ์ถœ ํ”ผํ•˜๊ธฐ

๋‹จ์ผ ๋ธ”๋กœํ‚น DB ๋˜๋Š” HTTP ํ˜ธ์ถœ์ด ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฝํ—˜ ๋ฒ•์น™: ๋” ๋งŽ์€ ์Šค๋ ˆ๋“œ โ‰  ๋” ๋งŽ์€ ์ฒ˜๋ฆฌ๋Ÿ‰. ํ™•์žฅ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋ ค๋ฉด ๋น„๋™๊ธฐ ๋ฐ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ๐ŸŽช


4๏ธโƒฃ JVM ๋ฐ GC ํŠœ๋‹

JVM์€ Spring Boot์˜ ์—”์ง„์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ์•ˆ์ „ํ•˜์ง€๋งŒ ๋†’์€ RPS์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๐ŸŽฏ ์ฃผ์š” JVM ์ตœ์ ํ™”:

  • ์ตœ์‹  JDK ์‚ฌ์šฉ(17 ์ด์ƒ) โ˜• - ๊ฐ ๋ฆด๋ฆฌ์Šค๋Š” ์„ฑ๋Šฅ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

  • ์˜ฌ๋ฐ”๋ฅธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(GC) ์„ ํƒ:

    • G1GC - ๊ท ํ˜• ์žกํžŒ ์›Œํฌ๋กœ๋“œ์šฉ
    • ZGC ๋˜๋Š” Shenandoah - ์ดˆ์ €์ง€์—ฐ์šฉ
  • ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๐Ÿ’ป - ํž™ ํฌ๊ธฐ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •:

    -Xms4g -Xmx4g -XX:+UseG1GC
    
    
    • ์ปจํ…Œ์ด๋„ˆ ์ œํ•œ์— ๋”ฐ๋ผ ์กฐ์ •
  • ์ปจํ…Œ์ด๋„ˆ ์ธ์‹ ํ™œ์„ฑํ™”:

    -XX:+UseContainerSupport
    
    

์ž˜ ํŠœ๋‹๋œ GC๋Š” 100๋งŒ RPS์—์„œ๋„ ์ง€์—ฐ ์‹œ๊ฐ„์„ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. โฑ๏ธ


5๏ธโƒฃ ์ ๊ทน์ ์œผ๋กœ ์บ์‹ฑ ํ™œ์šฉํ•˜๊ธฐ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์™ธ๋ถ€ ์„œ๋น„์Šค๋Š” ๊ฐ€์žฅ ํฐ ๋ณ‘๋ชฉ ํ˜„์ƒ์ž…๋‹ˆ๋‹ค. ๊ทน๋‹จ์ ์ธ ๊ทœ๋ชจ์—์„œ๋Š” ๋ชจ๋“  ์š”์ฒญ๋งˆ๋‹ค ์ด๋“ค์„ ํ˜ธ์ถœํ•  ์—ฌ์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿšซ

๐Ÿ“ฆ ์บ์‹ฑ ์ „๋žต:

  • ์ธ๋ฉ”๋ชจ๋ฆฌ ์บ์‹ฑ(Caffeine) - ๋กœ์ปฌ, ๊ทผ๊ฑฐ๋ฆฌ ์บ์‹œ ์„ฑ๋Šฅ
  • ๋ถ„์‚ฐ ์บ์‹ฑ(Redis, Hazelcast, Memcached) - ๋‹ค์ค‘ ๋…ธ๋“œ ํ™˜๊ฒฝ์šฉ
  • HTTP ์‘๋‹ต ์บ์‹ฑ - ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์ •์  ์‘๋‹ต ์บ์‹œ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ ์บ์‹ฑ - Hibernate์˜ 2์ฐจ ์บ์‹œ ๋˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ์บ์‹ฑ ์ „๋žต ์‚ฌ์šฉ

ํ™ฉ๊ธˆ ๋ฒ•์น™: ๋ชจ๋“  ์š”์ฒญ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ ˆ๋Œ€ ํ˜ธ์ถœํ•˜์ง€ ๋งˆ์„ธ์š”! ๐Ÿ† ์ ์ ˆํ•œ ์บ์‹ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด DB๊ฐ€ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ์•„๋‹Œ ๋ฐฑ์—…์ด ๋ฉ๋‹ˆ๋‹ค.


6๏ธโƒฃ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒํ˜ธ์ž‘์šฉ ์ตœ์ ํ™”ํ•˜๊ธฐ

Spring Boot ์•ฑ์ด ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ:

๐Ÿ”— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ตœ์ ํ™”:

  • ์ปค๋„ฅ์…˜ ํ’€๋ง ์‚ฌ์šฉ(HikariCP๋Š” Spring Boot์˜ ๊ธฐ๋ณธ๊ฐ’)

  • HikariCP๋ฅผ ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰์œผ๋กœ ํŠœ๋‹:

    spring.datasource.hikari.maximum-pool-size=200spring.datasource.hikari.minimum-idle=50spring.datasource.hikari.idle-timeout=30000spring.datasource.hikari.max-lifetime=600000
    
    
  • ๋‹จ์ผ ์ฟผ๋ฆฌ๋ณด๋‹ค ๋ฐฐ์น˜ ์‚ฝ์ž…/์—…๋ฐ์ดํŠธ ์„ ํ˜ธ ๐Ÿ“Š

  • ๋ถ„์„ ์ฟผ๋ฆฌ๋ฅผ ๋ณต์ œ๋ณธ์œผ๋กœ ์˜คํ”„๋กœ๋“œ ๐Ÿ”„

  • ์ดˆ๊ณ ์† ์“ฐ๊ธฐ/์ฝ๊ธฐ ์›Œํฌ๋กœ๋“œ๋ฅผ ์œ„ํ•ด NoSQL(Cassandra, DynamoDB, MongoDB) ๊ณ ๋ ค โšก

100๋งŒ RPS์—์„œ DB๋Š” ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์ด์— ๋งž๊ฒŒ ์„ค๊ณ„ํ•˜์„ธ์š”. ๐ŸŒ


7๏ธโƒฃ ์ง๋ ฌํ™” ์˜ค๋ฒ„ํ—ค๋“œ ์ตœ์†Œํ™”ํ•˜๊ธฐ

์ง๋ ฌํ™” ๋ฐ ์—ญ์ง๋ ฌํ™”๋Š” ๋Œ€๊ทœ๋ชจ์—์„œ ์กฐ์šฉํ•œ ํ‚ฌ๋Ÿฌ์ž…๋‹ˆ๋‹ค. JSON์€ ์‚ฌ๋žŒ์—๊ฒŒ ์นœ์ˆ™ํ•˜์ง€๋งŒ CPU ์ง‘์•ฝ์ ์ž…๋‹ˆ๋‹ค. ๐Ÿ˜ฐ

๐ŸŽจ ์ตœ์ ํ™”:

  • Jackson Afterburner ์‚ฌ์šฉ์œผ๋กœ JSON ์ง๋ ฌํ™” ์†๋„ ํ–ฅ์ƒ ๐Ÿš€
  • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•์‹(Protobuf, Avro, Smile) ์„ ํ˜ธ
  • ๋„คํŠธ์›Œํฌ๊ฐ€ ๋ณ‘๋ชฉ ํ˜„์ƒ์ธ ๊ฒฝ์šฐ์—๋งŒ ์‘๋‹ต ์••์ถ•. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์••์ถ•์ด CPU๋ฅผ ์†Œ๋ชจํ•ฉ๋‹ˆ๋‹ค.

์ž‘์€ ์ง๋ ฌํ™” ๋ณ€๊ฒฝ์œผ๋กœ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋‘ ๋ฐฐ๋กœ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿ’ฏ


8๏ธโƒฃ ์ˆ˜ํ‰ ํ™•์žฅ์œผ๋กœ ๋ฐฐํฌํ•˜๊ธฐ

๋‹จ์ผ Spring Boot ์ธ์Šคํ„ด์Šค๋กœ๋Š” 100๋งŒ RPS๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ˆ˜ํ‰์œผ๋กœ ํ™•์žฅํ•˜์„ธ์š”:

โ˜ธ๏ธ ํ™•์žฅ ์ „๋žต:

  • Kubernetes + HPA(Horizontal Pod Autoscaler) - CPU/๋ฉ”๋ชจ๋ฆฌ ๋˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ๋ฉ”ํŠธ๋ฆญ(RPS, ์ง€์—ฐ ์‹œ๊ฐ„)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™•์žฅ
  • ์„œ๋น„์Šค ๋ฉ”์‹œ(Istio/Linkerd) - ํŠธ๋ž˜ํ”ฝ, ์žฌ์‹œ๋„ ๋ฐ ์„œํ‚ท ๋ธŒ๋ ˆ์ดํ‚น ๊ด€๋ฆฌ
  • ๋ฌด์ƒํƒœ ์„ค๊ณ„ ๐ŸŽญ - ์„ธ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ Redis ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ณด๊ด€ํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—๋Š” ์ ˆ๋Œ€ ๋ณด๊ด€ํ•˜์ง€ ๋งˆ์„ธ์š”.

์„œ๋ฒ„๊ฐ€ ์•„๋‹Œ ํด๋Ÿฌ์Šคํ„ฐ ๊ด€์ ์œผ๋กœ ์ƒ๊ฐํ•˜์„ธ์š”. ๐ŸŒŸ


9๏ธโƒฃ ๋น„๋™๊ธฐ ๋ฉ”์‹œ์ง• ๋ฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜ ํ™œ์šฉํ•˜๊ธฐ

๊ทนํ•œ์˜ ๋ถ€ํ•˜์—์„œ๋Š” ๋™๊ธฐ ์š”์ฒญ-์‘๋‹ต ์‹œ์Šคํ…œ์ด ์–ด๋ ค์›€์„ ๊ฒช์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋„์ž…ํ•˜์„ธ์š”:

๐Ÿ“ฎ ๋น„๋™๊ธฐ ์ „๋žต:

  • Kafka, RabbitMQ, Pulsar๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„๋ฆฌ๋œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๐ŸŽช
  • ๋ฌด๊ฑฐ์šด ์ž‘์—…(์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ, ๋ถ„์„, ์•Œ๋ฆผ)์„ ๋น„๋™๊ธฐ ํ๋กœ ์˜คํ”„๋กœ๋“œ
  • ์ž‘์—…์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๊ณ„์†๋˜๋Š” ๋™์•ˆ ํด๋ผ์ด์–ธํŠธ์— ์ฆ‰๊ฐ์ ์ธ ์‘๋‹ต ๋ฐ˜ํ™˜ โšก

์ด ํŒจํ„ด์€ ์•ฑ์„ ๊ณผ๋ถ€ํ•˜์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด์„œ ๋†’์€ ์š”์ฒญ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ”Ÿ ํ”„๋กœํŒŒ์ผ๋ง, ๋ฒค์น˜๋งˆํ‚น ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง

๋งน๋ชฉ์ ์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฉ”ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•˜์„ธ์š”:

๐Ÿ“Š ๋„๊ตฌ ๋ฐ ๋ฉ”ํŠธ๋ฆญ:

๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ๋„๊ตฌ: Gatling, JMeter, Locust ํ”„๋กœํŒŒ์ผ๋Ÿฌ: YourKit, JFR(Java Flight Recorder), async-profiler ๋ชจ๋‹ˆํ„ฐ๋ง: Micrometer + Prometheus + Grafana

๐ŸŽฏ ์ฃผ์‹œํ•  ์ฃผ์š” ๋ฉ”ํŠธ๋ฆญ:

  • ์‘๋‹ต ์‹œ๊ฐ„(p95, p99 ์ง€์—ฐ ์‹œ๊ฐ„) โฑ๏ธ
  • GC ์ผ์‹œ ์ค‘์ง€ ๐Ÿ—‘๏ธ
  • CPU ์‚ฌ์šฉ๋ฅ  ๐Ÿ’ป
  • DB ์ฟผ๋ฆฌ ์‹œ๊ฐ„ ๐Ÿ“Š

๋ชจ๋‹ˆํ„ฐ๋ง ์—†์ด๋Š” 100๋งŒ RPS์— ์ •๋ง๋กœ ์ค€๋น„๋˜์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.


1๏ธโƒฃ1๏ธโƒฃ ๋Œ€๊ทœ๋ชจ ๋ฐฐํฌ์˜ ์‹ค์ „ ํŒ

๐Ÿ’ก ๊ณ ๊ธ‰ ํŒ:

  • JVM ๋ฐ ์บ์‹œ ์›Œ๋ฐ์—… ๐Ÿ”ฅ - ๋ผ์ด๋ธŒ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „์— ์›Œ๋ฐ์—…ํ•˜์„ธ์š”. ์ฝœ๋“œ ์Šคํƒ€ํŠธ๋Š” ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ต๋‹ˆ๋‹ค.
  • ๋น„๋Œ€ํ•œ ์‘๋‹ต ํ”ผํ•˜๊ธฐ ๐ŸŽฏ - ํŽ˜์ด๋กœ๋“œ๋ฅผ ๊ฐ€๋ณ๊ฒŒ ์œ ์ง€ํ•˜์„ธ์š”(์ƒ์„ธํ•œ ๊ฐ์ฒด๋ณด๋‹ค ID ์„ ํ˜ธ).
  • CPU ์ง‘์•ฝ์  ์ž‘์—… ๊ณ ์ • โš™๏ธ - ๋น„๋™๊ธฐ ์›Œ์ปค์— ๊ณ ์ •ํ•˜์„ธ์š”. HTTP ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ๋งˆ์„ธ์š”.
  • ์นด์˜ค์Šค ํ…Œ์ŠคํŠธ ๐ŸŒช๏ธ - ๋…ธ๋“œ ์žฅ์• , GC ์ผ์‹œ ์ค‘์ง€ ๋ฐ DB ์†๋„ ์ €ํ•˜๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์„ธ์š”.

๐ŸŽŠ ๊ฒฐ๋ก 

Spring Boot๋ฅผ ์ดˆ๋‹น 100๋งŒ ๊ฑด์˜ ์š”์ฒญ์œผ๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์€ ๋งˆ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ›ˆ๋ จ, ์ธก์ • ๋ฐ ์—”์ง€๋‹ˆ์–ด๋ง ์—„๊ฒฉํ•จ์ž…๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ํŠœ๋‹๊ณผ ์•„ํ‚คํ…์ฒ˜๋กœ Spring Boot๋Š” ์ธํ„ฐ๋„ท ๊ทœ๋ชจ์˜ ์›Œํฌ๋กœ๋“œ์—์„œ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿš€โœจ

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ™


๐Ÿ“ ์ถœ์ฒ˜

์›๋ฌธ: Enable Spring Boot application to handle 1 million requests per second

์ €์ž: Riya Sharma

๊ฒŒ์‹œ์ฒ˜: AWS in Plain English

๊ฒŒ์‹œ์ผ: 2025๋…„ 9์›” 23์ผ