[Spring] HTTP Request 데이터를 처리하는 3가지 방법

2025. 6. 21. 14:19·Spring/MVC

HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법은 크게 3가지로 나누어진다

- GET : 쿼리 파라미터

- POST : HTML From

- HTTP message body에 직접 데이터를 담아 요청

하나씩 차근차근 알아보자.


GET : 쿼리 파라미터

메시지 바디 없이 URL의 쿼리 파라미터를 통해 데이터를 전달하는 방식이다.

URL 요청 예시 :  http://localhost:8080/request-param?username=xuv2&age=26

다음과 같은 코드로 쿼리 파라미터를 조회할 수 있다.

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;
import java.util.Enumeration;

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

    // http://localhost:8080/request-param?username=xuv2&age=26
    @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("username = " + name);
        }

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

}

 

http://localhost:8080/request-param?username=xuv2&age=26&username=lim 에 대한 URL 요청 결과는 다음과 같다

 

이름이 같은 복수 파라미터와 같은 경우에는 getParameterValues() 를 통해 조회해야하지만, 단순 getParameter() 의 결과는 첫번째 입력 값만 출력 된다.

 


POST : HTML Form 

우리가 흔히 생각하는 웹 브라우저의 회원 가입 형식이다.

content-type 은 application/x-www-form-urlencoded 이고, 메시지 바디에 쿼리 파라미터 형식으로 데이터를 전달하는 특징이 있다.

예를 들어 다음과 같은 HTML Form 형식이 있다고 하자.

이런식으로 데이터를 POST 전송하면, 다음과 같은 형식으로 HTTP 메시지가 생성된다.

URL : http://localhost:8080/request-param -> html 파일 안에 action 필드 설정

content-type : application/x-www-form-urlencoded

message body : username=xuv2&age=26

이렇게 되면 서버 입장에서는 전달 받은 데이터가 쿼리 파라미터 방식과 동일하므로, getParamter() 메서드를 그대로 활용할 수 있다 !


API 메시지 바디

메시지 바디에 plain/text 전송하기

HTTP message body에 데이터를 직접 담아서 요청하는 방식이다.

HTTP API에서 주로 사용하고, XML이나 TEXT도 가능하지만 사실상 표준이 JSON을 사용한다.

import jakarta.servlet.ServletException;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.util.StreamUtils;

import java.io.IOException;

import static 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(); // 메시지 바디의 내용을 바이트코드로 바로 얻을 수 있다
        String messageBody = StreamUtils.copyToString(inputStream, UTF_8);

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

        response.getWriter().write("OK");

    }
}

getInputStream을 통해서  메시지 바디를 얻어올 수 있다.

이는 바이트 코드이기 때문에, 항상 데이터를 읽을 때는 문자 타입(UTF-8)을 지정해줘야한다.

 

메시지 바디를 정상적으로 읽을 수 있었다.

 


메시지 바디에 JSON 전송하기

사실상 표준인 JSON 형태를 전달해보자.

JSON 타입을 실습하기 위해선 받은 데이터를 파싱할 객체와 이를 객체로 변환해주는 ObjectMapper 가 필요하다.

import lombok.Getter;
import lombok.Setter;

// 데이터를 파싱할 임시 객체
@Getter @Setter
public class HelloData {
    private String username;
    private int age;

}
import com.fasterxml.jackson.databind.ObjectMapper;
import hello.servlet.basic.HelloData;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.util.StreamUtils;

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.getUserName = " + helloData.getUsername());
        System.out.println("helloData.getAge = " + helloData.getAge());
    }

}

JSON 결과를 파싱해서 자바 객체로 변환할 때는 Jackson 등의 변환 라이브러리가 필요한데, 우리는 스프링 부트를 선택했기 때문에 Jackson 라이브러이의 ObjectMapper를 사용할 수 있다.

-> HelloData의 객체에 자동으로 바인딩 된다 !


여담

위에서 본 것처럼 form 데이터도 메시지 바디를 통해 데이터를 전송하므로, getInputStream() 을 통해 직접 읽을 수 있다. 하지만 getParameter() 메서드로 편리하게 쓸 수 있기 때문에 굳이 사서 고생 하지 말자 !

'Spring > MVC' 카테고리의 다른 글

[Spring] HTTP Response 데이터 처리하기  (0) 2025.06.21
[Spring] HttpServletResponse와 제공 메서드  (0) 2025.06.21
[Spring] HttpServletRequest과 제공 메서드  (0) 2025.06.20
[Spring] Servlet - 서블릿이란?  (0) 2025.06.20
[Spring] Web Server, Web Application Server(WAS)  (0) 2025.06.20
'Spring/MVC' 카테고리의 다른 글
  • [Spring] HTTP Response 데이터 처리하기
  • [Spring] HttpServletResponse와 제공 메서드
  • [Spring] HttpServletRequest과 제공 메서드
  • [Spring] Servlet - 서블릿이란?
xuv2
xuv2
폭싹 늙었수다
  • xuv2
    xuvlog
    xuv2
  • 전체
    오늘
    어제
    • 전체 글 모아보기 (191) N
      • 잡담 (9)
      • 책, 인사이트 (1) N
      • 도전 , 자격증 (3)
      • Error (5)
      • Java (23)
        • Basic (11)
        • Exception (1)
        • Collections (6)
        • MultiThread & Concurrency (2)
        • IO & Network (2)
      • Spring (40)
        • Core (10)
        • MVC (21)
        • Thymeleaf (9)
      • Spring DB (2) N
        • JDBC (1) N
        • Transaction (0)
        • Exception (0)
      • DataBase (21) N
        • Database Modeling (6) N
        • SQL (15) N
      • HTTP (11)
      • Network (17)
      • Software Engineering (3)
      • Operating System (3)
      • Algorithm (16)
      • Project (19)
        • Web (9)
        • iOS (8)
        • Python (1)
        • Toy Project (1)
      • A.I (13)
      • Linux (5)
  • 블로그 메뉴

    • 홈
  • 링크

    • Github
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
xuv2
[Spring] HTTP Request 데이터를 처리하는 3가지 방법
상단으로

티스토리툴바