성장일기

내가 보려고 정리하는 공부기록

백엔드/스프링 MVC

[Spring MVC] 3. 요청 매핑하기 - (2) (@ModelAttribute, ServletInputStream과 HttpEntity)

와나나나 2024. 4. 8. 18:18
728x90

인프런 김영한 강사님의 스프링MVC 강의를 듣고 학습한 내용을 정리한 게시물입니다.

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

 

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

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

www.inflearn.com

 

지난 게시글에 이어 요청과 관련된 내용에 대해 더 정리해보려고 한다.

 

1. @ModelAttribute (요청 파라미터로 객체 만들기)

개발을 할 때 요청 파라미터를 받아 필요한 객체를 만들고, 그 객체에 값을 넣는 작업을 해주어야 한다. 이 과정을 자동화 해주는 애노테이션이 바로  @ModelAttribute 이다.

 

파라미터를 바인딩 받을 객체를 만든 후, 이 객체를 파라미터에 넣어 사용할 때 해당 애노테이션을 사용하게 된다. 예를 들어보겠다.

 

// 객체 생성

@Data
public class HelloData {
	private String username;
    private int age;
}

// 애노테이션 적용

@ResponseBody
@RequestMapping("/model-attribute")
public String modelAttribute(@ModelAttribute HelloData helloData) {
	log.info("username = {}, age = {}", helloData.getUsername(), helloData.getAge());
    return "test";
}

 

위 코드와 같이 사용하면 HelloData 객체가 생성되고, 그 안에 요청 파라미터 값도 모두 들어가게 된다.

 

만약 요청파라미터와 다르게, HTTP 메시지 바디를 통해 직접 데이터가 넘어온다면 어떻게 처리해야할까 ?

 

 

2. ServletInputStream과 HttpEntity

ServletInputStream

HTTP 메시지 바디로 데이터가 직접 넘어오는 경우 ( JSON, XML 등) 에는 앞서 배운 @RequestParam이나 @ModelAttribute를 사용할 수 없다고 한다. 

 

이렇게 HTTP 메시지 바디의 데이터는 InutStream을 이용해 직접 읽을 수 있다고 한다.

@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);

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

 

아래 코드처럼 ServletInputStreamgetInputStream을 쓰면 직접 읽는 것이 가능하다.

 

여기서 StreamUtils.copyToString은 첫 파라미터에 inputstream을, 두번째 파라미터에는 어떤 인코딩으로 바꿀지 넣어준다. 스트림은 바이트코드라서 꼭! 정해주어야 한다.

 

 

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

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

 

HttpEntity

이를 이용해 HTTP header와 body의 정보를 편리하게 조회할 수 있다. 게다가 응답에서도 사용이 가능하다!

  • 메시지 바디 정보 직접 조회
  • 요청 파라미터 조회하는 기능과는 관계 없음

응답에서 사용할 경우 헤더 정보도 포함할 수 있다. view를 조회하는 건 아니다 !