JAVA/Spring MVC

[자바 intellij] @RequestParam? @ModelAttribute? @RequestBody는 또 뭐야??

_DoYun 2022. 8. 14. 03:23

이번 포스팅에서는 위 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로 받는 데이터에는 분명한 차이가 존재합니다.