orElseThrow는 이름 그대로 “있으면(or) 주고, 없으면 던져(Else Throw)!” 라는 뜻입니다.
Optional 상자를 다룰 때 가장 많이 쓰는 핵심 메서드들을 **“상황별”**로 딱 정리해 드릴게요. 이 4개만 알면 Optional 마스터입니다. 😎
1. orElseThrow() : “없으면 에러야! (필수값)” 🚨
가장 많이 씁니다. **“DB에 무조건 있어야 하는 데이터”**를 꺼낼 때 씁니다. (로그인 시 회원 조회, 게시글 수정 시 글 조회 등)
-
동작: 상자를 깠는데 내용물이 있으면 → 꺼내줌 (User 리턴)
-
동작: 상자가 비어있으면 → 지정한 에러를 던짐 (예외 발생)
Java
// ✅ 아주 깔끔하죠?
User user = userRepository.findByEmail(email)
.orElseThrow(() -> new BusinessException("없는 유저입니다."));
2. orElse(기본값) : “없으면 이걸로 줘 (기본값)” 🎁
에러를 내면 안 되고, 데이터가 없을 때 **“대타(Default)“**를 써야 할 때 씁니다.
-
동작: 있으면 → 꺼내줌
-
동작: 없으면 → 괄호 안의 값을 줌
-
예시: “닉네임 없으면 그냥 ‘익명’이라고 해줘.”
Java
// 닉네임을 찾는데 없으면 "익명유저"를 리턴
String nickname = Optional.ofNullable(inputNickname)
.orElse("익명유저");
3. ifPresent(행동) : “있으면 ~해줘 (없으면 말고)” 👀
값을 꺼내서 리턴받을 필요는 없고, “그냥 있으면 로직만 실행하고 싶을 때” 씁니다.
-
동작: 있으면 → 괄호 안의 함수 실행 (void)
-
동작: 없으면 → 아무 일도 안 일어남 (조용함)
-
예시: “조회된 유저가 있으면 로그인 로그를 남겨줘.”
Java
userRepository.findByEmail(email)
.ifPresent(user -> {
System.out.println("로그인 시도: " + user.getEmail());
loginHistoryRepository.save(new History(user));
});
4. map(변환) : “꺼내서 변신시켜줘” ⚡️
상자 안에서 내용물을 꺼내지 않고, 상자 안에서 모양만 바꿀 때 씁니다. (Stream의 map이랑 똑같습니다.)
-
동작: User가 들어있는 상자를 → String(이메일)이 들어있는 상자로 바꿈
-
예시: “유저 객체 전체는 필요 없고, 이메일만 뽑아서 줘.”
Java
String email = userRepository.findById(1L) // Optional<User>
.map(user -> user.getEmail()) // Optional<String>으로 변신!
.orElse("이메일없음"); // 꺼내기 (String)
🚀 요약: 언제 뭘 쓸까?
| 메서드 | 상황 | 비유 |
|---|---|---|
orElseThrow | 필수 데이터 조회 (로그인, 조회) | “돈 안 가져왔어? 나가! (에러)“ |
orElse | 기본값 설정 (설정값, 프로필) | “돈 안 가져왔어? 내가 낼게. (기본값)“ |
ifPresent | 단순 실행 (로그 남기기, 알림) | “사람 있으면 인사해. (없으면 말고)“ |
map | 데이터 가공 (DTO 변환) | “사과 상자를 사과즙 상자로 바꿔.” |
지금 작성 중인 로그인 로직에서는 무조건 **1번 orElseThrow**가 정답입니다! 👍