TodoRepository를 사용한다. 업데이트를 하기 위해서 delete(), findByUserId() 메서드를 사용한다.
TodoService에 delete() 메서드를 작성한다.
public List<TodoEntity> delete(final TodoEntity entity) {
// (1) 저장할 엔티티가 유효한지 확인한다.
vaildate(entity);
try {
// (2) 엔티티를 삭제한다.
repository.delete(entity);
} catch (Exception e) {
// (3) exception 발생 시 id와 exception을 로깅한다.
log.error("error deleting entity ", entity.getId(), e);
// (4) 컨트롤러로 exception을 날린다. 데이터베이스 내부 로직을 캡슐화하기 위해 e를 리턴하지 않고 새 exception 오브젝트를 리턴한다.
throw new RuntimeException("error deleting entity " + entity.getId());
}
// (5) 새 Todo 리스트를 가져와 리턴한다.
return retrieve(entity.getUserId());
}
TodoController에 새 DELETE 메서드를 만들어 주고 메서드 내부를 서비스 코드를 이용해 작성한다.
@DeleteMapping
public ResponseEntity<?> deleteTodo(@RequestBody TodoDTO dto) {
try {
String temporaryUserId = "temporary-user"; // temporary user id
// (1) TodoEntity로 변환한다.
TodoEntity entity = TodoDTO.toEntity(dto);
// (2) 임시 유저 아이디를 설정해준다.
entity.setUserId(temporaryUserId);
// (3) 서비스를 이용해 entity를 삭제한다.
List<TodoEntity> entities = service.delete(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);
} catch (Exception e) {
// (8) 혹시 예외가 나는 경우 dto 대신 error에 메시지를 넣어 리턴한다.
String error = e.getMessage();
ResponseDTO<TodoDTO> response = ResponseDTO.<TodoDTO>builder().error(error).build();
return ResponseEntity.badRequest().body(response);
}
}
주의!! Retrieve, Update와 마찬가지로 POST 메서드로 새 Todo 아이템을 생성하고 실행해야 한다.
요청 바디로 id만 명시한 것에 주의하자. 바디 전체를 보내도 상관 없지만 삭제할 Todo 아이템의 id만 보내도 된다. 어차피 다른 필드는 삭제를 위해 사용하지 않기 때문이다.