이전 프로젝트에서는 프론트에서 변경되지 않은 부분도 한번 더 보내서 다시 저장을 하면됐는데, 이번에는 프론트에서 변경되는 부분만 보내주는 걸로 협의했다.
JudgementController
@Operation(summary = "롤문철 수정", description = "dto중 변경된 값만 업데이트")
@PutMapping("/update/{id}")
public ResponseEntity<Judgement> update_judgement(@RequestHeader(value = "Authorization") String token, @PathVariable Long id, @RequestBody JudgementUpdateDTO judgementUpdateDTO){
String access_token = get_access_token(token);
return new ResponseEntity<>(judgementService.update_judgement(access_token, id, judgementUpdateDTO), HttpStatus.OK);
}
JudgementService
public Judgement update_judgement(String access_token, Long id, JudgementUpdateDTO judgementUpdateDTO){
Member member = find_member(access_token);
Judgement judgement = judgementRepository.findById(id).orElseThrow(() ->
new IllegalArgumentException("해당 회원이 존재하지않습니다.")
);
if(judgement.getMember().equals(member)){
if(judgementUpdateDTO.getOutline() != null){
judgement.setOutline(judgementUpdateDTO.getOutline());
}
if(judgementUpdateDTO.getMyOp() != null){
judgement.setMyOp(judgementUpdateDTO.getMyOp());
}
if(judgementUpdateDTO.getYourOp() != null){
judgement.setYourOp(judgementUpdateDTO.getYourOp());
}
return judgementRepository.save(judgement);
}
throw new IllegalArgumentException("잘못된 요청입니다(본인의 게시물이 아닙니다)");
}
}
변경되지 않은 컬럼은 원래 저장된 값에서 추출하여 dto에 저장한 후, 저장하는 방식이다.
@DynamicUpdate
업데이트 기능과는 상관없지만, 검색을 하던 와중 신기한 애노테이션을 발견했다.
JPA를 이용하면 엔티티의 상태를 변경하기만 해도 update 쿼리를 실행시킨다. 이때 발생하는 쿼리는 모든 컬럼을 대상으로 update를 실행한다. 하지만 @DynamicUpdate애노테이션을 사용하면 해당 컬럼만 update가 실행된다. 컬럼이 많을 때나 동시성 이슈가 발생할 때 사용하면 좋다.
'개발' 카테고리의 다른 글
[SpringBoot] Custom Exception (0) | 2023.09.26 |
---|---|
[JPA] 양방향 매핑 순환참조 문제 (0) | 2023.09.07 |
[Mysql] orphanRemoval vs CascadeType.REMOVE (0) | 2023.08.28 |
[스프링부트] Querydsl 쿼리문 작성 (닉네임 공백, 대소문자) (0) | 2023.08.21 |
[Riot Developer] 스프링부트에서 Riot API로 데이터 추출 (0) | 2023.08.16 |