[Servlet] 04-1 | HttpServletRequest, HttpServletResponse
이번 글에서는 서블릿의 핵심 객체인 HttpServletRequest와 HttpServletResponse 객체를 알아보겠습니다.
- HttpServletRequest 객체는 브라우저가 보낸 HTTP 요청 메시지의 거의 모든 정보가 담기는 객체입니다. 브라우저로부터 요청을 받은 서블릿은 이 객체를 이용하여 사용자가 입력한 정보를 추출합니다.
- HttpServletResponse 객체는 서버가 브라우저에 보낼 HTTP 응답 메시지를 설정할 수 있는 객체입니다. 요청 처리를 완료한 서블릿은 처리 결과를 이 객체에 설정합니다.
서블릿 컨테이너는 서블릿의 service() 메서드를 호출하기 직전에 두 객체를 생성합니다. 생성된 두 객체는 service() 메서드의 파라미터 값으로 전달됩니다.
클라이언트와 서버 간 데이터 통신
그럼 HttpServletRequest와 HttpServletResponse 객체가 어떻게 쓰이는지 간단한 회원 가입 서비스의 동작을 통해 알아보겠습니다.
클라이언트
사용자가 아래와 같은 회원 가입 화면에서 이름, 아이디, 비밀번호, 이메일, 권한 정보를 입력한 후 [회원가입] 버튼을 클릭했다고 해봅시다.
아래의 script에 따라 사용자의 회원 가입 요청이 서버의 서블릿 중 /member/regist.do (form 태그 action 속성의 값)와 매핑된 서블릿으로 전달될 것입니다.
서버
웹 애플리케이션 설정 파일인 web.xml 파일에서 /member/regist.do는 RegistServlet과 매핑해두었습니다. 따라서 이 URL로 들어온 요청은 RegistServlet에서 처리하게 됩니다.
Servlet에서 요청 처리를 담당하는 메서드는 service()입니다. 서블릿 컨테이너는 service() 메서드를 호출하기 직전에 HttpServletRequest 객체와 HttpServletResponse 객체를 자동으로 생성합니다. 이때 생성된 HttpServletRequest 객체에는 HTTP 요청 메시지의 거의 모든 것이 담기게 됩니다.
브라우저가 POST 방식으로 요청을 보냈으므로 service() 메서드는 doPost() 메서드를 호출하여 요청 처리를 맡깁니다. 위 코드를 보면 서버 단에서 HttpServletRequest 객체의 getParameter() 메서드를 사용하여 사용자가 입력한 정보를 추출하는 것을 확인할 수 있습니다.
그럼 HttpServletRequest와 HttpServletResponse의 메서드에는 어떤 것들이 있는지 자세히 살펴보겠습니다.
참고로 HttpServletRequest와 HttpServletResponse는 인터페이스로서 각각 ServletRequest와 ServletResponse라는 인터페이스의 상속을 받습니다. HttpServletRequest와 HttpServletResponse 인터페이스의 경우 자바의 스펙을 관리하는 JCP (Java Community Process)에서 만듭니다.
01. HttpServletRequest
다음은 ServletRequest에서 상속받은 메서드와 HttpServletRequest에서 추가된 메서드입니다.
HttpServletRequest에는 HTTP 요청 메시지에 담겨 있는 요청 방식, 요청 URI, 요청에 사용된 프로토콜, 인코딩 정보, 사용자가 입력한 파라미터 등의 정보가 담겨 있습니다.
위에서 확인한 메서드 외에 다른 메소드들도 있습니다.
- ServletRequest로부터 상속받은 메서드
- getServletContext(): 서버가 구동되는 순간 서버에 등록된 웹 애플리케이션당 하나 생성되는 ServletContext 객체를 반환
- getRequestDispatcher(String path): 브라우저의 요청을 특정 경로로 이동시키기 위한 RequestDispatcher 객체를 반환
- HttpServletRequest
- getCookies(): 브라우저가 전송한 쿠키 정보를 배열로 반환
- getSession(): 브라우저와 매핑된 세션 객체를 리턴
쿠키나 세션 관련된 메서드는 다른 글에서 자세히 알아보겠습니다.
02. HttpServletResponse
다음은 ServletResponse에서 상속받은 메서드입니다.
getWriter() 메서드는 message-body와 연결된 출력 스트림(PrintWriter)을 반환합니다. 이 PrintWriter 객체의 print 메서드를 호출하면 브라우저에 원하는 내용을 출력할 수 있습니다.
다음은 HttpServletResponse에 추가된 메소드입니다.
크롬 브라우저의 개발자 도구를 이용하여 브라우저에 도착한 HTTP 응답 메시지의 내용을 살펴보면 서버에서 설정한 정보가 브라우저로 잘 전달된 것을 확인할 수 있습니다. sendRedirect(String path) 메서드를 사용할 경우, 서버로부터 응답을 받은 브라우저는 매개 변수로 전달받은 경로(예: /test/member/mainPage.jsp)에 다시 요청을 보내게 됩니다.
참고 자료
도서
- 채규태, <06장 서블릿 핵심 객체>, <<채쌤의 Servlet&JSP 프로그래밍 핵심>>, 쌤즈, 2022년, 163~169쪽
웹
- W3schools, Tutorials > HTML and CSS > Forms > Register Form, 글 보러가기