스프링 MVC 정리
1. 요청 매핑파트
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-arguments
@RestController
url 호출이 오면 이 메서드가 실행 되도록 매핑한다.
속성을 배열로 제공하므로 다중 설정이 가능하다. - {"/hello-basic", "/hello-go"}
@RequestMapping()
괄호 안에 method의 값으로 HTTP 요청을 GET, POST등등 선택도 가능하지만 클래스단에서 공통 주소를 매핑해주고
내부 개별 매서드에서 개별 url을 GetMapping PostMapping등의 어노테이션으로 묶어주면 훨씬 깔끔한 코드를 만들 수 있다.
@PathVariable
@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath(@PathVariable String userId, @PathVariable Long orderId) {
log.info("mappingPath userId={}, orderId={}", userId, orderId);
return "ok";
}
다음과 같이 url 변수를 PathVariable로 받아줄 수 있다. 특정 조건을 추가할 수도 있지만 잘 사용하지는 않는다.
클라이언트에서 서버로 요청 데이터를 전달할 때 주로 3가지 방법을 사용한다.
1. GET 쿼리 파라미터
2. POST 메시지 바디에 쿼리 파라미터 형식 전달
3. HTTP message body에 데이터를 직접 담아서 요청
파라미터를 통해 값을 받는 방법에서 스프링에서 사용할 수 있는 여러가지 방법이 있다.
@RequestParam
@RestController = @Controller + @ResponseBody라고 생각하면 된다.
@ResponseBody
@RequestMapping("/request-param-v5")
public String requestParamRequired(
@RequestParam(required = true) String username,
@RequestParam(required = false) Integer age){
log.info("username={}, age={}", username, age);
return "ok";
}
@RequestParam은 넘겨주는 변수와 이름이 같다면 굳이 안써도 된다. 또 만약 변수명을 바꿔서 받아주고 싶다면 RequestParam 안에 ("username")등과 같이 받는 이름을 달아주고 뒤의 String memberName과 같이 새 변수명을 달아주면 된다.
required를 통해 필요 여부도 정해서 충족하지 않는다면 400 bad request 에러를 띄울 수도 있다.
@ResponseBody
@RequestMapping("/request-param-v6")
public String requestParamDefalut(
@RequestParam(defaultValue = "guest") String username,
@RequestParam(required = false) Integer age){
log.info("username={}, age={}", username, age);
return "ok";
}
값이 없으면 디폴트를 넣어주는 방법도 있다. 빈 문자인 경우에도 설정한 기본값이 들어간다.
@ResponseBody
@RequestMapping("/request-param-map")
public String requestParamMap(@RequestParam Map<String, Object> paramMap){
log.info("username={}, age={}", paramMap.get("username"), paramMap.get("age"));
return "ok";
}
Map을 통해서 받아주는 방법도 있는데 파라미터의 값이 1개가 확실하다면 Map을 사용해도 되지만 그렇지 않다면 MultiValueMap을 사용해야 한다.
@ModelAttribute
@Data 적용시
Getter, Setter, ToString, EqualsAndHashCode, RequiredArgsConstructor를 자동 적용
@ResponseBody
@RequestMapping("/model-attribute-v1-1")
public String modelAttributeV1(@ModelAttribute HelloData helloData){
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
return "ok";
}
위와 같이 객체도 파라미터를 객체로 받는 @ModelAttribute를 생략 가능하다
http 메시지 바디를 통해 데이터가 넘어오는 경우 @RequestParam, @ModelAttribute를 사용할 수 없다. 그 대신 InputStream으로 받아줄 수 있다.
@RequestBody
HttpEntity
Http header, body 정보를 편리하게 조회하는데 쓰인다.
메시지 바디 정보를 조회하는데 위에서 지금까지 하던 요청 파라미터를 조회하는 기능과는 관계 없다.
응답에도 사용 가능하며 헤더 정보도 포함할 수 있다. 단 view조회는 불가능하다.
하지만 세개 중 가장 편한건 @RequestBody다.
@ResponseBody
@PostMapping("/request-body-string-v4")
public String requestBodyStringV4(@RequestBody String messageBody) throws IOException {
log.info("messageBody={}", messageBody);
return "ok";
}
여기서 @RequestBody를 생략할 수 있을까?
정답은 못한다. 스프링은 단순타입은 @RequestParam, 나머지는 @ModelAttribute로 반환하기 때문에 HTTP 메시지 바디가 아니라 요청 파라미터를 처리하는 로직을 따르게 된다.
출처: https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
오늘 정리
그냥 정신이 없다.