[Spring] 서블릿의 HttpServletRequest 와 HttpServletResponse 란??

728x90

 

서블릿

동작 흐름

1. 서블릿 등록

  > `@WebServlet` 을 통해 서블릿 이름과 URL 매핑을 설정하면 서블릿 클래스로 설정된다.   

  ( 이때 클래스는 `HttpServlet` 을 상속해야 한다.)

  > `@ServletComponentScan` 를 추가하여 패키지 스캔을 통해 서블릿 클래스를 서블릿으로 자동 등록한다.

@ServletComponentScan
@SpringBootApplication
public class ServletMain {
    public static void main(String[] args) {
    }
}
@WebServlet(name = "myServlet", urlPatterns = "/test")
public class MyServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
}

> 참고 <

- 서블릿 이름, URL 매핑은 중복되면 안 된다.

- 서블릿도 스프링 빈처럼 init( ) 초기화 메서드, destroy( ) 종료 메서드가 실행된다.

 

2. HTTP 요청이 들어오면 서블릿 컨테이너가 동작

  > 서블릿 컨테이너가 URL 매핑을 확인하고 해당 서블릿을 찾는다.

  > 요청을 service( ) 메서드에 전달하여 service( ) 메서드를 실행한다.

protected void service(HttpServletRequest request, HttpServletResponse response)

 

HttpServletRequest

- HTTP 요청 메시지를 편리하게 사용하도록 도와주는 객체

- HTTP 요청 메시지를 파싱하여 저장한다.

  : 시작 라인 조회 (HTTP 메서드, URL, 쿼리 스트링, 스키마/프로토콜) 

  : 헤더 조회

  : 바디 조회 (form 파라미터 형식, message body 데이터)

- 임시 저장소 기능 제공

- 세션 관리 기능 제공

 

시작 라인 조회

String method = request.getMethod();            // HTTP 메서드 조회
String requestURI = request.getRequestURI();    // 요청된 URI 조회
String protocol = request.getProtocol();        // 프로토콜 조회
String queryString = request.getQueryString();  // 쿼리 파라미터 조회

헤더 정보 조회

String header = request.getHeader("User-Agent");   // 클라이언트 브라우저 조회
request.getHeaderNames().asIterator()              // 모든 헤더 조회
       .forEachRemaining(headerName -> 
              System.out.println(headerName + ": " + request.getHeader(headerName)));

임시 저장소 기능

request.setAttribute("item", item);       // Item 객체를 "item" 이름으로 저장
Item item = request.getAttribute("item")  // "item" 이름으로 저장된 데이터 조회

세션 관리 기능

HttpSession session = request.getSession();  
session.setAttribute("user", "Kim");                 // 세션에 데이터 저장
String user = (String) session.getAttribute("user");  // 세션 데이터 조회

 

요청 데이터 처리 방법

1. GET - 쿼리 파라미터

- 검색, 필터, 페이징 등에서 사용

- 메시지 바디 없이 URL의 쿼리 파라미터를 사용

- `?` : 시작, `&` : 추가 파라미터

2. POST - HTML Form

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

- 메시지 바디에 쿼리 파라미터 형식으로 전달

String username = request.getParameter("username");                 // 단일 파라미터 조회
String[] usernames = request.getParameterValues("username");        // 복수 파라미터 조회
Map<String, String[]> parameterMap = request.getParameterMap();     // 파라미터를 Map으로 조회
request.getParameterNames().asIterator()                            // 모든 파라미터 이름 조회
       .forEachRemaining(paramName -> 
              System.out.println(paramName + "=" + request.getParameter(paramName)));

3. HTTP message body

- API 에서 사용

- 주로 JSON 사용

- POST, PUT, PATCH 에서 주로 사용

ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);  // String 메시지 바디를 문자열로 조회

ObjectMapper objectMapper = new ObjectMapper();
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);          // Json 메시지 바디를 객체로 조회

`inputStream` 을 통해 message body 를 바이트 코드로 변환한다.

`StreamUtils` 를 통해 바이트 코드를 문자로 변환하여 message body 를 조회할 수 있다.

 

추가적으로 Json 인 경우, Jackson 라이브러리인 `ObjectMapper` 를 통해 문자를 객체로 변환할 수 있다.

 

HttpServletResponse

- HTTP 응답 메시지를 편리하게 생성하도록 도와주는 객체

  : HTTP 응답코드 설정

  : 헤더 설정

  : 바디 생성

- 쿠키, 리다이렉트 기능 제공

 

응답코드 설정

response.setStatus(HttpServletResponse.SC_OK);   // 응답코드 200 설정

헤더 설정

response.setHeader("Content-Type", "text/plain;charset=utf-8");            // Content-Type 설정
response.setHeader("Cache-Control", "no-cache, no-store, mustrevalidate"); // 캐시 설정
response.setHeader("Pragma", "no-cache");                                    
response.setHeader("my-header","hello");                                   // 사용자지정 헤더 설정

response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");

바디 메시지 생성

PrintWriter writer = response.getWriter();
writer.println("ok");                         // 메시지 바디 생성

쿠키 기능

Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600);                          // 쿠키 지속시간 600초 설정
response.addCookie(cookie);

리다이렉트 기능

response.sendRedirect("/basic/hello-form.html");      // 리다이렉트 설정

 

응답 데이터 처리 방법

1. 단순 텍스트 응답

 

2. HTML 응답

  - content-type 을 `text/html` 로 설정해야 함

response.setContentType("text/html");           // content-type 설정
response.setCharacterEncoding("utf-8");         // content-type 설정

PrintWriter writer = response.getWriter();
writer.print("<html>\n");
writer.print("<body>\n");
writer.print("  <div>안녕?</div>\n");
writer.print("</body>\n");
writer.print("</html>");                        // html 메시지 바디 생성

3. HTTP API - message body Json 응답

  - content-type 을 `application/json` 으로 설정해야 함

response.setHeader("content-type", "application/json");
response.setCharacterEncoding("utf-8");                // content-type 설정

HelloData data = new HelloData();
String result = objectMapper.writeValueAsString(data); // 객체를 Json으로 변환하여 메시지 바디 생성
response.getWriter().write(result);

Jackson 라이브러리인 `ObjectMapper` 를 통해 객체를 Json 으로 변환할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

출처 | 스프링 MVC 1(김영한) - 인프런

 
728x90