2.3.4 Delete Todo 구현

jaehyeok1230·2022년 11월 26일
0

퍼시스턴스 구현

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만 보내도 된다. 어차피 다른 필드는 삭제를 위해 사용하지 않기 때문이다.

0개의 댓글