- @RequestBody: JSON 형식으로 복잡한 객체를 전달받을 때 사용. 일부 필드만 포함된 JSON을 전달해도 문제없이 매핑됩니다.
- @RequestParam: 단일 값 또는 여러 개의 개별 파라미터를 전달받을 때 사용. 이 방법은 간단한 파라미터 처리에 유용합니다.
`@RequestParam`과 `@RequestBody`는 서로 다른 방식으로 HTTP 요청 데이터를 처리하는 어노테이션이기 때문에, 같은 메소드에서 둘을 섞어서 사용할 수 있습니다.
하지만, 특정한 상황에 따라 이 두 어노테이션의 조합이 유용할 수 있습니다.
### `@RequestParam`과 `@RequestBody`의 차이점
- **`@RequestParam`**:
- URL 쿼리 파라미터, Form 데이터, 혹은 URL 경로 변수에서 데이터를 추출합니다.
- 주로 단순한 키-값 쌍의 데이터를 처리하는 데 사용됩니다.
- 예: `/profile?userId=someUserId`
- **`@RequestBody`**:
- HTTP 요청의 본문(body)에서 JSON, XML, 또는 다른 형식의 데이터를 추출하여 객체로 변환합니다.
- 주로 복잡한 객체 데이터를 처리하는 데 사용됩니다.
- 예: `{ "userId": "someUserId", "name": "John Doe" }`
### 함께 사용 예시
이 두 가지 어노테이션을 함께 사용하려는 경우, 다음과 같은 상황이 있을 수 있습니다:
- `@RequestBody`로 복잡한 JSON 객체를 받고, `@RequestParam`으로 단순한 쿼리 파라미터를 추가로 받고 싶을 때.
### 예시: `@RequestParam`과 `@RequestBody`의 조합
```java
@PostMapping("/profile")
public Response<User> profile(@RequestParam("includeDetails") boolean includeDetails,
@RequestBody User user) {
if (includeDetails) {
// user 객체에 추가적인 정보를 채우는 로직
user.setRole("user");
user.setStatus("active");
}
// 로직 처리 후 응답
return new Response<>(true, "User profile processed", user);
}
```
### 요청 예시:
#### URL:
```
/profile?includeDetails=true
```
#### HTTP 요청 본문 (JSON):
```json
{
"userId": "someUserId",
"name": "John Doe"
}
```
### 결과:
- `@RequestParam("includeDetails") boolean includeDetails`는 URL 쿼리 스트링에서 `includeDetails` 값을 추출합니다.
- `@RequestBody User user`는 HTTP 요청 본문에서 JSON 데이터를 `User` 객체로 매핑합니다.
이 방법을 사용하면, 쿼리 파라미터로 일부 설정이나 옵션을 추가하고, 본문으로 객체 데이터를 전송하는 등의 다양한 시나리오를 구현할 수 있습니다.
### 결론
- **함께 사용 가능**: `@RequestParam`과 `@RequestBody`는 동일한 메소드에서 함께 사용할 수 있으며, 서로 다른 종류의 데이터를 처리할 때 유용합니다.
- **적절한 상황**: 각 어노테이션의 사용 목적에 맞게 잘 활용하면, 더 유연하고 강력한 API를 만들 수 있습니다.
이 조합을 통해 클라이언트가 전송하는 데이터를 더욱 명확하고 구조적으로 처리할 수 있습니다.
코드 1과 코드 2의 차이
- 첫 번째 코드는 application/x-www-form-urlencoded 방식이나 쿼리 스트링 파라미터로 데이터를 전송할 때 유효합니다.

- 두 번째 코드는 JSON 데이터를 @RequestBody로 받아야 하며, 클라이언트에서 JSON 형식으로 데이터를 보내야 합니다.

// 코드 1
@PostMapping("/usercreate")
public Response<User> userCreate(@RequestParam("user_id") String userId,
@RequestParam("pass") String rawPassword,
@RequestParam("name") String name,
@RequestParam("etc") String etc) {
User user = new User();
user.setUserId(userId);
user.setPass(rawPassword);
user.setName(name);
user.setEtc(etc);
user = userService.createUser(user);
return new Response<>(true, "User created successfully", user);
}
// 코드 2
@PostMapping("/usercreate")
public Response<User> userCreate(@RequestBody User user) {
user = userService.createUser(user);
return new Response<>(true, "User created successfully", user);
}
'개인공부' 카테고리의 다른 글
| JSX, REACT (0) | 2025.01.09 |
|---|---|
| 데이터 타입, 데이터 구조 (0) | 2025.01.07 |
| [mybatis]db와 java에서 필드명이 다를때 (2) | 2024.08.15 |
| [java]제네릭 타입, 여러가지 객체를 담을 수 있는 타입으로 공통적으로 쓰일 response 만들기 (0) | 2024.08.15 |
| [vuetify]class="text-xs-center" 는 vuetify 1에서 사용하던것 (1) | 2024.08.11 |