티스토리 뷰

Servlet

  • Java는 서블릿을 이용해서 HTTP 요청을 처리하게 된다.
  • 서블릿은 개발자가 HTTP 요청을 쉽게 처리할 수 있도록 만들어진 기술로, 서블릿 대신 직접 문자열 파싱으로 프로토콜과 주어진 매개변수, 인코딩 형식 등 다양한 옵션 및 값을 처리해도된다. 하지만 이것이 너무 힘드니깐 만들어진 존재이다.
  • 서블릿 정리 글 ----> [Web/정리글] - 자바 웹 역사 정리

 

서블릿 응답 처리

@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")
public class RequestParamServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        전체_파라미터_조회(request);
        단일_파라미터_조회(request);
        이름이같은_복수_파라미터_조희(request);

        response.getWriter().write("ok");
    }
}

서블릿이 요청을 처리하는데 요청을 처리하는 로직은 당연히 개발자가 짜야한다. 이때 쿼리, form, 중복 파라미터 등이 올 수 있는데 적절한 조치법을 알아보자.

위 서블릿은 /request-param으로 요청이오면 처리를 담당하게 된다.

 

GET 쿼리 파라미터

GET 요청에 쿼리 매개변수가 포함되어 왔을 때 서블릿으로 어떻게 파라미터를 처리하는지 알아보자.

 

아래와 같은 요청을 보냈을 때 서버에서 처리 방법을 본다.
GET http://localhost:8080/request-param?username=woonsik&age=28&sex=male&job=jobseeker&username=woonsik2

 

전체 파라미터 조회

    private void 전체_파라미터_조회(HttpServletRequest request) {
        System.out.println("[전체 파라미터 조회] -- START");
        
        request.getParameterNames().asIterator()
                .forEachRemaining(param ->
                        System.out.println("param : " + param + " - " + request.getParameter(param))
                );
        
        System.out.println("[전체 파라미터 조회] -- END");
        System.out.println();
    }
    --
[전체 파라미터 조회] -- START
param : username - woonsik
param : age - 28
param : sex - male
param : job - jobseeker
[전체 파라미터 조회] -- END
  • 전체 파라미터를 조회하는 방식이다.
  • 사실 요청이 왔을 때 모든 파라미터를 확인할 일이 자주 있지는 않다. 필요한 정보만 뽑아서 로직을 수행할 수도 있지만, 모든 정보가 필요하다면 위와같이 가져올 수 있다.
  • getParameterNames()로 매개변수의 key를 가져오고, request에서 getParameter()에 key를 넣으면 value값을 얻을 수 있다.

단일 파라미터 조회

    private void 단일_파라미터_조회(HttpServletRequest request) {
        System.out.println("[단일 파라미터 조회] -- START");

        String username = request.getParameter("username");
        String age = request.getParameter("age");
        String sex = request.getParameter("sex");
        String job = request.getParameter("job");
        System.out.println("username = " + username);
        System.out.println("age = " + age);
        System.out.println("sex = " + sex);
        System.out.println("job = " + job);

        System.out.println("[단일 파라미터 조회] -- END");
        System.out.println();
    }
    --
[단일 파라미터 조회] -- START
username = woonsik
age = 28
sex = male
job = jobseeker
[단일 파라미터 조회] -- END
  • 필요한 값만 getParameter()를 통해 가져올 수 있다. 이때 key값을 통해 value를 조회한다.
  • 만약 같은 key값에 복수의 value가 들어오면 처음에 들어온 값을 반환한다.

파라미터 이름이 같은 복수 파라미터 조희

    private void 이름이같은_복수_파라미터_조희(HttpServletRequest request) {
        System.out.println("[이름이 같은 복수 파라미터 조회] -- START");
        String[] usernames = request.getParameterValues("username");
        for (String username : usernames) {
            System.out.println("username = " + username);
        }
        System.out.println("[이름이 같은 복수 파라미터 조회] -- END");
        System.out.println();
    }
    --
[이름이 같은 복수 파라미터 조회] -- START
username = woonsik
username = woonsik2
[이름이 같은 복수 파라미터 조회] -- END
  • 매개변수 이름이 같은게 있다면 getParameteValues()를 통해서 하나의 key에 여러개의 value를 가져올 수 있다.
  • 물론 좋은 방법은 아니다. 같은 파라미터에 여러개의 값을 전달하는 이상한 짓은 하지말도록 하자!

POST HTML FORM

HTML form으로 POST를 보냈을 때 파라미터를 처리하는 것을 보자.

아래와 같은 POST 요청을 가정한다.
POST http://localhost:8080/request-param

  • Content-Type이 x-www-form-urlencoded 이다.
  • 입력폼에 정보를 받아서 보내는 형태이다.

 

처리방법은 위 GET 요청에 대해 처리한 것과 동일하다. 똑같이 요청에 대해 request.getParameter()로 key값에 원하는 값을 주면 value를 취할 수 있다.

[전체 파라미터 조회] -- START
param : username - hi my name is woonsik
param : age - 10
param : sex - male
param : job - jobseeker
[전체 파라미터 조회] -- END

[단일 파라미터 조회] -- START
username = hi my name is woonsik
age = 10
sex = male
job = jobseeker
[단일 파라미터 조회] -- END

[이름이 같은 복수 파라미터 조회] -- START
username = hi my name is woonsik
[이름이 같은 복수 파라미터 조회] -- END

API 메시지 바디에 데이터를 포함해서 요청

HTTP message body에 데이터를 직접 담아서 요청한다.

  • HTTP API에서 주로 사용하고 데이터 형식은 JSON이 대표적이다.
  • POST, PUT, PATCH 프로토콜을 사용한다.

 

일반 text/plain으로 보낼 경우

    private void 텍스트메시지_바디(HttpServletRequest request, HttpServletResponse response) throws IOException {
        ServletInputStream inputStream = request.getInputStream();
        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

        System.out.println("messageBody = " + messageBody);
        response.getWriter().write("ok");
    }
    --
messageBody = hi i'm woonsik
  • getInputStream()을 통해 입력된 body를 받을 수 있다.
  • 해당 body를 문자열로 변한하기 위해서는 StreamUtils.copyToString()을 사용하면 된다. 이때 두번째 매개변수로 인코딩 형식을 꼭 지정해줘야 한다.

 

JSON 형식으로 보낼 경우

  • JSON 형식으로 데이터를 보낼 때이다.
private void JSON형식_출력(HttpServletRequest request) throws IOException {
    ServletInputStream inputStream = request.getInputStream();
    String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

    System.out.println("--- JSON 단순 문자열 출력 START");
    System.out.println("messageBody = " + messageBody);
    System.out.println("--- JSON 단순 문자열 출력 END\n");

    System.out.println("--- JSON 객체 변환 후 출력 START");
    HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
    System.out.println("helloData.getUsername() = " + helloData.getUsername());
    System.out.println("helloData.getAge() = " + helloData.getAge());
    System.out.println("helloData.getSex() = " + helloData.getSex());
    System.out.println("helloData.getJob() = " + helloData.getJob());
    System.out.println("--- JSON 객체 변환 후 출력 END\n");
}
--
--- JSON 단순 문자열 출력 START
messageBody = {
    "username": "woonsik", 
    "age": 28, 
    "sex": "male", 
    "job": "jobseeker"
}
--- JSON 단순 문자열 출력 END

--- JSON 객체 변환 후 출력 START
helloData.getUsername() = woonsik
helloData.getAge() = 28
helloData.getSex() = male
helloData.getJob() = jobseeker
--- JSON 객체 변환 후 출력 END
  • text/plain에서 처럼 getInputStream()을 통해 일단 body를 받아들인다. 이후 StreamUtils.copyToString()으로 문자열로 변환을 하고 이 문자열을 객체로 파싱을 할 수 있다.
  • 해당 문자열을 그냥 출력할 수 도 있지만 단순 문자열에 불과하다.
  • Jackson Libarary를 이용해서 ObjectMapper를 통해 객체로 변환할 수 있다. 이러면 내가 미리 생성한 객체의 프로퍼티로 값의 조회가 가능하다.
    즉, Json 형식으로 받은 데이터를 바로 객체화 시키는 것이 가능하다.
반응형
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday