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의 동작과정
- ModelAttribute는 먼저 Reflection을 사용해 필드를 인자로 받는 생성자가 있는지 검사한다.
- 만약 있다면 해당 생성자를 이용해 값을 세팅하고 없다면 Setter로 값을 세팅한다.
- 예를 들어 모든 필드를 인자로 받는 생성자가 있다면 해당 생성자로 값을 주입한다. 만약 없다면 일부 필드를 인자로 받는 생성자를 찾아 사용하고, 없으면 기본 생성자를 사용해 객체를 생성한다.
- 생성자로 주입하지 못한 남은 변수들은 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
'Spring' 카테고리의 다른 글
[Spring] 조회된 Bean이 두 개 이상일 때 - @Autowired 필드명, @Qualifier, @Primary (0) | 2023.01.30 |
---|---|
[Spring] 필터(Filter) & 인터셉터(Intercepter) (0) | 2023.01.30 |
[Spring] MVC 패턴 & 프론트 컨트롤러(Dispatcher-Servlet) (0) | 2023.01.29 |
[Spring] 컴포넌트 스캔과 의존관계 자동 주입(생성자 주입을 해야하는 이유) (0) | 2023.01.29 |
[Spring] 싱글톤 컨테이너 (0) | 2023.01.29 |