티스토리 뷰

Repository 


Spring Data MongoDB - Reference Documentation 을 읽어보면 알겠지만 상당부분을 Repository 라는 개념을 설명하고 있음을 알 수 있다. 우선 repository 라는 개념을 정확히 설명하기에 좀 애매한데.. 특정 collection(일반적인 RDBMS에서의 Table 개념)에만 사용할 쿼리들을 정의해두는 곳이라고 생각하면 단순하지 않을까 한다. 이 Repository 인터페이스를 만든 궁극적인 목적은 다양한 저장소들을 위한 데이터접근계층(Data Access Layer)을 구현하는 노력을 줄이는데 있다. 이 인터페이스가 어떤일을 하길래 우리가 매번 DB와 매핑작업하는 성가신작업을 줄여주는 것일까.


바로 Query methods 가 그 요점이다. 메소드명만 가지고 조회쿼리를 만들 수가 있다. 특정규칙을 따르는 메소드명만 늘어놓은 인터페이스만 만들면, 개발자가 구현 클래스를 따로 만들지 않고 SpringData 프로젝트가 대신해서 MongoDB 와 자동으로 매핑해서 결과를 가져다준다. 아마도 예제를 보면 쉽게 이해가 될듯하다. 다른데서도 이런개념이 있었나 모르겠지만, MongoDB 같이 join 개념이 없는 DB 에서는 탁월한 매핑법같다는 생각이 들었다.


repository 인터페이스를 뜯어보자.

public interface Repository<T, ID extends Serializable> { }

최고 상위 인터페이스 Repository 에는 아무것도 정의가 되있지 않다. 



CrudRepository 


Repository  인터페이스를 상속받아 CRUD 메소드들을 정의해놓게 CrudRepository 인터페이스이다.

public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
	T save(T entity);
	Iterable<T> save(Iterable<? extends T> entities);
	T findOne(ID id);
	boolean exists(ID id);
	Iterable<T> findAll();
	long count();
	void delete(ID id);
	void delete(T entity);
	void delete(Iterable<? extends T> entities);
	void deleteAll();
}

왜 굳이 Repository 에 아무것도 정의를 해놓지 않고 하위 인터페이스인 CrudRepository 라는 곳에 CRUD 에 필요한 메소드들을 다 정의해놓았을까. 사실 deletAll() 이런 위험한(?) 메소드들까지 있기에 모든 개발자에게 CrudRepository에 있는 메소드를 사용하게 하는 것은 매우 위험할 수 있다. 그래서 CrudRepository 인터페이스에 정의되있는 메소드들 중 몇개만 골라서 제공할 수 있다.

interface MyBaseRepository<T, ID extends Serializable> extends Repository<T, ID> {
	T findOne(ID id);
	T save(T entity);
}

이 사용자 정의 인터페이스를 사용하게 되면 관리자입장에서 개발자에게 노출할 메소드를 자유롭게 조정할 수 있다.

(참고 : 사용자정의 Repository 인터페이스 만들기)




PagingAndSortingRepository 


거기다 페이징처리를 수월하게 해주는 PagingAndSortingRepository 가 있다.

public interface PagingAndSortingRepository<T, ID extends Serializable> 
		extends CrudRepository<T, ID> {
	Iterable<T> findAll(Sort sort);
	Page<T> findAll(Pageable pageable);
}

어차피 거의 PagingAndSortingRepository 를 사용할 테지만, 이 세가지 인터페이스가 점차 확장되고 있는것을 잘 인지만 하시면 Spring Data 를 더 효과적으로 사용하실 수 있을 듯 하다.




반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함