스프링 MVC 기본 기능, HTTP 요청 메시지 - 단순 텍스트, JSON

2021. 7. 20. 16:47·교육 및 인강/스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

인프런 김영한 님의 스프링 강의이며, 섹션 6 - 스프링 MVC 기본 기능을 정리하는 시간이다.

자세한 설명이 궁금하면 수강을 권장한다.

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원

www.inflearn.com


HTTP 요청 메시지 - 단순 텍스트

이전 시간에 했던 요청 파라미터와 다르게 HTTP 메시지 바디를 통해 데이터 넘어오는 경우

@RequestParam, @ModelAttribute를 사용할 수 없다.

단, HTML Form 형식은 요청 파라미터로 인정된다. 

 

HTTP 메시지 바디의 데이터는 InputStream을 사용해서 직접 읽을 수 있다.

@Slf4j
@Controller
public class RequestBodyStringController {

    @PostMapping("/request-body-string-v1")
    public void requestBodyString(HttpServletRequest request, HttpServletResponse response) throws IOException {
        ServletInputStream inputStream = request.getInputStream();
        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);// 바이트코드를 UTF-8 변환

        log.info("messageBody={}", messageBody);
        
        response.getWriter().write("ok");
    }
}

확인은 postman으로 한다.

HttpServletRequest 에서 받아와서 처리하는 과정이 너무 길다.

 

스프링 MVC는 다음 파라미터를 지원한다.

InputStream(Reader) : HTTP 요청 메시지 바디의 내용을 직접 조회

OutputStream(Writer) : HTTP 응답 메시지의 바디에 직접 결과 출력

    @PostMapping("/request-body-string-v2")
    public void requestBodyStringV2(InputStream inputStream, Writer responseWriter) throws IOException {
        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);// 바이트코드를 UTF-8 변환

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

        responseWriter.write("ok");
    }

이것도 처음에 비하면 과정이 간단히 생략되었을 뿐 사용방법은 흡사해서 계속 반복되는 불편함이 있다.

 

스프링 MVC는 더 나아가 메시지 컨퍼버라는 기능을 제공한다. (자세한 내용은 다음에 언급된다.)

    @PostMapping("/request-body-string-v3")
    public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) throws IOException {
        String body = httpEntity.getBody();
        log.info("messageBody={}", body);

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

HTTP 메시지처럼 주고 받는다. 

 

HttpEntity

- HTTP header, body 정보를 편리하게 조회

- 요청 파라미터를 조회하는 기능과 관계없음 (@RequestParam, @ModelAttribute)

- 응답에도 사용 가능

- 메시지 바디 정보 직접 반환

- 헤더 정보 포함 가능

- view 조회X

 

HttpEntity를 상속받은 객체도 존재한다

RequestEntity

- HttpMethod, url 정보가 추가, 요청에 사용

 

ResponseEntity

- HTTP 상태 코드 설정 가능, 응답에서 사용

- return new ResponseEntity<String>("hello world", responseHeaders, HttpStatus.CREATED)

    @PostMapping("/request-body-string-v4")
    public HttpEntity<String> requestBodyStringV4(RequestEntity<String> httpEntity) throws IOException {
        String body = httpEntity.getBody();
        log.info("messageBody={}", body);

        return new ResponseEntity<>("ok", HttpStatus.CREATED);
    }

 

스프링MVC 내부에서 HTTP 메시지 바디를 읽어서 문자나 객체로 변환하여 전달한다. 이때 HTTP 메시지 컨버터(HttpMessageConverter) 기능을 사용한다. (자세한 내용은 다음에)

 

@RequestBody

@RequestBody를 사용하면 HTTP 메시지 바디 정보를 편리하게 조회할 수 있다. 헤더 정보가 필요하면 HttpEntity나 @RequestHeader를 사용한다. 메시지 바디를 조회하는 기능은 @RequestParam, @ModelAttribute와는 관계없다. 

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

        return "ok";
    }

 

정리

- 요청 파라미터를 조회하는 기능 : @RequestParam, @ModelAttirubte

- HTTP 메시지 바디를 직접 조회하는 기능 : @RequestBody

 

@ResponseBody

- 응답 결과를 HTTP 메시지 바디에 직접 담아서 전달 가능 (뷰를 사용하지 않는다.)


HTTP 요청 메시지 - JSON

JSON 형식 데이터 조회 방법이다.

 

서블릿 방식

@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 helloData = objectMapper.readValue(messageBody, HelloData.class);
        log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
        response.getWriter().write("ok");
    }
}

 

@RequestBody 방식 - String

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

        return "ok";
    }

생략을 했지만 반복되는 변환 과정이 존재한다.

 

@RequestBody 방식 - JSON -> 객체 자동 변환

    @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 helloData

 

HttpEntity, @RequestBody를 사용하면 HTTP 메시지 컨버터가 메시지 바디의 내용을 지정된 문자나 객체로 변환해준다.

JSON도 객체로 변환시켜주는데 V2 에서 했던 objectMapper.readValue(값, 객체)를 대신 처리해준다. (자세한 내용은 다음에)

 

@RequestBody는 생략 불가능하다. 생략하면 @RequestParam 이나 @ModelAttribute로 적용되어

HTTP 메시지 바디가 아니라 요청 파라미터를 처리하게 된다. (요청 파라미터 처리 기능은 메시지 바디 데이터를 인식 못한다)

 

명심할 것은 HTTP 요청 시에 content-type : application/json 인지 확인해야 한다. 그래야 HTTP 메시지 컨버터가 실행된다.

 

 

HttpEntity 방식

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

        return "ok";
    }

 

@RequestBody - 응답 방식

- 해당 객체를 HTTP 메시지 바디에 직접 넣을 수 있다

- 이 경우에도 HttpEntity 사용이 가능하다.

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

        return data;
    }

 

정리

@RequestBody 요청

- JSON 요청 -> HTTP 메시지 컨버터 -> 객체

 

@RequestBody 응답

- 객체 -> HTTP 메시지 컨버터 -> JSON 응답

'교육 및 인강 > 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 카테고리의 다른 글

스프링 MVC 기본 기능 - HTTP 메시지 컨버터, 요청 매핑 핸들러 어댑터 구조  (0) 2021.08.03
스프링 MVC 기본 기능, HTTP 응답 - 정적 리소스, 뷰 템플릿, HTTP API, 메시지 바디에 직접 입력  (0) 2021.07.28
스프링 MVC 기본 기능, HTTP 요청 - 기본, 헤더 조회, 파라미터  (0) 2021.07.20
스프링 MVC 기본 기능 - 로깅 알아보기, 요청 매핑, API 예시  (0) 2021.07.19
스프링 MVC 이해 - 시작하기, 컨트롤러 통합, 실용적인 방식  (0) 2021.07.19
'교육 및 인강/스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 카테고리의 다른 글
  • 스프링 MVC 기본 기능 - HTTP 메시지 컨버터, 요청 매핑 핸들러 어댑터 구조
  • 스프링 MVC 기본 기능, HTTP 응답 - 정적 리소스, 뷰 템플릿, HTTP API, 메시지 바디에 직접 입력
  • 스프링 MVC 기본 기능, HTTP 요청 - 기본, 헤더 조회, 파라미터
  • 스프링 MVC 기본 기능 - 로깅 알아보기, 요청 매핑, API 예시
loop-study
loop-study
오늘도 공부하자
  • loop-study
    개발 공부할래?
    loop-study
  • 전체
    오늘
    어제
    • 분류 전체보기 (187)
      • 목표 및 회고 (26)
      • 세미나 & 워크샵 (1)
      • 교육 및 인강 (67)
        • TDD, Clean Code with Java (5)
        • ATDD, 클린 코드 with Spring (6)
        • DDD 세레나데 (3)
        • 인프라 공방 (6)
        • 이규원의 현실 세상의 TDD (19)
        • 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (18)
        • 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 (0)
        • 모든 개발자를 위한 HTTP 웹 기본 지식 - 김영한 (8)
        • 코딩으로 학습하는 GoF의 디자인 패턴 (1)
        • 스프링 시큐리티 완전정복 6.x (1)
      • 서적 (62)
        • 객체지향의 사실과 오해 (1)
        • 객체지향과 디자인패턴 (7)
        • 만들면서 배우는 클린 아키텍처 (3)
        • 테스트 주도 개발로 배우는 객체 지향 설계와 실천 (1)
        • 오브젝트: 코드로 이해하는 객체지향 설계 (17)
        • 리팩토링 : 코드 구조를 체계적으로 개선하여 효율적인 리팩터링 구현하기 (0)
        • 토비의 스프링 (3)
        • 엔터프라이즈 애플리케이션 아키텍처 패턴 (9)
        • 개발자의 글쓰기 (1)
        • 소프트웨어 장인 (17)
        • Real MySQL 8.0 (2)
        • JVM 밑바닥까지 파헤치기 (0)
      • 개발 & 방법론 (29)
        • Java (13)
        • TDD (5)
        • ATDD (3)
        • DDD (6)
        • 인프라 (2)
        • SQL (0)
      • 개인이야기 (1)
  • 블로그 메뉴

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

  • 공지사항

    • 백엔드 로드맵
  • 인기 글

  • 태그

    인프런
    nextstep
    DDD 세레나데
    Patterns of Enterprise Application Architecture
    백기선
    이규원
    JUnit
    Test Driven Development
    장인정신
    스터디
    현실세상의 TDD
    ATDD
    조영호
    넥스트스탭
    스프링
    오브젝트
    fastcampus
    테스트 주도 개발
    소프트웨어 장인
    TDD
    자바
    엔터프라이즈 애플리케이션 아키텍처 패턴
    추상화
    인프라공방
    김영한
    모든 개발자를 위한 HTTP 웹 기본 지식
    객체지향
    java
    마틴 파울러
    study
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
loop-study
스프링 MVC 기본 기능, HTTP 요청 메시지 - 단순 텍스트, JSON
상단으로

티스토리툴바