Optional 란?
Optional은 Java 8에서 도입된 클래스로, null이 될 수 있는 객체를 감싸는 래퍼 클래스입니다. Optional의 주요 목적은 NullPointerException을 방지하고 null 체크
Optional의 주요 특징
- 값이 존재할 수도, 존재하지 않을 수도 있는 객체를 표현
- repository.findById(id)와 같은 메서드는 결과가 없을 경우 Optional.empty()를 반환
- 값을 안전하게 추출하기 위한 다양한 메서드 제공 (isPresent(), orElse(), orElseThrow() 등)
Optional 사용 시 주의사항
- get() 메서드는 값이 없을 때 NoSuchElementException 예외를 발생시키므로 isPresent()로 확인 후 사용해야 함
- orElseThrow()를 사용하면 값이 없을 때 지정한 예외를 발생시켜 더 명확한 에러 처리 가능
🔸 1. Optional<DataMember> member = repository.findById(id);
- 이 방식은 Java 8 이상의 Optional 객체를 사용하여 null을 안전하게 다루기 위한 방법입니다.
- findById()는 해당 id로 사용자를 찾지 못할 경우 Optional.empty()를 반환합니다.
- 이후 .get()을 호출하면, 값이 존재하면 반환되지만 값이 없으면 NoSuchElementException 예외가 발생합니다.
java
복사편집
Optional<DataMember> member = repository.findById(id); // Optional로 감싸진 값
if (member.get().getId() == null) { // 값이 있다고 가정하고 바로 꺼내서 사용 (위험)
throw new UsernameNotFoundException("User not found with id: " + id);
}
✅ 문제점: member.get()은 Optional.empty()일 때 예외가 발생하므로, 그 전에 isPresent() 또는 orElseThrow() 같은 안전한 처리를 해야 합니다.
🔸 2. DataMember member = repository.findById(id).get();
- Optional에서 바로 .get()으로 꺼내서 DataMember로 저장합니다.
- 이 경우도 값이 없을 경우 NoSuchElementException 발생.