요청으로 데이터 보내는 것은 크게 3가지
GET의 url 쿼리 파라미터
POST html form 파라미터 (메시지바디에 들어가서 보내짐.)
HTTP API 메시지바디의 데이터
@RequestParam("key") 은 GET의 url 쿼리파라미터 POST의 html form 이렇게 딱 두 종류의 경우 가능,
@PostMapping("/save")
public String save(@RequestParam("username") String username, @RequestParam("age") int age, Model model) {
Member member = new Member(username, age);
Member savedMember = memberRepository.save(member);
model.addAttribute("member",member);
return "save-result";
}
저거 쓸 때 만약 key와 변수 이름이 같다면 @RequestParam 아예 생략 가능.
디폴트값 가능, 아예 Map으로 받아버리면 파라미터들이 다 들어옴, @ModelAttribute 이용 시 아예 객체로 받을 수 있음.
아예 생략도 가능함. 아무 애노테이션 @RequestParam, @ModelAttribute 이것들이 기본임.
@RequestMapping("/model-attribute-v2")
public String modelAttributeV2(HelloData helloData){
log.info("username={}, age={}",helloData.getUsername(),helloData.getAge());
return "ok";
}
@RequestParam 사용 가능한 것들에만 한해서 가능.
String, int Integer 같은 기본타입은 @RequestParam이 되고, 나머지는 @ModelAttribute로 받는다.
그리고 @PathParam
@PatchMapping("/{userId}")
public String updateUser(@PathVariable String userId){
return "patch user" +userId;
}
url 경로에서부터 값으로 얻는거임.
HTTP API
HttpEntity로 바디에 있는 정보를 바로 받을 수 있다.
@PostMapping("/request-body-string-v3")
public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) throws IOException {
String messageBody = httpEntity.getBody();
log.info("message body={}",messageBody);
return new HttpEntity<>("ok");
}
@ResponseBody
@PostMapping("/request-body-string-v4")
public String requestBodyStringV4(@RequestBody String messageBody){
log.info("message body={}",messageBody);
return "ok";
}
@RequestBody는 HttpEntity + 자동 형변환.
Json
@PostMapping("/request-body-json-v5")
public HelloData requestBodyJsonV5(@RequestBody HelloData helloData) {
log.info("name={}, age={}",helloData.getUsername(), helloData.getAge());
return helloData;
}
이렇게 바로 가능하다.
마찬가지로 HttpEntity+ 자동 형변환인데, HttpEntity도 어댑터 패턴인 듯. 아마 ObjectMapper를 활용해서 해주지 않을까 함.
이거는 그래도 메시지바디 읽는 건 한번 생각해야 하는게, html form을 통한 건 상관없는데, 다른 건 저게 애노테이션 아무것도 안쓰면 기본이 @RequestParam, @ModelAttribute이기 때문에 메시지 바디 읽을 땐 @RequestBody 써야하나 고려 해야함. html form 말고 바디 읽는건 무조건 저거 써야 함.
HttpEntity는 메시지바디에 대한 걸 다루는 거임.
@RequestBody
요청의 메시지바디 -> HttpEntity + HttpMessageConverter -> 객체
@ResponseBody. 역순임.
객체 -> HttpMessageConverter -> HttpEntity를 통한 응답의 메시지바디
응답
@GetMapping("/response-body-json-v2")
public ResponseEntity<HelloData> responseBodyJsonV2() {
HelloData helloData = new HelloData();
helloData.setUsername("userA");
helloData.setAge(20);
return new ResponseEntity<>(helloData, HttpStatus.OK);
}
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@GetMapping("/response-body-json-v3")
public HelloData responseBodyJsonV3() {
HelloData helloData = new HelloData();
helloData.setUsername("userA");
helloData.setAge(20);
return helloData;
}
이렇게 ResponseEntity를 통해서 거기다 데이터를 넣어 보낼 수 있음. 응답 메시지바디에 바로 들어감.
아래 처럼 애노테이션으로도 가능. 상태코드도 애노테이션으로 넣어주면 됨.
근데 이렇게 하면 단점은 동적으로 상태코드 불가해서 그때는 위에거 이용하면 됨.
@RestController
@Controller + @ResponseBody
@ResponseBody 쓰면 저렇게 return 타입보고 HttpMessageConverter에서 어댑팅으로 선택해서 바로 메시지바디에 넣어서 응답해줌.
https://qwefdg3.tistory.com/270
'스프링 > 3. 스프링 MVC' 카테고리의 다른 글
53. 도메인 (0) | 2023.08.14 |
---|---|
52. 요구사항 (0) | 2023.08.14 |
50. 스프링MVC 구조 전체정리. (0) | 2023.08.13 |
49. 컨버터가 실행되는 위치, ArgumentResolver (0) | 2023.08.13 |
48. HTTP 메시지 컨버터 (0) | 2023.08.13 |