백엔드 웹개발 (Java/Spring) 초격차 - 4
Web Application의 이해
- 계산기 프로그램 웹 애플리케이션으로 만들기
- step 1 : 사용자 요청을 메인 Thread가 처리하도록 함
step 2 : 사용자 요청이 들어올때마다 Thread를 새로 생성, 사용자 요청을 처리.
step 3 : Thread Pool을 적용, 안정적 서비스가 가능하도록 함.
개념부터
HTTP
- 서버와 클라이언트가 웹에서 데이터를 주고받기 위한 프로토콜(규약)
서버-클라이언트가 데이터를 주고받기 위해서는 이 규약을 준수해야한다.
- 참고
- HTTP/1.1, HTTP/2는 TCP 기반 위에서 동작
3wayhandshake 위에서 연관을 맺음.
- HTTP/3은 UDP 기반 위에서 동작
3wayhandshake로 연결을 맺을 필요가 없음.
- 요청/응답 메시지 구조
특징
- 클라이언트-서버 모델
- 클라이언트 → 요청 → 서버. 서버 → 응답 → 클라이언트.
- 무상태 프로토콜(Stateless)
- 서버가 클라이언트 상태를 유지하지 않음.
- 왼쪽이 무상태 프로토콜. 클라이언트가 서버에 요청을 보내면, 서버는 클라이언트에게 응답을 주고 연결을 끊어버림. 다음에 클라이언트가 서버에 요청을 보내려면 다시 한 번 연결을 맺고 응답을 받아야함.
- 예시) TCP 기반 위에서 동작한다면, 클라이언트가 서버에 요청을 보낼때마다 3wayhandshake를 통해 연결을 맺은 뒤 데이터를 주고 받는 과정을 거쳐야 함.
- 이 과정을 매 요청마다 수행하는 것이 비효율적이라고 생각했기 때문에, 해결책 Keep-Alive 속성을 사용.
- 일정 기간동안은 해당 연결을 끊지 않고 클라이언트와 서버가 데이터를 주고받을 수 있게 한다. 특정 기간동안 클라이언트-서버가 연결을 유지하며 데이터를 주고받을 수 있게 됨.
- 잘못 사용하면 성능하락의 주범이 되기도 한다.
이 기능을 사용한 채로 클라이언트의 요청이 많아지면 유지되는 커넥션이 증가하고, 자연스럽게 신규 사용자가 들어오지 못할수도 있다.
웹 서버 스레드가 부족해지는 것.
- 비 연결성(Connectionless)
- 서버가 클라이언트 요청에 대해 응답을 마치면 맺었던 연결을 끊어버리는 것
- 해결책 : 쿠키(클라이언트에 정보 저장), 세션(서버에 정보 저장), JWT
- HTTP는 왜 이렇게 설계됐을까? 연결을 바로 끊는 이유?
- 기본적으로 웹 상에서 불특정 다수와 통신하도록 설계된 프로토콜
- 서버가 다수의 클라이언트들과 연결을 유자해야한다면 리소스 낭비가 굉장히 심해지게 된다.
- 연결을 유지하지 않는 대신, 더 많은 연결을 할 수 있도록 설계한 것.
- HTTP 요청 메서드
- HTTP 응답 코드
- 2xx(성공), 3xx(리다이랙션), 4xx(클라이언트 에러), 5xx(서버 에러) 등
- 응답코드를 보고 결과가 어떤지 파악할 수 있어야 한다.
- HTTP 헤더
- Content-type, Accept, Cookie, Set-Cookie, Authorization 등