Client에게 받은 요청 데이터 처리하기

최창효·2023년 9월 7일
0
post-thumbnail
post-custom-banner

@RequestParam

  • 일반적으로 GET방식의 queryString으로 넘어온 변수를 처리하기 위한 어노테이션입니다.

    Client

    <form action="http://localhost:8080/requestParam" method="GET">
      <input type="text" name="number">
      <input type="text" name="name">
      <button type = "submit">requestParam</button>
    </form>

    Server

    @GetMapping("/requestParam")
    public ResponseEntity<Dto> requestParamGet(@RequestParam(name="number") int number,
                                               @RequestParam(name = "name") String name){
        Dto dto = new Dto(number, name);
        return ResponseEntity.ok(dto);
    }
  • queryString의 GET방식 뿐만 아니라 body에 데이터를 담아오는 POST, 그 외의 PUT, DELETE에도 모두 사용 가능합니다.

    Client

    <form action="http://localhost:8080/requestParamPost" method="POST">
      <input type="text" name="number">
      <input type="text" name="name">
      <button type = "submit">requestParamPost</button>
    </form>

    Server

    @PostMapping("/requestParamPost")
    public ResponseEntity<Dto> requestParamPost(@RequestParam(name="number") int number,
                                                @RequestParam(name = "name") String name){
        Dto dto = new Dto(number, name);
        return ResponseEntity.ok(dto);
    }
  • Map형식으로 넘어오는 모든 데이터를 한번에 처리하는 것도 가능합니다.

    @GetMapping("/requestParamAll")
    public ResponseEntity<Dto> requestParamAll(@RequestParam Map<String,Object> allParameters){
        for (String key : allParameters.keySet()) {
            System.out.println(key +"||"+allParameters.get(key));
        }
        Dto dto = new Dto((int) allParameters.get("number"), (String) allParameters.get("name"));
        return ResponseEntity.ok(dto);
    }
    
    @PostMapping("/requestParamAllPost")
    public ResponseEntity<Dto> requestParamAllPost(@RequestParam Map<String,Object> allParameters){
        for (String key : allParameters.keySet()) {
            System.out.println(key +"||"+allParameters.get(key));
        }
        Dto dto = new Dto((int) allParameters.get("number"), (String) allParameters.get("name"));
        return ResponseEntity.ok(dto);
    }
    

pathVariable

queryString이 아닌 url 경로로 넘어온 변수를 처리하기 위한 어노테이션입니다.

Client

<form>
  <input type="text" name="number" id = "pathVariableInput">
  <button type = "button" onclick="document.location.href = makeUrl()">pathVariable</button>
</form>

Server

@GetMapping("/pathVariable/{number}")
public ResponseEntity<Dto> pathVariable(@PathVariable int number){
    System.out.println("number = " + number);
    return ResponseEntity.ok(new Dto(number,"dummyName"));
}

@RequestBody

  • Json형태의 HTTP Body를 받아 Java객체로 변환해주는 역할을 합니다.
    • HTTP Body에 담아 전송하기 때문에 GET방식이 아닌 POST방식으로 전송해야 합니다.
  • form은 Json이 아닌 application/x-www-form-urlencoded를 전송하기 때문에 @RequestBody로 form데이터를 받을 수 없습니다.

Client

<form action="http://localhost:8080/requestBody" method="POST" enctype="application/json">
  <input type="text" name="number">
  <input type="text" name="name">
  <button type = "submit">requestBody</button>
</form>

Server

@PostMapping("/requestBody")
public ResponseEntity<Dto> requestBody(@RequestBody Dto dto){
    System.out.println("dto = " + dto);
    return ResponseEntity.ok(dto);
}

결과

  • HttpMediaTypeNotSupportedException발생

@ModelAttribute

  • 사용자가 요청 시 전달하는 값을 오브젝트 형태로 매핑해주는 어노테이션입니다.
  • 클라이언트가 전송하는 form형태의 데이터가 특정 객체와 일치하다면 해당 객체로 매핑할 수 있습니다.
  • 특정 Parameter값만 가져오는 것도 가능합니다.

Client

<form action="http://localhost:8080/modelAttribute" method="POST">
  <input type="text" name="number">
  <input type="text" name="name">
  <button type = "submit">modelAttribute</button>
</form>

Server

@PostMapping("/modelAttribute")
public ResponseEntity<Dto> modelAttribute(@ModelAttribute Dto dto){
    System.out.println("dto = " + dto);
    return ResponseEntity.ok(dto);
}

기타1. Dto객체

@ToString
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class Dto {
    private int number;
    private String name;
}

기타2. queryString방식 vs pathVariable방식

  • queryString방식: http://localhost:8080?number=30&name=Lee
  • pathVariable방식: http://localhost:8080/30/Lee
profile
기록하고 정리하는 걸 좋아하는 개발자.
post-custom-banner

0개의 댓글