
Stateful 시스템에서는 클라이언트와 서버 간의 상태가 유지됨.
상태 정보는 클라이언트와의 상호작용에서 서버에 저장되고, 이후 요청에서도 해당 상태 정보를 기반으로 처리함.
예를 들어, 사용자가 서버와 세션을 맺으면, 서버는 사용자의 세션 정보를 유지하고, 이후 요청을 처리할 때 해당 세션 정보를 참조함.
대표적인 예) HTTP 세션, 데이터베이스 커넥션.
Stateless 시스템에서는 각 요청이 독립적으로 처리됨. 즉, 서버는 이전 요청의 상태를 전혀 기억하지 않음.
클라이언트의 각 요청은 완전한 정보를 포함하고 있어야 하며, 서버는 그 요청을 별도의 상태 없이 처리함.
Stateless 아키텍처에서는 서버 간 확장성이 높아지며, 각 요청을 처리하기 위한 리소스가 더 적게 필요함.
대표적인 예) RESTful API, DNS.
세션 유지: 서버는 클라이언트와의 연결 상태 또는 세션 정보를 유지함.
연결된 서버로만 접근 가능: 특정 서버에 세션 정보가 저장되므로, 같은 클라이언트 요청은 반드시 같은 서버로 전달되어야 함.
리소스 소모: 세션 상태를 유지하는 데 필요한 메모리나 리소스가 늘어남.
복잡성 증가: 여러 서버에 걸쳐 상태를 유지하거나 동기화해야 할 경우 복잡성이 증가함.
HTTP 세션 기반 인증: 사용자가 로그인을 하면 서버는 세션을 생성하고, 이후 요청마다 해당 세션을 통해 사용자를 식별함.
데이터베이스 트랜잭션: 트랜잭션이 진행되는 동안 데이터베이스는 해당 트랜잭션 상태를 기억하며, 완료되거나 롤백될 때까지 그 상태를 유지함.
요청 독립성: 각 요청은 다른 요청과 독립적으로 처리됨. 서버는 클라이언트의 상태를 기억하지 않음.
확장성: 상태를 유지하지 않기 때문에, 여러 서버로 분산하여 처리가 가능함. 클라이언트의 요청은 어느 서버로 가더라도 동일하게 처리될 수 있음.
리소스 효율성: 상태를 유지할 필요가 없기 때문에 메모리나 리소스를 적게 사용함.
RESTful API: 클라이언트의 모든 요청은 완전한 정보를 포함하며, 서버는 각 요청을 독립적으로 처리함. 인증 정보도 매번 요청에 포함되어야 함.
HTTP 프로토콜: 기본적으로 stateless로 설계되어 있음. 각 요청은 독립적이며, 서버는 이전 요청의 상태를 기억하지 않음.
| 항목 | Stateful | Stateless |
|---|---|---|
| 상태 유지 | 클라이언트 상태를 서버가 유지함 | 상태를 유지하지 않음 |
| 요청 처리 방식 | 이전 요청의 상태를 기반으로 처리 | 각 요청을 독립적으로 처리 |
| 확장성 | 상태 정보 때문에 서버 확장이 어려움 | 서버 간 확장이 용이 |
| 리소스 사용량 | 상태 유지에 필요한 리소스가 더 큼 | 상태를 유지하지 않기 때문에 리소스 효율적 |
| 예시 | HTTP 세션, 데이터베이스 트랜잭션 | RESTful API, DNS |
웹 애플리케이션의 로그인 세션: 사용자가 로그인하면 서버는 해당 사용자의 세션을 기억하고, 이후 요청에서 세션 ID를 통해 사용자를 식별.
온라인 게임: 서버는 클라이언트의 게임 상태(레벨, 경험치, 아이템 등)를 기억하고, 이를 기반으로 클라이언트와 상호작용.
RESTful API: 서버는 클라이언트 상태를 기억하지 않으며, 각 요청은 모든 필요한 정보를 포함함.
CDN (Content Delivery Network): 웹 페이지나 리소스를 제공할 때 상태를 유지하지 않으며, 각 요청은 독립적으로 처리됨.