CS

stateless, stateful ?

아가프린 2024. 4. 9. 23:38

이번 글에서는 무상태인 stateless와 상태유지 stateful을 알아보겠습니다.

원래는 REST를 공부하다가 "REST는 stateless하다." 라는 말을 듣고 어렴풋이 이해했지만

더 확실히 이해하고자 정리해보려 합니다.

 

stateful

이번 글에서 다루는 stateless와 stateful는 서버와 클라이언트 간의 통신에서의 개념을 말합니다.

stateful, stateless와 다르게 서버와 클라이언트의 상태를 유지하는 것을 의미합니다.

 

상태를 유지한다는 것은 서버가 이전 요청 후에 날린 요청에서도 이전 요청의 값을 저장하고 있는 것입니다.

주로 로그인을 예시로 들 수 있습니다.

 

사용자가 서비스를 이용할 때 한 번 로그인을 하면 어디서든 로그인이 유지된다.

 

위 상황은 클라이언트에서 저장할 수도 있지만 클라이언트에서 저장하지 않는 경우에는 서버에서

stateful한 방식을 사용한 것이다. 

 

저장소

stateful 방식을 썼을 때 대체 어디에 저장하는지 궁금할 수 있는데

보통은 Cookie나 서버의 Session에 저장해 매 요청마다 정보를 읽습니다.

 

문제점

1. 서버

stateful은 좋은 방식입니다. 하지만 약간의 문제점이 있습니다. 상태를 유지한다는 것은 서버가 클라이언트에서

보내는 어떠한 상태를 저장하는 것입니다. 이때 이 저장하고 있던 서버가 어떤 사정으로 다른 서버로 대체되거나

서버를 못 쓰게 될 경우에는 어떨까요?

 

새로운 서버는 이전 서버가 가지고 있던 상태를 가지고 있을 수 없습니다. 애당초 다른 서버니까요.

이런 경우에는 위 상황처럼 로그인 후 서비스 기능을 이용중일 때 갑자기 로그인을 다시 해야된다면

서버가 다운되어서 다른 서버가 이를 대체해 새로운 유저 상태를 받아야되기 때문일 수 있습니다.

 

서버에서의 기능은 똑같이 동작하지만 상태를 유지하지 못 할 뿐이라고 이해하면 됩니다.

 

2. 용량

서버도 상태를 저장하는데에는 한계 용량이 존재합니다. 그래서 한계점까지 상태를 꽉 채웠다면 일부가 빠져야

다음 상태 관련 기능을 처리할 수 있습니다.

 

방안

그래서 stateful이 무조건 좋지 않은 방식이란 것은 아닙니다. 위 문제들을 해결할 여러가지 방안들이 있기 때문입니다.

상태를 서버가 아닌 클라이언트에서 일부분 저장하거나 캐시 서버에 상태를 저장하는 등의 여러가지 방안이 있습니다.

 

stateless

HTTP 프로토콜의 특징 중 하나죠? stateless는 서버가 클라이언트의 상태를 저장하지 않습니다.

그렇기에 서버에 부담이 확연히 줄고 반대로 클라이언트의 부담이 조금 높아집니다.

 

클라이언트에서 통신에 필요한 모든 상태 정보들을 가지고 있다가 통신할 때 필요한 상태들을

데이터에 실어서 보내기 때문입니다. 이로 인해 서버는 상태를 저장할 필요가 없고 단지 요청에 대한 응답만 하면 되는 구조가 됩니다.

 

이렇게 되면 stateful의 서버 문제점은 생기지 않게 됩니다. 설령 현 서버가 다운되어도 다른 서버는 기능을 똑같이

수행하기 때문에 상태와 관련된 문제는 생기지 않게 됩니다.

 

꼭 서버가 다운되는 것 뿐만 아니라 서버가 확장되는 상황에서도 고려할 점은 stateful 방식보다 훨씬 줄어들게 됩니다.

REST API가 간단한 API인 이유 중 하나입니다.

 

문제점

모든 게 완벽한 방식은 없습니다. 당연히 stateless 또한 문제점이 있는데 과정이 꽤나 번거롭게 됩니다.

같은 상태가 필요한 통신을 여러번 보낼 때마다 같은 상태를 계속 실어줘야 되니까요.

 

물론 로그인의 경우에는 stateless만 사용할 수는 없습니다. 일정 부분 서버가 stateful 방식을 적용하거나

클라이언트가 유저의 정보를 가질 수 있는 JWT 토큰 방식도 존재합니다! 어떤 방식을 택할지는 서비스의 특성에 따라 갈리게 되니

상황에 따라 알맞게 사용하는 것이 바람직 합니다.

 

 

비교

stateful

A: 종업원님, 여기 돈까스 정식 얼마인가요?
B: 돈까스 정식은 10000원 입니다.

A: 알겠습니다. 3개 주문할게요.
B: 30000원 되겠습니다. 음료는 어떤걸로 주문하시겠어요?

A: 현금으로 결제 하겠습니다.
B: 30000원 결제 되셨습니다.

stateless

A: 종업원님, 여기 돈까스 정식 얼마인가요?
B: 돈까스 정식은 10000원 입니다.

A: 알겠습니다. 돈까스 정식 3개 주문할게요.
B: 30000원 되시겠습니다. 결제는 무엇으로 하시겠습니까?

A: 돈까스 정식 3개 현금으로 결제 하겠습니다.
B: 30000원 결제 되셨습니다.

 

 

사람처럼 대화하는 예시를 작성해보았습니다. 위 글에서의 개념들이 잘 이해되시나요?

 

stateful은 종업원, 즉 서버가 클라이언트의 요청 상태를 저장(기억) 하고 있기 때문에 요청 데이터가 많이 소모되지 않습니다.

반대로 stateless는 주문에 필요한 데이터들을 상대적으로 더 많이 요청하게 됩니다.

만약 stateless에서 stateful 같이 요청한다면 두 번째 대화에서 B는 무엇을 3개 주문하시겠습니까?라는 대답으로 돌아올 것입니다.