[자바 intellij] @RequestParam? @ModelAttribute? @RequestBody는 또 뭐야??
이번 포스팅에서는 위 3가지 에노테이션들에 대해 비교해볼 건데 핵심은 @RequestParam과 @ModelAttribute는 주로 파라미터 값을, @RequestBody는 Http Body 값을 가져오기 위해 활용하는 에노테이션들입니다.
# @RequestParam
정말 자주 쓰이는 에노테이션으로 개발을 한다면 꼭 한번 마주칠 개념입니다. 위에서 @RequestParam은 파라미터를 가져온다고 했는데 다음의 예시를 보면 이해가 편하실 것입니다.
네이버에서 세계일보 사이트에 들어가면 다음과 같은 url을 확인할 수 있습니다.
newsstand.naver.com/까지는 이해하겠는데 그 뒤의 내용은 무엇일까요? 이것이 바로 Http 요청 파라미터입니다. 해당 url에서는 각각 list와 pcode라는 파라미터 name이 &에 묶여서 2개의 value 값을 가지고 있습니다.
만약 위 사이트에서 해당 파라미터들을 가져오려 한다면? 코드는 다음과 같을 것입니다.
@GetMapping("/newsstand.naver.com")
public void practice(
@RequestParam("list") String name,
@RequestParam("pcode") Integer price)
{
System.out.println(name);
System.out.println(price);
}
@RequestParam()을 통해 각각 list, pcode 내에 저장되어 있는 value 값을 가져올 수 있습니다.
# @ModelAttribute
@ModelAttribute 또한 위 @RequestParam과 마찬가지로 Http 요청 파라미터를 가져올 수 있다고 말했습니다. 그럼 어떤 차이점이 있는 것일까요?
@RequestParam이 하나의 name-value를 가져올 수 있었던 반면에 @ModelAttribute는 이 파라미터들을 객체에 매핑시키는 것이 가능합니다.
@Getter
@Setter
public class Hello {
private String list;
private Integer pcode;
public Hello(String list,Integer pcode) {
this.index = index;
this.writer = writer;
}
}
만약 다음과 같은 클래스가 존재한다고 가정하겠습니다. 딱 필드들의 이름만 봐도 저희가 받아 오려는 데이터들과 연관이있겠다는 느낌이 오시죠?
이제 파라미터들을 받아오는 코드입니다. 참고로 해당 코드는 보통 Controller라는 클래스에 들어있습니다.
@GetMapping("/newsstand.naver.com")
public void practice(
@ModelAttribute Hello hello,
)
{
System.out.println(hello.getList());
System.out.println(hello.getAge());
}
자 이제 앞서 설명한 @RequestParam 부분의 코드와 차이 느껴지시나요? 결론부터 말하자면 요청 url로 들어온 HTTP 파라미터들을 Hello 클래스와 매핑시켜 이름이 같은 필드 값에 파라미터들의 value 값들을 넣어준 것입니다.
@RequestParam에 비해 고작 코드 한 줄 더 줄어든 것이 아닙니다. 만약 파라미터들을 100개, 1000개라면? 물론 클래스에서 미리 설정해야 하겠지만 고작 한줄로 한번에 수 많은 데이터들을 받아 올 수 있다는 장점이 있습니다.
# @RequestBody
자 이제 마지막 개념입니다. 앞서 설명한 다른 에노테이션들에 비해 @RequestBody는 Http 요청 Body!! Body!!에서 데이터를 가져오는 에노테이션입니다.
설명에 앞서 위 사진은 PostMan이라고 부르는 소프트웨어로 Http 요청,응답을 도와주는 기능을 가지고 있습니다.
예를 들어 위 사진처럼 세계일보 사이트에 데이터를 보낼 때 지금까지 파라미터로 보내는 것이 아닌 Body에 Json 형태로 데이터를 보낸다면 어떻게 받아야 할까요? 이때 필요한 것이 바로 @RequestBody!!
@Getter
@Setter
public class Hello {
private String list;
private Integer pcode;
public Hello(String list,Integer pcode) {
this.index = index;
this.writer = writer;
}
}
Hello 클래스는 어차피 넣어줘야할 데이터가 똑같기 때문에 유지해줍니다.
@PostMapping("/newsstand.naver.com")
public void practice(
@RequestBody Hello hello,
)
{
System.out.println(hello.getList());
System.out.println(hello.getAge());
}
전체적인 형태를 보시면 @ModelAttribute와 매우 유사합니다. 실제로 기능도 유사하죠 하지만 파라미터로 받는 데이터 , Body로 받는 데이터에는 분명한 차이가 존재합니다.