minOS

스프링 MVC 기본 기능 - HTTP 요청 메시지(1) 본문

TIL/김영한의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

스프링 MVC 기본 기능 - HTTP 요청 메시지(1)

minOE 2024. 7. 29. 17:03
728x90

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

HTTP message body에 데이터를 직접 담아서 요청
- HTTP API에서 주로 사용, JSON, XML, TEXT
- 데이터 형식은 주로 JSON 사용
- POST, PUT, PATCH
요청 파라미터와 다르게, HTTP 메시지 바디를 통해 데이터가 직접 넘어오는 경우는 `@RequestParam` , `@ModelAttribute` 를 사용할 수 없다.


1) HttpServletRequest와 HttpServletResponse를 사용하여 요청 본문을 읽는 방법
 @PostMapping("/request-body-string-v1")
    public void requestBodyStringV1(HttpServletRequest request, HttpServletResponse response) throws IOException {
        ServletInputStream inputStream = request.getInputStream(); // 요청 본문을 읽기 위한 InputStream
        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8); // InputStream을 String으로 변환

        log.info("messageBody = {}", messageBody); // 로그에 요청 본문 출력
        response.getWriter().write("ok"); // 응답 본문에 "ok" 작성
    }





2) InputStream과 Writer를 사용하여 요청 본문을 읽고 응답을 작성하는 방법

@PostMapping("/request-body-string-v2")
    public void requestBodyStringV2(InputStream inputStream, Writer responseWriter) throws IOException {
        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8); // InputStream을 String으로 변환

        log.info("messageBody = {}", messageBody); // 로그에 요청 본문 출력
        responseWriter.write("ok"); // 응답 본문에 "ok" 작성
    }

 

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

1) InputStream(Reader): HTTP 요청 메시지 바디의 내용을 직접 조회
2) OutputStream(Writer): HTTP 응답 메시지의 바디에 직접 결과 출력


3) HttpEntity를 사용하여 요청 본문을 읽고 응답을 작성하는 방법

@PostMapping("/request-body-string-v3")
    public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) throws IOException {
        String messageBody = httpEntity.getBody(); // HttpEntity에서 본문 추출
        log.info("messageBody = {}", messageBody); // 로그에 요청 본문 출력
        return new HttpEntity<>("ok"); // 응답 본문에 "ok" 작성하여 반환
    }

 

 

스프링 MVC는 다음 파라미터를 지원한다
1) HttpEntity: HTTP header, body 정보를 편리하게 조회

- 메시지 바디 정보를 직접 조회

- 요청 파라미터를 조회하는 기능과 관계 없음 `@RequestParam` X, `@ModelAttribute` X
2)
HttpEntity는 응답에도 사용 가능

- 메시지 바디 정보 직접 반환
- 헤더 정보 포함 가능
- view 조회X



HttpEntity
 를 상속받은 다음 객체들도 같은 기능을 제공한다.

- RequestEntity: HttpMethod, url 정보가 추가, 요청에서 사용
- ResponseEntity: HTTP 상태 코드 설정 가능, 응답에서 사용

 

4) RequestEntity와 ResponseEntity를 사용하여 요청 본문을 읽고 상태 코드와 함께 응답을 작성하는 방법

@PostMapping("/request-body-string-v4")
    public HttpEntity<String> requestBodyStringV4(RequestEntity<String> httpEntity) throws IOException {
        String messageBody = httpEntity.getBody(); // RequestEntity에서 본문 추출
        log.info("messageBody = {}", messageBody); // 로그에 요청 본문 출력
        return new ResponseEntity<>("ok", HttpStatus.CREATED); // 상태 코드 201(CREATED)와 함께 응답 본문에 "ok" 작성하여 반환
    }

 

 

 

상태코드 지정 가능

5)@RequestBody를 사용하여 요청 본문을 읽고 @ResponseBody로 응답을 작성하는 방법

   @ResponseBody // 반환 값을 응답 본문으로 사용하기 위한 어노테이션
    @PostMapping("/request-body-string-v5")
    public String requestBodyStringV5(@RequestBody String messageBody) {
        log.info("messageBody = {}", messageBody); // 로그에 요청 본문 출력
        return "ok"; // 응답 본문에 "ok" 작성하여 반환
    }





@RequestBody
`
@RequestBody` 를 사용하면 HTTP 메시지 바디 정보를 편리하게 조회할 수 있다. 참고로 헤더 정보가 필요하다면 `HttpEntity` 를 사용하거나 `@RequestHeader` 를 사용하면 된다.

이렇게 메시지 바디를 직접 조회하는 기능은 요청 파라미터를 조회하는 `@RequestParam` , `@ModelAttribute` 와 는 전혀 관계가 없다.



요청 파라미터 vs HTTP 메시지 바디

- 요청 파라미터를 조회하는 기능: `@RequestParam` , `@ModelAttribute`
- HTTP 메시지 바디를 직접 조회하는 기능: `@RequestBody`


@ResponseBody
@ResponseBody를 사용하면 응답 결과를 HTTP 메시지 바디에 직접 담아서 전달할 수 있다.

물론 이 경우에도 view를 사용하지 않는다.

 

728x90