관리 메뉴

거니의 velog

(10) 서블릿의 세 가지 기본 기능 본문

Java_Servlet

(10) 서블릿의 세 가지 기본 기능

Unlimited00 2023. 8. 22. 20:30

* 톰캣과 같은 WAS(Web Application Server, 웹 애플리케이션 서버)가 처음 나왔을 때 웹 브라우저 요청을 스레드 방식으로 처리하는 기술이 바로 서블릿이었다. 모든 웹 프로그램은 이 서블릿의 기능을 뼈대로 동작한다. 따라서 이 내용을 잘 이해하고 나면 전체 웹 프로그램이 어떤 식으로 동작하는지 쉽게 이해할 수 있다. 그 외의 기능들은 주요 서블릿 기능이 효율적으로 동작하기 위해 제공하는 세부 기능이라 할 수 있다.


1. 서블릿 기본 기능 수행 과정

* 다음은 서블릿이 수행하는 세 가지 주요 기능이다. 요약하면 클라이언트로부터 요청을 받아 비즈니스 로직을 처리하고, 그 결과를 다시 클라이언트에 돌려주는 과정이다.

(1) 클라이언트로부터 요청을 받는다.

(2) 데이터베이스 연동과 같은 비즈니스 로직을 처리한다.

(3) 처리된 결과를 클라이언트에 돌려준다.

* 초기 웹 프로그램 개발에서는 서블릿이 클라이언트로부터 요청을 받아 데이터베이스 연동 같은 비즈니스 작업을 처리한 후 그 결과를 클라이언트의 브라우저로 전송하는 방식으로 작업했다.

* 클라이언트로부터 요청을 받는 작업에는 어떤 것들이 있을까? 우리가 자주 사용하는 포털 사이트에서 로그인하려고 ID와 비밀번호를 텍스트 창에 입력한 후 로그인 버튼을 클릭하면 사용자가 입력한 ID와 비밀번호가 서버 쪽의 서블릿에 전송된다. 서블릿에서는 여러 가지 메서드를 이용해 사용자가 전송한 ID와 비밀번호를 받아온다.

* 그 다음 사용자의 로그인 요청에 대해 데이터베이스와 연동하여 사용자가 이미 등록된 회원인지 조회한다. 그 결과에 따라 다음 페이지로 가던지 ID나 비밀번호가 틀렸으니 다시 로그인하라는 오류 메시지를 클라이언트에 전송한다.


2. 서블릿 응답과 요청 수행 API 기능

* 우선 요청이나 응답과 관련된 서블릿 기능을 알아보자. 요청이나 응답과 관련된 API는 모두 javax.servlet.http 패키지에 있다.

- 요청과 관련된 API : javax.servlet.http.HttpServletRequest 클래스

- 응답과 관련된 API : javax.servlet.http.HttpServletResponse 클래스

다음 그림은 요청이나 응답과 관련된 API가 서블릿의 doGet()이나 doPost() 메서드의 매개변수로 사용되는 예이다.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("ThirdServlet doGet 메서드 호출");
}

* 클라이언트가 서블릿에 요청을 하면 먼저 톰캣 컨테이너가 받는다. 그런 다음 사용자의 요청이나 응답에 대한 HttpServletRequest 객체와 HttpServletResponse 객체를 만들고 서블릿의 doGet()이나 doPost() 메서드를 호출하면서 이 객체들을 전달한다.

* 톰캣이 사용자의 요청에 대한 정보를 모든 HttpServletRequest 객체의 속성으로 담아 메서드로 전달하므로 각 HttpServletRequest에서 제공하는 메서드들은 매개변수로 넘어온 객체들을 이용하여 사용자가 전송한 데이터를 받아 오거나 응답할 수 있는 것이다.

* 다음은 각 API에서 제공하는 중요한 메서드들을 정리해 둔 것이다. 이 메서드를 이용해서 여러 가지 요청이나 응답과 관련된 작업을 한다.


[HttpServletRequest의 여러 가지 메서드]

반환형 메서드 이름 기능
boolean authenticate
(HttpServletResponse response)
현재 요청한 사용자가 ServletContext 객체에 대한 인증을 하기 위한 컨테이너 로그인 메커니즘을 사용한다.
String changeSessionId() 현재 요청과 연관된 현재 세션의 id를 변경하여 새 세션 id를 반환한다.
String getContextPath() 요청한 컨텍스트를 가리키는 URI를 반환한다.
Cookie[] getCookies() 클라이언트가 현재의 요청과 함께 보낸 쿠키 객체들에 대한 배열을 반환한다.
String getHeader(String name) 특정 요청에 대한 헤더 정보를 문자열로 반환한다.
Enumeration<String> getHeaderNames() 현재의 요청에 포함된 헤더의 name 속성을 enumeration으로 반환한다.
String getMethod() 현재 요청이 GET, POST 또는 PUT 방식 중 어떤 HTTP 요청인지 반환한다.
String getRequestURI() 요청한 URL의 컨텍스트 이름과 파일 경로까지 반환한다.
String getServletPath() 요청한 URL에서 서블릿이나 JSP 이름을 반환한다.
HttpSession getSession() 현재의 요청과 관련된 세션을 반환한다. 만약 세션이 없으면 새로 만들어서 반환한다.

[HttpServletRequest의 여러 가지 메서드]

반환형 메서드 이름 기능
void addCookie(Cookie cookie) 응답에 쿠키를 추가한다.
void addHeader(String name, String value) name과 value를 헤더에 추가한다.
String encordURL(String url) 클라이언트가 쿠키를 지원하지 않을 때 세션 id를 포함한 특정 URL을 인코딩한다.
Collection<String> getHeaderNames() 현재 응답의 헤더에 포함된 name을 얻어온다.
void sendRedirect(String location) 클라이언트에게 리다이렉트(redirect) 응답을 보낸 후 특정 URL로 다시 요청하게 된다.
String getPathInfo() 클라이언트가 요청 시 보낸 URL과 관련된 추가 경로 정보를 반환한다.