[JAVA] Optional 관련

임홍원·2022년 4월 25일

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 하였다.

profile
Frontend Developer

0개의 댓글