Stateful와 Stateless

leedong617·2024년 9월 20일
post-thumbnail

Stateful vs Stateless 개념

Stateful (상태 저장)

Stateful 시스템에서는 클라이언트와 서버 간의 상태가 유지됨.
상태 정보는 클라이언트와의 상호작용에서 서버에 저장되고, 이후 요청에서도 해당 상태 정보를 기반으로 처리함.
예를 들어, 사용자가 서버와 세션을 맺으면, 서버는 사용자의 세션 정보를 유지하고, 이후 요청을 처리할 때 해당 세션 정보를 참조함.

대표적인 예) HTTP 세션, 데이터베이스 커넥션.

Stateless (상태 비저장)

Stateless 시스템에서는 각 요청이 독립적으로 처리됨. 즉, 서버는 이전 요청의 상태를 전혀 기억하지 않음.
클라이언트의 각 요청은 완전한 정보를 포함하고 있어야 하며, 서버는 그 요청을 별도의 상태 없이 처리함.
Stateless 아키텍처에서는 서버 간 확장성이 높아지며, 각 요청을 처리하기 위한 리소스가 더 적게 필요함.

대표적인 예) RESTful API, DNS.

Stateful 시스템의 특징

세션 유지: 서버는 클라이언트와의 연결 상태 또는 세션 정보를 유지함.

연결된 서버로만 접근 가능: 특정 서버에 세션 정보가 저장되므로, 같은 클라이언트 요청은 반드시 같은 서버로 전달되어야 함.

리소스 소모: 세션 상태를 유지하는 데 필요한 메모리나 리소스가 늘어남.

복잡성 증가: 여러 서버에 걸쳐 상태를 유지하거나 동기화해야 할 경우 복잡성이 증가함.

  • 예시)

HTTP 세션 기반 인증: 사용자가 로그인을 하면 서버는 세션을 생성하고, 이후 요청마다 해당 세션을 통해 사용자를 식별함.

데이터베이스 트랜잭션: 트랜잭션이 진행되는 동안 데이터베이스는 해당 트랜잭션 상태를 기억하며, 완료되거나 롤백될 때까지 그 상태를 유지함.

Stateless 시스템의 특징

요청 독립성: 각 요청은 다른 요청과 독립적으로 처리됨. 서버는 클라이언트의 상태를 기억하지 않음.

확장성: 상태를 유지하지 않기 때문에, 여러 서버로 분산하여 처리가 가능함. 클라이언트의 요청은 어느 서버로 가더라도 동일하게 처리될 수 있음.

리소스 효율성: 상태를 유지할 필요가 없기 때문에 메모리나 리소스를 적게 사용함.

  • 예시)

RESTful API: 클라이언트의 모든 요청은 완전한 정보를 포함하며, 서버는 각 요청을 독립적으로 처리함. 인증 정보도 매번 요청에 포함되어야 함.

HTTP 프로토콜: 기본적으로 stateless로 설계되어 있음. 각 요청은 독립적이며, 서버는 이전 요청의 상태를 기억하지 않음.

Stateful vs Stateless 비교

항목StatefulStateless
상태 유지클라이언트 상태를 서버가 유지함상태를 유지하지 않음
요청 처리 방식이전 요청의 상태를 기반으로 처리각 요청을 독립적으로 처리
확장성상태 정보 때문에 서버 확장이 어려움서버 간 확장이 용이
리소스 사용량상태 유지에 필요한 리소스가 더 큼상태를 유지하지 않기 때문에 리소스 효율적
예시HTTP 세션, 데이터베이스 트랜잭션RESTful API, DNS

Stateful와 Stateless의 사용 사례

Stateful 사용 사례

웹 애플리케이션의 로그인 세션: 사용자가 로그인하면 서버는 해당 사용자의 세션을 기억하고, 이후 요청에서 세션 ID를 통해 사용자를 식별.

온라인 게임: 서버는 클라이언트의 게임 상태(레벨, 경험치, 아이템 등)를 기억하고, 이를 기반으로 클라이언트와 상호작용.

Stateless 사용 사례

RESTful API: 서버는 클라이언트 상태를 기억하지 않으며, 각 요청은 모든 필요한 정보를 포함함.

CDN (Content Delivery Network): 웹 페이지나 리소스를 제공할 때 상태를 유지하지 않으며, 각 요청은 독립적으로 처리됨.

Stateful와 Stateless 선택 기준

Stateful이 적합한 경우

  • 클라이언트 상태를 지속적으로 유지해야 하는 경우.
  • 클라이언트와 긴밀한 상호작용이 필요한 시스템 (예: 채팅 애플리케이션, 게임 서버).

Stateless가 적합한 경우

  • 시스템 확장성이 중요한 경우.
  • 각 요청이 독립적이고 상태를 유지할 필요가 없는 경우.
  • 클라우드 환경에서 수평 확장(horizontal scaling)이 필요할 때.
profile
웹개발자 취업 준비생

0개의 댓글