HttpServlet - HttpServlet, HttpServletRequest, HttpServletResponse

휘Bin·2023년 5월 1일
0
post-thumbnail

HttpServlet

HttpServlet을 상속하는 별도의 서블릿들을 정의하는데, 해당 클래스를 정의 할 때 HttpServlet 클래스를 상속해서 구현한다.

  • HttpServlet의 특징
  1. HttpServlet은 GET/POST 등에 맞게 doGET(), doPost() 등을 제공한다. 필요한 메소드를 오버라이드하는 것만으로 GET/POST 방식을 나누어서 처리할 수 있다.
  2. HttpServlet을 상속받은 클래스 객체는 톰캣과 같은 WAS의 내부에서 자동으로 객체를 생성하고 관리하기 때문에 객체 관리에 따로 신경 쓸 필요가 없다.
  3. HttpServlet은 멀티 스레드에 의해서 동시에 실행가능하기에 동시에 많은 사용자를 어떻게 처리해야 할지에 대한 고민이 준다.
  • Servlet 클래스 상속 구조


HttpServlet은 상위 클래스로 GenericServlet이라는 추상 클래스를 상속한다.
GenericServlet과 HttpServlet의 가장 큰 차이는 GenericServlet의 경우 HTTP 프로토콜에 특화 되지 않은 요청(Request)과 응답(Response)에 대한 기능을 정의하고 있다는 것이다.
GenericServlet은 HTTP가 아닌 요청과 응답을 의미하는 ServletRequest/ServletResponse라는 타입을 이용한다.

  • HttpServlet의 라이프사이클
    서블릿은 기본적으로 요청(Request)을 처리해서 응답(Response)을 목적으로 설계되었다.
    다만, 서블릿은 웹이라는 특수한 환경으로 인해 객체를 직접 생성하는 대신, 톰캣에서 객체들을 관리한다. => 서블릿 관점에서 톰캣은 서블릿 컨테이너로 볼 수 있다.

  • 서블릿 클래스 처리 과정

  1. 브라우저가 톰캣에 서블릿이 처리해야 하는 경로를 호출
  2. 톰캣은 해당 경로에 맞는 서블릿 클래스를 로딩하고 객체를 생성. 이 과정에서 init()이라는 이름의 메소드를 실행해서 서블릿 객체가 동작 전에 수행해야 할 일들을 처리할 수도 있다.
  3. 생성된 서블릿 객체는 브라우저의 요청(Request)에 대한 정보를 분석해서 GET/POST 등의 정보와 함께 같이 전달되는 파라미터들을 HttpServletRequest라는 타입의 파라미터로 전달받는다. 여기서 응답을 처리하는데 필요한 기능들은 HttpServletResponse라는 타입의 객체로 전달 받는다.
  4. 서블릿 내부에서는 GET/POST에 맞게 doGet()/doPost() 등의 메소드를 실행. 이후 동일한 주소의 호출이 있다면 서블릿은 동일한 객체 하나만을 이용해 처리.
  5. 톰캣이 종료될 때는 서블릿의 destroy() 메소드 실행

위에서 중요한 점 2가지가 있는데, 하나는, 서블릿의 객체는 경로에 맞게 '하나만' 만들어 진다는 것이고, 두 번째는, 매번 호출 시에 자동으로 doGet()/doPost()를 이용해서 처리된다는 것이다.

HttpServletRequest의 주요 기능

서블릿 객체에서 최종적으로 요청(Request)을 처리하는 doGet()/doPost() 등은 HttpServletRequest와 HttpServletResponse를 파라미터로 전달받는다.

  • HttpServletRequest 주요 메소드
  • getParameter()

HttpServletRequest에서 가장 자주 사용하는 메소드 중 하나이다.
'?name=hwibin&who=ceo'과 같이 쿼리 스트링의 'name', 'who'라는 키(key)를 이용해 값(value)를 얻을 수 있다.
여기서 중요한 것은, getParameter()의 결과는 항상 String이라는 것이다! 문자열로 반환되기에 숫자 처리를 할 때는 예외가 발생할 수 있으므로 주의해야한다!

  • getParameterValues()

동일한 이름의 파라미터가 다수일 경우에 사용한다.
예를 들어, age라는 파라미터가 다수 존재한다면, getParameterValues()를 이용해 String[]타입으로 반환한다.

  • setAttribute()

JSP로 전달할 데이터를 추가할 때 사용한다.
setAttribute()는 '키(ket)'와 '값(value)'의 형태로 데이터를 저장한다. 키(key)는 '문자열'로 지정하고, 값(value)은 모든 객체 타입 사용 가능하다.

  • RequestDispatcher

웹 MVC 구조라면 HttpServletRequest의 getRequestDispatcher()를 이용해 RequestDispatcher 타입의 객체를 구할 수 있다.
RequestDispatcher는 현재의 요청을 다른 서버의 자원(서블릿 or JSP)에 전달할 때 사용한다.
1) forward() => 현재까지의 모든 응답(Response)을 무시하고, JSP가 작성하는 내용만을 브라우저에 전달
2) include() => 지금까지 만들어진 응답(Response)+JSP가 만든 내용을 브라우저로 전달
위 2개의 메소를 가지고 있다.
forward()와 include()가 있긴 하지만, 실제 개발에서는 거의 forward()만 사용한다.

HttpServletResponse의 주요 기능

HttpServletRequest가 '읽는' 기능을 제공한다면, HttpServletResponse는 '쓰는' 기능을 담당한다.


웹 MVC 구조에서 HttpServletResponse는 JSP에서 주로 처리된다. 따라서 서블릿 내에서 직접 사용되는 일은 많지 않고, 주로 sendRedirect()를 이용한다.

  • sendRedirect()

브라우저에 '이 곳으로 가라' 라는 응답(Response) 메시지를 전달한다.
senRedirect()를 이용하면 브라우저의 주소가 아예 변경되기 때문에 '새로고침' 요청을 방지할 수 있고, 특정 작업을 완전히 끝내고 새로운 흐름을 만들어낼 수 있다.

profile
One-step, one-step, steadily growing developer

0개의 댓글