Blue Chicken - The Legend Of Zelda
본문 바로가기

개인공부

[JAVA, POSTMAN, ANNOTATION] @RequestBody, @RequestParam 테스트 시 차이점

 

  • @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);
    }