서블릿에서 지원하는 기능
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);
'일상의 흔적 > Study' 카테고리의 다른 글
인프런 스프링 MVC 1 (웹개발 핵심 기술) : MVC 프레임워크 만들기 - 4 (0) | 2023.03.16 |
---|---|
인프런 스프링 MVC 1 (웹개발 핵심 기술) : 서블릿, JSP, MVC 패턴 - 3 (0) | 2023.03.16 |
인프런 스프링 MVC 1 (웹개발 핵심 기술) : 웹어플리케이션 이해 - 1 (0) | 2023.03.15 |
인프런 스프링 핵심 원리 요약 : 빈스코프 - 9 (0) | 2023.03.05 |
인프런 스프링 핵심 원리 요약 : 빈의 생명주기 콜백 - 8 (0) | 2023.03.05 |