Spring - HATEOAS

이정수·2025년 10월 26일

Spring Boot

목록 보기
17/25

HATEOAS ( Hypermedia as the Engine of Application State )

implementation 'org.springframework.boot:spring-boot-starter-hateoas'

API응답에서 다른 자원에 대한 하이퍼링크를 포함한 HAL Response로 응답하여 클라이언트가 동적으로 자원탐색할 수 있도록 하는 개념.
REST API를 이용하는 클라이언트서버동적상호작용이 가능하도록 설정

REST 아키텍처Uniform Interface에서 HATEOAS가 정의
APIHATEOAS도 함께 구현해야 RESTful API라고 할 수 있음
REST

클라이언트서버 API요청서버자원과 함께 클라이언트가 다음에 행할 추가적인 요청(= Action)에 대한 URI(= link)까지 함께 HAL Response에 포함하여 응답
▶ 수신된 URI를 통해 클라이언트Application State를 다음 요청으로 transfer하여 후속 작업을 수행하는것이 가능

swagger를 포함하는 Spring Docs와 함께 사용 시 Spring Boot 3.4.3 이하로 다운그레이드
2025-10-31 기준 Springdocs 2.7.0Spring Boot 3.4.3HATEOAS를 지원

ControllerHATEOAS 적용하기

  • WebMvcLinkBuilder의 모든 static method를 import
    import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;

  • Controller에서 EntityModel 객체 생성 및 반환
    id에 해당하는 특정 데이터를 검색 시 해당 데이터 뿐만 아닌 모든 데이터에 대해 검색하는 /members URL하이퍼링크도 함께 반환
    ▶ 반환할 DTO 객체를 포함하여 EntityModel.of(DTO객체)EntityModel 객체를 생성 및 다른 Controller매핑URL을 저장하는 링크 객체를 추가.
    EntityModel객체.add(Link객체.withRel("관계명칭"));
@GetMapping("/members/{id}")
	@ResponseStatus(HttpStatus.OK)
	public EntityModel<MemberReadResponse> getMember(@PathVariable int id){
		// loginid에 해당하는 계정  가져오기
		MemberReadResponse memberreadresponse = memberservice.getMember(id);
		// HATEOAS 구현을 위한 EntityModel 생성
		EntityModel<MemberReadResponse> entityModel = EntityModel.of(memberreadresponse);
		// 특정 Controller로 접근하는 하이퍼링크를 포함하는 링크객체 생성
		WebMvcLinkBuilder linkToMembers = linkTo(methodOn(MemberController.class).getAllMembers());
		// EntityModel에 링크객체 추가
		entityModel.add(linkToMembers.withRel("모든 멤버 조회"));
		// 계정과 하이퍼링크를 포함하는 EntityModel 반환 
		return entityModel;
	}


"_links" 아래 getAllMembers() 컨트롤러에 대해 매핑URL을 포함한 하이퍼링크가 생성
▶ 다음 하이퍼링크를 클릭 시 WebMvcLinkBuilder linkToMembers = linkTo(methodOn(MemberController.class).getAllMembers());를 통해 정의된 해당 getAllMembers() 메서드API 호출 수행

  • HAL (JSON Hypertext Application Language) :
    Spring에서 HATEOAS 구현을 위해 API의 각각의 자원에 대한 HyperLinkJSON으로 생성하는 일관적인 방법을 제공하는 format.

    "_links"라는 요소를 생성하여 여러 link를 정의하면서 REST API의 다른 Resource에 연결하는 방법을 정의.

  • EntityModel<T> : org.springframework.hateoas
    RepresentationModel을 상속하는 클래스
    RepresentationModelWebMvcLinkBuilder이 생성하는 Link 객체를 담고, EntityModel은 해당 Link 객체를 가진 Resource 객체를 포함

    Spring HATEOAS에서는 EntityModel을 이용해 Response에 사용할 Resource 객체캡슐화Link 객체를 등록
    Client에게 접근할 수 있는 자원에 대한 hyper link를 추가 제공하여 RESTful Response를 생성.

  • org.springframework.hateoas.Link
    Controller Method매핑URL을 포함하여 WebMvcLinkBuilder에 의해 객체가 생성되어 EntityModel에 추가하여 HATEOAS를 구현하는 클래스

    하드코딩을 통해 URL를 직접 입력하여 링크객체 생성이 가능하지만, 추후 컨트롤러에 매핑된 URL을 변경하는 경우 수동으로 변경해야하는 번거로움 존재
    • 링크객체.withRel("관계명")
      EntityModel에 추가 시 HATEOAS에 의해 하이퍼링크가 도출될때의 관계명을 작성


  • WebMvcLinkBuilder
    。다른 자원에 접근하는 Controller Method매핑URL을 포함하는 링크 객체를 자동생성하기위해 사용하는 클래스

    Controller method를 기반으로 static method를 사용하여 자동으로 Link 객체를 생성
    ▶ 생성된 링크객체entityModel.add(링크객체)EntityModel에 포함 및 반환하여 HATEOAS 구현

    WebMvcLinkBuilder static method
    ex ) WebMvcLinkBuilder linkToMember1 = linkTo(methodOn(MemberController.class).getAllMembers());

    • WebMvcLinkBuilder.linkTo(컨트롤러메서드)
      。해당 자원에 관한 hateoas.Link객체를 생성.

    • WebMvcLinkBuilder.methodOn(컨트롤러클래스의 Class객체)
      Controller classController method를 참조하는데 사용
profile
공부기록 블로그

0개의 댓글