본문 바로가기
Study

[Spring] @RequestBody, @RequestParam, @ModelAttribute 파헤치기

by jisayDeveloper 2023. 9. 12.
728x90
반응형
SMALL

클라이언트에서 받은 요청을 객체로 바인딩 하기 위해 제목의 3가지 방법을 사용하는데

이번 포스팅에서 각각의 차이점과 장단점을 파헤쳐보는 시간을 갖겠습니다.

@RequestParam

@RequestParam 은 1개의 HTTP 요청 파라미터를 받기 위해서 사용한다.

값의 여부는 무조건 true 여야 하기 때문에 반드시 해당 파라미터가 전송 돼야 하며,
만약 전송하지 않으면 400에러가 발생한다. 반드시 필요한 값이 아니라면 Required를 false로 설정하고,
defaultValue 옵션을 사용하면 기본값을 저장할 수 있다.

@RequsetBody

@RequestBody 는 클라이언트가 전송하는 JSON형태의 HTTP Body를 Java 객체로 변환 시켜주는 역할을 한다.

@RequestBody로 받는 데이터는 Spring에서 관리하는 MessageConverter들 중 하나인 MappingJackson2HttpMessageConverter를
통해 Java 객체로 변환되는데, 이는 ObjectMapper라는 클래스를 사용한다. 물론 데이터 형식이 Json이 아닐 수도 있다.

가장 큰 특징은 바인딩이 아닌 변환을 시키는 것이기 때문에 변수들의 Setter 함수가 없어도 정상적으로 저장됩니다.

@ModelAttribute

@ModelAttribute는 클라이언트가 전송하는 폼(form)형태의 HTTP Body와 요청 파라미터들을 생성자난 Setter로 바인딩 하기 위해 사용합니다. @ModelAttribute에는 매핑시키는 파라미터의 타입이 객체의 타입과 일치하는지 등을 포함한 다양한 검증(Validation)작업이 추가적으로 진행되는데, 타입이 서로 일치하지 않으면 BindException이 발생하게 된다.

@ModelAttribute을 사용해서 @RequestParam처럼 특정 파라미터 값만을 가져올 수 있는데
@ModelAttribute("writer") String writer를 사용하면 writer 변수 값을 얻을 수 있다.


차이점

@RequestParam

  • 1:1로 파라미터를 바인딩한다.
  • 특별한 옵션을 사용하지 않는 이상 null, 잘못된 값이 들어오면 400 에러를 발생시킨다.

@RequestBody

  • Post 요청시 기본 생성자가 있어야 하고 Setter는 없어도 된다.
  • Get 요청시 Setter가 존재해야한다.

@ModelAttribute

  • 여러 파라미터를 매개변수에 바인딩 할 수 있다.
  • Setter를 사용해 담기 때문에 해당 매개변수의 바인딩 받는 필드는 Setter가 필요하다.
728x90
반응형
LIST