코드 그라데이션

.orElseThrow에 대해 본문

Java, SpringBoot 추가 공부

.orElseThrow에 대해

완벽한 장면 2023. 7. 18. 12:44

.orElseThrow는 누구의 메서드인가?

예를 들면 코드에서 

    Item item = itemRepository.findById(orderDto.getItemId())
            .
orElseThrow(EntityNotFoundException::new);

이렇게 나와있다고 하면,

 

앞에서부터 

 itemRepository.findById(orderDto.getItemId()) 

여기에 .을 찍으면 어떤 메서드가 나온다. 그리고 나서 .을 또 찍는 것이기 때문에 이 메서드의 리턴과 관련이 있다. 즉 findById의 리턴과 관련이 있다.

findById는 일단 나는 id를 넘기는 것이고, 메서드는 item을 찾아준다. 즉 findItemById인  셈이다.

그런데 범용적으로 jpa가 제공하는 메서드를 쓰기 위해 형식에 맞춰 쓴 것일 뿐.

 

itemRepository.findById(X).orElseThrow 이 형태다.

결국 findById(X) 이 리턴에 orElseThrow가 붙은 것.

그런데 findById는 Optional이다. 그러면 orElseThrow는 Optional에 있는 것. 

 

우리는 Throw를 예외에서만 쓴다.

그래서 orElseThrow의 진자 의미는

.네가 감싼게 존재하면 리턴을 하고 orElseThrow()

                                                         그렇지않으면 예외를 던져라

 

public static void main(String[] args) {
	Optional<Object> o - Optional.ofNullable(null);
    
    Object o1 = o.orElseThrow(); // 여기서 에러 나옴. NoSuchElementException!!!
    
    System.out.println(o1);
}

 

객체가 있기 때문에 

아래는 정상적인 코드가 됨.

public static void main(String[] args) {
	Optional<Object> o - Optional.of(5);
    
    Object o1 = o.orElseThrow(); 
    
    System.out.println(o1); 
}

 

Optional 쓰지 않는 버전으로 바꾸면

public static void main(String[] args) {
	String item = null;
    Optional<Object> o = Optional.of(item);
    
    Object o1 = o.orElseThrow();
}

이 코드는

public static void main(String[] args) {
	String item = null;
    Optional<Object> o = Optional.of(item);
    
    // Object o1 = o.orElseThrow();
    
    
    if(item == null) {
    	throw new RuntimeException();
    }
    else {
    	o1 = item;
    }    
    
}

이것과 같다. 

 

orElseThrow가 나오면

항상 예외를 던진다는 게 아니라, 

Optional이 감싼 대상을 가져오려고 시도를 하되, 그게 만약 없다면 예외를 던진다.

 

728x90
Comments