@RestController
@RequestMapping("/v1/coffees")
public class CoffeeController {
private final Map<Long, Map<String, Object>> coffees = new HashMap<>();
.
.
.
@PatchMapping("/{coffee-Id}")
public ResponseEntity updateCoffee(@PathVariable("coffee-Id") long coffeeId,
@RequestParam("korName") String korName,
@RequestParam("price") long price)
{
Map<String, Object> coffee = coffees.get(coffeeId);
coffee.put("korName", korName);
coffee.put("price", price);
coffees.put(coffeeId, coffee);
return new ResponseEntity<>(coffee, HttpStatus.OK);
}
@DeleteMapping("/remove/{coffee-Id}")
public ResponseEntity removeCoffee(@PathVariable("coffee-Id") long coffeeId) {
coffees.remove(coffeeId);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
}
위의 코드에서는 korName과 price만을 @RequestParam 어노테이션을 이용해 파라미터 값을 받았다.
@PatchMapping("/{coffee-Id}")
public ResponseEntity updateCoffee(@PathVariable("coffee-Id") long coffeeId,
@RequestParam("korName") String korName,
@RequestParam("price") long price,
@RequestParam("engName") String engName)
{
Map<String, Object> coffee = coffees.get(coffeeId);
coffee.put("korName", korName);
coffee.put("price", price);
coffe.put("engName", engName);
coffees.put(coffeeId, coffee);
return new ResponseEntity<>(coffee, HttpStatus.OK);
사용자가 수정하길 원하는 커피정보를 선택적으로 수정하도록 구현하고 싶어 기본키인 coffeeId를 제외하고 모든 파라미터값을 가져왔다. 하지만 @RequestParam을 통해 가져온 파라미터 값을 모두 요청에 입력하지 않으면 다음과 같이 400 Bad Request 에러가 발생하였다.
위 오류를 해결하고자 알아본 결과로 @RequestParam 어노테이션은 required 조건이 없으면 기본적으로 true로 필수 파라미터이다. 따라서 @RequestParam에 명시한 요청 파라미터가 존재하지 않을 경우 400 Error를 웹 브라우저에게 전송하게 된다. 내가 원하는 것은 사용자가 선택해서 원하는 정보를 수정하는 것 이기 때문에 required 속성값을 false로 바꿔준다면 문제가 해결될 것이다.
public ResponseEntity updateCoffee(@PathVariable("coffee-Id") long coffeeId,
@RequestParam(value = "korName" ,required = false) String korName,
@RequestParam(value = "price" , required = false) Long price,
@RequestParam(value = "engName", required = false)String engName) {
Map<String, Object> coffee = coffees.get(coffeeId);
if(korName != null) {
coffee.put("korName", korName);
}
if(price != null) {
coffee.put("price", price);
}
if(engName != null) {
coffee.put("engName", engName);
}
coffees.put(coffeeId, coffee);
return new ResponseEntity<>(coffee, HttpStatus.OK);
}
이와 같이 코드를 변경해 주니 정상적으로 작동되는 모습을 보인다.