잘하고싶따
181
2020-05-28 10:44:38 작성 2020-05-28 10:45:01 수정됨
2
454

@PatchMapping Spring boot JPA


@PatchMapping("/{account_id}")
public ResponseEntity<AccountDto> modAccount(@PathVariable Long account_id, @RequestBody @Valid AccountDto accountDto) {

Optional<AccountDto> maybeAccountDto = _accountService.modAccount(account_id, accountDto);

return maybeAccountDto.map(account -> ResponseEntity.status(HttpStatus.OK).body(account)).orElseGet(() -> ResponseEntity.badRequest().build());
}

아래는 Postman으로 보낸 요청입니다. 



아래는 바뀐 DB값


Patch는 Put과 다르게 보내지 않은 값은 변경되지 않고 보낸값만 바꾸는 걸로 알고 있는데

DB를 확인해보면 보내지 않은 값은 전부 Put처럼 null로 처리 됩니다. 제가 쓴 방법이 잘못된건지 ㅠㅠ


0
  • 답변 2

  • rebwon
    433
    2020-05-28 10:52:09
    JPA의 동작을 잘 모르셔서 이런 문제가 발생한 겁니다. JPA는 INSERT UPDATE를 실행할 때 엔티티 클래스의 모든 필드를 INSERT, UPDATE하게끔 되어있습니다. 그래서 Put이나 Patch를 할 때 수정 부분만 DB에 반영하고 싶다면, @DynamicUpdate와 @DynamicInsert를 엔티티 클래스 위에 붙여서 하셔야 합니다.
  • Dierslair
    5k
    2020-05-28 12:39:08
    HTTP규약이고 명세일 뿐입니다. 그렇게 동작하도록 하는건 본인의 코드에요
  • 로그인을 하시면 답변을 등록할 수 있습니다.