UserRepository를 구성하고 있는데
단건조회는 Null을 반환할 가능성이 있어서 Optional로 래핑해서 반환하고,
서비스에서 예외처리 추가해주는게 좋겠다는 피드백을 받았다.
public interface UserRepository {
User save(User user); //create와 update를 save로 통합
User findById(UUID userId);
List<User> findAll();
void delete(UUID userId);
}
1.Optional이란?
이 값은 없을 수도 있다는 사실을 타입으로 명시하기 위한 컨테이너.
즉
User
이건 "반드시 User가 있다" 라는 의미
Optional<User>
이건 User가 있을 수도, 없을 수도 있다는 의미.
[현재 코드 문제점]
User findById(UUID userId);
"항상 User를 반환한다". 라고 말하고 있는거임.
[실제 구현]
User user = data.get(userId); // 없으면 null
return user;
타입과 현실이 불일치 하는 일이 생겨버린다.
이렇게 하면 Service쪽에서
User user = userRepository.findById(id);
if (user == null) {
...
}
매번 null 체크를 강제받게 된다.
[Optional 적용시]
Optional<User> findById(UUID userId);
User가 없을 수도 있으니 호출자는 그 가능성을 고려해라. 라는 말.
@Override
public Optional<User> findById(UUID userId) {
return Optional.ofNullable(data.get(userId));
}
ofNullable
- 값이 있으면 Optional<User>
- 값이 없으면 Optional.empty()
[Service쪽 예외 처리]
User user = userRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("유저 없음"));
orElseThrow(...)
Optional이 비어있는 경우 처리.
값이 있으면 그 값을 반환
값이 없으면 예외를 던진다.
'코드잇 스프린트 > 실습' 카테고리의 다른 글
| [sprint5] 디스코드 어플리케이션 채널 생성시 NPE 발생 (0) | 2026.02.23 |
|---|---|
| BasicUserService내 update 기능 피드백. (0) | 2026.01.29 |
| ReadStatus,UserStatus,BinaryContent 도메인 추가(왜 추가하는거고, 어떤 역할을 하는지?) (0) | 2026.01.28 |
| 간단한 디스코드 프로그램 만들기_ 피드백3(매개변수 변경 ,메서드 이관) (1) | 2026.01.15 |
| 간단한 디스코드 프로그램 만들기_ 각 필드에 List 추가해서 기능 추가하기. (0) | 2026.01.14 |