본문 바로가기

개발

[Springboot] 롤문철 업데이트 기능 + @DynamicUpdate

이전 프로젝트에서는 프론트에서 변경되지 않은 부분도 한번 더 보내서 다시 저장을 하면됐는데, 이번에는 프론트에서 변경되는 부분만 보내주는 걸로 협의했다.

 

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가 실행된다. 컬럼이 많을 때나 동시성 이슈가 발생할 때 사용하면 좋다.