복붙노트

[SPRING] 스프링 MVC에서 RESTful 삭제를 처리하는 방법

SPRING

스프링 MVC에서 RESTful 삭제를 처리하는 방법

Spring MVC 컨트롤러에서 RESTful delete를 올바르게 사용하려면 어떻게해야합니까? 일부 항목을 삭제하려고하면 부울 값을 반환하는 DAO가 있습니다.

항목을 삭제하려고합니다. 모든 것이 정상이면 항목 목록 만 표시됩니다 (삭제 된 항목은 더 이상 존재하지 않음). 항목을 삭제할 수없는 경우 세부 정보 페이지로 리디렉션하고 삭제할 수없는 이유를 말합니다.

특별한 응답 상태 또는 이와 비슷한 것이 필요합니까? 나의 접근 방식은 충분합니까?

@RequestMapping(value = "items/{id}", method = RequestMethod.DELETE)
public String delete(@PathVariable("id") int itemId, Model model) {
    Item item = itemDao.get(id);

    // true -> can delete
    // false -> cannot delete, f.e. is FK reference somewhere
    boolean wasOk = itemDao.delete(item); 

    if (wasOk) {
        return "redirect:/items";
    }

    // will write to user which item couldn't be deleted
    model.addAttribute("item", item);
    return "items/error";
}

해결법

  1. ==============================

    1.삭제와 관련된 문제가 사용자가 고칠 수있는 경우에는 괜찮습니다. 사용자가 할 수있는 일이 없으면 오류 코드 상태가 더 정확할 수 있습니다. 내가 삭제에 대해 상상할 수있는 유일한 실패는 401이 될 인증 실패 일 것입니다.이 메소드는 'HttpServletResponse response'에 매개 변수를 추가하여 설정할 수 있습니다. 귀하의 코드는 다음과 같습니다.

    삭제와 관련된 문제가 사용자가 고칠 수있는 경우에는 괜찮습니다. 사용자가 할 수있는 일이 없으면 오류 코드 상태가 더 정확할 수 있습니다. 내가 삭제에 대해 상상할 수있는 유일한 실패는 401이 될 인증 실패 일 것입니다.이 메소드는 'HttpServletResponse response'에 매개 변수를 추가하여 설정할 수 있습니다. 귀하의 코드는 다음과 같습니다.

    @RequestMapping(value = "items/{id}", method = RequestMethod.DELETE)
    public String delete(@PathVariable("id") int itemId, Model model, HttpServletReponse response) {
        Item item = itemDao.get(id);
    
        // true -> can delete
        // false -> cannot delete, f.e. is FK reference somewhere
        boolean wasOk = itemDao.delete(item); 
    
        if (!wasOk) {
            // will write to user which item couldn't be deleted
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            model.addAttribute("item", item);
            return "items/error";   
        }
    
        return "redirect:/items";
    }
    

    다른 상태 코드를 적절하게 대체 할 수는 있지만 일반적인 생각입니다.

    당신은 또한 다음과 같은 것을 할 수 있습니다 :

        if (!wasOk) {
            throw new DataAccessException("Unable to delete item: " + item);
        }
    

    그런 다음 같은 클래스에 주석 처리기가 있습니다.

    @ExceptionHandler(DataAccessException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public String handleDataAccessException(DataAccessException ex) {
        // Do some stuff
        return "errorView";
    }
    
  2. ==============================

    2.리디렉션이 아닌 삭제 작업의 성공 여부를 나타 내기 위해 HTTP 상태 코드를 사용해야합니다. 예를 들어 작업이 성공적으로 수행되었음을 나타내는 HTTP 200 OK (또는 HTTP 204 No Content)와 액세스하려는 리소스가 존재하지 않으면 HTTP 404 Not Found, 삭제 작업이 허용되지 않는 경우 HTTP 405 Method Not Allowed, 응답 상태에 따라 클라이언트는 참조 된 리소스 (사용자의 경우 item / {id}가 참조하는 객체)를 유지할지 여부를 결정할 수 있습니다.

    리디렉션이 아닌 삭제 작업의 성공 여부를 나타 내기 위해 HTTP 상태 코드를 사용해야합니다. 예를 들어 작업이 성공적으로 수행되었음을 나타내는 HTTP 200 OK (또는 HTTP 204 No Content)와 액세스하려는 리소스가 존재하지 않으면 HTTP 404 Not Found, 삭제 작업이 허용되지 않는 경우 HTTP 405 Method Not Allowed, 응답 상태에 따라 클라이언트는 참조 된 리소스 (사용자의 경우 item / {id}가 참조하는 객체)를 유지할지 여부를 결정할 수 있습니다.

    Spring을 사용하고 있기 때문에 컨트롤러 메소드에 적절한 @ResponseStatus를 사용하여 주석을 달 수 있습니다. @ResponseStatus (값 = HttpStatus.NO_CONTENT)

    또한 Spring HandlerExceptionResol은 이미 기본적으로 일부 상태 코드를 제공합니다.

  3. from https://stackoverflow.com/questions/10340599/how-to-handle-restful-delete-in-spring-mvc by cc-by-sa and MIT license