brunch

You can make anything
by writing

C.S.Lewis

REST API 초고속 개발?!

Spring Data REST

안녕하세요:)

카카오헤어샵 백엔드 개발자 ian입니다!


이번 주제는 Spring Data REST + Spring Data JPA를 이용해 REST API를 손쉽게 만들 수 있는 방법을 공유하겠습니다.


먼저, 보편적으로 REST API 생성 시 구조는 아래와 같을 것입니다.

(Controller -> Service -> Repository)


- Controller


- Service

- Repository

그러나 Spring Data REST + Spring Data JPA로 구성 시에는 Controller, Service 단 구성없이 Respository(Persistence Layer) 구성만으로 REST API를 쉽게 생성할 수 있습니다.


또한, 그뿐 아니라 기존에 REST API 구성 시 필요했던 (메타데이터 제공, 페이징 및 정렬 처리, 전처리 후처리 작업 등) 기능을 제공하고 있습니다.



실제 Spring Data REST를 사용하여, 기능에 대해 설명드리겠습니다.



1. build.gradle 구성

- 22, 23 라인: Spring Data JPA, Spring Data REST 구성


2. 도메인 구성



위의 구성으로도 Shop에 대한 CRUD REST API는 모두 생성되었습니다.

ex) Shop 전체 조회 API 호출


또한, HATEOAS를 기본으로 제공함으로써 관련 개발 시간을 더욱 단축시킬 수 있습니다.



그런데, 여기까지만 제공된다면 Spring Data REST를 사용할 수 있을까요?

아래에서는 Spring Data REST를 좀 더 잘 활용할 수 있는 부가적인 기능을 알아보겠습니다.



1.Repository 인터페이스에서 제공하는 추가적인 기능 사용 시 API 구성

위의 Shop 모델에서 name 또는 branch 명으로 검색하는 Query Method API를 구성하기 위해서는 보편적인 경우 Controller -> Service -> Repository로 보일러 플레이트 코드가 생성됩니다.


하지만, Spring Data REST에서는 Repository에 @RestResource에 path를 명시함으로써, API 경로를 지정하고 Query Method API를 생성할 수 있습니다.


- 12번 라인, 14번 라인: name, branchName 기준으로 API 생성


- 12번 라인에서 선언한 name 기준 API 생성 /shops/search/name?name=shop1


- 14번 라인에서 선언한 branchName 기준 API 생성 /shops/search/branchName?branchName=branch1



2. 페이징, 정렬 기능 제공

조회 API를 구성할 때 PagingAndSortingRepository를 상속받으면 페이징과 정렬 처리를 자동으로 제공합니다.


- 또한, 페이징 처리뿐 아니라 전체 페이지 및 페이지 이동(첫 번째, 다음 페이지 등)에 대한 정보를 자동으로 제공합니다.

- /shops?page=1&size=2 API 호출 예


- 필드의 특정값을 지정하여 정렬하는 기능 또한 제공합니다.

- /shops?sort=name,desc API 호출 예 (name 기준으로 내림 차림 정렬됨)


3. Projection 구성

API에서 응답 값을 도메인 모델이 아닌 커스텀하여 사용할 수 있습니다.

만약 Shop 모델에서 id와 name과 branchName이 조합된 풀네임을 제공하고 싶다면 아래와 같이 구성하시면 됩니다.



- /shops?projection=shopResponse API 호출 예 (projection 값에 위에서 정의한 name 값으로 호출)



4. 기존과 같은 Controller 구성 가능

보편적인 방식과 같이 Controller 구성도 다음과 같이 @RepositoryRestController 사용하여 확장이 가능합니다.


다만 여기서 주의할 점은 아래와 같이 base path가 도메인 모델과 다른 경우는 동작하지 않습니다.



5. eventListner 전처리, 후처리 기능 지원

데이터 생성, 업데이트 시 전처리 후처리 작업이 가능합니다.

AbstractRepositoryEventListener 상속받아 onBeforeCreate, onAfterCreate, onBeforeSave, onAfterSave 등을 사용하여 반복 작업을 줄일 수 있습니다.


Spring Data REST + Spring Data JPA 를 이용하면 이외에도 Spring Security와 연동을 통해 API에 대한 권한 제어도 가능합니다.


전체 소스코드는 아래에 있습니다.

https://github.com/kakaohairshop/spring-data-rest-study


Spring Data Docs 사용 후기


1. 간단한 도메인 모델을 가지는 프로젝트에 구성 시 반복적인 개발 시간을 줄일 수 있는 장점이 있다고 생각됩니다.


2. 활용도를 높이기 위해서는 Spring Data REST에서 지원하는 기능들에 대해 이해도가 높아야 할 것 같습니다.


3. 기존 프로젝트에 부분적으로 적용이 가능하다는 점에서도 점진적으로 적용할 수 있을 것입니다.


4. Spring HATEOAS를 프론트엔드에서 사용 시 적용하면 좋을 것 같습니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari