
자바 웹 개발에서 서블릿(Servlet)은 클라이언트(브라우저)의 요청을 받아 처리하고, 그 결과를 응답하는 핵심 컨트롤러 역할을 합니다.
이때 반드시 등장하는 두 객체가 바로 HttpServletRequest와 HttpServletResponse입니다.
HttpServletRequest와 HttpServletResponse 객체는 개발자가 직접 new 해서 만들지 않습니다.
이 객체들은 WAS(Web Application Server) 가 클라이언트의 요청을 받을 때 자동으로 생성합니다.
[클라이언트 요청]
↓
[WAS가 요청 수신]
↓
[요청 처리용 스레드 생성 또는 할당]
↓
[HttpServletRequest / HttpServletResponse 객체 생성]
↓
[서블릿의 service(req, resp) 호출]
WAS(예: Tomcat)는 클라이언트의 요청을 수신하면 다음과 같은 순서로 동작합니다.
클라이언트(브라우저)가 서버로 보낸 HTTP 요청 정보를 담고 있는 객체입니다.
서블릿이 클라이언트의 요청을 분석하고 처리하는 데 필요한 모든 정보를 이 객체를 통해 얻습니다.
(WAS가 서블릿 실행 시 자동으로 만들어서 전달해줍니다.)
| 기능 | 설명 | 예시 코드 |
|---|---|---|
| 요청 파라미터 조회 | 폼 데이터, 쿼리스트링 등 값 읽기 | request.getParameter("name"); |
| 요청 파라미터 전체 조회 | 모든 파라미터를 Map 형식으로 반환 | request.getParameterMap(); |
| 요청 파라미터 여러 값 | 체크박스 등 같은 이름 여러 값 받기 | request.getParameterValues("hobby"); |
| HTTP 메서드 확인 | GET/POST 등 요청 방식 구분 | request.getMethod(); |
| URL/URI 정보 | 요청 경로, 쿼리스트링 등 분석 | request.getRequestURI(); |
| 헤더 정보 | 브라우저, 쿠키, 인증 등 헤더값 조회 | request.getHeader("User-Agent"); |
| 헤더 전체 반복 조회 | 모든 헤더 이름 반복 처리 | request.getHeaderNames(); |
| 요청 바디 읽기 | POST/PUT 등 Body 데이터 직접 읽기 | request.getReader(); |
| 쿠키 정보 | 클라이언트가 보낸 쿠키 목록 | request.getCookies(); |
| 파일 업로드 | multipart 요청에서 업로드 파일 처리 | request.getPart("img"); |
| 클라이언트 정보 | IP 주소, 포트 번호 등 | request.getRemoteAddr(); |
| 서버 정보 | 서버 호스트명, 포트 등 | request.getServerName(); |
| 컨텍스트 경로 | 웹 애플리케이션의 루트 경로 | request.getContextPath(); |
| 속성(Attribute) 저장 | 서버 내부에서 JSP 등으로 데이터 전달 | request.setAttribute("key", obj); |
| 세션(Session) 접근 | 로그인 등 사용자 상태 관리 | request.getSession(); |
| 포워드(Forward) | 내부 리소스로 요청 전달 | request.getRequestDispatcher(...).forward(...); |
Tip
- 요청 파라미터는 GET, POST 모두 동일하게
getParameter()로 읽습니다.setAttribute()/getAttribute()는 서버 내부 데이터 전달(예: JSP forward) 용도입니다.- 세션은 로그인, 장바구니 등 사용자별 데이터 저장에 활용합니다.
getParameter()는 클라이언트가 보낸 값,getAttribute()는 서버 내부에서 전달한 값입니다.forward()는 서버 내부 이동,sendRedirect()는 클라이언트에게 새로운 요청을 보내도록 지시합니다.
서버가 클라이언트에게 보낼 HTTP 응답 정보를 담고 있는 객체입니다.
응답의 형태(HTML, JSON, 파일 등), 상태 코드, 헤더, 본문 등을 이 객체로 제어합니다.
(WAS가 서블릿 실행 시 자동으로 만들어서 전달해줍니다.)
| 기능 | 설명 | 예시 코드 |
|---|---|---|
| 응답 Content-Type 지정 | 브라우저가 해석할 MIME 타입 설정 | response.setContentType("text/html; charset=UTF-8"); |
| 직접 응답 출력 | HTML, JSON 등 응답 본문 직접 작성 | response.getWriter().println("<h1>Hello</h1>"); |
| 상태 코드 지정 | 200, 404, 500 등 HTTP 응답 상태 지정 | response.setStatus(HttpServletResponse.SC_NOT_FOUND); |
| 헤더 추가/수정 | 쿠키, 캐시 제어, 파일 다운로드 등 다양한 헤더 설정 | response.setHeader("Cache-Control", "no-store"); |
| 리다이렉트 | 클라이언트에게 다른 URL로 이동 지시 | response.sendRedirect("/login.jsp"); |
| 에러 응답 | 오류 상태 코드 및 메시지를 함께 전송 | response.sendError(403, "Access Denied"); |
| 쿠키 추가 | 클라이언트에 쿠키를 생성해 응답에 포함 | response.addCookie(new Cookie("id", "user123")); |
| 파일 다운로드 설정 | 첨부파일처럼 응답 헤더 설정 후 파일 데이터 전송 | response.setHeader("Content-Disposition", "attachment; filename=\"a.pdf\""); |
| 버퍼 초기화 | 출력 버퍼 비우기 (포워드 전에 출력이 있으면 예외 방지용) | response.resetBuffer(); |
| 콘텐츠 유형 | Content-Type 값 |
|---|---|
| HTML | text/html; charset=UTF-8 |
| JSON | application/json; charset=UTF-8 |
| 파일 다운로드 | application/octet-stream |
| 이미지 (PNG) | image/png |
HttpServletResponse는 브라우저로 돌려보낼 응답을 제어하는 객체입니다.
상태 코드, 헤더, 콘텐츠 타입, 본문 출력 등 모든 HTTP 응답 제어는 이 객체가 담당합니다.
클라이언트 → 요청 → WAS → request → 서블릿 → 내부 처리 → response → WAS → 응답 → 클라이언트
HttpServletRequest(요청정보)와 HttpServletResponse(빈 응답객체)를 만들어 서블릿에 전달합니다.request는 JSP로 데이터를 전달할 때 사용
Product product = service.find("p01");
request.setAttribute("p", product); // JSP에서 ${p.name} 으로 접근 가능
request.getRequestDispatcher("productInfo.jsp").forward(request, response);
setAttribute()로 데이터를 JSP에 넘기면, forward 방식에서는 같은 request 객체가 JSP로 전달되기 때문에 EL(Expression Language) 등으로 바로 사용할 수 있습니다.response는 JSP에서 자동 처리됨
response.getWriter()를 호출할 필요가 없습니다.즉, 서블릿이 JSP로 request와 response를 전달하면, request는 데이터 전달용으로, response는 JSP가 자동으로 응답을 작성하는 데 사용됩니다.
서버 내부에서 데이터(속성)를 주고받을 때는 HttpServletRequest 객체를 사용합니다.
| 구분 | HttpServletRequest | HttpServletResponse |
|---|---|---|
| 역할 | 클라이언트 → 서버로 정보 전달 | 서버 → 클라이언트로 응답 전송 |
| 주 사용처 | 요청 정보 분석, JSP 데이터 전달 | 직접 응답 출력, 리다이렉션, API 응답 |
| JSP와 함께 사용 | setAttribute로 데이터 전달 | 대부분 자동 처리됨 |