□ HTTP 요청 파라미터
※ 참고사항
- @ModelAttribute 생략 가능
- String, int 같은 단순 타입 = @RequestParam
- argument resolver 로 지정해둔 타입 외 = @ModelAttribute
- @RequestParam
- HTTP 요청 파라미터(query string 또는 form data)를 메서드 파라미터에 바인딩할 때 사용.
- 단일 파라미터나 간단한 자료형에 주로 사용됨.
@GetMapping("/hello")
public String hello(@RequestParam String name) {
return "Hello " + name;
}
- @ModelAttribute
- 폼 객체나 커맨드 객체처럼, 파라미터가 객체일 경우 사용.
- 요청 파라미터들을 객체의 필드에 바인딩함 (자동 setter 호출).
- 주로 POST 요청에서 폼 데이터 받을 때 사용하지만, GET도 가능.
@PostMapping("/register")
public String register(@ModelAttribute User user) {
String userName = user.getName()
String userEmaing = user.getEmail() // 등 사용 가능
return "success";
}
□ HTTP 단순 텍스트
- Input, Output 스트림, Reader
@PostMapping("/request-body-string-v2")
public void requestBodyStringV2(InputStream inputStream, Writer responseWriter) throws IOException {
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
log.info("messageBody={}", messageBody);
responseWriter.write("ok");
}
스프링 MVC는 다음 파라미터를 지원한다.
- InputStream(Reader): HTTP 요청 메시지 바디의 내용을 직접 조회
- OutputStream(Writer): HTTP 응답 메시지의 바디에 직접 결과 출력
- HttpEntity : HTTP header, body 정보를 편리하게 조회
- 메시지 바디 정보를 직접 조회
- 요청 파라미터를 조회하는 기능과 관계 없음(@RequestParam X, @ModelAttribute X)
- HttpMessageConverter 사용 → StringHttpMessageConverter 적용
- 응답에서도 HttpEntity 사용 가능
- 메시지 바디 정보 직접 반환(view 조회X)
- HttpMessageConverter 사용 → StringHttpMessageConverter 적용
- HttpEntity 를 상속받은 다음 객체들도 같은 기능을 제공한다.
- RequestEntity : HttpMethod, url 정보가 추가, 요청에서 사용
- ResponseEntity : HTTP 상태 코드 설정 가능, 응답에서 사용
return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED)
- @RequestBody
- @RequestBody를 사용하면 HTTP 메시지 바디 정보를 편리하게 조회할 수 있다.
- 헤더 정보가 필요하다면 HttpEntity를 사용하거나 @RequestHeader를 사용하면된다.
□ HTTP 요청 메시지 - 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 data = objectMapper.readValue(messageBody, HelloData.class);
log.info("username={}, age={}", data.getUsername(), data.getAge());
response.getWriter().write("ok");
}
}
- HttpServletRequest를 사용해서 직접 HTTP 메시지 바디에서 데이터를 읽어와 문자로 변환
- 문자로 된 JSON데이터를 objectMapper를 사용해서 자바 객체로 변환
@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";
}
- @RequestBody 를 사용해서 HTTP 메시지에서 데이터를 꺼내고 messageBody에 저장한다.
- 문자로 된 JSON 데이터인 messageBody 를 objectMapper 를 통해서 자바 객체로 변환한다.
@ResponseBody
@PostMapping("/request-body-json-v3")
public String requestBodyJsonV3(@RequestBody HelloData data) {
log.info("username={}, age={}", data.getUsername(), data.getAge());
return "ok";
}
- @RequestBody는 생략 불가능, 생략하게 되면 @ModelAttribute가 적용된다.
- @RequestBody 요청
- JSON 요청 → HTTP 메시지 컨버터 → 객체
- @ResponseBody 응답
- 객체 → HTTP 메시지 컨버터 → JSON 응답
□ HTTP 응답 - 정적 리소스, 뷰 템플릿
- 정적 리소스 : 웹 브라우저에 정적인 HTML, css, js를 제공할 때는, 정적 리소스를 사용한다.
- 뷰 템플릿 사용 : 웹 브라우저에 동적인 HTML을 제공할 때는 뷰 템플릿을 사용한다.
- HTTP 메시지 사용 : HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 하므로,
HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다.
'Java & Spring > Spring' 카테고리의 다른 글
스프링 MVC - 구조 분석 (0) | 2025.04.14 |
---|---|
스프링 MVC - 멀티 쓰레드 (0) | 2025.04.06 |
스프링 MVC - 웹 애플리케이션의 이해 (0) | 2025.04.06 |
Spring - Spring Security (0) | 2024.10.07 |
JPA - Querydsl 사용법 및 실습 (0) | 2024.10.04 |