[Spring boot] Spring Data Rest를 이용한 REST API 개발 1

MVC 패턴에 이어서, 이번에는 Spring Data Rest를 이용하여 REST API 서버를 개발하는 시간을 가져보도록 하겠습니다. 

MVC 패턴에서는 Domain, Controller, Repository 이렇게 3가지를 이용하였고, 추가로 Service 클래스를 구현하면 더욱 세부적인 처리가 가능하도록 구현할 수 있었습니다.

Spring Data Rest는 VC를 생략하고, 오직 Domain과 Repository만을 가지고 아주 쉽게 REST API 서버를 구현할 수 있습니다. 한 번 시작해보도록 하죠.

 

 

개발 환경 준비

기존의 MVC 패턴을 사용했던 디펜던시에서 일부 변경하여, Rest Repositores 선택해주면 됩니다.

 

Spring Data Rest에서는 base-path를 지정하여 모든 API 요청의 기본 경로를 설정해줄 수 있습니다. 이 부분은 각 Controller에서 직접 api 포인트를 잡아주지 않아도 되는 편리함이 있습니다.

default-page-size는 클라이언트가 따로 페이지 크기를 요청하지 않았을 때, 적용할 기본 페이지 크기를 설정하였고, max-page-size를 통해 최대 페이지 갯수를 설정하였습니다.

이 외에도 다양한 옵션들이 존재합니다.

이름 설명 기본값
page-param-name 페이지를 선택하는 쿼리 파라미터명 변경 page
limit-param-name 페이지 아이템 수를 나타내는 쿼리 파라미터명 변경 size
sort-param-name 페이지 정렬값을 나타내는 쿼리 파라미터명 변경 sort
default-media-type 미디어 타입의 기본 값 지정 application/hal+json;charset=UTF-8
return-body-on-create POST 메소드를 이용한 새로운 Entity 생성 이후 Response Body 반환 여부 설정 true
return-body-on-update PUT 메소드를 이용한 Entity 수정 이후, Response Body 반환 여부 설정 true
enable-enum-translation 'rest-message' 라는 property 파일을 만들어서 지정한 enum 값을 사용하게 해주는 설정 값.
적합한 enum 값 (DEFAULT, ALL, VISIBILITY, ANNOTATED)를 키로 사용
 
detection-strategy Repository 노출 전략을 설정하는 property 값
Repository Strategy 인터페이스 내부에 구현된 enum 값으로 설정
default

detection-strategy 옵션의 경우 API로 만들어줄 Repository를 찾는 전략입니다. Default 설정의 경우, 모든 public repository를 대상으로 하되, exported 옵션이 false인 경우는 예외로 두게 됩니다. 

Repository 전략을 지원하는 저장소는 아래의 리스트와 같습니다.

  • Spring Data JPA
  • Spring Data MongoDB
  • Spring Data Neo4j
  • Spring Data GemFire
  • Spring Data Cassandra

그 중 여기서는 Spring Data JPA로 다루게 될 것입니다.

 

 

REST API 구현하기

개발 설정이 모두 끝났다면, 바로 REST API를 구현해 보겠습니다. 

MVC 패턴 포스트에서 사용했던 도메인을 그대로 사용하고, 위와 같이 클래스와 인터페이스를 만들어줍니다.

여기에 RepositoryRestResource 어노테이션을 추가만 해주면 별도의 Controller, Service 없이 미리 내부적으로 정의되어 있는 로직에 따라 처리되어 더욱 쉽게 REST API 서버를 개발할 수 있습니다.

 

 

Test

MVC 패턴에서 했던 것과 똑같이 Curl 커맨드를 이용해서 테스트를 진행해보도록 하겠습니다.

$ curl http://localhost:8080/api/items

기존의 MVC 패턴에서 구현했던 것보다 더 많은 정보를 제공하는 것이 보입니다. 데이터베이스에 아무런 내용이 없으니, content에서는 target의 타입이 어떤 패키지에 어떤 클래스인지에 대한 정보가 나오는군요.

 

$ curl -X POST -H "Content-Type: application/json" --data '{ "name": "apple", "price": 3000 }' http://localhost:8080/api/items | json_pp

상품 하나를 생성하니, MVC 패턴에서는 모델 값을 반환해준 반면, Data Rest에서는 방금 생성한 모델의 name과 price를 표시해주고, 이를 가져오고 싶을 경우, 위의 URI를 이용하라는 지침의 반환값이 나옵니다. MVC 패턴으로 구현했을 때보다 더 설명이 좋고, 깔끔한 느낌입니다.

상품 하나를 추가한 뒤에 다시 목록을 조회하면, 클래스의 정보는 사라지고 content 내에 아까 반환 받은 내용이 들어가 있음을 확인할 수 있습니다.

이번에는 상품 10개를 등록하고, GET 메소드를 수행해보도록 하겠습니다.

 

$ for i in {1..10}; do curl -X POST -H "Content-Type: application/json" --data '{ "name": "apple", "price": 3000 }' http://localhost:8080/api/items | json_pp; done

Shell script를 이용해서 반복문을 이용해 위와 같이 명령어를 이용하면 쉽게 데이터를 추가할 수 있습니다. 

10개를 등록하면 11개가 되므로, 이제 links에서 페이지에 대한 정보를 주게 됩니다. 10개 이상의 데이터를 보고자 할 때, 어떤 페이지의 URI를 호출하면 되는지를 설명해주며 이는 HATEOAS를 아주 잘지킨 예시입니다. 이러한 정보는 Key-value 형식으로 구성되어 있어서 클라이언트가 키를 참조하도록 코드를 설정하면 서버에서 요청된 데이터 정보가 바뀌더라도 클라이언트 입장에서는 코드를 수정할 필요가 없어 매우 좋죠.

 

 

마치며...

여기까지 Spring Data Rest를 이용하여 REST API를 만들어봤습니다. 앞서 말씀드렸다시피 Spring Data Rest를 이용하게 되면 VC를 구현하지 않아도 Repository와 Domain 만으로도 쉽게 REST API를 구현할 수 있었는데요.

그렇지만 모든 개발자들이 이러한 형태를 그대로 사용하기를 원치 않을 수도 있습니다. 그래서 Spring Data Rest에서도 개별적으로 Controller, Service를 구현할 수도 있는데요. 이 부분은 다음 포스트에서 다뤄보도록 하겠습니다.

comments powered by Disqus

Tistory Comments 0