서버 사이드 프로그래밍은 서버 쪽에서 프로그래밍을 통해 데이터를 처리할 수 있도록 구성하는 것을 의미한다. 개발할 때는 다음과 같은 점들을 고려해야 한다.
만일 새로운 서비스를 개발할 때마다 이런 고민을 새로 해야 한다면 엄청나게 많은 개발 비용과 시간을 소모하게 된다.
자바의 병우 이러한 처리를 JavaEE라는 기술 스펙으로 정리해 두었고, Servlet과 JSP는 JavaEE의 여러 기술 중에 하나이다.
서블릿 기술은 쉽게 말해 서버에서 동적으로 요청과 응답을 처리할 수 있는 API들을 정의한 것이다.
서블릿 컨테이너란 말 그대로 서블릿을 담고 관리해주는 컨테이너
[그림1] 서블릿 컨테이너
출처
서블릿 컨테이너는 구현되어 있는 서블릿 클래스의 규칙에 맞게 서블릿을 관리해주며 클라이언트에서 요청을 하면 컨테이너는 HttpServletRequest, HttpServletResponse 두 객체를 생성하며 post,get 여부에 따라 동적인 페이지를 생성하여 응답을 보낸다.
getParameter() 와 유사하게 getParameterValues() 는 동일한 이름의 파라미터가 여러개 있는 경우에 사용한다. 예를 들어 name이라는 이름의 파라미터가 여러 개 존재한다면 getParameterValus()를 이용해서 String[] 타입으로 반환된다.
setAttribute()는 JSP로 전달할 데이터를 추가할 때 사용한다. setAttribute() 는 '키'와 '값' 형태로 데이터를 저장할 수 있다. 이때 키는 문자열로 지정하고, 값은 모든 객체 타입을 이용할 수 있다. JSP에는 서블릿에서 setAttribute()로 전달된 데이터를 화면에 출력하게 된다.
웹 MVC 구조에서는 HttpServletRequest와 getRequestDispatcher()를 이용해서 ReqeustDispatcher 타입의 객체를 구할 수 있다. ReqeustDispatcher 는 현재의 요청을 다른 서버의 자원(JSP 또는 서블릿)에게 전달하는 용도로 사용한다. ReqeustDispatcher에는 2개의 메서드가 존재한다.
기능 | 메소드 | 설명 |
---|---|---|
MIME 타입 | SetContentType() | 응답 데이터의 종류를 지정(이미지/html/xml 등) |
상태 관련 | setStatus() | 404,200,500 등 읍답 상태 코드 지정 |
출력 관련 | getWriter() | PrintWriter를 이용해서 응답메시지 작성 |
헤더 관련 | setHeader() | 특정 이름의 HTTP 헤더 지정 |
쿠키 관련 | addCookie() | 응답 시에 특정 쿠키 추가 |
전달 관련 | sendRedirect() | 브라우저에 이동을 지시 |
(1) 클라이언트는 호스트에게 원하는 웹 페이지를 요청.
요청할 때에는 원하는 페이지의 URL을 적어서 보낸다
(2) 사용자의 요청이 톰캣(WAS)에 도착 Apache-Tomcat에 등록되어있는 URL매핑들중 일치하는 자원을 찾는다.
(3) 등록된 자원들 중 사용자의 요청에 따라 다른 결과들이 나오는 페이지를 동적 웹 페이지라고 한다.
(4) 클라이언트의 요청이 올바른 요청이라면(톰캣에 등록된 자원이 맞다면)
해당 자원을 만들거나 이미 있는 자원을 응답한다.(Servlet 프로그램 실행)
(5) 서블릿 내부에서는 GET/POST에 맞게 doGet()/dePost() 등의 메소드를 실행한다. 이 후 동일한 주소의 호출이 있을 때 서블릿은 동일한 객체 하나만을 이용해서 이를 처리한다.
(6) 웹 서버에서 응답한 자원이 요청 보냈던 클라이언트의 웹 브라우저에 도착한다.
웹 브라우저는 응답받은 내용을 해석하여 사용자에게 보여준다.
MyServlet 이라는 이름으로 새로운 class를 생성한다.
HttpServlet 상속,url패턴 설정 , HTML 작성
@WebServlet은 브라우저의 경로와 해당 서블릿을 연결하는 설정을 위해 사용
doGet()은 브라우저의 주소를 직접 변경해서 접근하는 경우에 호출되는 메소드
@WebServlet(name = "myServlet",urlPatterns = "/my")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException{
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<html<body>");
out.println("<h1>MyServlet</h1>");
out.println("</body></html>");
}
}
이후 실행된 서블릿