DEV/Spring

[Spring] Spring Data Rest 란?

l-eazzy 2023. 7. 10. 18:31

 

 

이번에 갠플 진행하면서,

매번 만들던 Controller, Service, Repository 가 아닌 다른 형태로 진행해보기로 하였다.

 

Spring Data Rest를 이용한 방법인데,

설정과 어노테이션을 이용해서 EntityRepository 만으로 API 를 구성하며 추가적인  Http Request Path 설정과 반환 데이터 구조를 만들지 않아도 간단하게 사용이 가능하다.

 

1. Data Rest ?

Spring.io 에서는 Spring Data Rest 를 다음과 같이 정의하고 있다.

REST 웹 서비스는 웹에서 애플리케이션 통합을 위한 최고의 수단이 되었습니다. 핵심에서 REST는 클라이언트가 상호 작용하는 리소스로 구성된 시스템을 정의합니다. 이러한 리소스는 하이퍼미디어 기반 방식으로 구현됩니다. Spring MVC 와 Spring WebFlux는 각각 이러한 종류의 서비스를 구축하기 위한 견고한 기반을 제공합니다. 

그러나 다중 도메인 객체 시스템을 위한 REST 웹 서비스의 가장 단순한 원칙을 구현하는 것은 상당히 지루할 수 있으며 많은 상용구 코드를 생성할 수 있습니다.

Spring Data REST는 Spring Data 리포지토리 위에 구축되며 이를 REST 리소스로 자동으로 내보냅니다. 하이퍼미디어를 활용하여 고객이 리포지토리에 의해 노출된 기능을 자동으로 찾고 이러한 리소스를 관련 하이퍼미디어 기반 기능에 통합할 수 있도록 합니다.

 

특징

  • HAL을 미디어 유형으로 사용하여 도메인 모델에 대해 검색 가능한 REST API를 노출합니다.
  • 모델을 나타내는 컬렉션, 항목 및 연결 리소스를 노출합니다 .
  • 탐색 링크를 통해 pagination을 지원합니다 .
  • 컬렉션 리소스를 동적으로 필터링할 수 있습니다.
  • 리포지토리에 정의된 쿼리 메서드에 대한 전용 검색 리소스를 노출합니다.
  • Spring ApplicationEvents을 처리하여 REST 요청 처리에 연결할 수 있습니다.
  • ALPS 및 JSON 스키마로 검색된 모델에 대한 메타데이터를 노출합니다.
  • 프로젝션을 통해 고객별 표현을 정의할 수 있습니다 .
  • 노출된 메타데이터를 활용하기 위해 HAL 탐색기 의 맞춤 변형을 제공합니다 .
  • 현재 JPA, MongoDB, Neo4j, Solr, Cassandra, Gemfire를 지원합니다.
  • 노출된 기본 리소스의 고급 사용자 지정을 허용합니다 .

 

위와같이 특징들을 나타내고 있는데,

설명만 봐서는 '그래서 기존 방식이랑 무슨 차이가 있는데?' 라는 의문이 들어 간단히 코드를 작성하면서 살펴보기로 하였다.

 

 

2. 구현

a. 테스트 환경

  • MacOS (Ventura)
  • Java 17
  • Spring Boot 3.1.1
  • H2 Database

 

b. 의존성  및 프로퍼티 설정

* build.gradle

dependencies {
  ...
  implementation 'org.springframework.boot:spring-boot-starter-data-rest'
  ...
}

* application.yaml

spring:
  ...
  # jpa, Database, 기타 설정들은 각자 환경에 맞게 설정
  ...
  data:
    # Rest Setting
    rest:
      base-path: /api                           # 기본 베이스 url
      default-media-type: application/json      # 디폴트 미디어 타입 지정

 

테스트를 목적으로 하기 때문에 이번 글에서는 간단하게만 프로퍼티 설정을 하겠다.

추가적인 프로퍼티는 아래 이미지 또는 Spring 공식 사이트에서 확인!

 

c. 코드 구현 및 테스트

실행에 앞서서 EntityRepository를 생성하였다.

아래 이미지와 같이 생성하였다.

* Directory

 

* 예시코드

이 글에서는 Member 클래스 관련만 적어두겠다.

// Member Entity
@Entity
@NoArgsConstructor
@Getter
public class Member {

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

    @Column(name = "name", length = 10)
    private String name;
    @Column(name = "email", length = 50)
    private String email;

    @OneToMany(mappedBy = "member")
    private List<Board> boards;
    @OneToMany(mappedBy = "member")
    private List<Comment> comments;
    
}

// Member Repository
// 먼저 별도의 어노테이션 없이 구성해보았다.
public interface MemberRepository extends JpaRepository<Member, Repository> {
}

 

위와 같이 구성하고 실행 후,

http request(locahost:8080)를 요청하면 다음과 같이 나타난다.

(필자는 application.yaml 에 base-path 설정을 '/api'로 추가하였기 때문에 뒤에 /api 를 추가하였다.)

 

 

* Profile

 

리턴 값으로 현재 사용가능한 API 목록을 보여주고 있다.

해당 URL 목록은 Repository Open 정책에 따라 달라질 수 있다.

 

 

* 상세 Profile

/api/profile/{domain} 을 요청하게 되면 Member 에 대한 요청 정보를 확인이 가능하다.

별도의 문서 작업 없이 요청만으로 Member에 대한 CRUD 를 확인할 수 있다.

 

* Post

Profile 에서 본 Member URLHTTP Post Method로 요청해보았다.

위와 같이 추가된 Member 데이터의 조회 경로를 알려주고 있다.

추가적으로 연관관계를 가진 객체 조회 경로 또한 URL 경로로 가르키고 있어, 필요한 정보를 바로 조합해 가져올 수 있게 된다.

 

* Get

위에서 추가한 Member 를 조회해보았을때,

아래와 같이 데이터와 추가 조회 링크를 볼 수 있다.

 

전체 조회는 /api/membersGet 메소드로 보내주면 된다.

 

* Error

Member 엔티티를 만들때, name 컬럼의 길이를 10 으로 제한해두었다.

만약 이를 넘기면 어떻게 될까?

이에 Error를 아래 이미지 처럼 문구를 보내주었다.

 

 

3. 마무리

글이 길어지긴 했지만,

여기까지 내가 구성한 것은 의존성 주입, 프로퍼티 설정, 엔티티와 레포지토리 클래스를 만든 것 뿐이다.

 

기존에 Controller, Service, Entity, Repository... (어쩌면 여러 Dto도..) 등 구성해야하는 것들이 많았다.

이를 Entity 클래스와 Repository 인터페이스 2가지 만으로 API 구성이 완료되었다.

 

기존 복잡도를 늘리는 여러 클래스 파일 생성보다는 간단하지만,

복잡한 기능이 들어가거나 커스텀 시에는 오히려 복잡도가 늘어날지도 모르겠다.

이에 대해서는 좀 더 공부를 해보면서 적용해보고, 사용기에 대한 포스팅을 해볼 예정이다.

 

이외에 제공해주는 기능들이 있으니 그에 대해서도 추후 포스팅하겠다.

 

* git 링크

소스코드에 대한 부분은 아래 git 에 있으니 참고.

** 추후 업데이트 되는 포스팅에 대한 것도 동일한 레포지토리에 업데이트 예정

 

GitHub - mk1-p/spring-data-rest-test: Test for Spring Data Rest

Test for Spring Data Rest. Contribute to mk1-p/spring-data-rest-test development by creating an account on GitHub.

github.com

 

4. 참고자료

https://docs.spring.io/spring-data/rest/docs/current/reference/html/#preface

 

Spring Data REST Reference Guide

Spring Data REST presents a default view of the domain model you export. However, sometimes, you may need to alter the view of that model for various reasons. This section covers how to define projections and excerpts to serve up simplified and reduced vie

docs.spring.io

 

 

728x90