Spring

[Spring] HATEOAS 개념 및 장단점

테런 2023. 8. 14. 09:35
  • Spring HATEOAS 개념
Spring HATEOAS는 Spring Framework를 기반으로 한 Hypermedia as the Engine of Application State (HATEOAS)의 구현체입니다. HATEOAS는 RESTful 웹 서비스에서 리소스 간의 관계와 상태를 표현하고 클라이언트가 리소스 간의 상호 작용을 위한 정보를 동적으로 얻을 수 있도록 돕는 개념입니다.

HATEOAS의 핵심 개념은 "하이퍼미디어 링크"입니다. 이는 리소스와 관련된 다른 리소스로의 링크를 포함하는 것을 의미합니다. 클라이언트는 이러한 링크를 따라가며 API에서 제공되는 다른 리소스와 상호 작용할 수 있습니다. Spring HATEOAS는 이러한 하이퍼미디어 링크를 생성하고 관리하기 위한 도구와 클래스를 제공하여 개발자가 간편하게 HATEOAS를 구현할 수 있도록 돕습니다.

* Spring HATEOAS의 주요 개념과 구성 요소

1. EntityModel: Spring HATEOAS에서 사용되는 래퍼 클래스로, 리소스 데이터와 그에 대한 링크를 함께 포함합니다. 클라이언트는 이를 통해 리소스 데이터와 리소스 간의 관계를 함께 가져올 수 있습니다.

2. Link: 리소스 간의 관계를 나타내는 하이퍼미디어 링크입니다. 링크는 연관된 리소스의 URL과 링크의 관계 유형 등을 포함합니다.

3. RepresentationModel: EntityModel과 비슷한 개념으로, 리소스 데이터와 링크를 함께 포함하는 클래스입니다. CollectionModel과 PagedModel과 같은 특수한 서브클래스도 있습니다.

4. ControllerLinkBuilder: 컨트롤러 메서드에서 하이퍼미디어 링크를 생성하는 데 사용되는 유틸리티 클래스입니다. 이를 통해 컨트롤러 메서드에서 리소스 간의 관계를 쉽게 정의하고 링크를 생성할 수 있습니다.

5. RepresentationModelAssembler: 엔티티 객체를 RepresentationModel로 변환하는 역할을 합니다. 이를 사용하여 엔티티 객체와 링크를 함께 반환할 수 있습니다. Spring HATEOAS를 사용하면 API의 Hypermedia 링크를 쉽게 생성하고 관리할 수 있습니다. 클라이언트는 이러한 링크를 따라가며 API의 상호 작용에 필요한 정보를 얻을 수 있으며, API의 확장과 변경에 유연하게 대응할 수 있습니다.

 

  • Spring HATEOAS 장단점
Spring HATEOAS는 Spring Framework에서 제공하는 Hypermedia as the Engine of Application State (HATEOAS)의 구현체입니다. HATEOAS는 RESTful 웹 서비스에서 리소스 간의 관계와 상태를 표현하기 위한 방법론 중 하나로, 클라이언트가 리소스 간의 상호 작용을 위한 정보를 서버에서 동적으로 얻을 수 있도록 돕는 기술입니다. Spring HATEOAS는 이러한 개념을 Spring 애플리케이션에 쉽게 통합할 수 있도록 도와줍니다.

* 장점

1. Hypermedia 제공: Spring HATEOAS를 사용하면 API의 Hypermedia 링크를 제공할 수 있습니다. 클라이언트는 리소스 간의 관계와 작업 흐름을 이해하고 탐색할 수 있습니다. 이를 통해 클라이언트와 서버 간의 결합도가 낮아지고 유연한 상호 작용이 가능해집니다.

2. API 이해도 향상: Hypermedia 링크를 통해 클라이언트는 API의 구조와 사용법을 더 잘 이해할 수 있습니다. 즉, 클라이언트는 리소스 간의 관계를 알고 필요한 작업을 수행할 수 있는 연결점을 더 쉽게 찾을 수 있습니다.

3. 진화와 확장성: Hypermedia 링크를 사용하면 API의 변경에 더 유연하게 대응할 수 있습니다. 새로운 리소스 유형이나 기능을 도입할 때, 클라이언트에게 새로운 작업과 관계를 알리기 위해 Hypermedia 링크를 추가하는 것만으로도 충분합니다.

4. API 버전 관리: Spring HATEOAS를 사용하면 새로운 버전의 API 엔드포인트를 도입할 때 기존 API와의 호환성을 유지하기 쉽습니다. 새로운 버전의 API는 Hypermedia 링크를 통해 이전 버전과의 차이 및 이전 버전에서 새로운 버전으로의 전환 방법을 제공할 수 있습니다.

* 단점

1. 복잡성: HATEOAS를 구현하고 관리하는 것은 추가적인 복잡성을 초래할 수 있습니다. Hypermedia 링크를 관리하고 구성하는 것은 일부 개발자에게는 어려울 수 있습니다.

2. 오버헤드: Hypermedia 링크를 통한 API 디자인은 일부 오버헤드를 동반할 수 있습니다. 매 요청마다 추가적인 링크 정보가 포함되기 때문에 데이터 전송량이 늘어날 수 있습니다.

3. 클라이언트 복잡성: 클라이언트도 Hypermedia 링크를 이해하고 해석할 수 있어야 합니다. 클라이언트 개발자가 추가적인 작업을 수행해야 할 수 있습니다.

4. 생산성 저하: 초기 단계에서는 Hypermedia를 구현하고 관리하는 데 시간이 걸릴 수 있으며, 이로 인해 초기 개발 단계에서의 생산성이 저하될 수 있습니다.

요약하자면, Spring HATEOAS는 Hypermedia를 활용하여 RESTful API를 관리하고 이해하기 쉽게 만들어주는 강력한 도구입니다. 그러나 복잡성과 오버헤드와 같은 몇 가지 단점도 고려해야 합니다. API 디자인과 클라이언트 요구사항에 따라 사용 여부를 결정하는 것이 좋습니다.

 

  • Spring HATEOAS 예시
다음은 Spring HATEOAS를 사용한 간단한 예시입니다. 이 예시에서는 Spring Boot를 사용하여 간단한 RESTful API를 구축하고, Spring HATEOAS를 활용하여 Hypermedia 링크를 생성합니다.

1. 프로젝트 설정
먼저, Spring Boot 프로젝트를 생성하고 Spring HATEOAS를 의존성으로 추가해주세요. 이를 위해 build.gradle 또는 pom.xml 파일에 아래와 같이 의존성을 추가합니다.
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-hateoas'
    runtimeOnly 'com.h2database:h2'
}​

 

2. 엔티티 클래스 생성
@Entity
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String author;

    // getters and setters
}​

 

3. 컨트롤러 생성
@RestController
@RequestMapping("/books")
public class BookController {

    @Autowired
    private BookRepository bookRepository;

    @GetMapping
    public CollectionModel<EntityModel<Book>> getAllBooks() {
        List<EntityModel<Book>> books = bookRepository.findAll().stream()
            .map(book -> EntityModel.of(book,
                linkTo(methodOn(BookController.class).getBook(book.getId())).withSelfRel(),
                linkTo(methodOn(BookController.class).getAllBooks()).withRel("books")))
            .collect(Collectors.toList());

        return CollectionModel.of(books,
            linkTo(methodOn(BookController.class).getAllBooks()).withSelfRel());
    }

    @GetMapping("/{id}")
    public EntityModel<Book> getBook(@PathVariable Long id) {
        Book book = bookRepository.findById(id)
            .orElseThrow(() -> new BookNotFoundException(id));

        return EntityModel.of(book,
            linkTo(methodOn(BookController.class).getBook(id)).withSelfRel(),
            linkTo(methodOn(BookController.class).getAllBooks()).withRel("books"));
    }
}​

 

4. 애플리케이션 실행

Spring Boot 애플리케이션을 실행하고 브라우저나 API 클라이언트 도구를 통해 /books 엔드포인트로 접속하면, Spring HATEOAS를 통해 생성된 Hypermedia 링크를 확인할 수 있습니다.