woniper

Spring Data REST #2 동작 원리 본문

Spring

Spring Data REST #2 동작 원리

woniper1 2017. 5. 9. 14:06

  Introduction에서 Spring Data REST에 대한 간단한 소개와 사용방법을 알아봤다. Spring Data에서 제공하는 Repository interface 선언만으로 REST API가 만들어졌다.

어떻게 Repository 선언만으로 REST API가 제공될까?


위 그림은 발표 장표 중 하나다. CrudRepository에 선언된 메소드가 곧 REST API로 지원되는 것이다.

@RepositoryRestResource
public interface TodoRepository extends PagingAndSortingRepository<Todo, Long> {}


TodoRepositoryPagingAndSortingRepository를 상속받고 PagingAndSortingRepository는 다시 CrudRepository를 상속받고 있다. PagingAndSortingRepository paging과 sorting 조회 API가 추가 제공된다.

@RepositoryRestResource

  사실 Spring Data REST dependency가 추가되면 @RepositoryRestResource가 없어도 기본 설정으로 REST API가 만들어진다. 그럼 기본 설정이 아닌 추가 설정을 해야 한다면 @RepositoryRestResource가 필요하다는 뜻이다.

  • expored() : Repository interface를 REST API로 사용할지 여부
  • path() : URI 매핑 설정 (기본 URI는 entity의 복수)
  • collectionResourceRel() : HATEOAS collection rel name 설정
  • collectionresourceDescription() : HATEOAS collection rel 설명 설정
  • itemresourceRel() : HATEOAS item rel name 설정
  • itemResourceDescription() : HATEOAS item rel 설명 설정
  • excerptProjection() : 기본 Proejction 설정

  위 설명만 보고는 잘 이해가 안 된다. HATEOASProjection이 무엇인지 아직 설명하지 않았기 때문이다. 이번 글에서는 HATEOASProjection의 설명은 생략하기로 하고 중요한 건 expertedpath 설정이다. 기억하자.

정말 Repository interface만으로 동작할까?

  당연한 이야기지만 Repository interface만으로 동작하지 않는다. 자바에서 어떻게 interface의 구현체 없이 코드가 동작할까? Spring Data Project와 Spring Data REST project에 이미 구현체가 만들어졌기 때문이다.

Spring Data

  이 예제는 Spring Data JPA를 기준으로 설명하고 있는데 Data JPA를 사용해본 개발자는 알겠지만 TodoRepository 코드가 전혀 낯설지 않을 것이다. 우리가 만든 TodoRepository는 사실 Spring Data REST에서 제공하는 게 아니라 Spring Data Project에 이미 구현체가 만들어져있다.

Spring Data JPA

  Spring Data JPA에서는 Spring Data에서 제공되는 *Repository interface(앞서 본 CrudRepository, PagingAndSortingRepository, 그 외 다양한 Repository interface가 존재한다.)가 동작하기 위해 내부적으로 SimpleJpaRepository 구현체에 의해 동작한다.

하지만 SimpleJpaRepository만으로는 REST API가 지원되지 않는다. SimpleJpaRepository는 단지 데이터를 CRUD 하기 위한 Class다.

Spring Data REST

  Spring Data REST는 Repository interface를 기준으로 REST API 요청 가능한 Controller가 만들어져있다. 그 Class가 바로 RepositoryEntityController이다.

Spring Data REST 구조

Spring Data, Spring Data JPA, Spring Data REST의 구조를 간단하게 보자.

[INFO] org.springframework.data:spring-data-rest-webmvc:jar:3.0.0.BUILD-SNAPSHOT
[INFO] +- org.springframework.data:spring-data-rest-core:jar:3.0.0.BUILD-SNAPSHOT:compile
[INFO] |  +- org.springframework.data:spring-data-commons:jar:2.0.0.BUILD-SNAPSHOT:compile
[INFO] +- org.springframework:spring-webmvc:jar:5.0.0.BUILD-SNAPSHOT:compile
[INFO] |  +- org.springframework:spring-aop:jar:5.0.0.BUILD-SNAPSHOT:compile
[INFO] |  +- org.springframework:spring-beans:jar:5.0.0.BUILD-SNAPSHOT:compile
[INFO] |  +- org.springframework:spring-context:jar:5.0.0.BUILD-SNAPSHOT:compile
[INFO] |  +- org.springframework:spring-core:jar:5.0.0.BUILD-SNAPSHOT:compile
[INFO] +- org.hibernate:hibernate-core:jar:4.3.10.Final:compile
[INFO] |  +- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.0.Final:compile 

mvn dependency:tree 명령어를 통해 Spring Data REST project의 의존성 tree를 본 것인데, 더 많은 dependency가 나오지만 다른 dependency는 가독성을 위해 제거했다.

spring-data-commons

org.springframework.data:spring-data-commons:jar:2.0.0.BUILD-SNAPSHOT:compile가 보인다. Spring Data project는 데이터 영속화 기술을 추상화한 project다. RDB, MemoryDB, File 등 데이터를 저장하고 관리하는 기술을 추상화해 같은 interface를 통해 사용할 수 있다.

hibernate-code

  JPA는 Java ORM 기술을 추상화한 project다. Spring Data JPA는 JPA를 추상화한 project다. 여기서 org.hibernate:hibernate-core:jar:4.3.10.Final:compile를 JPA 구현체인 hibernate로 사용하는 것을 알 수 있다.

spring-data-rest-webmvc

  Spring Data REST project가 가장 추상화된 project라고 볼 수 있다. Spring Data REST는 Spring Data, Spring Data JPA, hibernate, Spring WebMVC 등 여러 dependency에 의존한다. 즉, Spring Data REST는 Spring Data + Spring MVC project가 결합한 추상화된 project다.

이번 글에서는 간단하게 설명한 dependency와 project의 구현체가 있다는 것만 알고 넘어가고 나중에 Spring Data REST 코드를 까보자.

Comments