반응형

서블릿에서 지원하는 기능

1. 스프링부트 서블릿 환경 구성

 스프링 부트의 main 메서드에 @ServletComponentScan 어노테이션 입력

※ @ServletComponentScan : 스프링 부트가 서블릿을 직접 등록해서 사용할 수 있도록 해주는 어노테이션

 클래스에 @WebServlet(name = "helloServlet", urlPatterns = "/hello") 애노테이션 입력

※ name: 서블릿 이름 urlPatterns: URL 매핑

Servlet클래스 생성시 HttpServlet을 상속 받아 오버라이드한 후 구현

※ HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 다음 메서드를 실행한다.

protected void service(HttpServletRequest request, HttpServletResponse response)

• 동작 방식

- 스프링 부트가 내장 톰켓 서버를 띄워줌

- 톰켓 서버는 내부에 서플릿 컨테이너기능을 가지고 있어서 서블릿 컨테이너를 통해 서블릿을 생성함

- 웹 브라우저가 요청을 보내면 request, respone 객체를 만들어서 싱글톤으로 떠있는 서블릿을 호출함

- 서블릿이 로직 수행을 완료하면 톰켓 서버가 respone에 담긴 정보를 가지고 response 메세지를 만들어서 응답

 

 

2. HttpServletRequest

2.1 서블릿과 HttpServletRequest 객체의 관계

 서블릿은 개발자가 HTTP 요청 메시지를 편리하게 사용할 수 있도록 파싱해줌.

 파싱 결과를 HttpServletRequest 객체에 담아서 제공

 HttpServletRequest를 사용하면 HTTP 요청 메시지를 편리하게 조회할 수 있음

※ HTTP 요청 메시지 예시

POST /save HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded

username=kim&age=20

 

2.2 HTTP 요청 메세지 구성요소와 HttpServletRequest객체에서 조회

START LINE HTTP메서드 request.getMethod()
URL request.getRequestURL()
URI request.getRequestURI()
쿼리스트링 request.getQueryString()
스키마 request.getScheme()
프로토콜 request.getProtocol()
https 여부 request.isSecure()
HEADER 다양한 헤더값 존재 request.getHeaderNames().asIterator()
.forEachRemaining(headerName ->
System.out.println(headerName + ": " + request.getHeader(headerName)));
BODY form 파라미터
형식 조회

※ 쿼리 파라미터
형식 조회와 같음
//단일 파라미터 조회
String username = request.getParameter("username"); 

//파라미터 이름들 모두 조회
Enumeration<String> parameterNames = request.getParameterNames();
 
//파라미터 이름들 모두 조회
Map<String, String[]> parameterMap = request.getParameterMap();

//복수 파라미터 조회
String[] usernames = request.getParameterValues("username"); 
message body
데이터 직접 조회
// 단순한 텍스트 메세지로 서버에 요청 했을 때 데이터 조회
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
// Json 형식 메세지로 서버에 요청 했을 때 데이터 조회
private ObjectMapper objectMapper = new ObjectMapper();

ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);

 

2.3 HttpServletRequest 객체의 기능

HTTP 요청 메시지를 편리하게 조회

• 임시 저장소 기능

 - 저장: request.setAttribute(name, value)

 - 조회: request.getAttribute(name)

※ 해당 HTTP 요청이 시작부터 끝날 때 까지 유지되는 임시 저장소 기능

• 세션 관리 기능

 - request.getSession(create: true)

 

2.4 HTTP 요청(request) 데이터

※ HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법 (3가지)

• GET - 쿼리 파라미터로 데이터 전달

ex) /url?username=hello&age=20

메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달

검색, 필터, 페이징등에서 많이 사용하는 방식

 

• POST - 메시지 바디에 쿼리 파리미터 형식으로 데이터 전달

ex) username=hello&age=20

컨텐트 타입이 content-type: application/x-www-form-urlencoded 으로 메시지 바디에 데이터를 포함해서 전달

회원 가입, 상품 주문 등 HTML Form에서 사용

 

• HTTP 메시지 바디에 데이터를 SON, XML, TEXT형식으로 직접 담아서 전달

ex) {"username":"kim","age":20}

POST, PUT, PATCH 메서드로 전달하고 주로 JSON을 사용

HTTP API에서 주로 사용

 

 

3. HttpServletResponse

3.1 HttpServletResponse의 역할

• HTTP 응답코드 지정

 - response.setStatus(HttpServletResponse.SC_OK);

• 헤더 생성

 - response.setHeader("Content-Type", "text/plain;charset=utf-8");

 - response.setHeader("Location", "/basic/hello-form.html");

※ 헤더의 content 관련 편의 메서드

 - response.setContentType("text/plain");

 - response.setCharacterEncoding("utf-8");

 바디 생성

 쿠키 생성 편의 메서드

Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600); //600초
response.addCookie(cookie);

※ Redirect 편의 메서드

- response.sendRedirect("/basic/hello-form.html");

 

3.2 HTTP 응답(response) 메시지

 단순 텍스트 응답

- writer.println("ok");

 HTML 응답 HTTP

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>");

• API - MessageBody JSON 응답

private ObjectMapper objectMapper = new ObjectMapper();

// HTTP 응답으로 JSON을 반환할 때는 content-type을 application/json 로 지정해야 함
response.setHeader("content-type", "application/json");
response.setCharacterEncoding("utf-8");

HelloData data = new HelloData();
data.setUsername("kim");
data.setAge(20);

//{"username":"kim","age":20}
// Jackson 라이브러리가 제공하는 objectMapper.writeValueAsString()를 사용하면 객체를 JSON 문자로 변경할 수 있음
String result = objectMapper.writeValueAsString(data);

response.getWriter().write(result);
반응형

+ Recent posts