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를 넣는거다.