[Servlet] HttpServletRequest와 HttpServletResponse

artp·2025년 5월 13일
0

web

목록 보기
3/9
post-thumbnail

자바 웹 개발에서 서블릿(Servlet)은 클라이언트(브라우저)의 요청을 받아 처리하고, 그 결과를 응답하는 핵심 컨트롤러 역할을 합니다.
이때 반드시 등장하는 두 객체가 바로 HttpServletRequestHttpServletResponse입니다.

HttpServletRequest와 HttpServletResponse 객체는 누가 언제 만들까?

HttpServletRequest와 HttpServletResponse 객체는 개발자가 직접 new 해서 만들지 않습니다.
이 객체들은 WAS(Web Application Server) 가 클라이언트의 요청을 받을 때 자동으로 생성합니다.

흐름 요약

[클라이언트 요청]
       ↓
[WAS가 요청 수신]
       ↓
[요청 처리용 스레드 생성 또는 할당]
       ↓
[HttpServletRequest / HttpServletResponse 객체 생성]
       ↓
[서블릿의 service(req, resp) 호출]

WAS(예: Tomcat)는 클라이언트의 요청을 수신하면 다음과 같은 순서로 동작합니다.

  1. 요청 수신
    • 클라이언트의 요청이 WAS로 도착하면, 내부적으로 커넥터가 이를 가로챕니다.
  2. 스레드 생성 또는 스레드풀에서 할당
    • 요청 하나당 하나의 스레드를 할당하여 처리합니다.
    • 이 스레드는 해당 요청 전용으로 작동하며, 동시에 여러 사용자의 요청을 병렬로 처리할 수 있게 해줍니다.
  3. 해당 스레드 내부에서 request/response 객체 생성
    • HttpServletRequest와 HttpServletResponse 객체는 이 스레드 내부에서 생성됩니다.
    • 요청에 담긴 URL, 파라미터, 헤더 등의 정보를 담고 있으며, 이 객체는 스레드마다 고유하게 존재합니다.
  4. 서블릿의 service() 호출
    • WAS는 서블릿 컨테이너를 통해 요청에 매핑된 서블릿을 찾고, 위에서 생성한 req, resp 객체를 넘겨 service() 메서드를 호출합니다.

HttpServletRequest란?

클라이언트(브라우저)가 서버로 보낸 HTTP 요청 정보를 담고 있는 객체입니다.
서블릿이 클라이언트의 요청을 분석하고 처리하는 데 필요한 모든 정보를 이 객체를 통해 얻습니다.
(WAS가 서블릿 실행 시 자동으로 만들어서 전달해줍니다.)

HttpServletRequest 주요 기능 정리

기능설명예시 코드
요청 파라미터 조회폼 데이터, 쿼리스트링 등 값 읽기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()는 클라이언트에게 새로운 요청을 보내도록 지시합니다.

HttpServletResponse란?

서버가 클라이언트에게 보낼 HTTP 응답 정보를 담고 있는 객체입니다.
응답의 형태(HTML, JSON, 파일 등), 상태 코드, 헤더, 본문 등을 이 객체로 제어합니다.
(WAS가 서블릿 실행 시 자동으로 만들어서 전달해줍니다.)

HttpServletResponse 주요 기능 정리

기능설명예시 코드
응답 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

콘텐츠 유형Content-Type 값
HTMLtext/html; charset=UTF-8
JSONapplication/json; charset=UTF-8
파일 다운로드application/octet-stream
이미지 (PNG)image/png

HttpServletResponse는 브라우저로 돌려보낼 응답을 제어하는 객체입니다.
상태 코드, 헤더, 콘텐츠 타입, 본문 출력 등 모든 HTTP 응답 제어는 이 객체가 담당합니다.

request와 response의 관계

클라이언트 → 요청 → WAS → request → 서블릿 → 내부 처리 → response → WAS → 응답 → 클라이언트

  • WAS(톰캣 등)가 요청이 들어올 때마다 HttpServletRequest(요청정보)와 HttpServletResponse(빈 응답객체)를 만들어 서블릿에 전달합니다.
  • 서블릿은 request에서 정보를 읽고, response에 응답을 작성합니다.

JSP와 함께 쓸 때의 주의사항

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에서 자동 처리됨

  • JSP는 HTML 출력을 response에 자동으로 기록합니다.
  • 개발자가 직접 response.getWriter()를 호출할 필요가 없습니다.
  • 서블릿이 JSP로 response를 전달하고, JSP는 그 객체를 사용해 최종 응답을 구성합니다.
  • 단, 파일 다운로드, JSON 응답, AJAX 응답 등 JSP를 사용하지 않는 경우에는 개발자가 response를 직접 제어해야 합니다.

즉, 서블릿이 JSP로 request와 response를 전달하면, request는 데이터 전달용으로, response는 JSP가 자동으로 응답을 작성하는 데 사용됩니다.

질문

Q1. 데이터를 JSP에 넘겨줄 땐 request? response?

  • request입니다.
  • response는 클라이언트에게 직접 응답을 줄 때 사용하고, JSP는 서버 내부에서 실행되므로 request를 통해 데이터를 주고받습니다.

    서버 내부에서 데이터(속성)를 주고받을 때는 HttpServletRequest 객체를 사용합니다.

Q2. response는 언제 직접 다루는지?

  • REST API 응답(JSON)
  • 파일 다운로드
  • 이미지/바이너리 응답
  • 클라이언트 리다이렉션(sendRedirect)
  • 오류 응답(sendError)

정리

구분HttpServletRequestHttpServletResponse
역할클라이언트 → 서버로 정보 전달서버 → 클라이언트로 응답 전송
주 사용처요청 정보 분석, JSP 데이터 전달직접 응답 출력, 리다이렉션, API 응답
JSP와 함께 사용setAttribute로 데이터 전달대부분 자동 처리됨
  • request는 서버 내부에서 데이터 전달(특히 JSP forward)용으로 사용합니다.
  • response는 최종 결과를 클라이언트에게 전송하는 용도입니다.
  • JSP 사용 시 대부분 request만 직접 다루면 되고, response는 자동 처리됩니다.
  • 단, REST API, 파일 다운로드, 리다이렉트 등에서는 response를 직접 제어하는 상황이 많으니 주의해야 합니다.
  • request와 response는 WAS가 요청마다 새로 만들어 전달하며, 하나의 요청/응답이 끝나면 소멸됩니다.
profile
donggyun_ee

0개의 댓글