2.3.3 Update Todo 구현

jaehyeok1230·2022년 11월 26일
0

퍼시스턴스 구현

TodoRepository를 사용한다. 업데이트를 위해 save(), findByUserId() 메서드를 사용한다.

서비스 구현

TodoService에 update() 메서드를 작성한다.

public List<TodoEntity> update(final TodoEntity entity) {
        // (1) 저장할 엔티티가 유효한지 확인한다.
        vaildate(entity);

        // (2) 넘겨받은 엔티티 id를 이용해 TodoEntity를 가져온다. 존재하지 않는 엔티티는 업데이트할 수 없기 때문이다.
        final Optional<TodoEntity> original = repository.findById(entity.getId());

        original.ifPresent(todo ->{
            // (3) 반환된 TodoEntity가 존재하면 값을 새 entity의 값으로 덮어 씌운다.
            todo.setTitle(entity.getTitle());
            todo.setDone(entity.isDone());

            // (4) 데이터베이스에 새 값을 저장한다.
            repository.save(todo);
        });

        // 유저의 모든 Todo 리스트를 리턴한다.
        return retrieve(entity.getUserId());
    }

컨트롤러 구현

TodoController에 새 PUT 메서드를 만들어주고 메서드 내부를 서비스 코드를 이용해 작성한다.

@PutMapping
    public ResponseEntity<?> updateTodo(@RequestBody TodoDTO dto) {

        String temporaryUserId = "temporary-user";  // temporary user id.

        // (1) TodoEntity로 변환한다.
        TodoEntity entity = TodoDTO.toEntity(dto);

        // (2) id를 temporaryUserId로 초기화한다.
        entity.setUserId(temporaryUserId);

        // (3) 서비스를 이용해 entity를 업데이트한다.
        List<TodoEntity> entities = service.update(entity);

        // (4) 자바 스트림을 이용해 리턴된 엔티티 리스트를 TodoDTO 리스트로 변환한다.
        List<TodoDTO> dtos = entities.stream().map(TodoDTO::new).collect(Collectors.toList());

        // (5) 변환된 TodoDTO 리스트를 이용해 ResponseDTO를 초기화한다.
        ResponseDTO<TodoDTO> response = ResponseDTO.<TodoDTO>builder().data(dtos).build();

        // (6) ResponseDTO를 리턴한다.
        return ResponseEntity.ok().body(response);
    }

테스팅

주의!! Retrieve와 마찬가지로 H2데이터베이스를 사용하고 있으니 프로그램을 다시 실행하면 이전에 데이터가 날라간다. 때문에 POST로 데이터를 생성 후에 업데이트를 해주어야 한다.

0개의 댓글