brunch

REST API 초고속 개발?!

Spring Data REST

안녕하세요:)

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


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


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

(Controller -> Service -> Repository)


- Controller

스크린샷 2021-01-25 오후 5.13.07.png


- Service

스크린샷 2021-01-25 오후 5.14.22.png

- Repository

스크린샷 2021-01-25 오후 5.15.27.png

그러나 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 호출

스크린샷 2021-01-25 오후 6.26.50.png


또한, 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

스크린샷 2021-01-25 오후 6.29.11.png


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

스크린샷 2021-01-25 오후 6.29.39.png



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

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


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

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

스크린샷 2021-01-25 오후 6.31.54.png


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

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

스크린샷 2021-01-25 오후 6.32.33.png


3. Projection 구성

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

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



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

스크린샷 2021-01-25 오후 6.23.39.png



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를 프론트엔드에서 사용 시 적용하면 좋을 것 같습니다.

keyword
매거진의 이전글spring-data-r2dbc