스프링/3. 스프링 MVC

51. 요청 파라미터 및 메시지바디의 데이터 정리

sdafdq 2023. 8. 13. 22:43

요청으로 데이터 보내는 것은 크게 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