인프런 커뮤니티 질문&답변

김준태님의 프로필 이미지
김준태

작성한 질문수

[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발

EntityModel과 ResponseEntity의 차이

작성

·

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 응답을 제어할 수 있도록 도와주며, 상태 코드, 헤더, 바디 등을 포함할수 있게 도와주는 클래스다. 라고 이해하면될까요 ??

 

  1. 그렇기 때문에 Get에서는 해당 자원에 대한 추가적인 리소스를 제공하기 위해 EntityModel을 사용하고 Post에는 해당자원의 생성에 대한 201 상태코드를 제공하고 해당자원에 위치를 제공하기위해 ResponseEntity를 사용한것 인가요??

  2. Post에도 반환 값으로 EntityModel을 사용을 하는 경우도 있을까요??

  3. 찾아보니 ResponseEntity<EntityModel<User>> 이렇게 사용하게 되는 경우 상태 코드와 함께 EntityModel<User>를 응답 본문으로 반환이 가능하다고 하는데 그렇다면 함께 사용하는 것이 데이터의 표현과 응답의 정확성을 높여줄것으로 예상이 되는데 이렇게 사용도 자주하는지 궁금합니다!

 

 

답변 2

0

Dowon Lee님의 프로필 이미지
Dowon Lee
지식공유자

안녕하세요, 이도원입니다.

말씀하신 내용처럼 Spring Boot에서는 ResponseEntity를 통해 클라이언트 요청에 대한 결과 데이터와 상태 등을 전달해 줄 수 있으며, EntityModel은 RepresentationModel의 하위 클래스로써, 반환하려는 데이터를 EntityModel로 Wrapping하면 Spring HATEOAS가 자동으로 표준 링크(ex, _self)를 포함시킬 수 있습니다.

추가로, 아래와 같이 POST 방식에서도 EntityModel을 사용하실 수 있습니다. 아래 예제에서는 회원 가입 후, 상세 보기를 하기 위해 URI를 제공하도록 작성되었습니다.

image

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

김준태 님의 질문에 대해 설명드리겠습니다.

  1. EntityModel과 ResponseEntity의 차이와 사용 이유: 말씀하신 대로, EntityModel은 Spring HATEOAS에서 제공하는 클래스로, 특정 자원에 대한 정보와 함께 추가적인 관련 리소스에 대한 링크를 제공하는 데 사용됩니다. 이는 API를 사용하는 클라이언트가 관련 자원으로 쉽게 네비게이션할 수 있도록 도와줍니다. 반면, ResponseEntity는 Spring MVC에서 제공하는 클래스로, HTTP 응답의 상태 코드, 헤더, 바디 등을 제어할 수 있게 해줍니다. Get 요청에서 EntityModel을 사용한 것은 말씀하신 이유로 맞으며, Post 요청에서 ResponseEntity를 사용한 것은 생성된 자원에 대한 HTTP 상태 코드(예: 201 Created)와 URI를 클라이언트에게 제공하기 위함입니다.

  2. Post 요청에서 EntityModel 사용: 실제 시나리오에 따라 Post 요청에서도 EntityModel을 반환할 수 있습니다. 예를 들어, 자원이 생성된 직후, 그 자원에 대한 상세 정보와 함께 관련 리소스로의 링크를 제공하고자 할 때 사용할 수 있습니다.

  3. ResponseEntity> 사용 고려: 이 형태의 사용은 단지 가능한 것이 아니라 매우 권장되는 패턴의 하나로 볼 수 있습니다. 이 방식을 사용함으로써, 클라이언트는 HTTP 상태 코드와 헤더 정보를 통해 응답의 메타 데이터를 파악할 수 있고, EntityModel을 통해 얻은 데이터와 관련 리소스에 대한 링크 정보를 활용할 수 있어 API 사용성이 크게 향상됩니다. 이는 특히 RESTful API를 설계할 때 중요한 부분으로, 클라이언트에게 더 많은 컨텍스트와 편의성을 제공합니다.

이러한 주제에 대한 더 자세한 정보와 예제는 다음 링크에서 확인할 수 있습니다:
- ResponseEntity와 HttpEntity
- HATEOAS질문드립니다

정리하자면, EntityModelResponseEntity는 각자의 목적에 맞게 사용됩니다. EntityModel은 클라이언트가 해당 리소스와 연관된 다른 리소스로 쉽게 이동할 수 있도록 링크 정보를 제공하는 데 사용되며, ResponseEntity는 HTTP 응답의 상세한 제어(상태 코드, 헤더 등)가 필요할 때 사용됩니다. 하나의 응답에서 두 클래스의 장점을 모두 활용하기 위해 함께 사용하는 것도 흔한 패턴입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김준태님의 프로필 이미지
김준태

작성한 질문수

질문하기