2025. 2. 24. 06:18ㆍ코딩 도구/백엔드 개발 (Backend Development)
서블릿과 HTTP 요청/응답의 핵심 개념
이 글에서는 인프런 김영한님의 "스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술"을 수강하고 정리했습니다.
1. 서블릿 컨테이너의 동작 방식
서블릿 컨테이너(Servlet Container)는 웹 애플리케이션을 실행하고 클라이언트 요청을 처리하는 중요한 구성 요소이다. 대표적인 서블릿 컨테이너로는 Tomcat, Jetty, WildFly 등이 있다.
서블릿 컨테이너의 주요 역할
- HTTP 요청 처리 및 서블릿 객체 관리
- 클라이언트로부터 HTTP 요청을 받으면, 해당 요청에 적절한 서블릿을 찾아 실행한다.
- 서블릿 객체는 컨테이너가 직접 생성하고 관리한다.
- 서블릿 생명주기 관리
- 서블릿 객체는 한 번만 생성되며, 이후 요청마다 service() 메서드가 실행된다.
- 컨테이너가 필요하지 않다고 판단하면 서블릿 객체를 제거한다.
- 멀티스레드 처리
- 하나의 서블릿 객체가 여러 클라이언트 요청을 동시에 처리할 수 있도록 멀티스레딩을 지원한다.
- 요청이 올 때마다 새로운 스레드가 생성되고, 동일한 서블릿 객체의 service() 메서드가 실행된다.
- 세션 및 쿠키 관리
- 클라이언트의 세션을 관리하여 사용자의 지속적인 정보를 유지할 수 있도록 지원한다.
- 필터와 리스너 지원
- 요청과 응답을 가로채어 처리할 수 있는 필터(Filter)와 특정 이벤트를 감지하는 리스너(Listener)를 지원한다.
서블릿 컨테이너의 동작 과정
- 클라이언트가 웹 서버로 HTTP 요청을 보낸다.
- 웹 서버는 해당 요청을 서블릿 컨테이너로 전달한다.
- 서블릿 컨테이너는 요청 URL을 분석하여 해당하는 서블릿을 찾는다.
- 서블릿이 존재하면, service() 메서드를 호출하여 요청을 처리한다.
- 응답을 생성하여 웹 서버를 통해 클라이언트에게 반환한다.
- 요청 처리가 완료되면, 서블릿 컨테이너는 필요에 따라 서블릿 객체를 재사용하거나 제거한다.
2. HttpServletRequest와 HttpServletResponse
2.1 HttpServletRequest 역할
HttpServletRequest는 클라이언트가 보낸 HTTP 요청 메시지를 파싱하여 개발자가 쉽게 활용할 수 있도록 지원하는 객체이다.
- 요청 정보 조회: 요청 URL, 헤더, 파라미터 등을 조회할 수 있다.
- 요청 본문(body) 읽기: JSON, XML, HTML Form 데이터 등을 읽을 수 있다.
- 세션 및 쿠키 관리: 클라이언트와의 지속적인 데이터를 유지할 수 있다.
HTTP 요청 메시지 예시
POST /save HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
username=kim&age=20
주요 메서드
String method = request.getMethod(); // 요청 메서드 (GET, POST 등)
String requestURI = request.getRequestURI(); // 요청 URI
String queryString = request.getQueryString(); // 쿼리 스트링
String header = request.getHeader("User-Agent"); // 헤더 값 조회
String username = request.getParameter("username"); // 파라미터 값 조회
HttpServletRequest 사용 시 주의점
HttpServletRequest 객체를 올바르게 활용하려면 HTTP 요청 메시지의 구조를 이해하는 것이 중요하다. 특히, 요청 데이터의 전송 방식(쿼리 파라미터, 바디 데이터 등)에 따라 데이터를 읽는 방법이 다르므로 주의해야 한다.
3. HTTP 요청 데이터 전송 방식
클라이언트에서 서버로 데이터를 전달하는 방식에는 크게 3가지가 있다.
3.1 GET - 쿼리 파라미터(Query Parameter)
- 요청 메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함하여 전달한다.
- 검색, 필터링, 페이징 등의 기능에서 많이 사용된다.
- 예시:
GET /search?keyword=java&page=2 HTTP/1.1
3.2 POST - HTML Form
- application/x-www-form-urlencoded 형식으로 요청 본문(body)에 데이터를 포함하여 전송한다.
- 회원 가입, 상품 주문 등에서 많이 사용된다.
- 예시:
POST /register HTTP/1.1
Content-Type: application/x-www-form-urlencoded
username=kim&password=1234
3.3 HTTP API - 메시지 바디 전송
- JSON, XML, TEXT 등 다양한 데이터 형식을 사용하여 본문에 데이터를 포함한다.
- Content-Type을 지정하여 데이터 형식을 명시해야 한다.
- 주로 REST API에서 활용된다.
- 예시:
POST /api/users HTTP/1.1
Content-Type: application/json
{"username": "kim", "age": 20}
JSON 데이터를 읽는 코드 예시
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
ObjectMapper objectMapper = new ObjectMapper();
UserData userData = objectMapper.readValue(messageBody, UserData.class);
4. HttpServletResponse - 응답 처리
HttpServletResponse 객체는 서버에서 생성한 HTTP 응답을 클라이언트에게 전달하는 역할을 한다.
주요 기능
응답 상태 코드 설정
response.setStatus(HttpServletResponse.SC_OK); // 200 OK response.setStatus(HttpServletResponse.SC_NOT_FOUND); // 404 Not Found
응답 헤더 설정
response.setHeader("Content-Type", "text/html;charset=UTF-8"); response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
응답 본문(body) 출력
PrintWriter writer = response.getWriter(); writer.println("<html><body><h1>Hello, World!</h1></body></html>");
JSON 응답 반환
response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); ObjectMapper objectMapper = new ObjectMapper(); String jsonResponse = objectMapper.writeValueAsString(userData); response.getWriter().write(jsonResponse);
5. 정리
- 서블릿 컨테이너는 서블릿 객체를 관리하고 HTTP 요청을 처리한다.
- HttpServletRequest를 사용하여 HTTP 요청 데이터를 읽을 수 있으며, 데이터 전송 방식(GET, POST, JSON)을 이해해야 한다.
- HttpServletResponse를 사용하여 HTTP 응답을 생성할 수 있으며, 상태 코드, 헤더, 본문을 적절히 설정해야 한다.
'코딩 도구 > 백엔드 개발 (Backend Development)' 카테고리의 다른 글
MVC 패턴: 서블릿과 JSP의 한계를 넘어 (1) | 2025.03.01 |
---|---|
웹 서버와 웹 애플리케이션 서버(WAS) (0) | 2025.02.28 |
[Spring] 빈 스코프 (0) | 2025.02.21 |
[Spring] 빈 생명주기 콜백 (0) | 2025.02.19 |
[Spring] 의존관계 자동 주입 (0) | 2025.02.18 |