티스토리 뷰

CrudRepository 혹은 PagingAndSortingRepository 인터페이스를 사용하면 MongoDB 의 Collection 을 다룰 모든 메소드가 제공되는 것이나 다름없다. 그렇다면 deleteAll() 같은 무자비한 메소드도 모든 개발자가 아무데서나 제약없이 사용 가능하다는 이야기 이다. 이런 메소드들을 선택적으로 제한하여 개발자에게 제공하고 싶다면 어떻게 할까. 사용자정의 Repository 인터페이스를 만들면 된다.


방법은 간단하다. CrudRepository 또는 PagingAndSortingRepository 인터페이스에 정의되있는 메소드들 중에 원하는 것만 copy 해서 따로 인터페이스를 만들면 된다.

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();
Iterable<T> findAll(Sort sort);
Page<T> findAll(Pageable pageable);



Selectively exposing CRUD methods


이것들 중에 노출하고 싶은 것만 골라서 아래와 같이 만들어주자.

public interface MyBaseRepository<T, ID extends Serializable> extends Repository<T, ID> {
	T save(T entity);
	T findOne(ID id);
	boolean exists(ID id);
	Page<T> findAll(Pageable pageable);
}



이 인터페이스를 상속하는 Person 도메인 클래스용 인터페이스를 만든다. 이런식으로 도메인별로 사용될 쿼리메소드를 추가로 정의해서 사용하게 된다.

public interface PersonRepository extends MyBaseRepository<Person, String> {
	Person findByName(String name);
}



Spring MVC 프로젝트에서는 컨트롤러에 두줄 추가해서 사용하면 끝.

@Controller
public class MongoController {
 
    private static final Logger logger = LoggerFactory.getLogger(MongoController.class);
     
    @Autowired
    private PersonRepository repository;
     
}

사실상 개발할 때 CrudRepository 를 쓰던 아니면 내가 정의한 MyBaseRepository 인터페이스를 쓰건 컨트롤러에서 바뀌는 소스는 하나도 없다. PersonRepository 가 어떤 인터페이스를 상속받을지 바뀌는 것일뿐이다.



반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함