인프런 김영한 강사님의 스프링MVC 강의를 듣고 학습한 내용을 정리한 게시물입니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
지난 게시글에 이어 요청과 관련된 내용에 대해 더 정리해보려고 한다.
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");
}
...
}
아래 코드처럼 ServletInputStream의 getInputStream을 쓰면 직접 읽는 것이 가능하다.
여기서 StreamUtils.copyToString은 첫 파라미터에 inputstream을, 두번째 파라미터에는 어떤 인코딩으로 바꿀지 넣어준다. 스트림은 바이트코드라서 꼭! 정해주어야 한다.
✅ 스프링 MVC는 다음 파라미터를 지원한다.
- InputStream(Reader): HTTP 요청 메시지 바디의 내용을 직접 조회
- OutputStream(Writer): HTTP 응답 메시지의 바디에 직접 결과 출력
HttpEntity
이를 이용해 HTTP header와 body의 정보를 편리하게 조회할 수 있다. 게다가 응답에서도 사용이 가능하다!
- 메시지 바디 정보 직접 조회
- 요청 파라미터 조회하는 기능과는 관계 없음
응답에서 사용할 경우 헤더 정보도 포함할 수 있다. view를 조회하는 건 아니다 !
'백엔드 > 스프링 MVC' 카테고리의 다른 글
[Spring MVC] 4. REQUEST와 RESPONSE에 관하여 (HttpServletRequest, HttpServletResponse..) - (1) Request (2) | 2024.09.13 |
---|---|
[Spring MVC] 1. 스프링 MVC 기초 정리 (스레드와 스레드풀) - (2) (0) | 2024.07.08 |
[Spring MVC] 3. 요청 매핑하기 - (1) (@Controller와 @RestController, RequestMapping 사용, RequestParam) (1) | 2024.04.07 |
[Spring MVC] 2. 스프링 MVC 구조 (0) | 2024.03.30 |
[Spring MVC] 1. 스프링 MVC 기초 정리 (MVC패턴, 서블릿, WAS) - (1) (1) | 2024.03.28 |