Scale Up/Out, Statefull(less), Connection(less)
서버의 성능 향상을 위한 방법
Scale Up (수직적 확장)

- 단일 서버의 하드웨어 사용을 높임
- CPU, Memory 등의 스펙을 높임
- 성능이 좋아질 수록 비용이 기하급수적으로 올라감
- 요청에 대한 처리를 더욱 빠르게 할 수 있도록 만듦
Scale Out (수평적 확장)

- 같은 사양의 서버를 여러 대 배치
- 동시에 더 많은 사용자 요청을 처리할 수 있도록 만듦
클라이언트-서버간 통신 상태 유지 여부
1. Stateful (상태 유지)

- 클라이언트의 상태를 유지함
- 상담원(서버)은 수강생(클라이언트)의 요청들을 기억(상태 유지)해 다음 질문들에 대한 처리 가능
Stateful 방식의 문제점
- 같은 서버가 유지되어야 함
- 상태를 유지하고 있던 서버가 종료되면?
- 요청 트래픽이 몰리면 상태를 유지하는 것에 자원이 많이 소모됨
- 자원이 버티지 못하면 서버가 다운되거나, 다음 요청의 처리가 느려짐
2. Statleless (무상태)


- 수강생(클라이언트)이 이전에 했던 요청을 쌓아가며 상담원(서버)에게 요청하게 됨
Stateless 방식의 장단점
- 장점
- 같은 서버를 유지할 필요가 없음
- Scale Out이 용이함 (수평 확장성이 높음)
- 단점
- 클라이언트가 데이터를 추가적으로 전송해야 함
- 전송되는 데이터의 양이 증가함
Stateless 방식의 한계점
- WebApplication을 만들때 서버의 확장성을 고려하여 최대한 Stateless하게 만들어야 하지만
실제로는 로그인과 같은 상태를 유지해야하는 경우가 발생함
- Cookie, Session, Token 등을 활용하여 한계를 극복함
- 상태 유지를 최소화 시켜야 한다.
클라이언트-서버간 연결 유지 여부
Connection (연결)

- 서버는 클라이언트와 연결을 유지하기 위해 자원을 소모하지만,
실제 서버에서 동시에 처리하는 요청은 작음
- 여러 클라이언트가 아무런 요청이 없어도 연결을 유지함
Connection 장단점
- 장점
- 새로운 연결 과정을 거치지 않아도 됨
- 요청에 대한 응답 속도가 빠름
- 단점
- 클라이언트가 지속적으로 요청을 보내지 않을 수 있음
- 연결을 위한 자원이 낭비될 수 있음
Coneectionless (비연결)

- 클라이언트와 서버간 연결을 유지하지 않음
- 서버는 최소한의 자원만 사용하게 됨
Coneectionless 장단점
- 장점
- 단점
- 요청이 추가적으로 오면 3 Way HandShake를 새로 해야 함
-> 요청에 대한 응답 시간이 증가함
- 웹사이트의 정적 자원을 모두 다시 다운로드 함
-> 캐시 , 브라우저 캐싱 으로 해결함
- 현재는
HTTP 지속 연결 로 문제를 해결함
HTTP 지속 연결 (Persistent Connections)

- 하나의 요청에 필요한 요청들이 모두 응답될 때까지 연결을 유지
참고자료
Spring 입문 - 1주차