본문 바로가기
쿤즈 Dev/Spring Boot

[Spring Boot] Java Optional 사용 방법

by :)Koon 2022. 12. 28.

Java를 이용하여 웹 프로그래밍을 할 때, 많은 부분은 CRUD를 사용하게 될 것입니다. 그리고 Read 부분이 가장 많이 이용되는 부분이 아닌가 싶습니다. 특히 Repository를 접근할때 JPA 기능을 사용하여 인터페이스를 상속받고 사용하는 메서드중에서 Optional 타입들이 있습니다.

이번 포스팅에서는 Optional 타입을 어떻게 사용하는지 알아보도록 할게요.


Optional 은 무엇인가?

Spring boot에서 엔티티를 조회하기 위해서 사용하는 메서드중 findById()라는 메서드가 있습니다. 이 메서드는 Id를 조회하여 엔티티 하나를 가져오는 메서드입니다.

이때 반환 타입을 보면 Optional로 되어 있습니다. 그리고 그 내부에 저희가 원하는 T 반환타입이 제너릭으로 만들어져 있어요. 그렇다면 Optional은 무엇일까요?

 

Optional은 결과 없음 ("no result") 을 분명히 나타내야 할 필요가 있고 null로 인해서 오류가 발생할 가능성이 있는 메서드 반환타입으로 사용하도록 만든것이 목적이라 합니다.

https://docs.oracle.com/javase/9/docs/api/java/util/Optional.html

그렇다면 Optional은 어떻게 사용할 수 있을까요?


Optional 사용 방법

Optional 클래스에는 사용할 수 있는 여러가지 메서드들이 존재합니다. 그 중에서도 사용하면 좋을 메서드들을 알아볼게요.


isPresent()

isPresent() 메서드는 값이 있으면 true를 반환하고 없으면 false를 반환하는 boolean 리턴타입의 메서드입니다.

Optional<Member> member = memberRepository.findById(id);
if(member.isPresent()) {
    // ...
}

위처럼 findById()를 이용해서 꺼내온 Member 엔티티는 Optional 로 감싸져있고 값이 존재하는지 확인하기 위해서 isPresent() 를 사용할 수 있습니다.

 

orElse(), orElseThrow()

isPresent() 를 사용해서 값의 유무를 확인할 수 있지만 체이닝을 이용해서 값을 꺼내오는 다른 메서드를 바로 사용하는 경우가 많습니다. 그 체이닝 메서드들이 바로 orElse(), orElseThrow() 입니다.

// 존재하면 member, 없으면 null
Member member = memberRepository
    .findById(id)
    .orElse(null);


// 존재하면 member, 없으면 throw
Member member = memberRepository
    .findById(id)
    .orElseThrow(() -> 
        new IllegalStateException("Not found member")
    );

orElse()는 없을경우 null을 명시적으로 내보내거나 혹은 다른 객체를 만들어서 내보낼 수 있습니다. 또한 원하는 엔티티가 존재하지 않을경우 익셉션을 처리하고 싶은 경우에는 orElseThrow()를 사용하여 예외처리를 할 수 있습니다.


Optional에 대해서 간단히 알아보았습니다. Optional로 반환타입을 만들어 줄 수도 있지만 이 자체가 값이 비싸기 때문에 의도에 맞게 사용하는 것이 중요합니다. 잘못 사용하면 안티패턴이 될 수 있습니다. 감사합니다.

댓글