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 |