[JAVA] Optional 관련

임홍원·2022년 4월 25일
0

Spring Data JPA 사용시 Repository패턴에서 Optional에서 isPresent와 get을 쓰는것이 별로 좋지 않다고 하여 리팩토링 해보았다.

Optional에서 .get() .isPresent()를 쓰면 좋지 않은 이유

  1. Optional을 쓰는 의미가 없다 -> null check를 하기 위하여 optional을 사용하는 것 이므로 if문을 덜 사용하기위해 Optional을 쓰는것이라고 필자는 생각한다.
  2. .get() 은 Null을 반환할 수 있으므로

처음코드로는

Optional <Restock> restock = restockRepository.findById(restockId);
if(restock.isPresent()){
	restock.get().setDeleted(true);
    restockRepository.save(restock.get());

이런 형태였다.

.get()의 경우 결과값이 null일 경우 NoSuchElementException 발생
orElseThrow()를 통해 값이 없을 경우 예외를 던져주거나
orElse , orElseGet를 통해 값이 없을 경우 값을 지정해야 한다

리팩토링한 코드로는

 Optional<Restock> restock = Optional.ofNullable(
               restockRepository
                       .findById(restockId)
                       .orElseThrow(() -> new NoSuchElementException("error")));

       restock.ifPresent(r -> {
           r.setDeleted(true);
           restockRepository.save(r);
               }
       );

orElseThrow()로 Exception을 던져주었으며
isPresent() 대신 ifPresent()를 사용하여 Repository 패턴을 통해 DB에 save 하였다.

0개의 댓글