1. ResponseEntity란?
- Spring Framework에서 제공하는 클래스 중 HttpEntity라는 클래스가 존재한다.
- 이것은 HTTP 요청(Request) 또는 응답(Response)에 해당하는 HttpHeader와 HttpBody를 포함하는 클래스이다.
public class HttpEntity<T> {
private final HttpHeaders headers;
@Nullable
private final T body;
}
public class RequestEntity<T> extends HttpEntity<T>
public class ResponseEntity<T> extends HttpEntity<T>
- HttpEntity 클래스를 상속받아 구현한 클래스가 RequestEntity, ResponseEntity 클래스이다.
- ResponseEntity는 사용자의 HttpRequest에 대한 응답 데이터를 포함하는 클래스이다.
- 따라서 HttpStatus, HttpHeaders, HttpBody를 포함한다.
2. ResponseEntity 생성자 사용법
2-1. HttpStatus 코드
ResponseEntity<Object> responseEntity = new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
2-2. 객체, HttpStatus 코드
ResponseEntity<Taco> tacoResponseEntity = new ResponseEntity<>(new Taco(), HttpStatus.OK);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("TEST", "MYTEST");
ResponseEntity<Taco> tacoResponseEntity
= new ResponseEntity<>(new Taco(), headers, HttpStatus.OK);
3. EntityModel
- ResourceSupport → RepresentationModel
- Resource → EntityModel
- Resources → CollectionModel
- PagedResources → PagedModel
3.1 EntityModel 사용법
public static <T> EntityModel<T> of(T content, Link... links) {
return of(content, (Iterable)Arrays.asList(links));
}
EntityModel<Taco> model = EntityModel.of(taco.orElse(null),
linkTo(methodOn(this.getClass()).recentTacos()).withRel("recents"));
3.2 CollectionModel 사용법
public static <T> CollectionModel<T> of(Iterable<T> content, Link... links) {
return of(content, (Iterable)Arrays.asList(links));
}
@GetMapping("/recent")
public CollectionModel<EntityModel<Taco>> recentTacos() {
PageRequest page = PageRequest.of(0, 12, Sort.by("createdAt").descending());
List<Taco> tacos = tacoRepository.findAll(page).getContent();
// HATEOS -> 링크추가 (REST API Level 3)
List<EntityModel<Taco>> entityModels = tacos.stream().map(
taco -> {
return EntityModel.of(taco, linkTo(methodOn(DesignTacoRestController.class).tacoById(taco.getId())).withSelfRel());
}
).collect(Collectors.toList());
return CollectionModel.of(entityModels,
linkTo(methodOn(DesignTacoRestController.class).recentTacos()).withRel("recents"));
}