CS

븟츠의 상태성(Stateful)과 무상태성(Stateless)

vtzs 2024. 8. 18. 14:05

웹 요청과 응답의 기본? HTTP!

 

현대의 웹 요청과 응답에는

HTTP라는 HyperText Transfer Protocol 라는 규칙이 적용되어서 사용되고 있습니다.


데이터를 전송할 수 있도록 데이터 교환 방법을 정리한 것인데, 이러한 HTTP에는 3가지 특징이 있습니다.

 

1. 단방향성

2. 비연결성

3. 무상태성

 

위 3가지 특징 중, 저는 3번째인 무상태성(Stateless)에 집중해서 설명을 하려고 합니다.

 

무상태성이라는 말은 그냥 들으면 무슨 말인지 이해가 잘 되지 않기 때문이기도 하고
저도 학부시절 여러번 들었지만,
그때마다 " 아 그냥 상태를 갖지 않는다는 말이구나 " 라고만 이해하고 넘어갔던 기억이 있기 때문입니다 😂

 


무상태성(Stateless...?)


무상태성은 간단하게 말하면 상태를 유지하지 않는다는 의미입니다.
상태..? 무슨 상태를 말하는거지? 라는 의문이 드실텐데 무상태성에 대해서 알아보기전에
예시와 함께 무상태성의 반대인 상태성(Stateful)에 대해서 먼저 알아보도록 합시다!

 

카페에가서 음료를 주문한다고 했을 때,

우리는 아래와 같은 흐름으로 점원과 대화하며 주문을 하게 됩니다.

 

 

 

 
 
 



 

위와 같은 흐름으로 주문을 할 수 있는 이유는 무엇일까요?
그 이유는 점원이 제가 주문하기 전에 했던 말을 기억하고 있기 때문입니다.

 

즉, 고객이 이전에 했던 말( = 어떠한 상태)을
점원이 기억하고 있기 때문에(= 어떠한 상태를 가지고 있기 때문에)

 

점원이 우리의 이전 상태를 기억하고 있기 때문에 위와 같은 흐름으로 주문을 할 수 있는 것이고
이것을 상태성(Stateful)이라고 합니다.

 

상태성에 대해서 이해하셨다면, 이제 무상태성이 뭔지 알아보도록 합시다.

 


 

그래서 무상태성은..?

 

우리가 인스타를 통해 엄청나게 유명해진 카페를 갔다고 가정해봅시다.
이 인스타에서 유명한 감성 카페는 너무나도 유명해서 고객이 어마어마하게 많이 오기 때문에
주문량을 모두 감당하기 위해서 점원이 5명이 있다고 생각해봅시다.

 

 

그리고 이 점원들은 너무나도 바빠서
고객의 요청을 돌아가면서 여유가 되는 점원이 그때그때 처리한다고 가정해 봅시다.

 

그럴 때, 위와 같이 주문을 한다면 어떻게 될까요?

 

 
 
 




중간에 점원이 계속 바뀐다면 이와 같은 일이 벌어지겠죠?
왜 이렇게 될까요?

 

그 이유는 점원이 바뀌었기 때문에 제가 주문하기 전에 했던 말을 기억하지 못하고 있기 때문입니다.

 

즉, 고객이 이전에 했던 말( = 어떠한 상태)을
점원이 기억하고 있지 않기 때문에(= 어떠한 상태를 가지고 있지 않기 때문에)

 

점원이 우리의 이전 상태를 기억하지 않기 때문에 위와 같은 흐름으로 주문을 할 수 있는 것이고
이것을 무상태성(Stateless)이라고 합니다.

 

그런데, 위의 예시만 보면 무상태성이 훨씬 안좋아보이는데
왜 무상태성을 지향하는 것일까요?

 


 

 

왜 무상태성을 지향할까?

 

위에서 든 예시처럼 인스타에서 너무 유명세를 타서 카페가 엄청나게 홍보가 잘되어서
하루에 5000명의 사람이 찾아온다고 가정하고
위의 상태성에서 든 예시처럼 한 점원이 주문을 계속 받는다고 해볼께요.

 

그런 상황에서 만약 모든 손님들이 본인이 주문하고 싶은 음료 종류나, 개수, 가격 등을 모두 정리하고
고민하지않고 빠르게 주문한다면 한 점원이 모두 주문을 받는다고 해도 문제는 없을 것입니다.

 

그렇지만, 실제로는

 

 


위와 같은 상황이 생길 수 있습니다.

 

이 경우, 손님을 탓할 수 있을까요?
당연히 메뉴를 보고 고민을 할 권리가 있으니 손님을 탓할 수는 없겠죠?

 

위와 같은 경우에는 손님은 고민을 하게 두고,
점원은 다른 손님의 주문을 받는다거나,
음료를 만드는 것이 훨씬 카페 입장에서는 일처리가 효율적이게 될겁니다.

 

그렇다면, 여유가 되는 점원이 손님의 주문을 받게 될텐데
손님의 이전 주문(어떤 메뉴를 골랐는지, 몇잔을 주문했는지) 등등 을
다른 점원은 기억하지 못할텐데 어떻게 무상태성으로 주문을 받을 수 있을까요??

 

사실 해법은 간단합니다.
점원이 주문을 받을 때 손님이 모든 요청을 전부 말하게 하면 됩니다.

 

 



위와 같이 한번에 모든 요구사항을 손님이 말한다면
점원은 손님의 이전 상태를 기억할 필요가 없게 됩니다.

 

그리고 수많은 손님이 온다고 해도 한번만 손님의 주문을 받으면 되니 시간도 아낄 수 있고
주문을 대기하는 손님들도 대기줄이 금방 줄어드니 카페입장에서도,

손님입장에서도 좋은 상황이라고 할 수 있습니다.

 

그래서 무상태성을 지향하게 되는 것입니다.

 

여기까지 이해하셨다면 이제, 클라이언트와 서버간의 통신을 생각해봅시다!

 


 

클라이언트와 서버간의 통신에서는

 

위에서 말한 유명한 인스타 감성 카페처럼 유명한 서버(네이버, 카카오 등)

너무나도 많은 고객들이 방문하기 때문에
많은 서버들은 그 많은 고객의 요청을 무상태성(stateless)으로 처리할 수 밖에 없습니다.


상대적으로 한가한 서버가 유저의 요청을 받아야
유저 입장에서도 덜 기다려도 되고,
서버 입장에서도 여러 서버가 고르게 작업을 처리할 수 있으니
서로 윈윈이기 때문입니다.

 

그리고, 서버에 갑자기 오류가 생긴다던지, 화재같은 재난상황이 발생해서
특정 서버가 아예 동작을 하지 못하게 되는 상황이 생긴다면
그냥 그 서버로 요청을 보내지 못하도록 막고 다른 서버가 일을 이어서 처리하게 하면 되니
이를 대비해서 서버들은 대부분 무상태성으로 운영됩니다.

 

이번에도 예시로 설명을 들어보도록 하겠습니다.
만약 유저가 A에 대한 정보가 필요하다고 하면 서버에 A에 대한 정보를 요청하면 됩니다.

 

 

 


위와 같은 흐름이 되겠죠?

 

그런데, 만약, 유저가 B에 대한 정보를 요청하려고 하는데
B에 대한 정보는 A에 대한 정보가 있어야만 의미가 있다고 가정해봅시다.

 

위의 카페 예시로 생각해보면,
아이스 아메리카노는 A에 해당하고 아이스/핫 에 대한 정보는 B에 해당하는 것이죠.

 

A를 생략하고 그냥 B에 대한 정보만 요청하면
무상태성으로 운영되던 서버는 당연히
A에 대한 정보도 달라고 하겠죠?

 

 

 

이번에도 해법은 똑같습니다.

 

A에 대한 정보는 이전의 요청에서 유저가 획득했기 때문에
요청을 보낼때 A에 대한 정보도 같이 보내주면서 B에 대한 정보를 요청하면 됩니다.

 

 

 

위와 같이 될것이고

 

전체 흐름은 다음과 같이 됩니다.

 

 


이제 무상태성과 상태성에 대해서 이해하셨나요?


궁금한점이 있다면 댓글 남겨주세요!