Optional
Optional
Optional
Optional을 찾아보게 된 이유
프로젝트 기능 수정을 진행하던 중 아래와 같은 코드를 작성하게 되었고 일부 로직은 생략했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
List<Long> allByIdx = registryRepository.findAllByIdx();
List<Long> temp = new LinkedList<>();
temp.addAll(allByIdx);
List<Optional<Registry>> result = new ArrayList<>();
if (temp.isEmpty()) {
Registry registry = new Registry("admin", "admin","admin");
result.add(Optional.ofNullable(registry));
}
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>로 받아도 될 것 같았지만 Optional을 제거하자 컴파일 에러가 발생했고
IDE에서도 Optional 타입을 사용하도록 자동으로 수정해 주었다.
왜 findById는 Optional을 반환해야 하는지 궁금해졌고 그 이유를 찾아보며 Optional에 대한 개념을 정리하게 되었다.
JPA에서 findById가 Optional을 반환하는 이유
JpaRepository 인터페이스를 확인해보면 find 관련 메서드는 CrudRepository를 참고하도록 되어 있고
CrudRepository의 findById는 반환 타입이 Optional<T>로 고정되어 있다.
→ 엔티티가 없을 수 있기 때문에 타입으로 강제하기 위해서다.
Optional이란?
Optional은 값이 있을 수도 있고 없을 수도 있는 객체를 안전하게 표현하기 위한 클래스다.
null 때문에 발생하는 NullPointerException(NPE) 을 줄이기 위해 도입되었다.
This post is licensed under CC BY 4.0 by the author.
