๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ŒCS/Web

[Web] Stateful vs. Stateless ์„œ๋น„์Šค

by dar0m! 2021. 9. 26.

 

1. Stateful Service

Stateful '๊ตฌ์กฐ'๋Š” Server์™€ Client๊ฐ„ ์„ธ์…˜์˜ 'State(์ƒํƒœ)'์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ Client์— response๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์— 'ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ๋™์ž‘, ์„ธ์…˜ ์ƒํƒœ ์ •๋ณด'๋ฅผ ์ €์žฅํ•œ๋‹ค.

TCP

๋Œ€ํ‘œ์ ์ธ Stateful ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅด๋Š” ํ”„๋กœํ† ์ฝœ๋กœ TCP๊ฐ€ ์žˆ๋‹ค. 

TCP์˜ 3-way handshaking ๊ณผ์ •์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด, Server์™€ Client๋Š” 3-way handshaking ๊ณผ์ •์—์„œ SYN๊ณผ SYNACK์„ ์ฃผ๊ณ  ๋ฐ›์œผ๋ฉฐ, ์–‘๋‹จ๊ฐ„ ์„ธ์…˜ '์ƒํƒœ'๋ฅผ establishedํ•œ '์ƒํƒœ'๋กœ ๋งŒ๋“ ๋‹ค.

์„ธ์…˜ '์ƒํƒœ'๊ฐ€  established๊ฐ€ ๋˜๋ฉด client์™€ server๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ TCP๋Š” ์„ธ์…˜ '์ƒํƒœ'์— ๋”ฐ๋ผ Server์˜ ์‘๋‹ต์ด ๋‹ฌ๋ผ์ง€๋Š” Stateful ํ”„๋กœํ† ์ฝœ์ด๋‹ค.

TCP์˜ ๋ฐ์ดํ„ฐ ์ „์†ก๊ณผ์ •๋„ ํ™•์ธํ•ด ๋ณด์ž.

server๋Š” client๋กœ๋ถ€ํ„ฐ ์†ก์‹ ๋œ ํŒจํ‚ทํ—ค๋”๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ์•ž์œผ๋กœ ์ˆ˜์‹ ํ•ด์•ผํ•  ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ(window), sequence ๋ฒˆํ˜ธ ๋“ฑ์„ ์ €์žฅํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ์ˆ˜์‹  ๋  ๋•Œ๊นŒ์ง€ client์™€์˜ ์„ธ์…˜์„ ์œ ์ง€ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ server๋Š” ์•ž์œผ๋กœ ์ˆ˜์‹ ํ•  ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ, sequence ๋ฒˆํ˜ธ ๋“ฑ๊ณผ ๊ฐ™์ด client์™€์˜ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

TCP (์ถœ์ฒ˜ : https://brunch.co.kr/@lars/1)

๋”ฐ๋ผ์„œ TCP๋Š”

  1. ์—ฐ๊ฒฐ ํ™•์ •
  2. ๋ฐ์ดํ„ฐ ์ „์†ก
  3. ์—ฐ๊ฒฐ ์ข…๊ฒฐ

์ด๋ผ๋Š” TCP handshaking ๊ณผ์ •์„ ํ†ตํ•ด ์—ฐ๊ฒฐ๋˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ด Client์™€์˜ ์„ธ์…˜ ์ •๋ณด๋ฅผ server์— ์ €์žฅํ•˜๊ณ , ์„ธ์…˜ ์ƒํƒœ์— ๊ธฐ๋ฐ˜ํ•œ server์˜ ์‘๋‹ต์ด ๋‹ฌ๋ผ์ง„๋‹ค๋Š” ์ ์—์„œ Stateful ํ•˜๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

Stateful Service

Stateful Service๋Š” ์ด๋Ÿฌํ•œ Statefulํ•œ ํŠน์„ฑ, 1. ์„ธ์…˜ ์ •๋ณด๋ฅผ server์— ์ €์žฅ, 2. ์„ธ์…˜ 'State(์ƒํƒœ)'์— ๋”ฐ๋ฅธ ์‘๋‹ต ์„ ๋งŒ์กฑํ•˜๋„๋ก ์„ค๊ณ„๋œ ์„œ๋น„์Šค ๊ตฌ์กฐ ์ด๋‹ค.

Stateful Service Architecture

 

์œ„์™€ ๊ฐ™์€ Stateful Service ๊ตฌ์กฐ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์ž. ClientA ์˜ ์š”์ฒญ์ด ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ํ†ตํ•ด ์ž„์˜์˜ ์„œ๋ฒ„(Server #1)์— ์ „๋‹ฌ๋˜๋ฉด Server#1 ์—๋Š” ClientA ์˜ ์„ธ์…˜ ์ •๋ณด๊ฐ€ ์ €์žฅ๋œ๋‹ค. 

๊ทธ๋Ÿฌ๋‚˜ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์— ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ server, ๊ทธ๋ฆผ์˜ ๊ฒฝ์šฐ Server#2, ์—๋Š” ํ•ด๋‹น ClientA์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์—†์œผ๋ฏ€๋กœ Server#2๋Š” Client A์™€์˜ ์„ธ์…˜ ์ธ์ฆ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ํ•ด์•ผํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ redundantํ•œ ์ž‘์—…์„ ์—†์• ๊ธฐ ์œ„ํ•ด ClientA์˜ ์š”์ฒญ์€ Server#1์„ ํ–ฅํ•ด ์œ ์ง€๋˜๋„๋ก ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. → Sticky Session

 

์„œ๋ฒ„ 2๊ฐœ ์ด์ƒ ์„ธ์…˜ ๋ถˆ์ผ์น˜ ํ•ด๊ฒฐํ•˜๊ธฐ

์„ธ์…˜ ๋ถˆ์ผ์น˜๋ž€? ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ: ํ•˜๋‚˜์˜ ์ธํ„ฐ๋„ท ์„œ๋น„์Šค๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์„ ๋•Œ, ์—ฌ๋Ÿฌ ๋Œ€์˜ ์„œ๋ฒ„๊ฐ€ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌํ•ด ์„œ๋ฒ„์˜ ๋กœ๋“œ์œจ ์ฆ๊ฐ€, ๋ถ€ํ•˜๋Ÿ‰, ์†๋„ ์ €ํ•˜ ๋“ฑ์„ ๊ณ ๋ คํ•ด ์ ์ ˆํžˆ ๋ถ„์‚ฐ์ฒ˜๋ฆฌํ•ด ํ•ด๊ฒฐํ•ด

kils-log-of-develop.tistory.com

 

2. Stateless Service

Stateless '๊ตฌ์กฐ'๋Š” server์˜ ์‘๋‹ต์ด client์™€์˜ ์„ธ์…˜ '์ƒํƒœ'์™€ ๋…๋ฆฝ์ ์ด๋‹ค.

Stateless ๊ตฌ์กฐ์—์„œ server๋Š” ๋‹จ์ˆœํžˆ ์š”์ฒญ์ด ์˜ค๋ฉด ์‘๋‹ต์„ ๋ณด๋‚ด๋Š” ์—ญํ• ๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์„ธ์…˜ ๊ด€๋ฆฌ๋Š” client์—๊ฒŒ ์ฑ…์ž„์ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ Stateless ๊ตฌ์กฐ๋Š” client์™€์˜ ์„ธ์…˜ ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ, ์ด๋Ÿฌํ•œ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์— ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

์„ธ์…˜(์ƒํƒœ)์™€ ๋ฌด๊ด€ํ•œ ์‘๋‹ต์„ ํ•˜๊ฒŒ ์„ค๊ณ„๋œ ์„œ๋น„์Šค ๊ตฌ์กฐ.
๋Œ€์‹  ํ•„์š”์— ๋”ฐ๋ผ ์™ธ๋ถ€ DB์— ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋‹ค. → Session Server

 

UDP

  TCP vs. UDP (์ถœ์ฒ˜ : https://www.muvi.com/wiki/udpuser-datagram-protocol.html)

๋Œ€ํ‘œ์ ์ธ Stateless ํ”„๋กœํ† ์ฝœ๋กœ๋Š” UDP์™€ HTTP ๋“ฑ์ด ์žˆ๋‹ค. 

UDP๋ฅผ ์ค‘์ ์ ์œผ๋กœ ์‚ดํŽด๋ณด์ž. UDP๋Š” TCP์™€ ๋‹ฌ๋ฆฌ handshaking ๊ณผ์ •์„ ํ†ตํ•ด ์—ฐ๊ฒฐ ์„ธ์…˜์„ ์ธ์ฆํ•˜๋Š” ์ ˆ์ฐจ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์„ธ์…˜ ์ƒํƒœ์— ๊ด€๊ณ„ ์—†์ด ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๊ทธ๋žจ์„ source์—์„œ destination ์ชฝ์œผ๋กœ ์ „์†กํ•˜๋ฉฐ, client๊ฐ€ ์†ก์‹ ํ•˜๋ ค ํ–ˆ๋˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ server์ชฝ์— ์ˆ˜์‹  ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ server์ชฝ์€ client์™€์˜ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์ „ํ˜€ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ UDP๋Š” Client์™€์˜ ์„ธ์…˜ ์ƒํƒœ์— ๊ด€๊ณ„์—†์ด ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต๋งŒ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋˜ํ•œ Client์™€์˜ ์„ธ์…˜ ์ •๋ณด๋ฅผ server๊ฐ€ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์—์„œ Stateless ํ•˜๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

Stateless Service

Stateless Service๋Š” ์ด๋Ÿฌํ•œ Statelessํ•œ ํŠน์„ฑ, 1. ์„ธ์…˜ ์ •๋ณด๋ฅผ server์— ์ €์žฅํ•˜์ง€ ์•Š์Œ, 2. ์„ธ์…˜ 'State(์ƒํƒœ)'์— ๋ฌด๊ด€ํ•œ ์‘๋‹ต ์„ ๋งŒ์กฑํ•˜๋„๋ก ์„ค๊ณ„๋œ ์„œ๋น„์Šค ๊ตฌ์กฐ์ด๋‹ค. 

Stateless Service Architecture

์œ„์™€ ๊ฐ™์€ Stateless ์„œ๋น„์Šค ๊ตฌ์กฐ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์ž. Client A์˜ ์š”์ฒญ์ด ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ํ†ตํ•ด Server #1 ์œผ๋กœ ์ „๋‹ฌ ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ, Stateful ์„œ๋น„์Šค ๊ตฌ์กฐ์—์„œ๋Š” server์— ์ง์ ‘ ClientA์™€์˜ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์ €์žฅํ–ˆ์ง€๋งŒ Stateless ์„œ๋น„์Šค ๊ตฌ์กฐ์—์„œ๋Š” ์ด ์ •๋ณด๋ฅผ  server์— ์ €์žฅํ•˜์ง€ ์•Š๊ณ , ์™ธ๋ถ€ DB์— ์ €์žฅํ•œ๋‹ค. → Session Server

๋”ฐ๋ผ์„œ ClientA์˜ ์š”์ฒญ์ด Server#2๋กœ ์ „๋‹ฌ ๋˜๋”๋ผ๋„, Server#2๋Š” DB๋ฅผ ํ†ตํ•ด ClientA ์ •๋ณด์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค. 
์ด๋Ÿฌํ•œ Stateless ๊ตฌ์กฐ์—์„œ๋Š” ClientA์˜ ์š”์ฒญ์„ Server#1์—๋งŒ ์œ ์ง€๋˜๋„๋ก ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. 

 

3. Stateless Service์˜ ์žฅ์ 

Statelss ๊ตฌ์กฐ๊ฐ€ Stateful ๊ตฌ์กฐ ๋Œ€๋น„ ๊ฐ–๋Š” ๋ช‡๊ฐ€์ง€ ์žฅ์ ๋“ค๋กœ ์ธํ•ด ์ตœ๊ทผ์˜ ์›น์„œ๋น„์Šค ๊ตฌ์กฐ๋Š” ๋ชจ๋‘ Stateless ๊ตฌ์กฐ ๊ธฐ๋ฐ˜์„ ๋”ฐ๋ฅด๊ณ  ์žˆ๋‹ค. 

๊ทธ๋ ‡๋‹ค๋ฉด Stateless Service๊ฐ€ ์–ด๋–ค ์ ์—์„œ ์œ ๋ฆฌํ• ๊นŒ? ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ๊ฒ ์ง€๋งŒ, stateless ๊ตฌ์กฐ์˜ ๊ฐ€์žฅ ํฐ ์ด์ ์€ ๋ฐ”๋กœ Scaling์ด ์ž์œ ๋กญ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. 

ํŠธ๋ž˜ํ”ฝ์˜ ๊ธ‰์ฆ์œผ๋กœ ์„œ๋ฒ„๊ฐ€ scale out๋œ ์ƒํ™ฉ์„ ์ƒ๊ฐ ํ•ด๋ณด์ž. 

Scaling Out of Stateful Service / Scaling Out of Stateless Service

  • Stateful ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ,
    • client์˜ ์„ธ์…˜ ์ •๋ณด๊ฐ€ ์ƒˆ๋กœ scale out๋œ ์„œ๋ฒ„์— ์ €์žฅ ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค
    • ๋”ฐ๋ผ์„œ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์˜ฎ๊ฒจ์ฃผ๋Š” ๋“ฑ์˜ ๋ถ€์ˆ˜์ ์ธ ๊ด€๋ฆฌ๊ฐ€ ์š”๊ตฌ๋œ๋‹ค.
  • Stateless ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ,
    • ์–ด์ฐจํ”ผ server๋Š” client ์„ธ์…˜ ๊ด€๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค!

scaling์€ ์ตœ๊ทผ ์›น ์„œ๋น„์Šค๋“ค์ด ์š”๊ตฌํ•˜๋Š” ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด๋‹ค. serverless ๊ตฌ์กฐ์˜ ์„œ๋น„์Šค ๊ตฌํ˜„์—์„œ๋Š” ํ•„์ˆ˜์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๊ทผ ์›น ์„œ๋น„์Šค ํŠธ๋ Œ๋“œ ๋™ํ–ฅ์— ๋ฐœ๋งž์ถฐ, scaling์ด ์ž์œ ๋กœ์šด Stateless ์„œ๋น„์Šค ๊ตฌ์กฐ๊ฐ€ ๊ฐ๊ด‘๋ฐ›๊ณ  ์žˆ๋‹ค. 

 

4. Stateless Service

stateless service๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋‚˜์˜ค๋Š” ์—ฐ๊ด€ ๊ฒ€์ƒ‰์–ด๋“ค์ด HTTP, REST ์ด๋‹ค.

HTTP๋Š” Statelessํ•œ ํ”„๋กœํ† ์ฝœ์ด๋‹ค.

REST(Representational State Transfer)๋Š” '๊ตฌ์กฐ(Architecture)' ์˜ ์ด๋ฆ„์ด๊ณ , HTTP ํ”„๋กœํ† ์ฝœ ์ƒ์— ๊ตฌํ˜„๋œ Resource Oriented Architecture(ROA) ์„ค๊ณ„ ๊ตฌ์กฐ์ด๋‹ค.

์ •๋ฆฌ

HTTP์™€ REST ๋ชจ๋‘ Statelessํ•œ ์„ฑ๊ฒฉ์„ ๊ฐ€์ง„ ๋…€์„๋“ค์ด๋ฉฐ,
HTTP๋Š” Statelssํ•œ ์„ฑ๊ฒฉ์„ ๊ฐ€์ง„ 'ํ”„๋กœํ† ์ฝœ'REST๋Š” Statelessํ•œ ์„ฑ๊ฒฉ์„ ๊ฐ€์ง„ '์„ค๊ณ„ ๊ตฌ์กฐ' ์ด๋‹ค.

 

์ฐธ๊ณ 

๋Œ“๊ธ€