티스토리 뷰
이전에 포스팅하였던 HTtpServletRequest 글에 이어서 작성된 내용입니다.
아래 링크를 통하여 이전글을 공부하고 오시면 이해하기 훨씬 쉬울 것이라고 생각합니다.
HTTP 요청 데이터
HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전송하는 방법은 크게 3가지가 있습니다.
- GET - 쿼리파라미터
- POST - HTML Form
- HTTP message body에 직접 데이터를 담아서 요청
클라이언트에서 이 3가지 방식으로 데이터를 보내면, 서버에서는 이들을 조회할 수 있어야 합니다.
하나씩 예제를 통해 알아보도록 하겠습니다.
1. GET - 쿼리 파라미터
/url? username=baek&age=20처럼 메시지 바디 없이 URL에서 물음표 이하의 쿼리 파라미터에 데이터를 포함해서 전달하는 방식입니다.
검색, 필터, 페이징 등에서 많이 사용하는 방식입니다.
CHAT-GPT 4.0이 알려주는 쿼리 파라미터란?
쿼리 파라미터는 URL에서 ? 뒤에 오는 키-값 쌍을 말합니다. 주로 웹 애플리케이션에서 클라이언트가 서버로 데이터를 전송하거나 특정 리소스를 요청할 때 사용됩니다.
예시 : https://example.com/search?query=chatgpt&page=1
여기서 query=chatgpt와 page=1이 쿼리 파라미터입니다.
아래는 GET 쿼리 파라미터를 이용하여 요청 데이터를 전송하는 예시 코드입니다.
http://localhost:8080/example?username=baek&age=20라는 URL로 접속하면 아래 코드와 같이 getParameter 메서드를 통해 username, age의 값을 받아올 수 있고 화면에 출력하는 코드(사진)입니다.
@WebServlet(name = "testServlet", urlPatterns = "/example")
public class RequestTest extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("username = " + request.getParameter("username"));
System.out.println("age = " + request.getParameter("age"));
}
}
2. POST - HTML Form
메시지 바디에 쿼리 파라미터 형식으로 데이터를 전달합니다.
회원 가입, 상품 주문, HTML Form 사용 시 주로 사용되는 방식입니다.
content-type이 application/x-www-form-urlencoded입니다.
메시지 본체에 쿼리 형식으로 데이터를 입력합니다.
마치 쿼리 파라미터 형식처럼 username=kim&age=20와 같이 데이터를 입력합니다.
형식이 유사하여 처음 소개 하였던, GET-쿼리 파라미터 방법과 동일한 방법으로 조회 가능합니다.
3. HTTP message body에 직접 데이터를 담아서 요청
HTTP API에서 주로 사용하는 방식으로, JSON, XML, TEXT 등이 전송됩니다.
보통 JSON 형식으로 데이터를 전송합니다.
POST, PUT, PATCH 메서드와 함께 사용되는 경우가 많습니다.
3-1. 단순 텍스트
HTTP 메시지 바디에 데이터를 직접 담아서 요청할 때, 주로 데이터의 형식은 JSON을 사용하지만, 먼저 가장 단순한 텍스트 메시지를 HTTP 메시지 바디에 전송하고 읽어보는 방법을 알아보도록 하겠습니다.
HTTP 메시지 바디의 데이터는 InputStream으로 들어옵니다.
따라서 스프링에서 제공하는 StreamUtils를 이용해서 copyToString 메서드를 사용하여 String으로 변환 후 메시지 바디를 읽어 들입니다. 아래의 예시 코드를 참고해 주세요.
(JAVA를 사용하여 공부 중이지만, 스프링에서 제공하는 StreamUtils를 사용하지 않으면 String으로 변환하는 과정이 너무나도 복잡하기에 이 부분은 스프링에 힘을 빌렸습니다.)
@WebServlet(name = "testServlet", urlPatterns = "/example")
public class RequestTest extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletInputStream inputStream = request.getInputStream();
//스프링이 제공하는 StreamUtils 클래스 사용
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
System.out.println("messageBody = " + messageBody);
response.getWriter().write("ok");
}
}
그래도 순수 자바(JAVA)만을 사용하고 싶을 경우 아래와 같은 코드처럼 작성할 수 있습니다.
//스프링이 제공하는 StreamUtils 클래스 사용
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
------------------------------------------------------------------------
//순수 자바를 사용하여 Stream을 String으로 변환하는 코드
StringBuilder stringBuilder = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
}
String messageBody = stringBuilder.toString();
포스트맨을 사용하여 테스트 진행 결과 정상적으로 화면과 콘솔에 출력되는 것을 확인할 수 있습니다.
3.2 JSON
마지막으로 HTTP API에서 주로 사용하는 JSON 형식으로 데이터를 전달하는 방법을 알아보도록 하겠습니다.
위의 단순 텍스트 전달 방법은 InputStream으로 받아서 String으로 변환한다고 하였는데, JSON 형식 같은 경우는 추가로 ObjectMapper를 사용하여 JSON을 객체로, 객체를 JSON으로 변환할 수 있습니다.
ObjectMapper의 readValue() 메서드를 사용하면 JSON에서 객체로 변환이 가능하고, 반대로 writeValueAsString() 메서드를 사용하면 객체에서 JSON으로 변환이 가능합니다.
@WebServlet(urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
public void service(ServletRequest request, ServletResponse 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");
}
}
@Getter @Setter
public class HelloData {
private String username;
private int age;
}
우선, JSON 형식은 객체로 바꾸어서 사용하기 때문에 'HelloData'라는 객체를 만들어두었습니다..
포스트맨을 통하여 JSON 형식으로 데이터를 요청합니다.
아래 사진을 확인해 보면, 정상적으로 JSON 형식의 데이터가 우리가 만들어놓은 HelloData 객체에 파싱 되어 잘 출력되는 것을 확인할 수 있습니다.
JSON을 자바 객체로 변환하려면 jaskson, gson 같은 라이브러리가 필요합니다.
스프링 부트를 사용하시면 기본으로 jackson이 제공되어 기본적으로 사용가능합니다.
이렇게 요청 데이터를 전송하는 방법에 대해 알아보았는데요.
이어서 응답 데이터는 어떻게 전송하는지, HttpServletResponse에 대해서 궁금하신 분은
아래 링크를 통하여 학습하시는 것을 추천드립니다.
감사합니다.
참고(출처)
https://passionate.tistory.com/35
https://dodeon.gitbook.io/study/kimyounghan-spring-mvc/02-servlet/http-request-data#postman
김영한님의 스프링 MVC 1편 강좌 (인프런)
+ 이번에 CTAT-GPT4o으로 업그레이드 한 챗지피티
'Spring | Spring Boot' 카테고리의 다른 글
[Spring] 스프링에서 제공하는 HTTP 요청 관련 어노테이션 (0) | 2024.05.17 |
---|---|
[Spring] 요청 매핑- @RequestMapping, @PathVariable (0) | 2024.05.16 |
[Spring] HttpServletResponse 기본 사용법 및 응답 데이터 처리 (0) | 2024.05.14 |
[Spring] HttpServletRequest 개요 및 기본 사용법 (0) | 2024.05.10 |
[Spring] 빈 스코프(Bean Scope) 완벽하게 이해하기 (1) | 2024.04.30 |
- Total
- Today
- Yesterday
- 객체지향설계원칙
- Thymeleaf
- 요청데이터
- Overloding
- Java
- erd editor
- 타임리프
- 스프링 컨테이너
- 네이버지도크롤링
- Servlet
- 스프링특징
- 인식안됨
- 인터페이스
- erd툴
- Spring
- 스프링
- 인터페이스 추상클래스 비교
- HttpServletRequest
- 추상클래스
- 스프링http
- 자바
- redirectattribute
- HTTP요청
- 빈생명주기콜백
- 요청매핑
- 스프링 빈
- 인터페이스 추상클래스 차이
- 크롤링
- 타임리프 기본기능
- RequiredArgsConstruct
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |