did_story

[Spring Boot] ์™ธ๋ถ€ ์„œ๋น„์Šค ์žฅ์• ์— ๋Œ€๋น„ํ•˜๋Š” ๋™๊ธฐ ํ˜ธ์ถœ์˜ ์ƒ์กด ์ „๋žต - 1 ๋ณธ๋ฌธ

BackEnd๐Ÿƒ/Spring boot

[Spring Boot] ์™ธ๋ถ€ ์„œ๋น„์Šค ์žฅ์• ์— ๋Œ€๋น„ํ•˜๋Š” ๋™๊ธฐ ํ˜ธ์ถœ์˜ ์ƒ์กด ์ „๋žต - 1

์–ด์ œ์‹œ์ž‘ 2025. 7. 2. 15:50
๋ฐฑ์—”๋“œ ์ž‘์—…์„ ํ•˜๋‹ค๋ณด๋ฉด ์™ธ๋ถ€ API๋ฅผ ๋ถˆ๋Ÿฌ์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์ด ์ ์  ๋งŽ์•„์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ฐ‘์ž๊ธฐ ์ด ์™ธ๋ถ€ ์„œ๋น„์Šค๋“ค์ด ๊ฐ‘์ž๊ธฐ ๋А๋ ค์ง€๋Š” ์žฅ์• ๊ฐ€ ๊ฑธ๋ฆฌ๋ฉด ์šฐ๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?! ๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ, ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋“ค์€ ์šฐ๋ฆฌ์˜ ์„œ๋น„์Šค์˜ ์žฅ์• ๋ฅผ ์ผ์œผํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฒˆ ๊ธฐํšŒ์— ์ด์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ ๋“ค์„ ์‚ดํŽด๋ณด๊ณ , ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ์ „์•ฝ์ธ ํƒ€์ž„์•„์›ƒ ์„ค์ •, ๋ฒŒํฌํ—ค๋“œ ํŒจํ„ด, ๊ทธ๋ฆฌ๊ณ  ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ํŒจํ„ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ์™ธ๋ถ€ ์„œ๋น„์Šค ์žฅ์• : ์กฐ์šฉํ•œ ์•”์‚ด์ž

์˜ค๋Š˜๋‚  ๋Œ€๋ถ€๋ถ„์˜ ์‹œ์Šคํ…œ์€ ์™ธ๋ถ€ API๋‚˜ ์„œ๋“œํŒŒํ‹ฐ ์„œ๋น„์Šค(๊ฒฐ์ œ, ์ธ์ฆ, ์ฃผ์†Œ ๊ฒ€์ƒ‰, ๋ฒˆ์—ญ, ๋‚ ์”จ ์ •๋ณด ๋“ฑ๋“ฑ)์— ์˜์กดํ•ด ๋™์ž‘ํ•˜๊ณ  ์žˆ์Œ์„ ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. ์ž˜ ๋˜๊ณ  ์žˆ๋‹ค๋ฉด ์ƒ๊ด€์ด ์—†๊ฒ ์ง€๋งŒ, ๋งŒ์•ฝ ์‘๋‹ต์ด ์ง€์—ฐ๋˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ• ๊นŒ์š”?

  1. ์“ฐ๋ ˆ๋“œ(๋˜๋Š” ์ปค๋„ฅ์…˜)๊ฐ€ ๋ฌถ์ธ๋‹ค.
    • ์™ธ๋ถ€ API ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ, ํ•ด๋‹น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋˜ ์„œ๋ฒ„์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋ธ”๋กœํ‚น ์ƒํƒœ์— ๋น ์ง‘๋‹ˆ๋‹ค.
    • ์ด๋Š” ๊ณง ์„œ๋ฒ„์˜ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ ์š”์ฒญ์ˆ˜๊ฐ€ ์ค„์–ด๋“œ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  2. ์‘๋‹ต ๋Œ€๊ธฐ ์ž์› ์ฆ๊ฐ€.
    • ๋ธ”๋กœํ‚น๋œ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ ์  ๋Š˜์–ด๋‚˜๊ณ , ๋™์‹œ์— ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์€ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๊ณ  ๋Œ€๊ธฐ์—ด์— ์Œ“์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    • ์ด๋กœ ์ธํ•ด ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„๋„ ์ „์ฒด์ ์œผ๋กœ ์ง€์—ฐ๋˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ž์› ๊ณ ๊ฐˆ (๋ฆฌ์†Œ์Šค Exhaustion)
    • ์ปค๋„ฅ์…˜ ํ’€, ์“ฐ๋ ˆ๋“œ ํ’€, DB ์ปค๋„ฅ์…˜ ๋“ฑ์ด ๊ณ ๊ฐˆ ๋ฉ๋‹ˆ๋‹ค.
    • ์„œ๋ฒ„๋Š” ๋‚ด๋ถ€ ์š”์ฒญ ์กฐ์ฐจ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค๋ฉด, ๊ฒฐ๊ตญ ์„œ๋น„์Šค์˜ ์ „์ฒด ์žฅ์• ๋กœ ์ด๋ค„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ์„ฑ๋Šฅ์ €ํ•˜.
    • ๊ฐ€์šฉ ์ž์›์ด ์ค„๋“ค๋ฉฐ ์ „์ฒด์ ์ธ ์„œ๋น„์Šค ์‘๋‹ต์†“๋„๊ฐ€ ๋А๋ ค์ง€๊ณ , ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค.
    • ๋งˆ์น˜ ์ž‘์€ ๊ท ์—ด์—์„œ ์‹œ์ž‘๋œ ๋„๋ฏธ๋…ธ ๋ถ•๊ดด์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ ์ด์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์–ด๋–ค ๋ฐฉ๋ฒ•๋“ค์ด ์žˆ์„๊นŒ์š”?

์ฒซ๋ฒˆ์งธ, ํƒ€์ž„์•„์›ƒ ์„ค์ •.

ํƒ€์ž„์•„์›ƒ ์„ค์ •์€ ์™ธ๋ถ€ ์„œ๋น„์Šค ์žฅ์• ๋‚˜ ์ง€์—ฐ์— ์šฐ๋ฆฌ ์‹œ์Šคํ…œ์ด ๋ฌดํ•œ์ • ๋Œ๋ ค๊ฐ€์ง€ ์•Š๋„๋ก ๋ง‰๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ด๊ณ  ์ค‘์š”ํ•œ ๋ฐฉ์–ด์„ ์ž…๋‹ˆ๋‹ค.

ํƒ€์ž„์•„์›ƒ(TimeOut)์€ ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„, ์ง€์ •๋œ ์‹œ๊ฐ„ ๋‚ด์— ์‘๋‹ต์„ ๋ฐ›์ง€ ๋ชปํ•˜๋ฉด ์š”์ฒญ์„ ์ค‘๋‹จํ•˜๊ณ  ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

Connection Timout

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์™ธ๋ถ€ ์„œ๋ฒ„์— TCP ์—ฐ๊ฒฐ์„ ์ˆ˜๋ฆฝํ•˜๋ ค๊ณ  ์‹œ๋„ํ•  ๋•Œ, ๊ทธ ์‹œ๋„๊ฐ€ ์–ผ๋งˆ๋‚˜ ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์ œํ•œํ•˜๋Š” ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์„œ๋ฒ„๊ฐ€ ๊บผ์ ธ ์žˆ๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ๋ฉ€๊ฑฐ๋‚˜ ๋ฐฉํ™”๋ฒฝ์ด ๋ง‰๊ณ  ์žˆ์–ด๋„, ๋ฌดํ•œํžˆ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ •ํ•ด์ง„ ์‹œ๊ฐ„๊นŒ์ง€๋งŒ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

[Client] โ”€โ”€โ”€ TCP SYN โ”€โ”€โ–บ [Server] (์‘๋‹ต ์—†์Œ)  
         โ—„โ”€โ”€ timeout (์˜ˆ: 3์ดˆ)

Read Timeout

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

[Client] โ”€โ”€โ”€ request โ”€โ”€โ–บ [Server]
                         (์„œ๋ฒ„๊ฐ€ ๋„ˆ๋ฌด ๋А๋ฆฌ๊ฒŒ ์‘๋‹ตํ•จ)
                         โ—„โ”€โ”€ timeout (์˜ˆ: 5์ดˆ)

Write Timeout

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ POST๋‚˜ PUT ์š”์ฒญ ์‹œ body ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ, ์–ผ๋งˆ๋‚˜ ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ์ด๋ฏธ์ง€, ๋Œ€์šฉ๋Ÿ‰ JSON ๋“ฑ ํฐ ๋ฐ”๋””๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.

[Client] โ”€โ”€โ”€(๋ณด๋‚ด๋Š” ์ค‘)โ”€โ”€โ–บ [Server]
         โ—„โ”€โ”€ timeout (์˜ˆ: 10์ดˆ)

 

 

→ Timeout์˜ ๊ธฐ์ค€: “ํ•œ ๋ฒˆ์˜ ํŒจํ‚ท ์œ ์‹ค ์ •๋„๋Š” ์žฌ์ „์†ก์„ ํ†ตํ•ด ๋ณต๊ตฌ๋  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์˜ ํƒ€์ž„์•„์›ƒ”

  • Connection Timout ๊ฐ’ ์„ค์ •
    • TCP ์—ฐ๊ฒฐ์„ ๋งบ์„ ๋•Œ๋Š” 3๋‹จ๊ณ„์˜ ํ•ธ๋“œ ์„ธ์ดํฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
      1. Client → Server : SYN ์ „์†ก
      2. Server → Client : SYN/ACK ์‘๋‹ต
      3. Client → Server : ACK ์ „์†ก
      → ์ด ๊ณผ์ • ์ค‘ ์–ด๋–ค ๋‹จ๊ณ„์—์„œ๋“  ํŒจํ‚ท ์œ ์‹ค(loss)๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • TCP๋Š” ์ตœ์ดˆ๋กœ ํŒจํ‚ท(SYN)์„ ๋ณด๋‚ผ ๋•Œ, ์ƒ๋Œ€ ์„œ๋ฒ„๊นŒ์ง€ ์™•๋ณตํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„(RTT)์„ ์•„์ง ์•Œ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ž„์‹œ๋กœ ๊ณ ์ •๋œ ๊ฐ’์ธ InitRTO๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ ์ฒซ๋ฒˆ์งธ SYN๊ฐ€ ์œ ์‹ค๋œ๋‹ค๋ฉด, 1์ดˆ ํ›„ ์žฌ์ „์†ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ๋„ ์‹คํŒจํ•˜๋ฉด 2์ดˆ๋’ค ์žฌ์ „์†ก ํ•˜๊ณ , ๊ทธ๋ž˜๋„ ์‹คํŒจํ•˜๋ฉด 4์ดˆ ๋’ค ์žฌ์ „์†ก ํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค. (์ฆ‰ ํƒ€์ž„์•„์›ƒ ์‹œ๊ฐ„์€ 2์˜ ์ œ๊ณฑํ˜•ํƒœ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.)
    // ์žฌ์ „์†ก ์ฃผ๊ธฐ
    1์ดˆ → 2์ดˆ → 4์ดˆ ...
    • initRTO ๊ฐ’์„ 3์ดˆ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์‹ค์šฉ์ ์ด๋ผ๊ณ  ํ•œ๋‹ค ์™œ์ผ๊นŒ?, ๋‹ต์€ 3์ดˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ 1~2๋ฒˆ์˜ ํŒจํ‚ท ์†์‹ค๊นŒ์ง€๋Š” ๋ณต๊ตฌ ์ง€์†์  ์žฅ์•  ์ƒํ™ฉ์—์„œ๋Š” ๋น ๋ฅด๊ฒŒ ์‹คํŒจ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. (ํ•˜์ง€๋งŒ ์ด ๋˜ํ•œ ์„œ๋น„์Šค์˜ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ์„œ ์กฐ์ ˆ์ด ํ•„์š”ํ•˜๋‹ค.)
  • Read Timeout ๊ฐ’ ์„ค์ •
    • TCP๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ ํ›„ RTT(Round-Trip-Time) ๋ฅผ ์ธก์ •ํ•˜์—ฌ RTO(์žฌ์ „์†ก ํƒ€์ž„์•„์›ƒ)์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. RTO์˜ ์ตœ์†Ÿ๊ฐ’์€ 200ms์ด๋ฉฐ RTT์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๋ณ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ฆ‰ ๋ฆฌ๋“œ ํƒ€์ž„ ์•„์›ƒ ์€ ์‹ค์ œ ์™ธ๋ถ€ ์„œ๋น„์Šค ์ฒ˜๋ฆฌ ์‹œ๊ฐ„(Processing Time)๊ณผ RTT, RTO์— ํ•จ๊ป˜ ๊ณ ๋ คํ•ด์„œ ์ •ํ•ด์•ผ ํ•˜๋Š” ๊ณจ์น˜์•„ํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•˜๋Š” HTTP ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ปค๋„ฅ์…˜ ํƒ€์ž„์•„์›ƒ๊ณผ ๋ฆฌ๋“œ ํƒ€์ž„์•„์›ƒ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๊ฒƒ์€ ํƒ€์ž„์•„์›ƒ์˜ ์˜๋ฏธ๋ฅผ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ  ์„œ๋น„์Šค ํŠน์„ฑ์— ๋งž์ถฐ์„œ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

๋‹ค์Œ์€ ๋ฒŒํฌํ—ค๋“œ ํŒจํ„ด, ๊ทธ๋ฆฌ๊ณ  ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ํŒจํ„ด์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.