ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • spring[10] Servlet - request(요청)
    개인 공부/spring 2021. 6. 6. 08:40
    728x90
    반응형

    Servlet의 데이터 요청 방식

    1. GET - query parameter
      • url?name=이름&age=10
      • 메세지 바디 없이 url의 쿼리 파라미터를 사용하여 데이터를 전달
      • 검색, 페이징, 필터에 주로 사용됨
    2. POST - Form
      • content-type: application/x-www-form-urlencoded
      • 메세지 바디에 쿼리 파라미터 형식으로 전달
      • 회원가입, 상품주문, form 데이터를 전달 받을 때 사용
    3. HTTP message body
      • 주로 json 데이터를 전달
      • HTTP API에서 사용

    GET - query parameter

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * 1. 파라미터 전송 기능
     * http://localhost:8080/request-param?username=hello&age=20
     */
    @WebServlet(name = "requestParamServelt", urlPatterns = "/request-param")
    public class RequestParamServelt extends HttpServlet {
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            System.out.println("[전체 파라미터 조회] - start");
            request.getParameterNames().asIterator().forEachRemaining(paramName -> System.out.println(paramName + " = "+ request.getParameter(paramName)));
            System.out.println("[전체 파라미터 조회] - end");
            System.out.println();
    
            System.out.println("[단일 파라미터 조회] - start");
            String username = request.getParameter("username");
            String age = request.getParameter("age");
    
            System.out.println("username = " + username);
            System.out.println("age = " + age);
            System.out.println();
    
            System.out.println("[이름이 같은 복수 파라미터 조회]");
            //http://localhost:8080/request-param?username=hello&age=20&username=bye
            String[] usernames = request.getParameterValues("username");
            for (String name : usernames) {
                System.out.println("name = " + name);
            }
            System.out.println("[단일 파라미터 조회] - end");
        }
    }

    위의 코드를 http://localhost:8080/request-param?username=hello&age=20&username=bye 로 실행해보면 get 방식으로 서블릿을 통해 파라미터를 조회하는 방법을 확인할 수 있다.

    • .getParameterNames() : 모든 파라미터 조회
    • .getParameter("파라미터 key값") : 단일 파라미터 조회
    • .getParameterValues("파라미터 key값") : 복수 파라미터 조회

    만약 복수 파라미터인데 getParameter로 조회하면 첫번째 파라미터로 조회된다.

    POST - form 전송

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title>Title</title>
        </head>
        <body>
            <form action="/request-param" method="post">
                username: <input type="text" name="username" />
                age: <input type="text" name="age" />
                <button type="submit">전송</button>
            </form>
        </body>
    </html>

    우리가 위에 만든 /request-param으로 위의 form을 전송하면 자동으로 데이터들을 똑같이 읽어내는데 이는 get 방식은 url에 파라미터를 key=value&key=value 형식으로 전송하고 post-form 또한 http message body에 form data인 key=value&key=value 형식으로 데이터를 전송하기 때문이다. get 파라미터 방식과 post-form 방식은 똑같이 request.getParameter()로 데이터를 파싱해올 수 있다.

    HTTP message body - text

    import org.springframework.util.StreamUtils;
    import javax.servlet.ServletException;
    import javax.servlet.ServletInputStream;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.nio.charset.StandardCharsets;
    
    @WebServlet(name = "requestBodyStringServlet", urlPatterns = "/request-body-string")
    public class RequestBodyStringServlet extends HttpServlet {
    
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            ServletInputStream inputStream = request.getInputStream();  //바이트로 message body를 읽어옴
            String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);//인코딩 정보
    
            System.out.println(messageBody);
            response.getWriter().write("ok");
        }
    }

    위 코드는 http로 전송된 message body를 byte로 읽어서 다시 byte를 인코딩하여 String으로 반환해주는 코드이다. postman으로 post요청을 해보면

    위와 같이 내가 요청한 내용을 확인할 수 있다.

    이 내용은 굳이 정리하지 않으려 했는데 .getInputStream()과 스프링에서 제공하는 StreamUtils라는 기능을 사용해볼 수 있는 간단한 예시 코드여서 정리해봤다.

    HTTP message body - json

    import lombok.Data;
    
    @Data
    public class HelloData {
    
        private String username;
        private int age;
    }

    json 데이터를 담을 class를 만들어준다.

    import com.fasterxml.jackson.databind.ObjectMapper;
    import hello.servlet.basic.HelloData;
    import org.springframework.util.StreamUtils;
    import javax.servlet.ServletException;
    import javax.servlet.ServletInputStream;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.nio.charset.StandardCharsets;
    
    @WebServlet(name = "requestBodyJsonServlet", urlPatterns = "/request-body-json")
    public class RequestBodyJsonServlet extends HttpServlet {
    
        private ObjectMapper objectMapper = new ObjectMapper();
    
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            ServletInputStream inputStream = request.getInputStream();
            String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
            System.out.println("messageBody > "+messageBody);
    
            HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
            System.out.println("helloData.username = " + helloData.getUsername());
            System.out.println("helloData.age = " + helloData.getAge());
        }
    }

    다음 코드로 json 또한 text요청과 같이 inputStream으로 읽어오고 jackson libarary의 ObjectMapper를 통해 자동으로 파싱하여 사용하면 된다. json을 읽는 라이브러리는 자기가 편한거 사용하면 되는데. 지금 프로젝트는 간단하게 스프링에서 제공하는걸로 했다. 그리고 나서 postman으로 요청한 결과를 확인하면

    다음과 같이 정상적으로 String으로 읽어온 것과 json형식으로 파싱한 결과를 확인할 수있다.

    출처 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

    728x90
    반응형
Designed by Juno.