HTTP GET 메소드와 @RequestBody

JunHyeok Seo·2024년 1월 7일

web

목록 보기
7/9

GetMapping

@RequestBody

@RequestBody 어노테이션을 사용할 경우 waring이 발생한다.

Required request body is missing

ajax의 data 영역

GET

ajax를 통해 데이터를 요청할 때, 메소드가 GET이면 data 영역의 값이 자동으로 URL에 포함된다.

예를 들어, data: { key1: 'value1', key2: 'value2' }와 같이 설정한 경우

GET /your-api-endpoint?key1=value1&key2=value2 와 같은 URL이 된다.

아래 코드를 통해, GET 메소드의 경우 data 영역이 query parameter로 변경되어 전송된다는 것을 확인할 수 있다.

//Test Class
package com.td.TrenD.controller;

import lombok.Data;

@Data
public class Test {
	private String id;
	private String pass;
}

//컨트롤러
@GetMapping("/test/getmapping")
public void testGetMapping(Test test) {
	System.out.println("TrendReController.testGetMapping");
	System.out.println("id = " + test.getId());
	System.out.println("pass = " + test.getPass());
}

//ajax
function test() {
    const uri = `/test/getmapping`;
    const params = {
        id : 'jun',
      pass : '1'
    }
    getJson(uri, params);
}

//출력
TrendReController.testGetMapping
id = jun
pass = 1

그 외

GET이 아닌 다른 메소드의 경우. data 속성에 설정한 데이터가 요청의 본문(Request Body)으로 전송된다.

GET 메소드는 data 영역의 값이 request body가 아닌 query parameter로 전송되기 때문에 @RequestBody을 사용하는 경우 값을 찾지 못한다.

@RequestParam

@RequestParam 어노테이션을 사용해도 경고가 발생한다.

Required request parameter 'params' for method parameter type RePagingVO is not present

메소드에서는 매개변수로 RePagingVO 클래스 객체를 사용하여 여러 프로퍼티를 한번에 받는다.

ajax에서 프로퍼티를 Map 형태로 만들어 전송하는데 RePagingVO 형태가 아니므로 위와 같은 경고가 발생한다.

클래스를 매개변수로 사용하는 경우

클래스 형태의 객체를 매개변수로 받는 컨트롤러 메소드에서 별도의 어노테이션을 사용하지 않는 경우. Spring MVC는 기본적으로 쿼리 파라미터를 클래스의 프로퍼티와 매핑한다.

@RequestParam 어노테이션을 사용하면 매개변수가 쿼리 파라미터로 넘어오는 것이 아니라, 매개변수 자체가 요청의 특정 파라미터와 매핑되도록 기대한다. 따라서 클래스 타입의 객체를 @RequestParam으로 직접 받는다면 쿼리 파라미터 매핑이 자동으로 이뤄지지 않는다.


GET 메소드와 RequestBody를 함께 사용해도 되나?

결론

과거에는 함께 사용하는 것이 불가능했으나 현재는 가능하다. 그러나 이는 일반적이지 않은 사용법이고 지원하지 않는 서버가 대부분이므로 사용하지 않는 것이 좋다.

0개의 댓글