Framework/Spring
[ Spring ] Spring HATEOAS에 대해서 알아보기
Soso Dev
2025. 4. 5. 00:18
반응형
🌱 스프링 HATEOAS(Hypermedia as the Engine of Application State)는 RESTful 웹 서비스를 구축할 때 하이퍼미디어를 사용하여 클라이언트와 서버 간의 상호작용을 더욱 동적으로 만드는 스프링 프레임워크의 라이브러리입니다.
1. HATEOAS의 핵심 개념
- 하이퍼미디어 링크: API 응답에 리소스 간의 관계와 상태를 나타내는 링크를 포함합니다.
- 동적 상호작용: 클라이언트는 이러한 링크를 통해 다음에 수행할 수 있는 작업을 동적으로 파악하고, 서버가 제공하는 대로 API를 탐색할 수 있습니다.
- 느슨한 결합: 클라이언트가 하드코딩된 URL에 의존하지 않으므로 API 변경에 유연하게 대응할 수 있습니다.
2. 스프링 HATEOAS의 주요 구성 요소
- EntityModel: 리소스 데이터와 링크를 함께 포함하는 래퍼 클래스입니다.
- Link: 리소스 간의 관계를 나타내는 하이퍼미디어 링크입니다.
- RepresentationModel: EntityModel과 유사하며, 컬렉션이나 페이징된 데이터와 같은 복잡한 리소스를 표현하는 데 사용됩니다.
- RepresentationModelAssembler: 엔티티 객체를 RepresentationModel로 변환하는 역할을 합니다.
- WebMvcLinkBuilder: 컨트롤러 메서드를 기반으로 하이퍼미디어 링크를 생성하는 유틸리티 클래스입니다.
3. 장점
- API 탐색성 향상: 클라이언트가 API의 사용 방법을 더 쉽게 이해할 수 있도록 돕습니다.
- 유연성: API 변경 시 클라이언트 코드의 수정 부담을 줄여줍니다.
- 느슨한 결합: 클라이언트와 서버 간의 의존성을 줄여 유지보수성을 높입니다.
4. 단점
- 복잡성 증가: 하이퍼미디어 링크를 구현하는 데 추가적인 코드가 필요합니다.
- 성능 오버헤드: 링크 생성 및 관리에 약간의 성능 저하가 발생할 수 있습니다.
5. 사용 예시
@RestController
@RequestMapping("/orders")
public class OrderController {
@GetMapping("/{id}")
public EntityModel<Order> getOrder(@PathVariable Long id) {
Order order = orderService.getOrder(id);
return EntityModel.of(order,
linkTo(methodOn(OrderController.class).getOrder(id)).withSelfRel(),
linkTo(methodOn(OrderController.class).cancelOrder(id)).withRel("cancel"));
}
@PutMapping("/{id}/cancel")
public ResponseEntity<?> cancelOrder(@PathVariable Long id) {
orderService.cancelOrder(id);
return ResponseEntity.noContent().build();
}
}
위 예시에서는 EntityModel
을 사용하여 주문 정보를 반환하고, linkTo
메서드를 사용하여 주문 자체에 대한 링크와 주문 취소에 대한 링크를 함께 제공합니다.
스프링 HATEOAS는 RESTful API를 더욱 효율적이고 유지보수하기 쉽게 만들어주는 강력한 도구이지만, 복잡성과 성능 오버헤드를 고려하여 신중하게 적용해야 합니다.
반응형