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**가 정답입니다! 👍