REST에 대해 발표를 한 후 질문을 받았는데, 답을 하려고보니 내가 WAS
, stateless
,stateful
에 대해 제대로 이해하지 못한 것 같아서 이를 정리해봤다.
상태가 있다, 없다
= 사용자나 클라이언트의 컨텍스트를 서버 쪽에서 유지한다, 안한다
= HTTP세션과 같은 컨텍스트 저장소에 상태 정보를 저장한다,안한다
Server와 Client끼리 세션의 State(상태)에 기반하여 Client에 Response를 보낸다.
이를 위해서 세션 상태를 포함한 Client와의 세션 정보를 Server에 저장한다.
이것이 Stateful하다는 것이다.
Stateful특성
Stateful예시
그림 예시) TCP
-> 그림에 보이는 SYN_SENT
, LISTEN
, ESTABLISHED
등등이 여기서 말하는 '상태' 이다.
TCP는 Connection(3-handShake)을 맺고 서버가 클라이언트에 대한 정보와 상태를 유지시키고 있기 때문에 Stateful이라고 함.
client로부터 받은 패킷헤더를 파싱해서 앞으로 받을 데이터의 크기, sequence번호 등을 저장하는데 이 받은 크기의 데이터를 다 받을 때까지 세션을 유지하고 크기, sequence번호 등의 세션정보를 서버에 저장한다.
SMTP -> 메일 서버로 메일 보낼 때 상태를 가지고 송신자 주소, 수신자 주소, 메일 데이터 전송, 종료 등을 전송 종료 명령이 보내질 때까지 계속 유지됨
server의 응답이 client와의 세션 상태와 독립적이고 server는 단순히 요청이 오면 응답을 보내는 역할만 수행하고 서버에 저장되는 상태값이 없다.
Stateless특성
Stateless예시
HTTP는 통신 시 정보를 한 번씩 주고받은 후 바로 끊는 형태로 처리된다.
이렇게 상태 정보를 저장하지 않는 통신형태를 stateless라고 하며, HTTTP는 대표적인 stateless 프로토콜입니다.
그렇기 때문에 웹 서비스에서는 상태 정보 유지를 위한 별도의 처리가 필요하다.
서버가 클라이언트를 식별할 수 없을 때, 식별하기 위한
별도의 처리
만약에, server1에 클라이언트의 세션정보가 저장되면 server2에는 해당 정보가 없으므로 세션인증을 처음부터 다시 해줘야하기 때문에 clientA의 요청은 server1으로 연결되도록 관리해줘야 한다.
clientA의 요청이 sever1, server2 어디에 연결되더라도 DB를 통해 정보에 접근이 가능하다.
즉, Stateless한 구조를 따르면, Scailing이 자유롭다는 장점이 있다.
트래픽 급증으로 clientA가 server2로 연결된 경우 세션 정보를 다시 옮겨줘야하지만 stateless는 이런 걱정이 필요없습니다.
웹 서버와 웹 컨네이너를 합친 것으로, 동적 컨텐츠를 제공하기 위해서 만들어진 Application서버입니다.
HTTP프로토콜을 기반으로 어플리케이션을 수행할 수 있도록 해주는 미들웨어이고 데이터베이스 서버와 같이 수행된다.
-> DB접속 기능 제공, 여러 트랜잭션 및 비즈니스 로직 수행
즉, 정적 컨텐츠만 제공하는 서버일 경우에는 WAS없이 REST API 사용가능
REST와는 별개로 HTTP 동적 컨텐츠를 요청하면 WAS로 넘겨서 처리받고 이 결과를 WAS에게 받아서 클라이언트로 넘겨주는 것이고, 동적 컨텐츠를 사용하냐마냐와는 상관없이 여러 건의 요청을 동일한 사용자가 보내는 것인지 아닌지를 확인하기 위해서는 쿠키,세션이 필요하다