Spring/Spring MVC

[์Šคํ”„๋ง MVC] - 14. HTTP message body ๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์š”์ฒญ

hello_u 2023. 2. 16. 21:16

 

 

HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€ - ๋‹จ์ˆœ ํ…์ŠคํŠธ

 

  

์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋‹ค๋ฅด๊ฒŒ, HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ง์ ‘ ๋„˜์–ด์˜ค๋Š” ๊ฒฝ์šฐ๋Š”

 

@RequestParam , @ModelAttribute ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

 

 

 

 

InputStream

ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

log.info("messageBody={}",messageBody);

 

HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์˜ ๋ฐ์ดํ„ฐ๋ฅผ InputStream ์„ ์‚ฌ์šฉํ•ด์„œ ์ง์ ‘ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

@PostMapping("/request-body-string-v2")
public void requestBodyString(InputStream inputStream, Writer responseWriter) throws IOException {

    String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
    log.info("messageBody={}",messageBody);
    responseWriter.write("OK");

 

InputStream(Reader): HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์˜ ๋‚ด์šฉ์„ ์ง์ ‘ ์กฐํšŒ

 

OutputStream(Writer): HTTP ์‘๋‹ต ๋ฉ”์‹œ์ง€์˜ ๋ฐ”๋””์— ์ง์ ‘ ๊ฒฐ๊ณผ ์ถœ๋ ฅ

 

 

 

HttpEntity

 

@PostMapping("/request-body-string-v3")
public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) throws IOException {

    String messageBody = httpEntity.getBody();
    log.info("messageBody={}",messageBody);

    return new HttpEntity<>("OK");
}

 

 HTTP header, body ์ •๋ณด๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์กฐํšŒ / ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ์ •๋ณด๋ฅผ ์ง์ ‘ ์กฐํšŒ

 

 

 

@RequestBody / @ResponseBody

 

@ResponseBody
@PostMapping("/request-body-string-v4")
public String requestBodyStringV4(@RequestBody String messageBody){
    
    log.info("messageBody={}",messageBody);
    return "OK";
}

 

 

@RequestBody : HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ์ง์ ‘ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ

 

@ResponseBody : ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ์ง์ ‘ ๋‹ด์•„์„œ ์ „๋‹ฌ

 

 

 

 

์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ: @RequestParam , @ModelAttribute


HTTP  ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ์ง์ ‘ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ : @RequestBody

 

 

 

HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€ - JSON

 

ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

 

HttpServletRequest๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ง์ ‘ HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์™€์„œ, ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

 

 

private ObjectMapper objectMapper = new ObjectMapper();
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);

 

๋ฌธ์ž๋กœ ๋œ JSON ๋ฐ์ดํ„ฐ๋ฅผ Jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ objectMapper ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

 

JSON ํŒŒ์ผ์„ Java ๊ฐ์ฒด๋กœ deserialization ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ObjectMapper์˜ readValue() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค.

 

๋ฌธ์ž๋กœ ๋œ JSON ๋ฐ์ดํ„ฐ์ธ messageBody ๋ฅผ objectMapper ๋ฅผ ํ†ตํ•ด์„œ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

 

 

# ์ฐธ๊ณ  : ObjectMapper (JSON ํŒŒ์‹ฑ)

๋”๋ณด๊ธฐ

ObjectMapper

 

ObjectMapper๋ฅผ ์ด์šฉํ•˜๋ฉด JSON์„ Java ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜

 

๋ฐ˜๋Œ€๋กœ Java ๊ฐ์ฒด๋ฅผ JSON ๊ฐ์ฒด๋กœ serialization ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

Java Object → JSON

 

Java ๊ฐ์ฒด๋ฅผ JSON์œผ๋กœ serialization ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ObjectMapper์˜ writeValue() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค.

 

// Java Object ->  JSON
        Person person = new Person("zooneon", 25, "seoul");
        try {
            objectMapper.writeValue(new File("src/person.json"), person);
        } catch (IOException e) {
            e.printStackTrace();
        }

์œ„์™€ ๊ฐ™์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ JSON์„ ์ €์žฅํ•  ํŒŒ์ผ๊ณผ ์ง๋ ฌํ™”์‹œํ‚ฌ ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

JSON → Java Object

 

JSON ํŒŒ์ผ์„ Java ๊ฐ์ฒด๋กœ deserialization ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ObjectMapper์˜ readValue() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค.

 

// JSON -> Java Object
        String json = "{\"name\":\"zooneon\",\"age\":25,\"address\":\"seoul\"}";
        try {
            Person deserializedPerson = objectMapper.readValue(json, Person.class);
            System.out.println(deserializedPerson);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }

์œ„์™€ ๊ฐ™์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ JSON ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด or ๊ฐ์ฒด์™€ ์—ญ์ง๋ ฌํ™” ์‹œํ‚ฌ ํด๋ž˜์Šค๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

 

 

@RequestBody ๊ฐ์ฒด ๋ณ€ํ™˜

 

@ResponseBody
@PostMapping("request-body-json-v3")
public String requestBodyJsonV3(@RequestBody HelloData helloData) throws IOException {
    log.info("username={}, age={}",helloData.getUsername(),helloData.getAge());
    return "OK";
}

 

@RequestBody ์— ์ง์ ‘ ๋งŒ๋“  ๊ฐ์ฒด๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

@RequestBody๋Š” ์ƒ๋žต ๋ถˆ๊ฐ€๋Šฅ

 

HelloData์— @RequestBody ๋ฅผ ์ƒ๋žตํ•˜๋ฉด @ModelAttribute ๊ฐ€ ์ ์šฉ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค.


๋”ฐ๋ผ์„œ ์ƒ๋žตํ•˜๋ฉด HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๊ฐ€ ์•„๋‹ˆ๋ผ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

 

@ModelAttribute

 

์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ๊ฐ์ฒด์— ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค 

 

์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด๋ฆ„์œผ๋กœ HelloData ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐพ๋Š”๋‹ค.

 

 

 

@ResponseBody 

@ResponseBody
@PostMapping("request-body-json-v5")
public HelloData requestBodyJsonV5(@RequestBody HelloData helloData) throws IOException {
    log.info("username={}, age={}",helloData.getUsername(),helloData.getAge());
    return helloData;
}

 

 

์‘๋‹ต์˜ ๊ฒฝ์šฐ์—๋„ @ResponseBody ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ์ง์ ‘ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

@RequestBody ์š”์ฒญ

 

JSON ์š”์ฒญ -> HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ -> ๊ฐ์ฒด

 

@ResponseBody ์‘๋‹ต

 

๊ฐ์ฒด -> HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ -> JSON ์‘๋‹ต

 

 

 

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

 

์Šคํ”„๋ง MVC 1ํŽธ - ๋ฐฑ์—”๋“œ ์›น ๊ฐœ๋ฐœ ํ•ต์‹ฌ ๊ธฐ์ˆ  - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ํ•„์š”ํ•œ ๋ชจ๋“  ์›น ๊ธฐ์ˆ ์„ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์ดํ•ดํ•˜๊ณ , ์™„์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง MVC์˜ ํ•ต์‹ฌ ์›๋ฆฌ์™€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋” ๊นŠ์ด์žˆ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., -

www.inflearn.com