Spring Boot를 이용한 RESTful Web Services 개발 #14 HTTP Status Code 제어

jakeseo_me·2021년 9월 16일
0

Spring-boot-restful

목록 보기
14/17

HTTP Status Code 제어

명확한 HTTP Status Code 사용의 중요성

보통 REST API를 구성할 때, 범하는 실수가 요청이 성공했을 때 단순 HTTP 응답에서 상태 코드로 200 OK만 반환하는 것이다.

200 OK로 물론 해당 요청이 성공했음을 알 수는 있지만, 정확히 어떠한 결과를 낳았는지 알기 어려울 때가 있다.

2xx 코드의 종류

2xx코드의 종류는 아래와 같다.

  • 201 Created (새로운 리소스가 생성됨)
    • 요청 성공 후에 새로운 리소스가 생성된 경우이다.
    • 보통 생성된 리소스는 응답의 Location 헤더 필드로 식별한다.
  • 202 Accepted (요청 접수가 완료됐지만, 예약된 시간에 실행될 것임)
    • 즉시 어떠한 행동을 하지 않고 스케쥴링된 시간에 행위를 하겠다는 의미이다.
    • 이를테면 1시간 뒤에 배치 처리를 하겠다는 명령이 될 수 있다.
  • 204 No Content (서버가 요청을 성공적으로 수행했지만, 응답 페이로드 본문에 보낼 데이터가 없음)
    • 요청에 대한 응답은 성공적이지만, 딱히 성공으로 인해 생성된 데이터 등을 보낼 이유가 없을 때이다.
    • 이를테면 사용자 정보 수정 페이지에서 사용자 정보가 수정되었을 때, 화면에 이미 수정된 사용자 정보가 나와있다면, 굳이 반환해줄 이유가 없다.

물론 실제 개발 환경에서는 모든 개발팀이 규약을 정하고 정해진 규칙대로 코드를 사용하는 것이 가장 이상적이다.

UserController 소스코드 수정하기

addUser()

    @PostMapping("")
    // @RequestBody: HTTP 요청 Body 영역에 User 객체가 올 것이다.
    public ResponseEntity<User> addUser(@RequestBody User user) {
        User savedUser = service.save(user);

        URI location = ServletUriComponentsBuilder.fromCurrentRequest()
                .path("/{id}")
                .buildAndExpand(savedUser.getId())
                .toUri();

        return ResponseEntity.created(location).build();
    }

기존에는 단순히 User를 생성만 했다면, 이번에는 동작이 조금 바뀌었다.

  • 유저 생성
  • ServletUriComponentBuilderlocation에 사용될 URI 생성
  • ResponseEntity 객체를 통해 HTTP Status code 201(created())로 응답하고 어떤 리소스가 생성되었는지 location도 헤더를 통해 올바르게 반환하였다.

결과 살펴보기

올바르게 201 Created로 응답이 오고, location에 우리가 생성한 리소스에 접근하는 경로까지 출력해준다.

ResponseEntity 메소드 살펴보기

ResponseEntity 객체에서는 created(201) 뿐만 아니라, accepted(202), noContent(204), badRequest(400), internalServerError(500), notFound(404) 등 자주 쓰이는 상태코드를 가독성 좋은 메소드로 제공한다.

profile
대전에서 풀스택 웹개발자로 일하고 있는 Jake Seo입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. 프론트엔드: Javascript, React 백엔드: Spring Framework에 관심이 있습니다.

0개의 댓글