Spring

[Spring] @RequestParam, @ModelAttribute, @RequestBody 정리

날아 2023. 1. 29. 23:52
Spring에서 클라이언트로부터 받은 요청을 객체로 바인딩하기 위해 사용하는 방법들 

1. @RequestParam

  • 1개의 HTTP 요청 파라미터를 받기 위해서 사용한다.
  • RequestParam은 필수 여부가 true이기 때문에 반드시 해당 파라미터가 전송되어야 한다. (위배시 400에러 발생)
  • 반드시 필요한 값이 아니라면 required를 false로 설정하면 되고, defaultValue 옵션을 사용하여 기본값을 지정할 수 있다. 
  • String, int, Integer 등의 단순 타입일경우 @RequestParam 생략 가능
    • 생략할 경우 스프링 MVC는 내부에서 required=false를 적용한다. 
@ResponseBody
@RequestMapping("/request-param-required")
public String requestParamRequired(
       @RequestParam(required = true) String username,
       @RequestParam(required = false, defalutValue = "-1") Integer age) {
    
	log.info("username={}, age={}", username, age);
    
    return "ok";
  }

2. @ModelAttribute

  • @ModelAttribute는 클라이언트가 전송하는 폼(form) 형태의 HTTP Body와 요청 파라미터들을 생성자나 Setter로 바인딩하기 위해 사용된다. 
  • @ModelAttribute에는 매핑시키는 파라미터의 타입이 객체의 타입과 일치하는지 등을 포함한 다양한 검증(Validiation) 작업이 추가적으로 진행된다. 
    • ex)  int형 index 변수에 "1번" 이라는 String형을 넣으려고 한다면, BindException이 발생
  • @ModelAttribute 생략 가능 

 

ModelAttribute의 동작과정 
  1. ModelAttribute는 먼저 Reflection을 사용해 필드를 인자로 받는 생성자가 있는지 검사한다.
  2. 만약 있다면 해당 생성자를 이용해 값을 세팅하고 없다면 Setter로 값을 세팅한다. 
  3. 예를 들어 모든 필드를 인자로 받는 생성자가 있다면 해당 생성자로 값을 주입한다. 만약 없다면 일부 필드를 인자로 받는 생성자를 찾아 사용하고, 없으면 기본 생성자를 사용해 객체를 생성한다.
  4. 생성자로 주입하지 못한 남은 변수들은 Setter를 이용해 값을 할당한다.
@Getter
@Setter
@ToString
public class User {

    private int Uno;
    private String Id;
    private String PWd;

    public User(int Uno) {
        this.Uno = Uno;
    }

    public User(int Uno, String Id) {
        this.Uno = Uno;
        this.Id = Id;
    }
}

만약 User(1,"skfk") 값이 넘어올 경우 public User(int Uno, Strung Id) 생성자를 통해 Board 객체가 생성되고, 그 다음 Setter를 통해 Pwd에 값이 주입된다. 


3. @RequestBody

  • @RequestBody는 클라이언트가 전송하는 Json(application/json) 형태의 HTTP Body를 Java 객체로 변환시켜주는 역할을 한다.
  •  @RequestBody로 받는 데이터는 Spring에서 관리하는 MessageConverter들 중 하나인 MappingJackson2HttpMessageConverter를 통해 Java 객체로 변환되는데, 이는 ObjectMapper 라는 클래스를 사용한다.
  • @RequestBody는 생략 불가능  

4. 활용 예시

@Getter
@Setter
@ToString
public class Board {

    private int index;
    private String writer;
    private String contents;

}
@RestController
@RequestMapping("/board")
public class BoardController {

    @PostMapping("/requestBody")
    public ResponseEntity<Board> requestBody(@RequestBody Board board) {
        // @RequestBody는 MessageConverter를 통해 Json 형태의 HTTP Body를 Java 객체로 변환시킨다.
        return ResponseEntity.ok(board);
    }

    @PostMapping("/modelAttribute")
    public ResponseEntity<Board> modelAttribute(@ModelAttribute Board board) {
        // @ModelAttribute는 폼(form) 형태의 HTTP Body와 요청 파라미터들을 객체에 바인딩시킨다.
        return ResponseEntity.ok(board);
    }

    @GetMapping("/list")
    public ResponseEntity<List<Board>> requestParam(
            @RequestParam(required = false, defaultValue = "skfk") String searchKeyWord) {

        // searchKeyWord는 required가 false이기 때문에 없을 수도 있으므로, 없다면 기본값이 할당된다.
        return ResponseEntity.ok(boardService.getBoardList(searchKeyWord));
    }

}

 

 

 

출저

인프런 강의 스프링 MVC 1편 (김영한 강사님)

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard