Spring

@RequestBody vs @RequestParam 비교

으엉어엉 2025. 3. 24. 18:30
728x90

Spring Boot에서는 클라이언트로부터 데이터를 전달받을 때 @RequestBody, @RequestParam, @PathVariable 등의 어노테이션을 사용합니다. 그 중에서도 @RequestBody와 @RequestParam은 어떤 것을 써야할지 고민이 됩니다.  둘의 특징을 생각해보고 결정을 해보고자 합니다.

 

 @RequestParam 특징 상세

1. 요청 파라미터 (Query Parameter) 수신

  • 주로 GET 요청의 ?key=value 형식이나 POST 폼 요청에서 사용됨.
  • 내부적으로 HttpServletRequest.getParameter("key")와 유사하게 동작.

 

2. 폼 전송 (application/x-www-form-urlencoded) 지원

  • <form> 태그에서 submit한 값들을 받을 때 유용.
  • 일반적인 HTML 폼 기반 로그인, 회원가입 등에서 자주 사용.

 

3. 단일 값 또는 소수의 값에 최적화

  • 문자열, 숫자 등 단순 데이터에 적합.
  • @RequestParam Map<String, String> 형태로 모든 쿼리파라미터를 받는 것도 가능.

 

4. required 옵션 사용 가능

  • @RequestParam(required = false)로 파라미터 필수 여부 지정 가능.
  • defaultValue도 지정 가능:
  • @RequestParam(defaultValue = "guest") String name

 

5. 자동 타입 변환 지원

  • 예: ?age=25 → int age로 자동 변환.
  • List<String> 같은 컬렉션도 ?tags=a&tags=b 형식으로 처리 가능.

 


 

@RequestBody 특징 상세

1. HTTP Body 전체 수신

  • 클라이언트가 전송한 Request Body 전체를 Java 객체로 매핑.
  • 주로 application/json 형식의 요청에서 사용.

2. 역직렬화 (Deserialization)

  • Spring 내부적으로 HttpMessageConverter가 작동하여 JSON → Java 객체로 변환.
  • Jackson 또는 Gson 라이브러리를 통해 처리됨.

3. 복잡한 데이터 구조 처리

  • 중첩된 객체, 리스트, 배열 등 복잡한 구조의 데이터를 받을 때 적합.
  • DTO 클래스를 만들어 사용해야 하며, 기본 생성자 + getter/setter 필수.

4. 파라미터 1개만 사용 가능

  • @RequestBody는 하나의 메서드 파라미터에만 적용 가능 (Request Body는 하나뿐이므로).
  • 여러 데이터가 필요한 경우 DTO 객체에 다 포함시켜야 함.

5. Content-Type이 중요

  • 요청의 Content-Type 헤더가 application/json이어야 제대로 매핑됨.
  • 설정이 다르면 400 Bad Request 에러 발생 가능.

6. POST, PUT, PATCH 요청에서 주로 사용

  • REST API에서 리소스를 생성하거나 수정할 때 사용됨.
  • 예: 회원가입, 글 작성, 상품 등록 등

 

 공통점

데이터 수신용 클라이언트 요청(request)으로부터 데이터를 컨트롤러로 전달받을 때 사용
 Controller 메서드 파라미터에 사용 둘 다 메서드의 파라미터에 붙여서 값을 바인딩
 주로 POST/GET에서 활용 HTTP 메서드 관계없이 사용 가능하지만, 사용하는 방식이 다름
 Spring이 자동 매핑 처리 Spring의 바인딩 기능으로 자동 변환 (예: JSON → 객체, 쿼리 파라미터 → 변수)

차이점 비교

 

용도 쿼리 파라미터, 폼 데이터(key=value 형식) 수신 JSON, XML 등 Request Body 데이터 수신
전달 형식 ?key=value 또는 form-data, x-www-form-urlencoded application/json, application/xml 등
사용 HTTP 방식 주로 GET, POST (form 전송 등) 주로 POST, PUT, PATCH (JSON 전송)
단일 파라미터/간단한 값 단일 값 또는 소수의 값 바인딩에 적합 복잡한 구조(객체, 리스트 등)에 적합
예시 /api?name=홍길동&age=30 { "name": "홍길동", "age": 30 }
바인딩 방식 key=value → 기본형/문자열/DTO로 바인딩 JSON → 객체(POJO)로 역직렬화(Deserialization)

 

1. @RequestParam 예시

@GetMapping("/hello") public String hello(@RequestParam String name, @RequestParam int age) { return "안녕하세요 " + name + "님, 나이: " + age; }
  • 호출 예시: GET /hello?name=홍길동&age=30

 

2. @RequestBody 예시

@PostMapping("/register") public String register(@RequestBody UserDto user) { return "등록 완료: " + user.getName(); }
// POST 요청 Body { "name": "홍길동", "email": "hong@example.com" }

 

정리 요약

상황어떤 걸 써야 할까?

 

쿼리 스트링 or 폼 전송 @RequestParam
JSON 데이터를 객체로 받을 때 @RequestBody
단일 파라미터, 간단한 값 @RequestParam
복잡한 데이터 구조 (DTO, 배열 등) @RequestBody

 

 부가 팁

  • @RequestParam은 기본적으로 required=true이므로, 생략 가능하도록 하려면 required = false를 지정해야 해요.
  • @RequestBody는 JSON 데이터를 Java 객체로 매핑하므로, DTO에 getter/setter가 있어야 정상 동작합니다.
  • @RequestBody는 한 메서드에 한 번만 사용 가능하지만, @RequestParam은 여러 개 사용 가능해요.

 

결론

  • 간단한 데이터 → @RequestParam
  • 복잡한 구조(JSON 등) → @RequestBody
728x90

'Spring' 카테고리의 다른 글

S3 Bucket 생성  (0) 2025.02.22
게시글, 댓글 , 좋아요 기능 구현  (0) 2025.02.22
Security - (3)  (0) 2024.12.14
Security - 2  (0) 2024.12.14
security (1) - 동작원리  (0) 2024.11.23