WEEK 4-2: Spring 기본(2)

ensalada.de.pollo·2025년 5월 4일

be

목록 보기
14/44

HTTP

HTTP(HyperText Transfer Protocol)은 웹에서 텍스트, 이미지, HTML, JSON 등 다양한 데이터를 전송하는 데에 사용되는 표준 프로토콜입니다. 클라이언트와 서버 간의 요청, 응답 교환을 기반으로 작동하고 서버 간 통신이나 서버에서 클라이언트로의 데이터 전송에도 활용이 됩니다.

HTTP의 주요 특징

  • application 계층 프로토콜로 인터넷에서 데이터를 주고 받는 규칙을 정의합니다.
  • 버전이 존재하는데, 가장 널리 사용되고 있는 것은 HTTP/1.1입니다.
  • Stateless: 각 요청이 독립적으로 처리되고, 상태 유지가 필요할 때에는 쿠키, 세션, 토큰 등을 활용합니다.
  • Connectionless: 각 요청, 응답 후 연결이 끊어집니다. HTTP/1.1부터는 Persistent Connection 기능을 사용합니다.
  • 미디어 독립성: MIME 타입을 통하여 다양한 데이터를 전송합니다.

HTTP 동작 방식

  1. 클라이언트가 요청을 보냅니다
  2. 서버가 요청을 처리하고 응답을 반환합니다.

HTTP 메세지 구조

요청, 응답 모두 아래와 같은 구조를 가집니다.

  • Start Line: 요청의 경우 HTTP 메서드와 경로, 응답의 경우에는 상태 코드와 메세지
  • Header: 메타데이터
  • 공백 줄: 헤더와 바디를 구분합니다.
  • Message Body: 실제 데이터가 들어가는 부분입니다.

주요 HTTP 메서드

메서드설명용도안전성멱등성캐시 가능성
GET데이터 조회페이지/리소스 조회OOO
POST데이터 생성/전송회원가입, 글쓰기 등XXConditional
PUT데이터 전체 수정/덮어쓰기리소스 전체 변경XOX
PATCH데이터 일부 수정리소스 부분 변경XXConditional
DELETE데이터 삭제리소스 삭제XOX
HEAD헤더만 조회상태 확인OOO
OPTIONS지원 메서드 조회사전 요청OOX
CONNECT터널 연결 설정proxy 등XXX
TRACE경로 추적디버깅OOX
  • 안전성은 해당 메서드를 여러 번 호출해도 서버의 리소스 상태가 변하지 않는 특성을 의미합니다.
  • 멱등성: 동일한 요청을 한 번 보내든 여러 번 보내든 서버의 상태와 결과가 동일하게 유지됩니다.
  • 캐시가능성: 서버의 응답 결과를 클라이언트나 중간 서버가 저장하고 동일한 요청이 오면 서버에 재요청하지 않고 캐시된 데이터에 접근하여 재사용합니다.

캐시가능성에서 conditional은?

응답에 명시적으로 freshness 정보와 Content-Location 헤더가 있을 때만 가능

HTTP/1.1의 특징

  • Persistent Connections
  • 효율적인 캐싱: 조건부 GET, 캐시 협상 등으로 네트워크 트래픽을 줄이면서 응답 속도를 높입니다.
  • 다양한 메서드 지원: PUT, DELETE, OPTIONS 등으로 서버 리소스 관리가 용이합니다.
  • 확장성: 헤더를 통해서 새로운 기능 추가가 쉽고, 새로운 기능의 도입 또한 가능합니다.

HTTP 상태 코드

서버가 클라이언트 요청을 어떻게 처리했는지 알려주는 코드입니다.
첫 번째 숫자를 기준으로 다섯 가지로 분류됩니다.

  • 1xx(정보): 요청을 받고, 처리가 진행중
  • 2xx(성공): 요청이 성공적으로 처리
  • 3xx(리다리엑션): 추가 조치가 필요
  • 4xx(클라이언트 에러): 클라이언트에서 잘못된 요청을 보낸 경우
  • 5xx(서버 에러): 서버에 문제가 발생해서 요청을 처리하지 못한 경우

HTTP API 설계

  • HTTP API 설계는 항상 리소스 식별(RESTful)을 기준으로 삼습니다.
  • URI에는 동사 대신 명사(복수형)을 사용합니다.
  • 동작(생성, 조회, 수정, 삭제)는 HTTP 메서드로 구분합니다.

HTTP Header

클라이언트와 서버가 요청, 응답 시 부가적인 정보를 전달하기 위하여 사용하는 텍스트 기반 key-value 페어입니다. 이 헤더들은 메세지의 본문 내용, 크기, 인증, 브라우저 정보 등 다양한 메타데이터들을 포함할 수 있습니다.

HTTP Header의 구조와 특징

  • 각 헤더는 name:value 형태로 작성됩니다.
  • 헤더는 요청, 응답 메세지 모두에 포함될 수 있습니다.
  • 여러 줄의 헤더는 각 줄마다 구분되어서 작성됩니다.
  • 커스텀 헤더도 추가가 가능하지만, 서버가 해당 값을 이해해야 의미가 있을 것입니다.
  • 헤더는 plain text로 이루어져 있습니다.

HTTP Header의 분류

분류설명
일반 헤더요청과 응답 모두에 사용, 메세지의 일반 정보 제공
요청 헤더클라이언트가 서버에 추가 정보를 전달
응답 헤더서버가 클라이언트에 추가 정보를 전달
표현 헤더메세지 본문의 형식, 인코딩, 언어 등 리소스 표현 정보
페이로드 헤더페이로드 데이터에 대한 정보(길이, 인코딩 등)

주요 HTTP Header

  • Content-Type: 전송하는 데이터의 미디어 타입
  • Content-Encoding: 데이터 압축 방식
  • Content-Language: 데이터의 언어
  • Content-Length: 본문 데이터의 바이트 크기
  • User-Agent: 클라이언트의 브라우저, OS 등 환경 정보
  • Authorization: 인증 정보
  • Host: 요청한 도메인 정보
  • Set-Cookie / Cookie: 세션 및 사용자 상태 관리

RESTful API

HTTP Header를 적극 활용합니다. 헤더에 다양한 정보를 명확하게 전달함으로써 클라이언트와 서버가 표준화된 방식으로 통신할 수 있습니다.

Best Practice

  • 리소스는 명사(복수형), URI에는 동사를 사용하지 말 것
  • HTTP Method를 활용하여 리소스의 상태를 관리
  • 상태 코드와 Header를 통해 요청/응답의 의미와 상태를 명확히 전달
  • URI에는 민감한 정보를 포함하지 않을 것
  • 예외 처리는 일관된 방식으로 할 것

Web Application

Web Server

웹 서버는 HTTP 기반으로 동작하고, 정적 리소스(HTML, JS, CSS 등)을 제공합니다. 대표적으로는 NGINX와 Apache가 있습니다.

WAS(Web Application Server)

WAS는 웹 서버의 기능을 포함합니다. 추가적으로 코드를 실행하여 application 로직을 처리하고, 데이터베이스와 상호작용을 하여 동적 컨텐츠를 생성합니다.
대표적으로는 Tomcat, Jetty 등이 있습니다.

Java에서는 Servlet Container 기능을 제공하면 WAS라고 합니다.

Web Server vs. WAS

WAS는 application 코드를 실행하는 데에 더 특화되어 있습니다. 그래서 모든 요청을 WAS가 처리하게 되면 서버 과부하가 발생하기 쉽고, 서버에 장애가 발생 시 아무런 화면도 표시할 수 없습니다.
따라서 보통 웹 서버와 WAS를 같이 사용합니다. 정적 리소스는 웹 서버가 처리하고 application 로직이 필요한 경우에만 WAS로 전달을 하는 방식으로 사용합니다.

Servlet

Servlet(서블릿)은 HTTP 프로토콜 기반의 요청과 응답을 처리하는 Java의 기술입니다.
HttpServlet 클래스를 상속받아서 구현을 합니다.

동작 순서

  1. 클라이언트가 HTTP 요청을 보냅니다.
  2. WAS가 HTTP 요청 메세지를 기반으로 하여 요청, 응답 객체를 생성합니다.
  3. WAS가 Servlet Container에 객체를 넘겨주고 해당 Servlet을 호출합니다.
  4. Servlet에서 비즈니스 로직을 처리하고, 응답 정보를 응답 객체에 입력합니다.
  5. WAS는 응답 객체를 바탕으로 해서 HTTP 응답 메세지를 생성해 클라이언트에 전달합니다.

Servlet Container

WAS 내부에 존재하며, 서블릿의 초기화, 생성, 관리, 호출, 종료를 담당합니다. 코드를 짜는 사람이 직접 인스턴스를 생성하지 않아도 컨테이너가 싱글톤으로 관리합니다.
동시 요청 처리를 위해서 Multi Thread도 지원합니다.

Thread Pool

WAS는 동시 요청을 처리하기 위해서 Thread Pool을 사용합니다.

  • 요청이 들어올 때마다 새로운 쓰레드를 생성하는 대신에 미리 생성된 쓰레드를 재사용합니다.
  • Thread Pool의 최대 쓰레드 수를 정해두어서 리소스 사용을 보다 효율적으로 관리합니다.

멀티 쓰레드 환경에서는 싱글톤 사용시 공유 자원 문제(데이터 변경에서의 문제 등)가 발생할 수 있습니다.

SSR(Server Side Rendering)

서버에서 동적으로 HTML을 생성하여 클라이언트에 제공하는 방식입니다. Java에서는 JSP, Thymeleaf등이 대표적으로 사용됩니다.

  • 장점: 초기 페이지 로딩이 빠르고, SEO에 유리합니다.
  • 단점: 모든 요청마다 서버가 페이지를 랜더링해야 합니다. 이로 인해 트래픽이 많을 때에는 서버 부하가 클 수 있습니다.

SEO(Search Engine Optimization)란?

검색 엔진에서 웹사이트가 상위에 노출될 수 있도록 최적화하는 과정입니다.

CSR(Client Side Rendering)

웹 브라우저에서 자바 스크립트로 동적으로 HTML을 생성하는 방식입니다. 대표적인 도구로는 React, Vue 등이 있습니다.

  • 장점: 반응이 빠르고, 페이지 전환도 빠릅니다.
  • 단점: 초기 로딩시 자바스크립트 파일을 다운로드 해야 하므로 첫 로딩이 느릴 수 있습니다. SEO에 불리할 수도 있습니다.

자료 및 코드 출처: 스파르타 코딩클럽

0개의 댓글