
HTTP(HyperText Transfer Protocol)는 클라이언트와 서버 간에 하이퍼미디어(HTML, JSON 등)를 주고 받기 위한 비연결성, 무상태성 통신 규약이다. 요청과 응답 구조로 동작하며 메서드와 상태 코드로 의미를 전달한다. 현대에서는 TCP/IP와 함께 웹 브라우징, API 통신 등 다양한 네트워크 서비스에 활용되고 있다.
요청(Request): 클라이언트가 서버에 자원을 요청하는 메시지로 시작 라인(메서드, 경로, HTTP 버전), 헤더(요청 정보), 선택적 본문(전송 데이터)으로 구성
응답(Response): 서버가 클라이언트 요청에 대한 처리 결과를 반환하는 메시지로 상태 라인(HTTP 버전, 상태 코드, 설명), 헤더(응답 정보), 본문(자원 데이터)으로 구성
HTTP 상태코드는 서버가 클라이언트 요청을 처리한 결과를 숫자와 메시지로 표현하는 코드이다.
1xx~5xx까지 구분되며, 정보·성공·리다이렉션·클라이언트 오류·서버 오류 상태를 나타낸다.
요청을 받았으며, 처리를 계속 진행 중이라는 의미입니다.
| 상태 코드 | 의미 | 설명 |
|---|---|---|
| 100 | Continue | 클라이언트는 요청을 계속해도 됨 |
| 101 | Switching Protocols | 프로토콜 전환 승인 |
| 102 | Processing (WebDAV) | 요청 처리 중 (비동기 작업 등) |
| 103 | Early Hints | 응답 본문 전에 헤더 미리 전달 |
요청이 정상적으로 처리되었음을 나타냅니다.
| 상태 코드 | 의미 | 설명 |
|---|---|---|
| 200 | OK | 요청 성공 |
| 201 | Created | 리소스 생성 성공 (POST 등) |
| 202 | Accepted | 요청 수락, 처리 중 |
| 203 | Non-Authoritative Information | 원 서버가 아닌 다른 소스에서 가져옴 |
| 204 | No Content | 응답 본문 없음 (삭제 등) |
| 205 | Reset Content | 클라이언트에서 입력 폼 초기화 필요 |
| 206 | Partial Content | 부분 응답 (Range 요청 시) |
| 207 | Multi-Status (WebDAV) | 복수 상태 코드 포함 |
| 208 | Already Reported (WebDAV) | 이미 처리된 항목 반복 방지 |
| 226 | IM Used | 서버가 인스턴트 메시지 적용해 응답 |
클라이언트가 요청을 완료하려면 추가 동작이 필요함.
| 상태 코드 | 의미 | 설명 |
|---|---|---|
| 300 | Multiple Choices | 복수 응답 중 선택 필요 |
| 301 | Moved Permanently | 리소스가 영구적으로 이동됨 |
| 302 | Found (Moved Temporarily) | 일시적 이동 |
| 303 | See Other | 다른 URI 참조 필요 (POST → GET 전환 등) |
| 304 | Not Modified | 캐시 사용 가능 |
| 305 | Use Proxy | 프록시 사용 필요 (비표준) |
| 307 | Temporary Redirect | 요청을 임시적으로 다른 URI로 전달 |
| 308 | Permanent Redirect | 요청을 영구적으로 다른 URI로 전달 |
클라이언트의 잘못된 요청
| 상태 코드 | 의미 | 설명 |
|---|---|---|
| 400 | Bad Request | 잘못된 요청 형식 |
| 401 | Unauthorized | 인증 필요 |
| 402 | Payment Required | (거의 사용되지 않음) |
| 403 | Forbidden | 접근 금지 (권한 부족) |
| 404 | Not Found | 리소스 없음 |
| 405 | Method Not Allowed | 허용되지 않은 HTTP 메서드 |
| 406 | Not Acceptable | 허용되지 않는 응답 형식 |
| 407 | Proxy Authentication Required | 프록시 인증 필요 |
| 408 | Request Timeout | 요청 시간 초과 |
| 409 | Conflict | 리소스 충돌 (예: 중복 등록 등) |
| 410 | Gone | 리소스가 사라짐 |
| 411 | Length Required | Content-Length 헤더 필요 |
| 412 | Precondition Failed | 조건 불일치 |
| 413 | Payload Too Large | 요청 본문이 너무 큼 |
| 414 | URI Too Long | 요청 URI가 너무 김 |
| 415 | Unsupported Media Type | 지원하지 않는 콘텐츠 타입 |
| 416 | Range Not Satisfiable | 요청 범위 오류 |
| 417 | Expectation Failed | Expect 헤더 기대 불일치 |
| 418 | I'm a teapot | 만우절용 농담 상태 코드 (RFC 2324) |
| 422 | Unprocessable Entity | 유효하지 않은 요청 본문 (주로 Validation) |
| 425 | Too Early | 처리하기 이름 |
| 426 | Upgrade Required | 다른 프로토콜로 업그레이드 필요 |
| 429 | Too Many Requests | 요청이 너무 많음 (Rate Limit 초과) |
| 431 | Request Header Fields Too Large | 헤더 필드 너무 큼 |
서버 내부의 문제로 인해 요청 처리 실패
| 상태 코드 | 의미 | 설명 |
|---|---|---|
| 500 | Internal Server Error | 서버 내부 오류 |
| 501 | Not Implemented | 기능 구현되지 않음 |
| 502 | Bad Gateway | 게이트웨이/프록시 오류 |
| 503 | Service Unavailable | 일시적 서비스 불가 (서버 과부하, 유지보수) |
| 504 | Gateway Timeout | 게이트웨이 응답 시간 초과 |
| 505 | HTTP Version Not Supported | 지원하지 않는 HTTP 버전 |
| 507 | Insufficient Storage (WebDAV) | 저장 공간 부족 |
| 511 | Network Authentication Required | 네트워크 인증 필요 |
Content-Type: 서버가 응답 본문(Body)의 데이터 형식을 클라이언트에 알리기 위해 사용
Accept: 클라이언트가 서버에 원하는 응답 데이터 형식을 지정할 때 사용
MIME Type: 전송되는 데이터의 형식을 식별하기 위한 표준 규격 문자열 (Content-Type에 들어갈 type)
MIME: Multipurpose Internet Mail Extensions Type
| 구분 | MIME Type | 설명 |
|---|---|---|
| HTML | text/html | 일반 웹 페이지 HTML 문서 |
| Plain Text | text/plain | 단순 텍스트 데이터 |
| JSON | application/json | JSON 데이터 |
| XML | application/xml | XML 데이터 |
| Form 데이터 | application/x-www-form-urlencoded | HTML 폼 전송 기본 방식 |
| Multipart | multipart/form-data | 파일 업로드 포함 폼 데이터 |
| 이미지 | image/png, image/jpeg, image/gif | 이미지 데이터 (PNG/JPEG/GIF) |
| 파일 다운로드 | application/octet-stream | 일반 바이너리 데이터 (다운로드) |
| application/pdf | PDF 문서 | |
| 자바스크립트 | application/javascript | 자바스크립트 파일 |
| CSS | text/css | 스타일시트 파일 |
Server + Applet의 합성어로 Dynamic Web Page개발을 위한 자바 기반 최초의 Web 어플리케이션 프레임워크이다.
Client의 요청(Request)을 받고 요청에 따른 응답(Response)을 HTML로 동적으로 작성할 수 있는 Servlet Class를 사용자가 상속 받아 메서드 재정의 통해 체계적으로 처리가 가능하도록 프로그래밍이 가능하다.
→ Spring은 Servlet 기반으로 만들어진 프레임워크로 서블릿의 기능을 확장·추상화 하여 더 편리하게 웹 애플리케이션을 개발할 수 있도록 만든 프레임워크이다.

init() 서블릿이 최초 요청 시 한 번만 실행되는 초기화 메서드 (DB 연결, 리소스 로딩 등 초기 작업 수행)service() 클라이언트 요청마다 호출되며 요청 방식에 따라 doGet(), doPost() 등을 실행doGet() 클라이언트의 GET 요청 처리doPost() 클라이언트의 POST 요청 처리destroy() 서블릿이 컨테이너에서 내려갈 때 한 번 실행되며 사용한 자원 해제 및 정리Spring Boot는 Tomcat을 기반한 서블릿 컨테이너를 내장하여 별도의 설치 없이 실행할 수 있다.
일반적인 Web의 요청과 응답에 대한 기본 처리는 서블릿 컨테이너가 수행하고, 사용자의 비즈니스 영역은 Spring에서 구현되어 사용자가 정의한 비즈니스 로직을 수행할 수 있는 구조로 구성되어 있다.
Spring MVC의 핵심 컴포넌트로는 요청을 받아 흐름을 제어하는 DispatcherServlet, 핸들러 매핑·호출을 담당하는 HandlerMapping과 HandlerAdapter, 응답 생성을 담당하는 ViewResolver와 HttpMessageConverter 등이 있다.
이러한 컴포넌트들의 상호 작용을 통해 클라이언트 요청을 컨트롤러 로직과 연결하고, 처리 결과를 적절한 형태로 변환해 응답이 가능하다.

DispatcherServlet은 Spring MVC의 프론트 컨트롤러로, 모든 클라이언트 요청을 받아 처리 흐름을 제어한다. 해당 객체는 순수 Servlet으로 구성되어 있으며, Spring MVC에서 유일하게 서블릿 컨테이너에 직접 등록되는 서블릿이다. 요청을 적절한 컨트롤러(핸들러)에 위임하고, 처리 결과를 받아 ViewResolver 또는 HttpMessageConverter를 통해 HTML 또는 JSON 등으로 변환해 응답한다.
| 구성 요소 | 역할 | 설명 |
|---|---|---|
| DispatcherServlet (Front Controller) | 요청· 응답 제어 | 클라이언트의 요청(Request)을 전달 받고 요청에 맞는 컨트롤러를 호출하고, 리턴 한 결과 값을 통해 알맞은 응답(Response) 생성하는 객체 |
| HandlerMapping | 요청 처리 | 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할 지 결정 |
| HandlerAdapter | 요청 처리 | 매핑된 핸들러를 실행할 수 있도록 호출을 추상화 |
| Controller | 요청 처리 | 클라이언트의 요청을 처리한 뒤 결과를 DispatcherServlet에게 리턴 |
| ModelAndView | 요청 처리 | 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담음 |
| ViewResolver | 응답 처리 | 뷰 이름으로부터 실제 뷰(JSP, Thymeleaf 등)를 찾아 렌더링 |
| View | 응답 처리 | 컨트롤러의 처리 결과 화면 생성, JSP나 Thymeleaf 템플릿 파일 등을 View로 사용 |
| HttpMessageConverter | 응답 처리 | 객체를 JSON, XML 등 HTTP 메시지로 변환하여 응답 처리 (RestController의 경우 ViewResolver, View를 대체함) |

요청 접수부터 응답 생성까지의 과정 상세 설명
spring-boot-starter-web은 Spring Boot에서 웹 애플리케이션 개발을 위한 기본 스타터 패키지이다.
Spring MVC, 내장 톰캣, Jackson 등 웹 개발에 필요한 주요 라이브러리를 통합 제공한다.
DispatcherServlet, ViewResolver, HttpMessageConverter 등의 핵심 컴포넌트를 자동 설정하여 빠른 웹 개발을 지원한다.
자동 설정 컴포넌트
정적 리소스 설정은 CSS, JS, 이미지, HTML 등 서버에서 가공 없이 그대로 제공되는 파일 경로를 지정하는 기능이다.
Spring Boot는 기본적으로 /static, /public, /resources, /META-INF/resources 경로를 정적 리소스 위치로 인식한다.
필요 시 WebMvcConfigurer의 addResourceHandlers()를 사용하여 커스텀 경로나 외부 디렉토리를 추가할 수 있다.