Spring Data JPA
Repository.findById()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
List<Long> allByIdx = registryRepository.findAllByIdx();
List<Long> temp = new LinkedList<>();
temp.addAll(allByIdx);
List<Optional<Registry>> result = new ArrayList<>();
if (temp.isEmpty()) {
result = Collections.emptyList();
}
if (temp.toArray().length > 10) {
for (int i = 0; i < 10; i++) {
result.add(registryRepository.findById(temp.get(i)));
}
} else {
for (int i = 0; i < temp.toArray().length; i++) {
result.add(registryRepository.findById(temp.get(i)));
}
}
프로젝트 기능 수정을 하기 위해 작성했던 코드 중 일부 생략된 코드이다.
내가 의문이 들었던 것은 registryRepository.findById
를 작성할 때 Optional로 줘야 하는 부분이다.
그냥 List<Registry> result
로 하면 안되나? 싶었는데 Optional을 생략하면 에러가 떴고 IDE에서 Optional로 바꿔주었다.
그래서 그 이유를 찾아보게 되었다.
JPA
해당 Repository가 상속받고 있는 JpaRepository interface에 들어가봤다.
JpaRepository 인터페이스에서 find와 관련된 메서드는 CrudRepository를 참고하라고 한다.
CrudRepository interface에 findById 메소드를 확인해보니 return값이 Optional 타입으로 고정되어있다.
원인은 바로 CrudRepository interface의 return값이 Optional로 주어져서였다.
JPA 구조
JpaRepository는 PaingAndSortingRepository, QueryByExampleExecutor를 상속하고 있다.
CrudRepository가 조부모, PagingAndSortingRepository가 부모, JpaRepository가 자식의 관계이다.
우리가 만든 Repository는 JpaRepository를 상속받는다.
모든 인터페이스가 <T, ID>
두 개의 제네릭 타입을 사용하는 것을 볼 수 있는데,
T는 Entity의 타입 클래스를, ID는 식별자(PK)의 타입을 의미한다.
이 때, ID에 해당하는 타입은 반드시 java.io.Serializable 인터페이스 타입이어야만 한다.
*Serializable : 직렬화
Serializable 인터페이스 타입??
아래 diagram을 보면 Long, String은 Serializable interface를 구현하고 있다.
우연하게도 Integer, Long, Double, Float, Boolean의 다이어그램을 보니
Primitive Type(기본 자료형)이 Serializable interface를 구현하고 있다. (+ String)
Long
String
List
최상위 부모인 Repository를 CrudRepository가 상속받아 확장시키고,
이를 PagingAndSortingRepository가, 그리고 이를 또 JpaRepository가 상속받아 확장시킨 것을 볼 수 있다.
실제 주로 사용하는 것은 CRUD(Create, Read, Update, Delete) 작업을 위주로 하는 CrudRepository 인터페이스나
페이징 처리, 검색 처리 등을 할 수 있는 PagingAndSortingRepository 인터페이스다.
CrudRepository
조부모 인터페이스인 CrudRepository에는 다음과 같은 메소드들을 제공한다.
reference
[JPA] 리턴타입이 옵셔널(Optional)인 이유는?
[Spring Framework] Spring Data JPA Repository
[JPA] CrudRepository vs JpaRepository
[Spring Data JPA] Repository 생성
[JPA] JpaRepository vs CrudRepository(1) - Paging과 Sorting / QueryExampleExecutor