클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술
출처: https://mangkyu.tistory.com/14 [MangKyu's Diary:티스토리]
서블릿이란 자바를 사용하여 웹을 만들때 사용하는 기술이다. 쉽게 말하면 클라이언트의 request에 대한 response를 전달해주는것이다.
결론적으로 request를 받고 response를 생성하고 보내주는 과정을 알아서 처리해주는 기능인것이다.
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
어노테이션을 통해서 서블릿을 사용할 수 있다.
이 /hello url로 오게되면, helloServlet이라는 이름을 가진 이 servlet이 작동하는것이다.
또한, request.getParameter 함수를 통해서 query param을 쉽게 받을 수 있다.
request.getParameter()
HttpServletRequest는 http request를 담는다. 이를 통해 편리하게 사용할 수 있다.
또한, 임시 저장소 기능을 할 수 있다. 해당 HTTP 요청이 시작부터 끝날 때 까지 유지되는 임시 저장소 기능이다. 이를 나중에 MVC에 활용할 수 도 있다.
저장: request.setAttribute(name, value)
조회: request.getAttribute(name)
/url?username=hello&age=20
메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달
예) 검색, 필터, 페이징등에서 많이 사용하는 방식
content-type: application/x-www-form-urlencoded
메시지 바디에 쿼리 파리미터 형식으로 전달 username=hello&age=20
예) 회원 가입, 상품 주문, HTML Form 사용
GET, POST는 결국 queryparameter를 받아서 처리하는 방식인것이다.
API기반 방식은 다음과 같다.
단순한 문자열의 경우 HTTP 메시지 바디의 데이터를 InputStream을 사용해서 직접 읽을 수 있다.
HTTP API에서 주로 사용, JSON, XML, TEXT
데이터 형식은 주로 JSON 사용
POST, PUT, PATCH
objectMapper.readValue(messageBody, HelloData.class);
objectMapper를 이용해서 json 데이터를 미리 자기가 만들어 둔 class에 맞춰서 집어 넣을 수 있다,.
@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//[status-line]
response.setStatus(HttpServletResponse.SC_OK); //200
//[response-headers]
response.setHeader("Content-Type", "text/plain;charset=utf-8");
response.setHeader("Cache-Control", "no-cache, no-store, mustrevalidate");
response.setHeader("Pragma", "no-cache");
response.setHeader("my-header","hello");
//[Header 편의 메서드]
content(response);
cookie(response);
redirect(response);
//[message body]
PrintWriter writer = response.getWriter();
writer.println("ok");
}
}
헤더정보를 설정해서 응답을 보내줄 수 있다. 크게 복잡한 부분은 없다
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Content-Type: text/html;charset=utf-8
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter writer = response.getWriter();
writer.println("<html>");
writer.println("<body>");
writer.println(" <div>안녕?</div>");
writer.println("</body>");
writer.println("</html>");
}
이렇게 html코드를 직접 적어주면 브라우저가 이를 보고 렌더링을 하는데 대충 봐도 html코드를 자바로 일일히 입력하고 보내주는 방식이라 굉장히 불합리하고 불편해보인다.
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Content-Type: application/json
response.setHeader("content-type", "application/json");
response.setCharacterEncoding("utf-8");
HelloData data = new HelloData();
data.setName("kim");
data.setAge(20); //{"username":"kim","age":20}
String result = objectMapper.writeValueAsString(data);
response.getWriter().write(result);
}
json 구현 class를 데이터로 설저하고 이 안에 값을 설정한다. 그리고 이 값을 objectMapper.writeValueString을 통해서 응답을 반환할 수 있다.
스프링 MVC 패턴을 사용하면, 이 모든 기능을 스프링이 알아서 처리해주고, 처리를 이렇게 번거롭게 할 필요가 없다.