[스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술] HTTP 요청 데이터

2024. 8. 26. 16:04·Back-End/Spring

[작성일: 2024. 06. 24]

 

GET 쿼리 파라미터

package hello.servlet.basic.request;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

/*
* 1. 파라미터 전송 기능
* http://localhost:8080/request-param?username=hello&age=20
* */

@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")

public class RequestParamServlet 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("[단일 파라미터 조회]");
        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("[이름이 같은 복수 파라미터 조회]");
        String[] usernames = request.getParameterValues("username");
        for (String name : usernames) {
            System.out.println("name = " + name);
        }

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

 

콘솔 창 출력

 

http://localhost:8080/request-param?username=hello&age=20

 

메시지 바디 없이 URL의 쿼리 파라미터를 사용해서 username=hello&age=20 데이터를 전달했다.

이 방식은 검색이나 필터, 페이징처리 등에서 많이 사용한다.

 

쿼리 파라미터는 URL에 ?를 시작으로 보낼 수 있으며 추가 파라미터는 &으로 구분한다.

 

 

username=hello&username=kim과 같이 파라미터 이름은 하나인데 값이 중복될 경우는 어떻게 될까?

 

request.getParameter()는 하나의 파라미터 이름에 대해 단 하나의 값만 있을 때 사용해야 하므로 중복일 경우엔 request.getParameterValues()를 사용해야 한다. 중복일 때 request.getParameter()를 사용하게 되면 request.getParameterValues()의 첫번째 값을 반환한다.

 

 

 

 

 

POST HTML Form

HTML의 Form을 사용해서 클라이언트에서 서버로 데이터를 전송하는 경우는 주로 회원가입, 상품 주문 등에서 사용하는 방식이다.

 

  • content-type: application/x-www-form-urlencoded
  • 메시지 바디에 쿼리 파라미터 형식으로 데이터를 전달한다.
    • username=hello&age=20

 

hello-form.html을 생성해서 실행해보자.

 

<!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>

 

 

POST의 HTML Form을 전송하면 웹 브라우저는 다음과 같은 형식으로 HTTP 메시지를 만든다.

  • 요청 URL: http://localhost8080/request-param
  • content-type: application/x-www-form-urlencoded
  • message body: username=hello&age=20

 

application/x-www-form-urlencoded는 GET 방식의 쿼리 파라미터 형식과 같다.

클라이언트 입장에서는 두 방식에 차이가 있지만 서버 입장에서는 둘의 형식이 동일하므로 request.getParameter()로 구분없이 편리하게 조회할 수 있다.

 

참고
contetn-type은 HTTP 메시지 바디의 데이터 형식을 지원한다.
GET URL 쿼리 파라미터 형식으로 클라이언트에서 서버로 데이터를 전달할 때는 HTTP 메시지 바디를 사용하지 않기 때문에 content-type이 없다.
POST HTML Form 형식으로 데이터를 전달하면 HTTP 메시지 바디에 해당 데이터를 포함해서 내보내기 때문에 바디에 포함된 데이터가 어떤 형식인지 content-type을 꼭 지정해야 한다.
이렇게 폼으로 데이터를 전송하는 형식을 application/x-www-form-urlencoded라고 한다.

 

 

postman을 사용한 테스트

 

 

 

 

 

API 메시지 바디 - 단순 텍스트

@WebServlet(name = "requestBodyStringServlet", urlPatterns = "/request-body-string")
public class RequestBodyStringServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // getInputString()로 데이터를 읽을 수 있다.
        ServletInputStream inputStream = request.getInputStream();
        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

        System.out.println("messageBody = " + messageBody);

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

 

postman 실행 결과

 

 

inputStream은 바이트 코드를 반환한다. 바이트 코드를 읽을 수 있는 문자(String)로 보려면 문자표(Charset)를 지정해주어야 한다. (ex: UTF_8 Charset)

 

 

 

 

 

API 메시지 바디 - JSON

@Getter
@Setter
public class HelloData {
    private String username;
    private int age;
}

 

@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());

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

 

postman 실행 결과

 

 

 

JSON 결과를 파싱해서 사용할 수 있는 자바 객체로 변환하려면 Jackson, Gson 같은 JSON 변환 라이브러리를 추가해서 사용해야 한다. 

 

 

 

 

 

 

 

 

 

 


🐣 출처: 인프런 김영한님 강의

 

이 글은 인프런의 김영한님 스프링 강의를 보고 작성한 글입니다.

강의를 들으면서 정리한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.

 

저작자표시 비영리 변경금지 (새창열림)
'Back-End/Spring' 카테고리의 다른 글
  • [스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술] HTTP 응답 데이터
  • [스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술] HttpServletResponse 기본 사용법
  • [스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술] HttpServletRequest
  • [스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술] Hello Servlet
뚜비
뚜비
1년차 백엔드&iOS 개발자의 감자 탈출 블로그 🥔🥔
  • 뚜비
    뚜비의 개발로그
    뚜비
  • 전체
    오늘
    어제
  • 글쓰기     관리
    • Devlog
      • Back-End
        • Java
        • Spring
        • JPA
        • HTTP
        • Security
        • Back-End
        • Front-End
      • 알고리즘
      • iOS
        • Swift
      • Database
      • Tips
        • Git & GitHub
        • A to Z
      • 프로젝트
      • 생각정리
  • 태그

    Security
    알고리즘
    sql
    Swift
    김영한
    Java
    Database
    생성자
    게시판만들기
    데이터베이스
    최주호
    spring
    자바스크립트
    html
    다형성
    jsp
    객체
    스프링
    javascript
    백준
    JPA
    자바
    HTTP
    프로그래머스
    성능최적화
    DB
    MVC
    의존성주입
    Spring Security
    변수
  • hELLO· Designed By정상우.v4.10.0
뚜비
[스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술] HTTP 요청 데이터
상단으로

티스토리툴바