안녕하세요 백엔드 개발자 paige 입니다.
오늘은 REST API를 위한 원칙중 하나인 HATEOAS를 스프링에서 간단히 구현해보려 합니다.
*REST API에 대한 내용은 이곳을 참고해주세요.
Hypermedia As The Engine Of Application State의 약자로 서버가 클라이언트에게 하이퍼 미디어를 통해 정보를 동적으로 제공해주는것을 말합니다.
API에서 리소스에 대해 어떠한 행동을 할 수 있는지 URL을 전달하여 클라이언트가 참고하고 사용할 수 있도록 합니다. 이때, 해당 리소스의 상태에 따라 링크 정보가 바뀌며 동적으로 리소스를 구성합니다.
예를 들어 예약의 상태에 따라 시술완료가 가능하면 시술완료 처리를 할 수 있는 링크를 포함해 응답을 전달합니다.
또한 이러한 메세지를 표현하기 위해 헤더의 Content Type을 application/hal+json으로 전달하면 클라이언트에서는 _links 필드에 링크 정보가 있다고 예상할 수 있습니다.
스프링에서도 HATEOAS 원칙을 따르는 REST API를 만들기위해 Spring HATEOAS 프로젝트를 제공하고 있습니다.
HTTP 응답에 들어갈 Resources와 다른 상태나 리소스에 접근할 수 있는 Links를 제공합니다.
아래와 같이 _links에 다양한 링크를 넣어 응답할 수 있습니다.
spring-boot-starter-hateoas 의존성 추가로 간단하게 사용할 수 있습니다.
여러건 일때는 CollectionModel, 단건일 때는 EntityModel을 사용해서 Resource와 Link를 함께 내려줄 수 있습니다.
2번과 같이 개발을 진행하다보면 중복되는 코드가 많이 발생할 수 있습니다.
이때, RepresentationModelAssembler 인터페이스를 상속받아 아래와 같이 간단하게 구현이 가능합니다.
전체 프로젝트에 대한 코드는 이곳에 있으니 참고해 보세요 :)
추가로 spring boot 2.2.0 이후 변경된 내역이니 구현에 참고하시면 좋을것 같습니다.
ResourceSupport → RepresentationModel
Resource → EntityModel
Resources → CollectionModel
PagedResources → PagedModel
ResourceAssembler → RepresentationModelAssembler
ControllerLinkBuilder → WebMvcLinkBuilder