[강의] Spring MVC

Jerry·2025년 8월 7일
post-thumbnail

웹 애플리케이션의 기초

HTTP 프로토콜 기초

HTTP(HyperText Transfer Protocol)는 클라이언트와 서버 간에 하이퍼미디어(HTML, JSON 등)를 주고 받기 위한 비연결성, 무상태성 통신 규약이다. 요청과 응답 구조로 동작하며 메서드와 상태 코드로 의미를 전달한다. 현대에서는 TCP/IP와 함께 웹 브라우징, API 통신 등 다양한 네트워크 서비스에 활용되고 있다.

요청과 응답의 구조

요청(Request): 클라이언트가 서버에 자원을 요청하는 메시지로 시작 라인(메서드, 경로, HTTP 버전), 헤더(요청 정보), 선택적 본문(전송 데이터)으로 구성
응답(Response): 서버가 클라이언트 요청에 대한 처리 결과를 반환하는 메시지로 상태 라인(HTTP 버전, 상태 코드, 설명), 헤더(응답 정보), 본문(자원 데이터)으로 구성

요청(Request) 구조 상세

  1. 요청 시작줄 (Request Line)
    • Method : 동작 유형 (GET, POST, PUT, DELETE, PATCH 등)
    • Path : 요청 자원의 경로 (예: /api/users)
    • Query String : ? 뒤의 파라미터 (예: /search?q=chatgpt&lang=ko)
    • Protocol Version : HTTP 버전 (예: HTTP/1.1, HTTP/2)
  2. 요청 헤더 (Request Headers)
    • Host : 요청 대상 서버 도메인 (예: www.google.com)
    • Accept / Accept-Language / Accept-Encoding : 응답 데이터 형식·언어·압축 등 클라이언트 선호
    • User-Agent : 요청 클라이언트 정보(브라우저, 앱, 버전 등)
    • Authorization : 인증 정보 (예: Bearer 토큰)
    • Content-Type : 전송 본문 데이터 형식 (예: application/json, multipart/form-data)
    • Content-Length : 본문 길이 (바이트 단위)
    • Cookie : 세션 및 사용자 데이터
  3. 빈 줄 (Empty Line) : 헤더와 본문을 구분하는 한 줄 공백
  4. 요청 본문 (Request Body)
    • 데이터 페이로드: POST, PUT 요청 시 전달할 데이터 (JSON, XML, Form 데이터 등)

응답(Response) 구조 상세

  1. 상태 줄(Status Line)
    • Protocol version : 응답에 사용된 HTTP 버전 (예: HTTP/1.1)
    • Status code : 서버 처리 결과 코드 (예: 200 - 성공, 404 - 자원 없음, 500 - 서버 오류)
    • Status message : 상태 코드에 대한 텍스트 설명 (예: OK, Forbidden, Not Found)
  2. 응답 헤더(Response Headers)
    • 서버가 응답에 추가 정보를 제공하는 영역
    • Date : 응답이 생성된 시간 (Tue, 18 Jun 2024 10:03:55 GMT)
    • Cache-Control : 캐시 정책 (public, max-age=3600 1시간 캐시 허용)
    • Content-Type : 본문 데이터의 타입 (text/html; charset=UTF-8)
    • Content-Length : 본문 데이터 크기(바이트 단위, 필요 시 포함)
    • Server : 서버 정보 (Apache, Nginx 등, 보안상 생략하기도 함)
  3. 빈 줄 (Empty Line) : 헤더와 본문을 구분하는 공백 줄
  4. 응답 본문(Response Body)
    • 서버가 반환하는 실제 데이터 (HTML, JSON, 이미지 등)

HTTP 상태 코드

HTTP 상태코드는 서버가 클라이언트 요청을 처리한 결과를 숫자와 메시지로 표현하는 코드이다.
1xx~5xx까지 구분되며, 정보·성공·리다이렉션·클라이언트 오류·서버 오류 상태를 나타낸다.

1xx: Informational (정보)

요청을 받았으며, 처리를 계속 진행 중이라는 의미입니다.

상태 코드의미설명
100Continue클라이언트는 요청을 계속해도 됨
101Switching Protocols프로토콜 전환 승인
102Processing (WebDAV)요청 처리 중 (비동기 작업 등)
103Early Hints응답 본문 전에 헤더 미리 전달

2xx: Success (성공)

요청이 정상적으로 처리되었음을 나타냅니다.

상태 코드의미설명
200OK요청 성공
201Created리소스 생성 성공 (POST 등)
202Accepted요청 수락, 처리 중
203Non-Authoritative Information원 서버가 아닌 다른 소스에서 가져옴
204No Content응답 본문 없음 (삭제 등)
205Reset Content클라이언트에서 입력 폼 초기화 필요
206Partial Content부분 응답 (Range 요청 시)
207Multi-Status (WebDAV)복수 상태 코드 포함
208Already Reported (WebDAV)이미 처리된 항목 반복 방지
226IM Used서버가 인스턴트 메시지 적용해 응답

3xx: Redirection (리다이렉션)

클라이언트가 요청을 완료하려면 추가 동작이 필요함.

상태 코드의미설명
300Multiple Choices복수 응답 중 선택 필요
301Moved Permanently리소스가 영구적으로 이동됨
302Found (Moved Temporarily)일시적 이동
303See Other다른 URI 참조 필요 (POST → GET 전환 등)
304Not Modified캐시 사용 가능
305Use Proxy프록시 사용 필요 (비표준)
307Temporary Redirect요청을 임시적으로 다른 URI로 전달
308Permanent Redirect요청을 영구적으로 다른 URI로 전달

4xx: Client Error (클라이언트 오류)

클라이언트의 잘못된 요청

상태 코드의미설명
400Bad Request잘못된 요청 형식
401Unauthorized인증 필요
402Payment Required(거의 사용되지 않음)
403Forbidden접근 금지 (권한 부족)
404Not Found리소스 없음
405Method Not Allowed허용되지 않은 HTTP 메서드
406Not Acceptable허용되지 않는 응답 형식
407Proxy Authentication Required프록시 인증 필요
408Request Timeout요청 시간 초과
409Conflict리소스 충돌 (예: 중복 등록 등)
410Gone리소스가 사라짐
411Length RequiredContent-Length 헤더 필요
412Precondition Failed조건 불일치
413Payload Too Large요청 본문이 너무 큼
414URI Too Long요청 URI가 너무 김
415Unsupported Media Type지원하지 않는 콘텐츠 타입
416Range Not Satisfiable요청 범위 오류
417Expectation FailedExpect 헤더 기대 불일치
418I'm a teapot만우절용 농담 상태 코드 (RFC 2324)
422Unprocessable Entity유효하지 않은 요청 본문 (주로 Validation)
425Too Early처리하기 이름
426Upgrade Required다른 프로토콜로 업그레이드 필요
429Too Many Requests요청이 너무 많음 (Rate Limit 초과)
431Request Header Fields Too Large헤더 필드 너무 큼

5xx: Server Error (서버 오류)

서버 내부의 문제로 인해 요청 처리 실패

상태 코드의미설명
500Internal Server Error서버 내부 오류
501Not Implemented기능 구현되지 않음
502Bad Gateway게이트웨이/프록시 오류
503Service Unavailable일시적 서비스 불가 (서버 과부하, 유지보수)
504Gateway Timeout게이트웨이 응답 시간 초과
505HTTP Version Not Supported지원하지 않는 HTTP 버전
507Insufficient Storage (WebDAV)저장 공간 부족
511Network Authentication Required네트워크 인증 필요

Content-Type과 Accept 헤더의 역할

Content-Type: 서버가 응답 본문(Body)의 데이터 형식을 클라이언트에 알리기 위해 사용
Accept: 클라이언트가 서버에 원하는 응답 데이터 형식을 지정할 때 사용
MIME Type: 전송되는 데이터의 형식을 식별하기 위한 표준 규격 문자열 (Content-Type에 들어갈 type)
MIME: Multipurpose Internet Mail Extensions Type

구분MIME Type설명
HTMLtext/html일반 웹 페이지 HTML 문서
Plain Texttext/plain단순 텍스트 데이터
JSONapplication/jsonJSON 데이터
XMLapplication/xmlXML 데이터
Form 데이터application/x-www-form-urlencodedHTML 폼 전송 기본 방식
Multipartmultipart/form-data파일 업로드 포함 폼 데이터
이미지image/png, image/jpeg, image/gif이미지 데이터 (PNG/JPEG/GIF)
파일 다운로드application/octet-stream일반 바이너리 데이터 (다운로드)
PDFapplication/pdfPDF 문서
자바스크립트application/javascript자바스크립트 파일
CSStext/css스타일시트 파일

Servlet의 이해

서블릿(Servlet) 개념

Server + Applet의 합성어로 Dynamic Web Page개발을 위한 자바 기반 최초의 Web 어플리케이션 프레임워크이다.
Client의 요청(Request)을 받고 요청에 따른 응답(Response)을 HTML로 동적으로 작성할 수 있는 Servlet Class를 사용자가 상속 받아 메서드 재정의 통해 체계적으로 처리가 가능하도록 프로그래밍이 가능하다.
→ Spring은 Servlet 기반으로 만들어진 프레임워크로 서블릿의 기능을 확장·추상화 하여 더 편리하게 웹 애플리케이션을 개발할 수 있도록 만든 프레임워크이다.

서블릿 동작 구조

  1. Request (사용자의 요청)
    • 사용자의 요청으로 브라우저에서 요청한 URL과 브라우저 정보와 추가적인 데이터를 가지고 있는 객체
  2. Servlet Container
    • 사용자의 요청에 따라 동작 할 로직을 정의한 Class로 컨테이너는 의미는 실제 서버에 동작하는 상태
    • Class의 내부에는 doGet, doPost를 요청(URL)에 따라 동작할 서비스를 미리 프로그래밍 한다.
  3. 서블릿 doGet, doPost 호출
    • 요청(URL)에 따라 실제 동작할 Servlet Container를 실제로 호출하는 과정,
    • 요청은 Thread를 통해 멀티 태스킹으로 처리 된다.

서블릿의 생명주기

  1. 객체 생성, 초기화
    • init() 서블릿이 최초 요청 시 한 번만 실행되는 초기화 메서드 (DB 연결, 리소스 로딩 등 초기 작업 수행)
  2. 요청 처리
    • service() 클라이언트 요청마다 호출되며 요청 방식에 따라 doGet(), doPost() 등을 실행
    • doGet() 클라이언트의 GET 요청 처리
    • doPost() 클라이언트의 POST 요청 처리
  3. 종료, 정리
    • destroy() 서블릿이 컨테이너에서 내려갈 때 한 번 실행되며 사용한 자원 해제 및 정리

Spring Boot의 내장 서블릿 컨테이너

Spring Boot는 Tomcat을 기반한 서블릿 컨테이너를 내장하여 별도의 설치 없이 실행할 수 있다.
일반적인 Web의 요청과 응답에 대한 기본 처리는 서블릿 컨테이너가 수행하고, 사용자의 비즈니스 영역은 Spring에서 구현되어 사용자가 정의한 비즈니스 로직을 수행할 수 있는 구조로 구성되어 있다.

MVC 아키텍처의 이해

Spring MVC의 핵심 컴포넌트

Spring MVC의 핵심 컴포넌트로는 요청을 받아 흐름을 제어하는 DispatcherServlet, 핸들러 매핑·호출을 담당하는 HandlerMappingHandlerAdapter, 응답 생성을 담당하는 ViewResolverHttpMessageConverter 등이 있다.
이러한 컴포넌트들의 상호 작용을 통해 클라이언트 요청을 컨트롤러 로직과 연결하고, 처리 결과를 적절한 형태로 변환해 응답이 가능하다.

DispatcherServlet의 개념 (프론트 컨트롤러)

DispatcherServlet은 Spring MVC의 프론트 컨트롤러로, 모든 클라이언트 요청을 받아 처리 흐름을 제어한다. 해당 객체는 순수 Servlet으로 구성되어 있으며, Spring MVC에서 유일하게 서블릿 컨테이너에 직접 등록되는 서블릿이다. 요청을 적절한 컨트롤러(핸들러)에 위임하고, 처리 결과를 받아 ViewResolver 또는 HttpMessageConverter를 통해 HTML 또는 JSON 등으로 변환해 응답한다.

Spring MVC의 핵심 컴포넌트 설명

구성 요소역할설명
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를 대체함)

요청 처리 흐름

요청 접수부터 응답 생성까지의 과정 상세 설명

  1. 클라이언트 요청: 사용자가 HTTP 요청을 전송한다.
  2. DispatcherServlet: 모든 요청을 받아 Front Controller 역할을 수행한다.
  3. HandlerMapping: 요청 URL과 매핑되는 컨트롤러(핸들러)를 조회한다.
  4. HandlerAdapter: 조회된 핸들러를 실행할 수 있는 어댑터를 선택한다.
  5. Controller 실행: 실제 컨트롤러가 비즈니스 로직(Service, Repository 등)과 연동해 처리하고 ModelAndView를 반환한다.
  6. ViewResolver 호출: 반환된 View 이름을 기반으로 적절한 View를 선택한다.
  7. View 반환: View 객체를 반환한다.
  8. 렌더링: View가 Model 데이터를 기반으로 화면을 렌더링해 HTML 응답을 생성한다.

업로드중..

  • HTML/JSP: ViewResolver가 JSP/Thymeleaf 등을 찾아 렌더링 후 View를 통해 HTML 응답 반환
  • JSON/XML(API 응답): ViewResolver 대신 HttpMessageConverter가 동작하여 JSON, XML 등 데이터 응답 반환

Spring Boot MVC 시작하기

spring-boot-starter-web 이해

spring-boot-starter-web은 Spring Boot에서 웹 애플리케이션 개발을 위한 기본 스타터 패키지이다.
Spring MVC, 내장 톰캣, Jackson 등 웹 개발에 필요한 주요 라이브러리를 통합 제공한다.
DispatcherServlet, ViewResolver, HttpMessageConverter 등의 핵심 컴포넌트를 자동 설정하여 빠른 웹 개발을 지원한다.

주요 의존성

  • spring-web, spring-webmvc : Spring MVC 기반 웹 애플리케이션 지원
  • spring-boot-starter-json : Jackson 기반 JSON 직렬화/역직렬화
  • spring-boot-starter-tomcat : 내장 Tomcat 서블릿 컨테이너
  • spring-boot-starter-validation : JSR-380 기반 입력값 검증
  • spring-boot-starter : 로깅 및 기본 설정

자동 설정 컴포넌트

  • DispatcherServlet : 프론트 컨트롤러 자동 등록
  • HandlerMapping, HandlerAdapter : 요청-컨트롤러 매핑 및 실행
  • ViewResolver : 뷰 이름을 뷰 객체로 변환
  • HttpMessageConverter : JSON 등 메시지 변환기 자동 설정

정적 리소스 설정

정적 리소스 설정은 CSS, JS, 이미지, HTML 등 서버에서 가공 없이 그대로 제공되는 파일 경로를 지정하는 기능이다.
Spring Boot는 기본적으로 /static, /public, /resources, /META-INF/resources 경로를 정적 리소스 위치로 인식한다.
필요 시 WebMvcConfigurer의 addResourceHandlers()를 사용하여 커스텀 경로나 외부 디렉토리를 추가할 수 있다.

profile
Backend engineer

0개의 댓글