전체 보기
🍀

ResponseEntity.Created 와 location필드

작성일자
2023/10/17
태그
DIARY_DEVELOP
프로젝트
FIS
책 종류
1 more property

ResponseEntity.Created 와 location필드

ResponseEntity 반환 객체는 Created()과 같은 뒤에 붙는 메소드에 따라 response 타입이 결정되는데, created로 할 경우 201 응답코드를 반환한다.
우선 근본적으로 응답코드를 쓰는 이유는 뭘까?
클라이언트단에서 정상적으로 처리되었는지의 유무를
별도의 필드(ex. success:ok) 없이도 알 수 있게 되어
불필요한 네트워크 트래픽을 감소할 수 있기 때문이다.
그럼 더 나아가서 201 응답코드를 보낼 때 header에 Location 필드를 같이 보내는 이유는 뭘까?
이 역시 클라이언트와의 소통을 위한 것으로
클라이언트가 POST 요청에 대한 성공을 인지한 후
해당 필드에 들어있는 URI(ex. http://localhost:8080/users/1)로 요청을 보내면 상세정보를 확인할 수 있게 하기 위함이다.
이를 통해 id를 responseBody에 담아보낼 필요가 없다.
이전에 통상적인 통신 규칙을 잘 모를 때 아래와 같이 api를 구현한 적이 있다. (잘못된 예입니다!)
// 청소 기록하기 @PostMapping("{beachId}") public ResponseEntity<IdResponse> saveRecord (@AuthenticationPrincipal PrincipalDetails userDetails, @PathVariable("beachId") Long beachId, @Valid RecordSaveRequest request) throws IOException { Long recordId = recordService.saveRecord(userDetails.getMember().getId(), request, beachId); IdResponse response = IdResponse.builder() .id(recordId) .build(); return ResponseEntity.status(HttpStatus.OK).body(response); }
Java
복사
ㅋㅋㅋㅋㅋ,,,, 200을 보내고 id는 직접 dto로 만들어 보냈다,,,
그래도 id를 보내긴 했으니,,
그렇지만 Spring 공식 문서에 보면 아래와 같은 예시 코드를 보여준다. (올바른 예입니다)
// Can also be used in Spring MVC, as the return value from a @Controller method: @RequestMapping("/handle") public ResponseEntity<String> handle() { URI location = ...; HttpHeaders responseHeaders = new HttpHeaders(); responseHeaders.setLocation(location); responseHeaders.set("MyResponseHeader", "MyValue"); return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED); } // Or, by using a builder accessible via static methods: @RequestMapping("/handle") public ResponseEntity<String> handle() { URI location = ...; return ResponseEntity.created(location).header("MyResponseHeader", "MyValue").body("Hello World"); }
Java
복사
예시가 두 개 있긴 한데, 핵심은 responseHeader에 location이란 필드를 넣는 거다.
그리고 location이란 필드에ㄹ 생성된 값을 확인할 수 있는 uri를 넣는거다.