Stateful과 Stateless
웹 공부를 함에 있어서 서버와 클라이언트 사이에 상태유지 (Stateful), 그리고 무상태 (Stateless)라는 개념을
자주 들었었다. 그렇지만 머릿속에 남는 것은 단어 그 자체뿐이었고, 왜 이러한 특성이 중요한 것인지
궁금하여 학습하였다.
오늘은 Stateful과 Stateless에 대해 명확히 이해하기 위한 포스팅을 작성하고자 한다.
Stateful (상태 유지)
- 서버가 클라이언트의 상태를 보존함
클라이언트의 상태를 보존한다?
이는 클라이언트의 정보를 서버의 어딘가에 저장하고, 통신 시 이를 활용한다는 의미이다.
(보통 브라우저의 쿠키나 서버의 세션 메모리에 저장되어 상태를 유지한다.)
Stateful 문제점
서버에서 클라이언트의 상태 정보를 저장한다고 할 때, 가장 큰 문제는
클라이언트의 정보를 저장하고 있는 서버에 문제가 생겨, 다른 서버를 사용해야 할 때 발생한다.
그 이유는 새로운 서버에는 이전 서버에서 저장한 클라이언트의 상태를 기억하고 있지 않기 때문이다.
우리가 옷을 주문한다고 가정해보자.
로그인, 주소 입력, 결제의 과정까지 각 단계에서 이전에 내가 선택한 정보들이지속적으로 저장되어 있지 않다면, 다시 말해 Stateful 하지 않다면 우리는 해당 상품을 주문할 수 없을 것이다.
정리하면, Stateful 시스템은 사용자에게 개인화되고 맞춤화된 경험을 제공하는 데 유용하지만, 상태 정보를 지속적으로 관리해야하므로 시스템의 복잡성이 증가하고, 서버의 부하가 커질 수 있으며 이를 고려한 적절한 구조 설계가 중요하다.
이러한 불상사를 방지하기 위해서는 다음과 같은 방법들이 사용된다.
- 캐시 서버 (Redis) 활용
- 클라우드 서비스 활용
- 이중화 및 분산 시스템 활용
Stateless (무상태)
무상태는 앞서 소개한 stateful과는 반대로 서버가 클라이언트의 상태를 보존하지 않음의 의미이다.
Stateless 구조에서 서버는 요청이 왔을 때 응답을 보내는 역할만을 수행하며
클라이언트의 상태는 오직 클라이언트에게 그 책임이 있다.
다시 말해, 클라이언트와 서버 간 통신에 필요한 모든 상태정보들을 클라이언트에서 가지고 있다가
서버와 통신할 때 실어서 보내는 것이 무상태 구조이다.
위의 Stateful 예시를 대입 했을 때,
클라이언트가 서버에게 주문에 관한 모든 정보를 누적하여 전달하며, 서버는 클라이언트의 어떠한 상태도 기억하지 않는다.
data [ ( 브랜드 ( xx ), 셔츠, 우리집 주소로 결제형식은 카드로 결제)]의 전체 내용을 서버로
요청서버는 그저 결제 승인.
Stateless 문제점
stateful과 달리, 무상태의 경우 클라이언트가 서버에 전달할 데이터의 양이 많아지는 것이 가장 큰 문제점이다.
하지만 Stateless 구조를 활용할 경우 Scale-out 즉, 서버 확장을 수월하게 할 수 있으므로처리하는 데이터의 양이 증가한다고 할 때, 이를 처리할 서버만 증설한다면 문제를 해결할 수 있다.
(Stateful과 달리 클라이언트의 상태를 기억할 필요가 없으므로)
대표적인 프로토콜로는 HTTP와 UDP가 있으며
stateless의 특징을 유지하면서도 로그인 상태 유지를 가능하게 해주는 기술이 바로 JWT (Json Web Token)이다.
'Server' 카테고리의 다른 글
RESTful API에 대하여 (0) | 2024.06.10 |
---|---|
JPA와 MyBatis (ORM, SQL Mapper)에 대하여 (0) | 2024.06.09 |
java.lang.IndexOutOfBoundsException (MyBatis) (0) | 2024.05.18 |
intellij Project 인식 오류 해결하기 (0) | 2024.05.15 |
웹프로그래밍_Servlet에 대하여 (2) | 2024.03.14 |