spring & springboot

@PathVariable, @RequestParam 등 스프링부트 애노테이션 정리

gyk7 2024. 8. 3. 13:16

@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 사용