출처

[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 관련하여 사용법을 간략하게 정리해봤습니다.


1. get() 사용 관련

    // 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);

2. Optional 에서 값 바로 받기

Repository에서 Optional을 반환하는 경우 원하는 값이 있으면 원하는 객체로 받고 없으면 Exception처리를 하는 패턴을 사용