inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

옵셔널 - 베스트 프랙티스

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

144

service

작성한 질문수 26

0

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

 

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

 

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

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

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

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

java 함수형-프로그래밍 lambda optional

답변 2

0

David

안녕하세요. 박철현님, 공식 서포터즈 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 인턴

안녕하세요, 인프런 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로 하는게 좋을까요?)이라는 게시물도 참고해보시면 도움이 될 것입니다.

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

db sql vs java stream 비교 궁금증 알려주세요!

1

75

1

파라미터 구분이 안되는지..?

0

70

1

자바 21 버전을 꼭 써야하나요??

0

144

2

9. 스트림 API3-컬렉터 오타?

0

78

2

(추석 챌린지) 복습 정리내용

0

95

1

람다 궁금한 점

0

73

2

스트림과 for문 질문

0

44

1

디폴트 메서드를 사용한 리펙토링

0

52

1

실무에서의 커스텀 Collector 사례 여부

0

65

1

IntelliJ 한글 깨지는 현상 문의

0

202

1

함수형 프로그래밍 적용 범위/원칙

0

61

1

스트림에 대해서 질문(float)은 사용하는지

0

58

1

[자료 패키지 누락] 2.람다 자료에서 문제 패키지명 생략 (25page)

0

60

2

지연 평가

0

68

1

메서드 시그니처

0

102

3

고급편 우선순위

0

130

3

스프링 데이터 JPA 인터페이스에서의 default 메서드 사용

0

113

2

독립적인 스레드 할당 시 스레드 개수는 어떻게 할당해야 할까요?

0

87

1

병렬 프레임 병목 현상 해결책에 대해 궁금한 점

0

103

1

스트림 중복 에러 관련 질문

0

71

1

자바 버전이 31 까지 업데이트 된다면 새로운 자바 강의를 추가 하실 건가요?

0

134

1

임계값과 스레드수를 줄일 경우 교착상태가 발생할수 있는건가요?

0

103

2

변수 합치기에 대해서 질문드립니다!

0

83

2

flatMap 응용 방법에 대해서, 이렇게 하는게 맞는지?

0

129

1