@RequestBody를 GET 요청에서 쓰면 안되는 이유

Soyun_p·2025년 2월 22일
0

📖 지식

목록 보기
2/10
post-thumbnail

🪼 HTTP 요청에서 본문(Body)란?

HTTP 요청은 크게 헤더(Header)본문(Body)로 구성된다

  • 헤더(Header): 요청 정보를 담고 있다 (예: Content-Type, Authorization 등)
  • 본문(Body): 요청의 실제 데이터(payload)가 담기는 부분. 주로 POST, PUT, PATCH에서 사용된다

✅Example

POST /login HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 50

{
	"username": "mole",
    "password": "1234"
}

🔹 여기서 본문(Body)는 {username" : "soyun", "password": "1234" } 이다
🔹 @RequestBody는 이 데이터를 자바 객체로 변환해주는 역할을 한다


🪼 HTTP GET요청이란?

GET요청은 서버에서 데이터를 조회(읽기)할 때 사용하는 HTTP 메서드이다
RESTful API 설계에서 리소스를 변경하지 않고 조회만 해야하는 경우에 사용한다.

GET 요청의 특징
🔹 목적: 리로스 조회(읽기)
🔹 요청 본문(Body): 없다(표준적으로 허용되지 않는다)
🔹 멱등성: 동일한 요청을 여러번 보내도 서버 상태 변화가 없어야한다
🔹 캐싱 가능: 브라우저/프록시에서 캐싱 가능
🔹 데이터 전달 방식: 쿼리 파라미터 또는 URL 사용


🪼 @RequestBody의 역할

스프링에서 @RequestBodyHTTP 요청의 본문(Body)을 컨트롤러 메서드의 매개변수로 변환해준다

  • JSON, XML 등 다양한 형식의 데이터를 받을 수 있다
  • 내부적으로 HttpMessageConverter를 사용해서 요청 본문을 자바 객체로 변환한다

✅Example

@RestController
@RequestMapping("/users")
public class UserController{

	@PostMapping("/create")
    public String createUser(@RequestBody User user){
    	return "User created: " + user.getUsername();
    }
}
public class User{
	private String username;
    private String password;
    
    //GETTER, SETTER 필수

⬇️클라이언트가 아래와 같은 JSON 요청을 보내면

POST /users/create
Content-Type: application/json

{
	"username": "soyun",
    "password": "1234"
}

➡️@RequestBody가 본문을 User 객체로 변환해준다


🪼 @RequestBodyGET에서 쓰면 안되는 이유

(1) GET 요청은 일반적으로 본문이 없다

  • HTTP 1.1 스펙에서는 GET 요청이 본문을 가질 수 있다고 명시하지만, 대부분의 클라이언트(브라우저, API 게이트웨이)는 GET 요청의 본문을 무시한다
  • 서버에서 @RequestBody를 쓰더라도 요청 본문을 받을 수 없는 경우가 많다

(2) 캐싱이 안된다

  • GET 요청은 주로 캐싱이 가능해야한다
  • 하지만 본문이 포함되면 캐싱 로직이 깨질 수 있다

(3) HTTP 스펙 위반 가능

  • GET 요청의 목적은 데이터를 조회하는 것인데, 본문을 보내면 API 디자인이 RESTful 하지 않다
  • RESTful 원칙에서는 조회는 URL(쿼리 파라미터, PathVariable)로, 생성/수정은 본문을 통해 처리하는 것이 일반적이다

🔹그러면 데이터를 보내야할 때는?
1. 조회용이면 쿼리 파라미터(@RequestParam)이나 URL Path(@PathVariable) 사용
2. 본문 데이터가 필요하면 POST, PUT, PATCH 요청 사용

✅Example
1. 쿼리 파라미터 사용

@GetMapping("/products")
public List<Product? getProducts(@RequestParam String category){
	return productService.getProductsByCategory(category);
}

➡️ Get /products?category=book

  1. PathVariable 사용
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id){
	return userService.getUserById(id);
}

➡️ GET /users/123


🪼 정리

GET 요청에서 @RequestBody를 쓰는 것은 비추천한다!

GET 요청에서 데이터를 보내야 한다면, URL 파라미터로 전달하는 것이 RESTful한 설계 방식이다!!!!

0개의 댓글