작성
·
361
0
*UserController
@GetMapping("/users/{id}")
public EntityModel<User> retrieveUser(@Parameter(description = "사용자 ID", required = true, example = "1") @PathVariable int id) {
User user = service.findOne(id);
if (user == null) {
throw new UserNotFoundException("id-" + id);
}
EntityModel entityModel = EntityModel.of(user);
WebMvcLinkBuilder linkTo = linkTo(methodOn(this.getClass()).retrieveAllUsers());
entityModel.add(linkTo.withRel("all-users")); // http://127.0.0.1:8080/users
try {
return entityModel;
} catch (Exception ex) {
throw new RuntimeException();
}
}
@PostMapping("/users")
public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
User savedUser = service.save(user);
URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(savedUser.getId())
.toUri();
return ResponseEntity.created(location).build();
}
두 클래스가 비슷하게 느껴져서 질문드립니다.
EntityModel 클래스는 Spring HATEOAS에서 지원하는 클래스로 위의 코드로 특정 사용자 정보를 조회하면서 동시에 관련 리소스로 쉽게 이동할수 있는 링크를 제공을 도와주는 클래스고
ResponseEntity클래스는 Spring MVC에서 지원하는 클래스로 HTTP 응답을 제어할 수 있도록 도와주며, 상태 코드, 헤더, 바디 등을 포함할수 있게 도와주는 클래스다. 라고 이해하면될까요 ??
그렇기 때문에 Get에서는 해당 자원에 대한 추가적인 리소스를 제공하기 위해 EntityModel을 사용하고 Post에는 해당자원의 생성에 대한 201 상태코드를 제공하고 해당자원에 위치를 제공하기위해 ResponseEntity를 사용한것 인가요??
Post에도 반환 값으로 EntityModel을 사용을 하는 경우도 있을까요??
찾아보니 ResponseEntity<EntityModel<User>> 이렇게 사용하게 되는 경우 상태 코드와 함께 EntityModel<User>를 응답 본문으로 반환이 가능하다고 하는데 그렇다면 함께 사용하는 것이 데이터의 표현과 응답의 정확성을 높여줄것으로 예상이 되는데 이렇게 사용도 자주하는지 궁금합니다!
답변 2
0
안녕하세요, 이도원입니다.
말씀하신 내용처럼 Spring Boot에서는 ResponseEntity를 통해 클라이언트 요청에 대한 결과 데이터와 상태 등을 전달해 줄 수 있으며, EntityModel은 RepresentationModel의 하위 클래스로써, 반환하려는 데이터를 EntityModel로 Wrapping하면 Spring HATEOAS가 자동으로 표준 링크(ex, _self)를 포함시킬 수 있습니다.
추가로, 아래와 같이 POST 방식에서도 EntityModel을 사용하실 수 있습니다. 아래 예제에서는 회원 가입 후, 상세 보기를 하기 위해 URI를 제공하도록 작성되었습니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
김준태 님의 질문에 대해 설명드리겠습니다.
EntityModel과 ResponseEntity의 차이와 사용 이유: 말씀하신 대로, EntityModel
은 Spring HATEOAS에서 제공하는 클래스로, 특정 자원에 대한 정보와 함께 추가적인 관련 리소스에 대한 링크를 제공하는 데 사용됩니다. 이는 API를 사용하는 클라이언트가 관련 자원으로 쉽게 네비게이션할 수 있도록 도와줍니다. 반면, ResponseEntity
는 Spring MVC에서 제공하는 클래스로, HTTP 응답의 상태 코드, 헤더, 바디 등을 제어할 수 있게 해줍니다. Get 요청에서 EntityModel
을 사용한 것은 말씀하신 이유로 맞으며, Post 요청에서 ResponseEntity
를 사용한 것은 생성된 자원에 대한 HTTP 상태 코드(예: 201 Created)와 URI를 클라이언트에게 제공하기 위함입니다.
Post 요청에서 EntityModel 사용: 실제 시나리오에 따라 Post 요청에서도 EntityModel
을 반환할 수 있습니다. 예를 들어, 자원이 생성된 직후, 그 자원에 대한 상세 정보와 함께 관련 리소스로의 링크를 제공하고자 할 때 사용할 수 있습니다.
ResponseEntityEntityModel
을 통해 얻은 데이터와 관련 리소스에 대한 링크 정보를 활용할 수 있어 API 사용성이 크게 향상됩니다. 이는 특히 RESTful API를 설계할 때 중요한 부분으로, 클라이언트에게 더 많은 컨텍스트와 편의성을 제공합니다.
이러한 주제에 대한 더 자세한 정보와 예제는 다음 링크에서 확인할 수 있습니다:
- ResponseEntity와 HttpEntity
- HATEOAS질문드립니다
정리하자면, EntityModel
과 ResponseEntity
는 각자의 목적에 맞게 사용됩니다. EntityModel
은 클라이언트가 해당 리소스와 연관된 다른 리소스로 쉽게 이동할 수 있도록 링크 정보를 제공하는 데 사용되며, ResponseEntity
는 HTTP 응답의 상세한 제어(상태 코드, 헤더 등)가 필요할 때 사용됩니다. 하나의 응답에서 두 클래스의 장점을 모두 활용하기 위해 함께 사용하는 것도 흔한 패턴입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.