Backend/Spring+Boot

@ResquestParam, @RequestBody 와 Get, Post

findmypiece 2021. 4. 26. 16:12
728x90

알다시피 payload 는 url에 queryString을 통해 header 에 포함할 수도 있고, body에 포함할 수도 있다. Spring에서는 Controller 에서 해당 payload를 받아서 처리하게 되는데 전자의 경우 @RequestParam 을 사용하고 후자는 @RequestBody 를 사용한다.

 

여기에서 중요한 점은 @ResquestParam, @RequestBody 는 각각 Request 에서 payload를 읽어들일 곳을 지정하는 것 뿐이라는 것이다. 즉, @ResquestParam 는 header에서 payload를 읽어오고 @RequestBody 는 body 에서 payload를 읽어오게 된다.

 

간혹 jsp 시절부터 들어왔던 Get방식, Post방식 이라는 용어 때문에 @ResquestParam, @RequestBody를 Get, Post와 연관지어 생각하는 경우가 있는데 이는 전혀 연관이 없다.

 

html form 태그에서 Get과 Post만 지원하기 때문에 왜 Get방식, Post방식이라는 용어가 사용되었는데 엄밀히 말하면 이는 http 통신에서 행위를 지정하는 메소드일 뿐이다. 그렇기 때문에 Post 방식을 사용하더라도 url에 queryString을 추가할 경우 그 값을 @ResquestParam 로 읽어들일 수가 있는 것이다.

 

참고로 @ModelAttribute 라는 것도 있는데 이건 내가 만든 특정 VO객체에 값을 1:1로 매핑해준다. VO 객체에는 payload 의 키값과 동일한 변수와 이와 연결되는 Setter가 반드시 선언되어 있어야 한다. 

 

@ModelAttribute 의 재미있는 점은 queryString과 body에 있는 내용 모두를 읽어올 수 있다는 점이다. 다만 body의 내용도 읽어오려면 Content-Type 가 반드시 multipart/form-data 여야 한다.

 

@RequestMapping가 선언된 메소드에 @ModelAttribute와 함께 Model 타입의 변수를 함께 선언하면 @ModelAttribute로 받은 값들이 Model에 자동으로 추가되어 메소드 내에서 사용할 수 있다. 만약 특정 파라미터를 항상 Model 에 포함하고 싶다면 이 방법을 고려해도 좋다. 매번 Model 객체에 파라미터 값을 수동으로 넣어줄 필요가 없어진다.

 

728x90

'Backend > Spring+Boot' 카테고리의 다른 글

크로스 도메인 이슈  (0) 2021.04.29
@RestController  (0) 2021.04.27
threadContextInheritable  (0) 2021.04.23
RequestContextHolder  (0) 2021.04.23
Spring Security AuthenticationException message  (0) 2021.04.22