DATA JPA Repository를 생성하기 전에, repository에 저장할 entity class를 생성한다.
Data JPA repository는 다음과 2가지 경우로 생성할 수 있다.
1. CrudRepository interface를 상속받는 interface 생성
2. Repository interface를 상속받는 interface를 생성하고, 요구되는 methods를 추가한다.
Repository interface는 2개의 type parameter를 갖는다.
1. Repository에 관리되는 entity의 type
2. 그 entity의 id의 type
그러므로 Repository<Todo, Long>을 갖는다.
CrudRepository는 다음 methods를 갖는다.
The void delete(T entity) method deletes the entity whose id is given as a method parameter.
The Iterable<T findAll() method returns all entities that are saved to the database.
The T findOne(Long id) method returns the entity whose id is given as method parameter. If no entity is found, this method returns null.
The T save(T entity) method saves the entity given as a method parameter and returns the persisted entity.
CRD 의 methods를 갖는다. update는 변경감지를 통해 하는듯
CrudRepository를 상속시킬까?
Crud는 Optional으로 반환하지 않고, Crud interface의 methods를 모든 Repositories에 상속시킨다.
Repository interface를 상속시킬까?
Optional을 반환하거나, Crud의 모든 methods를 상속시키지는 않는다.
Blog의 저자는 method가 Null값을 반환할 수 있어 더 좋은 APIs를 만들기위해 ,
불필요한 methods가 추가되는 경우를 막기위해 Repository 를 적은 method만 포함하게 하면 더 사용하기 쉽고, components만들기 쉽게하기 때문에
2번째 방법인 Repository interface를 상속시킨다고 한다
다음과 같은 단계로 다른 method를 쓰도록 한다.
1. Repository interface와 common methods를 추가한 base interface를 생성
1.1 Repository interface를 상속받는 BaseRepository는 2개의 type parameter를 가짐
1. Repository에 관리되는 entity의 type T
2. 그 entity의 id의 type ID
1.2 interface에 @NoRepositoryBean을 붙여 JPA가 BaseRepository interface의 구현체를 생성하지 않도록 한다.
1.3 BaseRepository에 common methods를 추가한다.
``
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.Repository;
import java.util.List;
import java.util.Optional;
@NoRepositoryBean
interface BaseRepository<T, ID extends Serializable> extends Repository<T, ID> {
void delete(T deleted);
List<T> findAll();
Optional<T> findOne(ID id);
T save(T persisted);
}
``
2. base interface를 상속받는 repository interface를 생성
2.1 TodoRepository 생성
2.2 2개 type parameter 제공하는 BaseRepository 상속시키기
모든 repository interface에 같은 methods를 정의할 필요없이 CRUD 동작을 제공하는 Repositories를 생성함
findAll() method만 제공하는 repository를 생성할 수 있다.

Repository interface를 상속받는 BaseRepsitory<>를 생성하여 common methods를 추가한다 (CRD methods).
BaseRepository이 제네릭 타입 매개변수(T,ID)로 정의 되어있어 상속받는 Repository들이 각각 다른 entity에 대해 관리가 가능하다.
BaseRepository를 각 entity에 대한 Repository에 상속시킨다.
CrudRepository 혹은 Repsoitory를 상속시켜 CRUD 동작을 지원하는 JPA Repository interface를 생성할 수 있는데
CrudRepository를 상속시키면 그 interface에 정의된 methods를 쓰면 되고 Repository를 상속시키면 Repsitory에 쓰고자하는 CRUD동작 지원하는 methods를 Repository에 정의하고 상속시키는데
Repository를 상속시켜 불필요한 method 상속을 최대한 줄이는 방향을 권장한다고 한다.