@RequsetParam과 @RequestBody의 차이는 무엇일까?
@RequestBody 로 객체가 만들어지는 원리는 무엇일까?
HttpMessageConverter 의 역할은 무엇일까?
메소드의 매개변수가 웹 요청 매개변수에 바인딩되어야한다는 어노테이션이다.
이때 여러개의 매개변수를 받을 수는 있지만 단일값만으로만 받을 수 있다. 객체는 받을 수 없다.
Spring MVC와 Spring WebFlux에서 각각 다르게 작동한다.
Spring MVC에서 요청 매개변수는 쿼리데이터와 폼데이터형식을 받을 수 있다.
Servlet API
가 쿼리데이터와 폼데이터를 동일한 방식으로 다루기 때문이다.
Spring WebFlux에서 요청 매개변수는 쿼리데이터만 받을 수 있다. 만약 폼데이터나 멀티파트 데이터를 처리하고 싶다면, ModelAttribute
를 사용할 수 있다.
🧐 Spring MVC와 Spring WebFlux의 차이
- Spring MVC를 사용 --> spring-web 모듈의 의존성
- Spring WebFlux를 사용--> spring-webflux 모듈의 의존성
포스팅 보러가기
defaultValue
: 요청 파라미터가 값이 없을 때 사용할 문자열 값을 지정한다. 타입이 String이다. name
: 바인딩할 매개변수의 이름이다. required
: 매개변수의 필수 여부를 지정한다. 기본값이 true
이기 때문에 따로 지정하지 않으면 true
이다. 이때 해당 요청값이 없으면 익셉션이 발생한다.value
: name
과 같은 역할을 한다. @RestController
public class RequestTest {
@GetMapping("/requestest/RequestParam")
public String RequestParam(@RequestParam(value = "name")String name,
@RequestParam(value = "age")int age) {
return name+"님! 당신은 " + age + "살이군요?";
}
spring-boot-starter-web
으로 Spring MVC
를 사용한다.🙆 쿼리데이터를 정상적으로 받는다.
🙆 쿼리데이터를 정상적으로 받는다. (다만 JSON 데이터는 받을 수 없다.)
@RestController
public class RequestTest {
@GetMapping("/requestest/RequestParam")
public String RequestParam(@RequestParam(value = "name")String name,@RequestParam(value = "age")int age,@RequestParam(required = false) String nickname) {
if (nickname == null){
return name+"님! 당신은 " + age + "살이군요?";
}else {
return name+"님! " +nickname+ "이란 별명이 귀여워요! 당신은 " + age + "살이군요?";
}
}
}
@RequsetParam은 단순한 변수하나하나를 받을 수 있다.
Spring MVC에서는 쿼리데이터와 폼데이터를 받을 수 있고,
Spring WebFlux에서는 쿼리 데이터를 받을 수 있다.
required = false 일 때는, 값이 비어도 인셉션이 나지 않는다.
🤔 만약 폼으로 데이터를 받는데, 파라미터 개수가 너무 많으면 코드가 너무 길어지겠지...?
스프링은 이런 불편함을 줄이기 위해서 요청 파라미터의 값을 커맨더 객체에 담아줄 수 있는 기능을 제공한다. 👉 @ModelAttribute
@ModelAttribute은 HTTP Body내용과 HTTP파라미터의 값들을 생성자와 Getter와 Setter를 통해 주입할 때 사용한다.
만약 폼데이터를 자바코드에서 자바객체로 받는다면 @ModelAttribute
가 생략된 코드이다.
@PostMapping("/request/object")
public Book requestTestObject(@ModelAttribute Book user){
System.out.println("user = " + user);
return user;
}
커멘드 객체란?
스프링 MVC에서 폼 데이터를 받거나 전달하기 위해 사용되는 객체이고, 필수로
getter
,setter
를 가진다.
JSON 형식의 요청 데이터를 자바 객체로 변환해 받을 수 있도록 하는 어노테이션이다.
이 어노테이션이 붙어있으면 MessageConverter
의 Jackson라이브러리
가 자바객체로 변환시켜준다.
참고자료
습관적으로 썼던 어노테이션들의 차이를 확실히 알게 됐어요! 잘 보고 갑니당ㅎㅎ