튼튼발자 개발 성장기🏋️

#15 : 상속 없이 repository를 만들자 본문

Framework/spring

#15 : 상속 없이 repository를 만들자

시뻘건 튼튼발자 2020. 5. 24. 00:39
반응형

  이전 글에서 query method를 만드는 4 step에 대해 알아 보았다.

  1. Repository를 상속한 인터페이스 만들기
  2. query method 정의하기
  3. String Data JPA 활성 시키기
  4. 주입 받아서 사용하기

상위 단계 중에 1step에 대해 알아보려고 한다.

보통 Repository와 CrudRepository와 PagingAndSortingRepositoryRepository 그리고 JpaRepository 중에 하나를 상속을(extends)를 받아 사용할텐데, 이 것을 어노테이션을 사용할 수도 있다.

바로 이런 식으로.

@NoRepositoryBean
interface MyBaseRepository<T, ID> extends Repository<T, ID> {
	Optional<T> findById(ID id);
	<S extends T> S save(S entity);
}

Spring Data JPA reference에 의하면 CrudRepository에서 노출하고 싶은 것만 복붙하라고 되어 있다. 예제는 단지 save()인 것이다. 이렇게 하면 제공된 spring Data repository 기능 위에 각자 본인의 추상화를 정의 할 수 있다는 장점과 함께 서술되어 있는 것을 볼 수 있다.

 

이런 방법도 있다.

@NoRepositoryBean
interface MyBaseRepository<T, ID> extends Repository<T, ID> {
	Optional<T> findById(ID id);
	<S extends T> S save(S entity);
}

interface UserRepository extends MyBaseRepository<User, Long> {
	User findByEmailAddress(EmailAddress emailAddress);
}

소스를 까보고 들어가서 보면 알겠지만 Repository는 비어있는 녀석이다. 그 녀석을 상속을 받고 @NoRepositoryBean 어노테이션을 주고, 추상화를 정의하고 해당 인터페이스를 상속받은 또 다른 repository를 정의하는 방법이다. Repository가 비어있기 때문에 가능한 일이다.

 

 

  Multiple Spring Data Module을 가진 repository도 있다.

애플리케이션은 여러 Spring Data Module을 사용해야 할 때가 분명 있을 텐데, 여러 repository를 감지하면 Spring Data는 strict repository 구성 모드로 전환한다. strict repository 구성 모드는 repository 정의를 위한 Spring Data Module 바인딩을 결정하기 위해 repository 또는 도메인 클래스의 세부 사항을 사용한다.

정의된 scope 안에서의 모든 repository 인터페이스가 Spring Data Module에 바인딩 되어 있기 때문에 애플리케이션에서 고유한 Spring Data Module을 사용하면 심플해질 수 있다.

이렇게.

interface MyRepository extends JpaRepository<User, Long> {

}

@NoRepositoryBean
interface MyBaseRepository<T, ID> extends JpaRepository<T, ID> {
	// ...
}

interface UserRepository extends MyBaseRepository<User, Long> {
	// ...
}
반응형

'Framework > spring' 카테고리의 다른 글

#17 : H2 database 연동 준비  (0) 2020.06.13
#16 : query method를 정의하자  (0) 2020.05.24
#14 : JPA 시작  (0) 2020.05.18
#13 : JDBC (Java DataBase Connectivity)  (0) 2020.05.10
#12 : spring 관련 docs 및 API 참고 자료  (0) 2020.05.08