눈이 녹으면 Spring-MVC 1월 30일 7회차

2023. 1. 30. 18:26·모각코
728x90

오늘 할 일

HTTP 요청 데이터-API 메시지 바디를 활용하여 직접 바디 태그를 채워서

서버에게 데이터 요청하기

 

  • HTTP message body에 데이터를 직접 담아서 요청
    • HTTP API에서 주로 사용, JSON, XML, TEXT
    • 데이터 형식은 주로 JSON 사용
    • POST, PUT, PATCH
  • 먼저 가장 단순한 텍스트 메시지를 HTTP 메시지 바디에 담아서 전송하고, 읽어보자.
  • HTTP 메시지 바디의 데이터를 InputStream을 사용해서 직접 읽을 수 있다.
packagehello.servlet.basic.request;

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);
			//위에서 얻은 바이트 코드를 String으로 바꾸기 위해 스프링이 제공하는 Utility를 사용한다.
			//추가로 꺼낼때는 인코딩 정보를 알려줘야 한다.
        System.out.println("messageBody = " + messageBody);

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

위 코드 작성에서 option+command+V로 자동완성을 활용한다.

위 코드를 테스트 하기 위해서는 postman을 사용한다.

  • 문자전송content-type:text/plain결과 : messageBody = hello!
  • message body: hello!
  • POST http://localhost:8080/request-body-string

*참고

inputStream은 byte코드를 반환한다. byte 코드를 우리가 읽을 수 있는 문자(String)로 보려면 문자표(Charset)를 지정해주어야 한다. 여기서는 UTF-8 Charset을 지정해주었다.

 

이번에는 HTTP API에서 주로 사용하는 JSON 형식으로 데이터를 전달해보자

JSON 형식 전송

  • POST http://localhost:8080/request-body-json
  • content-type : application/json
  • message body : {”username”: “hello”, “age”: 20}
  • 결과: messageBody = {”username”: “hello”, “age”: 20}

JSON 형식 파싱 추가

JSON 형식으로 파싱할 수 있게 객체를 하나 생성

hello.servlet.basic.HelloData

packagehello.servlet.basic;

importlombok.Getter;
importlombok.Setter;

@Getter @Setter
public class HelloData {

private String username;
private int age;

}//lombok라이브러리를 통해서 getter와setter를 따로 만들지 않고 어노테이션으로 처리한다.

API messageBody에서 텍스트를 가져온 것과 마찬가지로 inputStream을 받아온다.

packagehello.servlet.basic.request;

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 {
@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);
        response.getWriter().write("ok");
    }
}

그 다음으로 HelloData를 변화시키려면 Json라이브러리가 필요하다.

Json라이브러리는 기본으로 jackson라이브러리를 사용한다.

@WebServlet(name="requestBodyJsonServlet", urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet {

**private ObjectMapper objectMapper =new ObjectMapper();//jackson라이브러리 사용**
@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());
        response.getWriter().write("ok");
    }
}

👉🏻참고

JSON결과를 파싱해서 사용할 수 있는 자바 객체로 변환하려면 Jackson, Gson같은 JSON변환 라이브러리를 추가해서 사용해야 한다. 스프링 부트로 SpringMVC를 선택하면 기본으로 Jackson 라이브러리(ObjectMapper)를 함께 제공한다.

참고

HTML form 데이터도 메시지 바디를 통해 전송되므로 직접 읽을 수 있다. 하지만 편리한 파라미터 조회 기능 (request.getParameter(…))을 이미 제공하기 때문에 파라미터 조회 기능을 사용하면 된다.

위와 같이 HTML form으로 데이터를 보내더라도 아래와 같이 HTTP meassageBody의 내용을 가져 올 수는 있다.(아래의 에러는 json형식이 아니어서 파싱과정에서 발생한 에러이다.

JSON 형식 전송

  • POST http://localhost:8080/request-body-json
  • content-type : application/json
  • message body : {”username”: “hello”, “age”: 20}
  • 결과: messageBody = {”username”: “hello”, “age”: 20}

JSON 형식 파싱 추가

JSON 형식으로 파싱할 수 있게 객체를 하나 생성

hello.servlet.basic.HelloData

packagehello.servlet.basic;

importlombok.Getter;
importlombok.Setter;

@Getter @Setter
public class HelloData {

private String username;
private int age;

}//lombok라이브러리를 통해서 getter와setter를 따로 만들지 않고 어노테이션으로 처리한다.

API messageBody에서 텍스트를 가져온 것과 마찬가지로 inputStream을 받아온다.

packagehello.servlet.basic.request;

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 {
@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);
        response.getWriter().write("ok");
    }
}

그 다음으로 HelloData를 변화시키려면 Json라이브러리가 필요하다.

Json라이브러리는 기본으로 jackson라이브러리를 사용한다.

@WebServlet(name="requestBodyJsonServlet", urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet {

**private ObjectMapper objectMapper =new ObjectMapper();//jackson라이브러리 사용**
@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());
        response.getWriter().write("ok");
    }
}

👉🏻참고

JSON결과를 파싱해서 사용할 수 있는 자바 객체로 변환하려면 Jackson, Gson같은 JSON변환 라이브러리를 추가해서 사용해야 한다. 스프링 부트로 SpringMVC를 선택하면 기본으로 Jackson 라이브러리(ObjectMapper)를 함께 제공한다.

참고

HTML form 데이터도 메시지 바디를 통해 전송되므로 직접 읽을 수 있다. 하지만 편리한 파라미터 조회 기능 (request.getParameter(…))을 이미 제공하기 때문에 파라미터 조회 기능을 사용하면 된다.

HTML form으로 데이터를 보내더라도 아래와 같이 HTTP meassageBody의 내용을 가져 올 수는 있다.(아래의 에러는 json형식이 아니어서 파싱과정에서 발생한 에러이다.

728x90

'모각코' 카테고리의 다른 글

절개와지조 1차 모각코  (1) 2023.07.06
눈이 녹으면 Spring-MVC 1월 31일 8회차  (0) 2023.01.31
눈이 녹으면 Spring-MVC 1월 24일 6회차  (1) 2023.01.24
눈이 녹으면 Spring-MVC 1월 23일 5회차  (0) 2023.01.23
눈이 녹으면 Spring-MVC 1월 10일 4회차 모각코  (2) 2023.01.10
'모각코' 카테고리의 다른 글
  • 절개와지조 1차 모각코
  • 눈이 녹으면 Spring-MVC 1월 31일 8회차
  • 눈이 녹으면 Spring-MVC 1월 24일 6회차
  • 눈이 녹으면 Spring-MVC 1월 23일 5회차
Bello's
Bello's
개발하는 벨로
  • Bello's
    벨로의 개발일지
    Bello's
  • 전체
    오늘
    어제
    • 분류 전체보기 (199) N
      • 노예 일지 (7)
        • 스타트업 노예일지 (3)
      • CS 이론 (81)
        • 학과 수업 (4)
        • 알고리즘 (64)
        • 시스템 프로그래밍 (3)
        • 데이터 통신 (1)
        • 운영체제 (2)
        • 데이터베이스 (1)
      • project (3)
      • 나는 감자다. (4)
      • Spring (27)
      • 모각코 (45)
        • 절개와지조(모각코) (7)
        • 어쩌다보니 박준태가 조장이조 (11)
        • 어쩌다보니 박준태가 또 조장이조 (12)
      • LikeLion🦁 (20)
      • 캘리포니아 감자 (4)
      • OpenSource Contribute (1)
      • 우아한테크벨로 (1) N
        • 프리코스 회고록 (6) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    감자
    Spring
    BFS
    티스토리챌린지
    회고록
    오블완
    JPA
    그래프 순회
    누적합
    자바
    뛰슈
    모각코
    어렵다
    절개와지조
    8기
    나는 감자
    프리코스
    타임리프
    백준
    DFS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Bello's
눈이 녹으면 Spring-MVC 1월 30일 7회차
상단으로

티스토리툴바