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로 데이터를 생성 후에 업데이트를 해주어야 한다.