@PathVariable, @RequestParam 등 스프링부트 애노테이션 정리
@PathVariable, @RequestParam, @ModelAttribute
모두 Http 요청에 오는 정보들을 컨트롤러의 매개변수로 바인딩할 때 편하게 해주는 애노테이션들
1. @PathVariable
URL 템플릿에서 동적으로 변하는 값들을 추출하는데 사용. 주로 리소스 식별자를 얻는데 사용함.
ex) users/1 : 식별자가 1인 user를 조회해야할 때 => @PathVariable 사용
2. @RequestParam
쿼리 파라미터, 쿼리 스트링이나 폼 데이터를 바인딩할 때 사용
ex) users?name=spring: name이 "spring"인 user를 조회해야 할 때 => @RequestParam
* 주의
@RequestParam을 사용해서 받아오는 변수에 값이 존재하지 않으면 400 error로 응답함.
↓
@RequestParam(required = false, defaultValue = "default")
이렇게 required를 false로 지정하거나, default값을 지정해주면 됨.
3. @ModelAttribute
폼 데이터를 자바 객체로 바인딩할 때, 해당 객체를 모델로 하여 뷰로 전달할 때 사용.
ex) name=&id= 받아올 값이 많아졌을 경우에 @RequestParam으로 하나씩 받아오지 않고 미리 만들어둔 객체로 바인딩시킬 수 있음. 이 때 객체에 각각의 변수에 setter함수 또는 생성자가 없다면 저장 안됨.
+ 추가 기능 - Validation
@ModelAttribute를 사용하면 @RequestParam과 달리 검증 작업 가능.
@RequestParam의 경우 잘못된 요청이 들어오면 400 Bad Request 응답을 하게 되는데,
@ModelAttribute의 경우에는 잘못된 값이 들어올 경우 BindingResult 객체에 실패 결과를 담아 controller에 전달하므로 그에 따른 추가적인 검증 처리가 가능함.
또는 @Valid를 사용해서 검증된 값을 BindingResult에 담을 수도 있음.
에러가 발생했는지 확인은 bindingResult.hasError()으로 함.
→ 이때 Exception이 발생하지 X, 해당 변수에 null이 담기는 상태가 되므로 잘 처리해주어야 함.
4. @RequestBody vs @RequestParam
@RequestBody : 클라이언트가 서버로 전송하는 Http 요청의 Body의 내용을 JavaObject로 변환시켜주는 어노테이션.
HttpMessageConverter를 통해 파싱 되어 자바 객체로 변환됨.
@RequestBody 사용 시 DTO에 getter 메서드 없으면 DTO가 null로 채워짐.
=> getter 또는 setter가 있어야 함.
* 참고 : Get, Delete와 같은 Http 통신 방법에는 Http Body가 없음. => @RequestBody 사용 불가능.
차이점 : 모두 요청 파라미터를 객체로 바인딩하기 위해 사용되지만 어떤 것을 바인딩하는 것인지 차이가 있음.
@RequestParam은 URL에 요청 파라미터를 바인딩하지만,
@RequestBody는 HttpBody에 있는 내용을 Java - Object로 변환함.
5. 예시
- http://localhost:8080/board/1
@PathVariable 사용
- http://localhost:8080/board?id=2&name=kim
@RequestParam, @ModelAttribute 사용
- http://localhost:8080/board
POST에서 @RequestBody 사용