개발 등/SPRING

Spring HATEOAS with Spring Boot >= 2.2

darkhorizon 2023. 4. 29. 14:55
728x90
반응형

HATEOAS(Hypermedia As The Engine Of Application State)란 REST API를 사용하는 클라이언트가 서버와 동적으로 상호작용이 가능하도록 하는 것이다.

간단히 말하면첫째 Hypermedia를 통해서 애플리케이션의 상태 전이가 가능해야 한다.둘째 Hypermedia를 통해서 자기 자신에 대한 정보가 있어야 한다.

 

이를 사용하기 위해 Spring HATEOAS 를 의존성에 추가해야 한다.

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>

 

사용법은 Spring Boot 2.2 이상과 그 미만의 버전에서 달리한다.

여기에서는 2.2 이상을 기준으로 설명한다.

 

    @PostMapping()
    public ResponseEntity createEvent(@RequestBody @Valid EventDto eventDto, Errors errors) {
        if (errors.hasErrors()) {
            return ResponseEntity.badRequest().body(errors);
        }
        eventValidator.validate(eventDto,  errors);
        if (errors.hasErrors()) {
            return ResponseEntity.badRequest().body(errors);
        }
        Event event = modelMapper.map(eventDto, Event.class);
        event.update();
        Event savedEvent = this.eventRepository.save(event);
        WebMvcLinkBuilder selfLinkBuilder = linkTo(EventController.class).slash(savedEvent.getId());
        URI uri = selfLinkBuilder.toUri();
        EntityModel<Event> entityModel = EntityModel.of(savedEvent);
        entityModel.add(linkTo(EventController.class).withRel("query-events"));
        entityModel.add(linkTo(EventController.class).withRel("update-event"));
        entityModel.add(linkTo(EventController.class).withSelfRel());
        return ResponseEntity.created(uri).body(entityModel);
    }

 

그럼 다음과 같은 응답값을 확인할 수 있다.

  {
    "id": 1,
    "name": "spring",
    "description": "Rest api developement",
    "beginEnrollmentDateTime": "2023-04-12T13:22:00",
    "closeEnrollmentDateTime": "2023-04-13T14:00:00",
    "beginEventDateTime": "2023-04-28T00:00:00",
    "endEventDateTime": "2023-04-30T00:00:00",
    "location": "서울역",
    "basePrice": 100,
    "maxPrice": 200,
    "limitOfEnrollment": 100,
    "offline": true,
    "free": false,
    "eventStatus": "DRAFT",
    "_links": {
      "query-events": {
        "href": "http://localhost/api/events"
      },
      "update-event": {
        "href": "http://localhost/api/events"
      },
      "self": {
        "href": "http://localhost/api/events"
      }
    }
  }
728x90