향후 Web Application을 실제 개발하기 위해서는 클라이언트와 서버 간의 통신 흐름을 알아야 한다.
왜 알아야 할까?
- 효율적인 API 설계를 위해
→ RESTful API 설계와 HTTP 메서드(GET, POST, PUT, DELETE 등)를 올바르게 활용 가능 - 디버깅 / 문제 해결을 위해
→ 오류 발생 시 어떤 오류인지 정확히 파악하고 해결 가능 - 보안 / 최적화를 위해
→ HTTPS를 사용한 암호화된 통신, 캐싱 전략 구현, 데이터 압축, 비동기 통신 등을 활용하여 응답 속도 개선 가능 - 전체적인 시스템 흐름 파악을 위해
→ 백엔드와 프론트엔드의 상호작용 명확히 이해하고, 시스템 구조에 대해 파악 가능
클라이언트가 요청을 보내는 과정
클라이언트에서 URL을 입력 or 버튼 클릭 → 해당 요청을 서버로 보내기 위한 준비 시작한다.
- DNS(Domain Name System) 서버에 요청 → 요청한 도메인 이름을 IP 주소로 변환하여 서버 위치 확인한다.
- DNS에서 IP 주소 확인 → 서버와 연결하기 위해 TCP 연결을 설정하고, 3-way handshake 절차 진행하여 연결한다.
HTTP 요청 전송
클라이언트는 HTTP 요청을 서버로 전송한다. (요청 메서드, URL, 헤더, 본문(선택) 포함)
- 요청 메서드: GET, POST, PUT, DELETE, PATCH 등
- URL: 요청할 리소스 위치
- 헤더: 요청에 대한 메타 데이터(User-Agent, Content-Type, Authorization 등)
- 본문: POST, PUT 등 요청 시 필요한 데이터를 포함하여 서버에 전송
GET /users HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
서버에서 요청 처리
서버는 클라이언트의 요청을 받게 되면, 요청 URL을 분석하고 적절한 라우팅을 찾아 요청된 리소스에 대한 처리를 시작한다.
- 요청에 대한 비즈니스 로직을 수행하여 결과를 준비한다
- 요청 처리 과정에서 필요한 경우 외부 API와 통신/데이터 가져오는 등 작업을 진행한다
- 요청에 대한 응답을 준비한다. ( 응답 코드 + 응답 본문)
HTTP 응답 전송
서버는 클라이언트 요청에 대해 준비한 HTTP 응답을 클라이언트에게 반환한다
- 상태 코드: 요청 처리 결과를 나타내는 코드 ( 200 OK / 404 NOT FOUND / 500 INTERNAL SERVER ERROR 등)
- 응답 헤더: 응답에 대한 메타 데이터 (Content-Type, Cache Control, Date 등)
- 응답 본문: 요청한 리소스에 대한 실제 데이터 (HTML, JSON 등)
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1,
"name": "Alice"
}
클라이언트 응답 처리
클라이언트는 서버로부터 받은 응답을 처리하게 된다
- HTML: 페이지 렌더링 후 화면에 표시한다
- JSON: 클라이언트 어플리케이션에서 파싱 후 데이터 처리하고, 사용자에게 표시하거나 후속 작업 진행한다.
추가 리소스 요청: 만약 HTML과 같은 페이지에서 이미지, CSS 파일 등 정적 리소스가 포함되어 있을 경우 클라이언트는 해당 리소스에 대한 데이터를 서버로부터 추가 요청을 한다.
연결 종료
클라이언트와 서버의 HTTP 연결을 종료한다
- HTTP는 무상태성(Stateless) 프로토콜이므로,
- 각 요청 및 응답은 독립적이기 때문에 서버는 이전 요청의 상태를 기억하지 않는다.
- 이로 인해 클라이언트와 서버간의 연결은 매 요청마다 새로 연결해야하고 완료되면 종료된다.
'Dev > Spring' 카테고리의 다른 글
[Spring] 연관 관계 매핑 (0) | 2025.05.19 |
---|---|
[Spring] JPA (0) | 2025.05.15 |
[Spring] IP / Port / Domain / URL (0) | 2025.05.13 |
[Spring] HTTP 기본 구조 (0) | 2025.05.07 |
[Spring] Spring 이란 (0) | 2025.05.02 |