강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

박철현님의 프로필 이미지
박철현

작성한 질문수

김영한의 실전 자바 - 고급 3편, 람다, 스트림, 함수형 프로그래밍

옵셔널 - 베스트 프랙티스

값이 없으면 예외를 던지는 것이 더 자연스러운 상황에 대한 질문

작성

·

116

0

베스트 프랙티스 6.무조건 Optional이 좋은 것은 아니다 부분을 설명 하실 때

 

"값이 없으면 예외를 던지는 것"이 더 자연스러운 상황에 대한 설명 부분에서 궁금한 것이 생겨서 질문드립니다.

 

예를 들어 특정 ID 기반으로 User 엔티티를 찾는 DBA 코드가 있다고 할 때 반환타입을 Optional<User>가 아닌 User로 했을 때 클라이언트 코드쪽에서는

if (user == null) { 
   throw new NotFoundException("...");
}

아래와 같은 Optional을 사용한 코드보다 위와 같은 이런 코드가 더 낫다는 걸로 받아들이면 될까요??

findUserById(userId)
.orElseThrow(() -> new NotFoundException("..."));

답변 2

0

안녕하세요. 박철현님, 공식 서포터즈 David입니다.

ID기반으로 무조건 존재하는 DB 엔터티를 찾아야 하는 경우, Optional 대신 에외를 던지는 게 API 설계상 명확할 수 있다.

위 부분은 getUser와 같이 구현된 경우를 말하는 것입니다.


public User getUser(long id) {
  User user = userMap.get(id);
  if (user == null) {
    throw new UserNotFoundException("사용자 정보가 없습니다.");
  }
  
  return user;
}

public Optional<User> findUser(long id) {
  User user = userMap.get(id);
  return Optional.ofNullable(user);
}

 

반드시 값이 존재해야 하는 경우를 생각해보면 DB 설정 값이 있습니다.

일반적으로 DB를 사용하는 스프링부트 애플리케이션의 경우 실행될 때 데이터소스를 구성합니다. 이때 적절한 설정 값이 없다면 해당 값이 없다고 예외가 발생합니다.

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. 박철현님.

이 질문은 ‘람다, 스트림, 함수형 프로그래밍’에서 Optional을 사용하는 방식에 대한 올바른 사용법을 논의하고 있습니다. Optional은 주어진 값이 없을 때 예외를 처리하기 위한 방법으로 활용됩니다.

주어진 예제의 차이를 간단히 설명드리면, Optional을 사용하는 코드:

findUserById(userId)
.orElseThrow(() -> new NotFoundException("..."));

는 코드의 가독성을 높이고 명확성을 제공합니다. 이 방식은 코드의 흐름이 명시적으로 나타나며, 값이 없을 때 자동으로 예외를 던질 수 있도록 설정되어 있어 더 직관적입니다. 결과적으로 예외 처리를 간소화하고, 명시적 예외 처리 패턴을 제공합니다.

반면, 기존의 null 체크 방식:

if (user == null) {
   throw new NotFoundException("...");
}

은 개발자의 실수로 null 체크를 깜박할 수 있는 리스크가 있습니다. 이 방식에서는 각 상황마다 null 체크가 필요해서 같은 코드가 반복될 가능성도 있습니다.

각 프로젝트의 성격 및 팀이 채택한 코딩 스타일에 따라 어느 것을 사용할지는 다를 수 있습니다. 그러나 Java 8 이상에서는 Optional을 사용하여 null 값을 명시적으로 처리하는 것이 권장됩니다.

이미 많은 개발자들이 Optional을 사용하는 것이 예외를 다루는데 있어 보다 안전하고 일관된 방식을 제공한다고 여기고 있습니다.

추가적으로, Entity Optional 반환 값에 대한 질문(왜 optional로 하는게 좋을까요?)이라는 게시물도 참고해보시면 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

박철현님의 프로필 이미지
박철현

작성한 질문수

질문하기