스프링 공부 (인프런 김영한 선생님)/스프링 MVC 1편

[스프링 웹 MVC 1편] 23. HTTP 요청 파라미터 (JSON)

2023. 6. 3. 20:02
package hello.springmvc.basic.request;

import com.fasterxml.jackson.databind.ObjectMapper;
import hello.springmvc.basic.HelloData;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpEntity;
import org.springframework.stereotype.Controller;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;

@Slf4j
@Controller
public class RequestBodyJsonController {

    private ObjectMapper objectMapper = new ObjectMapper();

    @PostMapping("/request-body-json-v1")
    public void requestBodyJsonV1(HttpServletRequest request, HttpServletResponse response)
        throws IOException {
        ServletInputStream inputStream = request.getInputStream();
        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

        log.info("messageBody = {}", messageBody);
        HelloData data = objectMapper.readValue(messageBody, HelloData.class);
        log.info("username = {}, age = {}", data.getUsername(), data.getAge());

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

    }

}

HTTP API에서 주로 사용되는 JSON 데이터 형식을 조회해보겠습니다.

먼저 서블릿에서 사용했던 방식을 비슷하게 옮기겠습니다.

 

Jackson 라이브러리를 사용하는 ObjectMapper를 사용합니다.

 

ServletInputStream 객체 타입의 inputStream을 request.getInputStream()을 통해 가져옵니다

messageBody를 StreamUtils의 toCopyString 메서드를 통해 받아오는데, 여기까지는 messageBody를 가져왔던 서블릿 방식과 동일합니다.

 

그러나 이제 objectMapper의 readValue 메서드를 사용하는데, 이때 messageBody와 클래스 형식을 넘겨주면,

objectMapper에 의해 자동으로 Json형태의 정보로 텍스트 정보가 변환됩니다.

 


@ResponseBody
@PostMapping("/request-body-json-v2")
public String requestBodyJsonV2(@RequestBody String messageBody) throws IOException{
    HelloData data = objectMapper.readValue(messageBody, HelloData.class);
    log.info("username = {}, age = {}", data.getUsername(), data.getAge());
    return "ok";
}

V2에서는 이전에 학습한 @RequestBody를 사용해서 HTTP 메세지에서 데이터를 꺼내고 messageBody에 저장한 뒤 동일하게 objectMapper를 사용하여 Json으로 변환합니다.

 

문자로 변환하고 다시 Json으로 변환하는 과정도 한번에 할 수는 없을까? -> V3에서 해결!


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

@RequestBody에 직접 만든 객체를 파라미터로 지정 가능

HttpEntity, @RequestBody를 사용하면 HTTP 메세지 컨버터가 바디의 내용을 우리가 원하는 문자나 객체로 변환해 줌.

이 메세지 컨버터는 문자 뿐만 아니라 JSON도 객체로 변환해준다. 자세한건 HTTP 메세지 컨버터에서 다룬다.

 

@RequestBody는 생략이 불가능하다

-> @ModelAttribute, @RequestParam의 경우 생략하면 단순 타입은 RequestParam으로

나머지는 @ModelAttribute로 인식된다, 이 때 HelloData의 @RequestBody를 생략하면 @ModelAttribute가 적용되어버린다.

 

따라서 이렇게 되면 HTTP 메세지 바디가 아니라 요청 파라미터를 처리하게 된다.

 

HTTP 요청시에 content-type이 application/json인지 꼭! 확인해야 한다.

그래야 JSON을 처리할 수 있는 HTTP 메시지 컨버터가 실행된다.


@ResponseBody
@PostMapping("/request-body-json-v4")
public String requestBodyJsonV4(HttpEntity<HelloData> httpEntity){
    HelloData data = httpEntity.getBody();
    log.info("username = {}, age = {}", data.getUsername(), data.getAge());
    return "ok";
}

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

HttpEntity나 @RequestBody를 사용해도 된다.

@ResponseBody를 사용하게 되면 객체를 직접 HTTP 메세지 바디에 직접 넣어줄 수 있다.

'스프링 공부 (인프런 김영한 선생님) > 스프링 MVC 1편' 카테고리의 다른 글

[스프링 웹 MVC 1편] 25. HTTP 응답 - HTTP API, 메세지 바디에 직접 입력  (0) 2023.06.04
[스프링 웹 MVC 1편] 24. HTTP 응답 - 정적 리소스, 뷰 템플릿  (0) 2023.06.04
[스프링 웹 MVC 1편] 22. HTTP 요청 파라미터 (@ModelAttribute, 단순 텍스트)  (0) 2023.06.03
[스프링 웹 MVC 1편] 21. 스프링 MVC - 기본기능 (기본/헤더/쿼리파라미터/ HTML Form 조회)  (1) 2023.06.03
[스프링 웹 MVC 1편] 20. 스프링 MVC - 기본기능 (요청매핑)  (0) 2023.06.03
'스프링 공부 (인프런 김영한 선생님)/스프링 MVC 1편' 카테고리의 다른 글
  • [스프링 웹 MVC 1편] 25. HTTP 응답 - HTTP API, 메세지 바디에 직접 입력
  • [스프링 웹 MVC 1편] 24. HTTP 응답 - 정적 리소스, 뷰 템플릿
  • [스프링 웹 MVC 1편] 22. HTTP 요청 파라미터 (@ModelAttribute, 단순 텍스트)
  • [스프링 웹 MVC 1편] 21. 스프링 MVC - 기본기능 (기본/헤더/쿼리파라미터/ HTML Form 조회)
ProgYun.
ProgYun.
인내, 일관성, 그리고 꾸준함을 담습니다.
ProgYun.
Perseverance, Consistency, Continuity
ProgYun.
전체
오늘
어제
  • 분류 전체보기
    • 칼럼
    • 일상생활
      • 월별 회고
      • 인생 이야기 (대학생활)
      • 취준
      • 운동인증
      • 제품 사용 후기와 추천
    • 스프링 공부 (인프런 김영한 선생님)
      • 스프링 핵심원리
      • 스프링 MVC 1편
      • 스프링 MVC 2편
    • 면접 준비
    • 전공
      • OOP 정리
      • Design Pattern
    • 스터디
    • English
      • Electronics(Laptop)
      • 1일 1단어

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 확진자
  • 하이닉스
  • 컴공
  • 대학생
  • p31
  • 해외직구
  • 오미크론
  • ssd
  • mason
  • 코로나
  • 포맷
  • 자가격리
  • 피로그래밍
  • 편입생
  • 일상
  • 윈도우재설치
  • 윈도우10
  • NVME
  • 자존감
  • 코로나19

최근 댓글

최근 글

hELLO · Designed By 정상우.
ProgYun.
[스프링 웹 MVC 1편] 23. HTTP 요청 파라미터 (JSON)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.