π μμ£Ό μ½κ² μ΄ν΄νλ Stateful / Stateless μ°¨μ΄
Stateful κ³Ό Stateless μ°¨μ΄μ
μΉ κ³΅λΆλ₯Ό νλ€λ³΄λ©΄ ν΄λΌμ΄μΈνΈ(Client)μ μλ²(Server)κ°μ ν΅μ μ μνμ μ§(Stateful) νλλ, μνμ μ§νμ§μμ(Stateless) μΌλ‘ νλλ λΌλ λ§κ·λ₯Ό νλ²μ―€μ λ€μ΄λ³Έ μ μ΄ μμ κ²μ΄λ€.
μνλΌλκ² μ΄λ ν μ 보λ₯Ό λ§νλ κ² κ°μλ°, μ΄λ² μκ°μλ Stateful κ³Ό Statelessμ μ°¨μ΄μ μ λν΄ μΆμμ μΈ κ°λ μ΄ν΄μμ λ²μ΄λ λͺ νν νμ νλ μκ°μ κ°μ Έλ³΄μ.
Stateful (μνμ μ§)
μν μ μ§λΌ ν¨μ ν΄λΌμ΄μΈνΈμ μλ² κ΄κ³μμ μλ²κ° ν΄λΌμ΄μΈνΈμ μνλ₯Ό 보쑴ν¨μ μλ―Ένλ€.
ν΄λΌμ΄μΈνΈμ μλ² κ°μ μ‘μμ μ νλ©° λ¨κ³λ³ κ³Όμ μ μ§ννλλ° μμ΄, μλ²μμ ν΄λΌμ΄μΈνΈκ° μ΄μ λ¨κ³μμ μ 곡ν κ°μ μ μ₯νκ³ λ€μ λ¨κ³μμλ μ μ₯ν μνμ΄λ€.
λνμ μΌλ‘ ννμ΄μ§μμ νλ² λ‘κ·ΈμΈμ νλ©΄ νμ΄μ§λ₯Ό μ΄λν΄λ λ‘κ·ΈμΈμ΄ ν리μ§μκ³ κ³μ μ μ§λλ κ²μ΄ λ°λ‘ μλ²κ° ν΄λΌμ΄μΈνΈμ μνλ₯Ό μ μ§(κΈ°μ΅)νκ³ μμΌλκΉ κ°λ₯ν κ²μ΄λ€.
ν΄λΌμ΄μΈνΈμ μ 보λ₯Ό κΈ°μ΅νλ€λΌλ λ§μ μ΄λκ°μ μ 보λ₯Ό μ μ₯νκ³ ν΅μ ν λλ§λ€ μ½λλ€λ λ»μ΄λ€.
μ΄λ¬ν μ 보λ€μ μΌλ°μ μΌλ‘ λΈλΌμ°μ μ μΏ ν€(Cookie)μ μ μ₯λκ±°λ, μλ²μ μΈμ (Session) λ©λͺ¨λ¦¬μ μ μ₯λμ΄ μνλ₯Ό μ μ§νκ² λλ€.
Statefulν νλ‘ν μ½
λνμ μΈ Stateful ꡬ쑰λ₯Ό λ°λ₯΄λ νλ‘ν μ½λ‘ TCPμ 3-way handshaking κ³Όμ μ μλ₯Ό λ€μκ° μλ€.
- ν΄λΌμ΄μΈνΈλ μλ²μ SYN(μ μ μμ² λ©μΈμ§)λ₯Ό μ μ‘νκ³ SYN_SENT μνκ° λλ€.
- μλ²λ SYN μμ²μ λ°κ³ , ν΄λΌμ΄μΈνΈμ μμ²μ μλ½νλ SYN/ACKλ₯Ό μ μ‘νκ³ SYN_RECEIVED μνκ° λλ€.
- ν΄λΌμ΄μΈνΈλ μλ²μκ² μλ½ νμΈμΌλ‘ ACKλ₯Ό λ 보λ΄κ³ , μμ λ°μ μλ²λ ESTABLISHED μνκ° λλ€.
- μΈμ 'μν'κ° ESTABLISHED κ° λ¨μΌλ‘μ¨, μλ²μ ν΄λΌμ΄μΈνΈλ μλ‘ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°μ μ μλ μνκ° λλ€.
μ΄λ κ² TCPλ μΈμ 'μν'μ λ°λΌ μλ²μ μλ΅μ΄ λ¬λΌμ§κ² λλ Stateful νλ€κ³ λ§ν μ μλ κ²μ΄λ€.
Stateful λ¬Έμ μ
μμμ μνλ₯Ό μ μ§νλ€λ ν¨μ, μλ²μμ ν΄λΌμ΄μΈνΈμ μν μ 보λ₯Ό μ μ₯νκ³ μλ€κ³ λ§νμλ€.
statefulμ λ¬Έμ μ μ ν΄λΉ μλ²κ° λ©μΆκ±°λ μ¬λ¬ μ΄μ λ‘ ν΄λΉ μλ²κ° λͺ»μ°κ² λμ΄ λ€λ₯Έ μλ²λ₯Ό μ¬μ©ν΄μΌ ν λ λ°μνλ€.
μλνλ©΄ μλ‘μ΄ μλ²μμλ μ΄μ μλ²μμ κ°μ§κ³ μλ μνκ°λ€μ κ°μ§κ³ μμ§ μκΈ° λλ¬Έμ΄λ€.
μλ₯Ό λ€μλ©΄, μ μ κ° λ‘κ·ΈμΈμ νκ³ κ²μν νμ΄μ§μ λ€μ΄κ°μ κΈμ μ°κΈ° μν΄ [κΈμ°κΈ°] λ₯Ό λλ λλ λ€μ λ‘κ·ΈμΈ νλΌλ νλ©΄μ΄ λ¨λ κ²μ΄λ€. μ΄λ ν΄λΌμ΄μΈνΈμ λ‘κ·ΈμΈ μ 보λ₯Ό λ€κ³ μλ μλ²κ° μ΄λ ν λ¬Έμ λ‘ μΈν΄ λ€μ΄λμ΄ λ€λ₯Έ μλ²κ° λμ μν μ μ΄μ΄ λ°μλλ° ν΄λΉ ν΄λΌμ΄μΈνΈμ λ‘κ·ΈμΈ μ λ³΄κ° μκΈ° λλ¬Έμ μΌμ΄λ κ²μ΄λ€. (λ§μ½, κΈ°μ‘΄μλ²μμ μλ‘μ΄μλ²λ‘ μ΄μ λ°μ΄ν°λ₯Ό λͺ¨λ μ λ¬ν΄μ€λ€λ©΄ λ¬Έμ κ° μμ μ μλ€)
μ¦, μλ² 1μ΄ λ΄ μ 보λ₯Ό κ°κ³ μκΈ° λλ¬Έμ μ€κ°μ μλ² 1μ μ₯μ κ° μκΈ°λ©΄ ν΄λΌμ΄μΈνΈ Aλ μΌμ μ²μλΆν° λ€μ ν΄μΌλλ€.
λν Stateful λ°©μμ νλμ μλ²κ° 1λ§ λͺ μ ν΄λΌμ΄μΈνΈλ₯Ό μ²λ¦¬ν λ₯λ ₯μ΄ μμ λ κ·Έλ³΄λ€ λ§μ μμ ν΄λΌμ΄μΈνΈκ° λͺ°λ¦¬λ©΄, μ΄λ―Έ μ°κ²°λ 1λ§ λͺ μ ν΄λΌμ΄μΈνΈ μ€ μΌλΆκ° λΉ μ ΈμΌ λ€μ ν΄λΌμ΄μΈνΈκ° μ²λ¦¬λλ€λ νκ³κ° μλ€.
λΉμ°ν ν΄λΌμ΄μΈνΈ μνλ€μ λ€κ³ μμΌλ μ©λ νκ³κ° μ‘΄μ¬νκΈ° λλ¬Έμ΄λ€.
λ°λΌμ νμ μμλ μ΄λ¬ν ν΄λΌμ΄μΈνΈμ μν λ°μ΄ν°λ₯Ό λ°λ‘ μΊμ μλ²(Redis)μ μ μ₯νμ¬ μ΄μ©νλ€.
Stateful ν΅μ μμ
λ€μμ μλ²μ ν΄λΌμ΄μΈνΈκ° λ€μκ³Ό κ°μ΄ μ€λΉλμ΄μκ³ ν΄λΌμ΄μΈνΈκ° μ»΄ν¨ν°λ₯Ό μ¬κΈ°μν΄ μλ²μκ² μ»΄ν¨ν° λΆνμ λ¨κ³λ³λ‘ 컀μ€ν νμ¬ μμ²μ νλ μν©μ λΉμ ν κ²μ΄λ€.
- μ»΄ν¨ν° ν맀λ₯Ό νλ μλ² X
- μ»΄ν¨ν° μ¬λ €λ ν΄λΌμ΄μΈνΈ A
λνλ₯Ό 보면 ν맀νλ μλ² Xλ μ¬μ©μμ μ΄μ μμ²μ λͺ¨λ κΈ°μ΅νλ©° μ§ννλ€λ κ²μ μ μ μλ€.
μ΄κ²μ΄ μν μ μ§μ΄λ©° μ¬λ μ μ₯μμλ μ§κ·Ήν μ μμ μΈ λν μ²λΌ 보μΈλ€.
νμ§λ§ μ¬κΈ°μ ν¨μ μ΄ μλ€. λ°λ‘ ν맀νλ μλ² Xκ° μ€κ°μ λ°λ κ²½μ° μ΄λ€.
λ§μ½ λλμ νΈλν½μ΄ λͺ°λ €λ€μ΄μ μλ²λ₯Ό κΈ΄κΈνκ² λλ Έλ€κ³ κ°μ ν΄λ³΄λ©΄, ν맀μ μλ² Xκ° μλ μ¦μ€λ μ΄λ€ μλ² Yκ° κ΅¬λ§€κ³Όμ μ λμ μ΄μ΄λ°κ² λ μλ μλ€.
λ€μμ ν΄λΌμ΄μΈνΈ Aμ ν΅μ νκ³ μλ μλ² Xκ° μ€κ°μ μλ² Yμ μλ² Zλ‘ λ°λμμ κ²½μ°μ μν©μ΄λ€.
κ·ΈμΌλ§λ‘ νΌλμ λκ°λμ΄λ€. μ΄κ² λ°λ‘ μν μ μ§μ λ¬Έμ λ€.
Stateless (무μν)
무μνλ λ°λλ‘ ν΄λΌμ΄μΈνΈμ μλ² κ΄κ³μμ μλ²κ° ν΄λΌμ΄μΈνΈμ μνλ₯Ό 보쑴νμ§ μμμ μλ―Ένλ€.
Stateless ꡬ쑰μμ μλ²λ λ¨μν μμ²μ΄ μ€λ©΄ μλ΅μ 보λ΄λ μν λ§ μννλ©°, μν κ΄λ¦¬λ μ μ μΌλ‘ ν΄λΌμ΄μΈνΈμκ² μ± μμ΄ μλ κ²μ΄λ€.
μ¦, ν΄λΌμ΄μΈνΈμ μλ²κ°μ ν΅μ μ νμν λͺ¨λ μν μ 보λ€μ ν΄λΌμ΄μΈνΈμμ κ°μ§κ³ μλ€κ° μλ²μ ν΅μ ν λ λ°μ΄ν°λ₯Ό μ€μ΄ 보λ΄λ κ²μ΄ 무μν ꡬ쑰μ΄λ€.
μλ²λ λ¨μν λ°μμ μλ΅λ§ ν΄μ£ΌκΈ° λλ¬Έμ μν μ μ§μ λν λΆνκ° νμ ν μ€μ΄λ€κ² λλ€.
λν μνλ₯Ό 보κ΄νμ§ μμ μλ² 1μ λ¬Έμ κ° μ겨 μλ² 2κ° μ΄μ΄ λ°μλ μλ΅νλλ° μμ΄ λ¬Έμ λ μλ€.
κ·Έλμ λλμ νΈλν½ λ°μ μμλ μλ² νμ₯μ ν΅ν΄ λμ²λ₯Ό μμνκ² ν μ μλ€λ μ₯μ λ μλ€. (statefulκ³Ό λ¬λ¦¬ μλ²κ° λ°λμ΄μλ μ νν μλ΅μ λ¬Έμ κ° μμΌλκΉ)
Statelessν νλ‘ν μ½
λνμ μΈ Stateless νλ‘ν μ½λ‘λ UDPμ HTTP λ₯Ό λ€ μ μλ€. (HTTP ν΅μ κΈ°λ³Έμ΄ λ¬΄μν)
무μνμμ λΈλΌμ°μ λ λ°μ΄ν°λ₯Ό μ μ‘ν λλ§λ€ μ°κ²°νκ³ λ°λ‘ λμ΄λ²λ¦¬κ² λλ€.
UDPλ₯Ό μλ‘ λ€μ΄ 보μλ©΄, UDPλ TCPμ λ¬λ¦¬ handshaking κ³Όμ μ ν΅ν΄ μ°κ²° μΈμ μ μΈμ¦νλ μ μ°¨λ₯Ό μννμ§ μκ³ , μΈμ μνμ κ΄κ³ μμ΄ κ·Έλ₯ 무μμ λ³΄λ΄ λ²λ¦°λ€.
κ·Έλμ μλ²μͺ½μ ν΄λΌμ΄μΈνΈμμ μΈμ μ 보λ₯Ό μ μ₯νλ κ³Όμ μ κ±°μΉμ§ μμ, ν΄λΌμ΄μΈνΈκ° μ‘μ ν λ°μ΄ν°κ° μμ λμλμ§ νμΈνμ§λ μμΌλ©° ν΄λΌμ΄μΈνΈμμ μΈμ μνμ κ΄κ³μμ΄ μμ²μ λν μλ΅λ§μ μννκ² λλ€.
μ¦, Clientμμ μΈμ μ 보λ₯Ό Serverκ° μ μ₯νμ§ μλλ€λ μ μμ Stateless νλ€κ³ λ§ν μ μλ κ²μ΄λ€.
Stateless λ¬Έμ μ
무μνμ λ¨μ μΌλ‘λ ν΄λΌμ΄μΈνΈμ μμ²μ μλμ μΌλ‘ Stateful λ³΄λ€ λ λ§μ λ°μ΄ν°κ° μλͺ¨λκ² λλ€λ μ μ΄λ€.
λ§€λ² μμ²ν λλ§λ€ μμ μ λΆκ°μ 보λ₯Ό μ€μΌνλ€.
λ¬Όλ‘ μ΄λ²€νΈ μκ° νμ΄μ§μ²λΌ μ무 μ 보λ₯Ό λ΄μ νμκ° μλ νμ΄μ§λ 무μνλ‘ λ§λ€λ©΄ μ’λ€.
νμ§λ§ λ‘κ·ΈμΈμ²λΌ μ μ κ° λ‘κ·ΈμΈνκ³ μλ€λ μνλ₯Ό μ μ§ν΄μΌ νλ μλΉμ€λ μνλ₯Ό μ μ§νμ§ μμΌλ©΄ λ‘κ·ΈμΈμ΄ νλ €λ²λ¦°λ€.
λ°λΌμ λͺ¨λ κ²μ 무μνλ‘ μ€κ³ν μ μλ€. μ΄μ© μ μλ κ²½μ°μλ§ μν μ μ§λ₯Ό μ΅μνμΌλ‘ μ¬μ©νλ κ²μ΄ λ² μ€νΈμ΄λ€.
Stateless ν΅μ μμ
μν μ μ§λ₯Ό μ΄ν΄νλ€λ©΄ 무μνλ μκ°λ³΄λ€ μ½κ² μ΄ν΄ν μ μμ κ²μ΄λ€.
- μμ κ±° ν맀λ₯Ό νλ μλ² X
- λ체 κ°λ₯ν μλ² Y, Z
- μμ κ±° μ¬λ €λ ν΄λΌμ΄μΈνΈ A
λνλ΄μ©μΌλ‘ μ§μνλ―μ΄, μλ²κ° μ΄μ μ ν΄λΌμ΄μΈνΈμ μμ²(μν)μ μ μ§νμ§ μμλ ν΄λΌμ΄μΈνΈμμ μ 보λ₯Ό μΌμΌν μ²μλΆν° νλλ λ€ λ³΄λ΄μ£ΌκΈ° λλ¬Έμ μλ‘ ν΅μ νλλ°λ μ무 λ¬Έμ μμ΄ μ²λ¦¬κ° λλ€.
λ°λΌμ 무μν(stateless)λ κΈ°μ‘΄μ μλ²κ° νΌμ‘ν΄μ Έμ μλ‘μ΄ μλ²λ₯Ό κ°μ Έλ€ λμλ κΈ°μ‘΄μ λΉμ¦λμ€ λ‘μ§μ κ·Έλλ‘ κ΅¬ννκ³ μλ€λ©΄ μ΄μ μ μ¬μ©μ μμ²μ΄ μ΄λ€μ§μ κ΄κ³μμ΄ κ³μ μΌμ μ²λ¦¬ν μ μλ€.
κ·Έλ¬λ λ¨μ μ ν΄λΌμ΄μΈνΈκ° νκ³ μνλ μ΅μ’ λͺ©μ μ μν΄ μ§λλ κ³Όμ λ§λ€ μ μ μ λ¬ν΄μΌνλ λ΄μ©μ΄ λ§μμ§λ€λ κ²μ΄λ€.
Stateless μ ν ν°(Token)
μμμ 무μνμ νΉμ§μΌλ‘ ν΄λΌμ΄μΈνΈμ μλ²κ°μ ν΅μ μ νμν λͺ¨λ μν μ 보λ€μ ν΄λΌμ΄μΈνΈμμ κ°μ§κ³ μλ€κ° μλ²μ ν΅μ ν λ λ°μ΄ν°λ₯Ό μ€μ΄ 보λ΄λ κ²μ΄λΌκ³ νλ€.
κ·Έλμ μλ²λ λ¨μν λ°μμ μλ΅λ§ ν΄μ£ΌκΈ° λλ¬Έμ μλ²μ λν λΆνκ° νμ ν μ€μ΄λ λ€κ³ λ νμλ€.
νμ§λ§ λ‘κ·ΈμΈ μ μ§μ κ°μ μνλ μ«μΌλ μ’μΌλ statefulν μνλ₯Ό μ¬μ©νμ¬μΌ νλλ°, κ·Έλ¬λ©΄ μλ²μ λΆνκ° μκΈ°κ³ μ’ κ·Έλ λ€.
κ·Έλμ stateless νΉμ§μ μ μ§νλ©΄μλ λ‘κ·ΈμΈ μν μ μ§λ₯Ό κ°λ₯νκ² νλ κΈ°μ μ΄ λ°λ‘ JWT ν ν° μ΄λ€.
ν ν°μ ν΄λΌμ΄μΈνΈκ° μνΈνλ λ‘κ·ΈμΈ μ 보λ€μ μ§λκ³ μλ€κ° μλ²μ ν΅μ ν λ λ겨μ€μΌλ‘μ¨ λ΄κ° λ‘κ·ΈμΈ λ¬μμ μΈμ¦νλ λ°©μμ΄λ€. μμ§ ν ν°μ λν΄ λͺ¨λ₯Έλ€λ©΄ μμ λ§ν¬λ₯Ό νκ³ νλ² μ λ ν΄λ³΄κΈ°λ₯Ό κΆνλ€. (μΉμ λ€λ£¬λ€λ©΄ 무쑰건 λ°°μ°κ² λ κ°λ μ΄λ€)
λ°λΌμ νΉλ³ν μΌμ΄ μλ€λ©΄ 무μνλ₯Ό μ§ν₯ν΄μΌνλ©° μ λ§ νμν κ²½μ°μλ§ μν μ μ§λ₯Ό ν΄μΌνλ€.
Stateless μ HTTP / REST
λ³΄ν΅ κ΅¬κΈμ Stateless μλΉμ€λ₯Ό κ²μνλ©΄ λμ€λ μ°κ΄ κ°λ λ€μ΄ λ°λ‘ HTTP, REST μ λκ° μλ€.
HTTPλ μμλ€ μνΌ νλ‘ν μ½μ΄λ€.
λ°λ©΄ RESTλ νλ‘ν μ½μ΄λΌκΈ° λ³΄λ¨ κ΅¬μ‘°(Architecture)μ κ°κΉλ€.
μ¦, RESTλ HTTP νλ‘ν μ½ μμ ꡬνλ Resource Oriented Architecture (ROA) μ€κ³ ꡬ쑰 μ΄λ€.
λ°λΌμ HTTPμ REST λͺ¨λ Statelessν μ±κ²©μ κ°μ§ λ μλ€μ΄λ©°,
- HTTPλ Statelssν μ±κ²©μ κ°μ§ 'νλ‘ν μ½'
- RESTλ Statelessν μ±κ²©μ κ°μ§ 'μ€κ³ ꡬ쑰'
λΌκ³ μ 리νλ©΄ λλ€.
# μ°Έκ³ μλ£
https://5equal0.tistory.com/entry/StatefulStateless-Stateful-vs-Stateless-%EC%84%9C%EB%B9%84%EC%8A%A4%EC%99%80-HTTP-%EB%B0%8F-REST
λͺ¨λ κ°λ°μλ₯Ό μν HTTP μΉ κΈ°λ³Έ μ§μ - κΉμν
https://irostub.github.io/web/stateful-stateless/
https://sjlim5092.tistory.com/35