출처
[https://velog.io/@aidenshin/Optional-관련..](https://velog.io/@aidenshin/Optional-관련..)
열심히 JPA 책을 보면서 따라하고 있는데, Spring JPA에서 Spring Data JPA로 변경하던 와중 오류를 맞이했다.
책이 써졌을 때는 .findOne() 의 리턴타입이 그냥 원본 클래스인 것 같은데, JDK17 버전이 나온 시점에서 findOne() 메소드는 Optional 객체를 리턴한다는 것이다.
따라서 구글링을 통해서 이것에 대해 찾아보았다. 아래는 그 내용이다.
Spring Data JPA 사용 시 Repository에서 리턴 타입을 Optional로 바로 받을 수 있도록 지원하고 있습니다.
Optional을 사용하면 반복적인 null 체크
를 줄일 수 있기 때문에 잘 사용하면 매우 편리한 것 같습니다.
Optional 관련하여 사용법을 간략하게 정리해봤습니다.
// AS-IS
@Override
public Sample getSample(final Long id) {
// 값이 없으면 NoSuchElementException
return sampleRepository.findById(id).get();
}
.get()
의 경우 결과값이 null일 경우 NoSuchElementException
발생
orElseThrow()
를 통해 값이 없을 경우 예외를 던져주거나orElse
, orElseGet
를 통해 값이 없을 경우 값을 지정
//Optional 결과 값이 없을 때 처리
// throw Exception
return sampleRepository.findById(id)
.orElseThrow(IllegalArgumentException::new);
return sampleRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("no such data");
// null Return
return sampleRepository.findById(id)
.orElse(null);
// 비어있는 객체로 Return
return sampleRepository.findById(id)
.orElseGet(Sample::new);
Repository
에서 Optional을 반환하는 경우
원하는 값이 있으면 원하는 객체로 받고 없으면 Exception처리
를 하는 패턴을 사용