다음과 같은 코드가 있었다.
private User getUser(OAuthAttributes attributes, PlatformType platformType){
User findUser = userRepository.findByUserPlatformAndUserSocialId(platformType,
attributes.getOauth2UserInfo().getId()).orElse(null);
if(findUser == null){
return saveUser(attributes, platformType);
}
return findUser;
}
userRepository의 메서드는 Optional 타입이었다.
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByUserPlatformAndUserSocialId(PlatformType platformType, String userSocialId);
}
그래서 리턴값(findUser)이 empty인 경우를 꼭 확인해야 했다. (Optional.empty() 형태)
그런데 맨 위의 코드는 약간 가독성이 떨어진다고 생각이 들어서 Optional에 대해 공부했다. (+ GPT의 도움)
그리고 다음과 같이 리팩토링할 수 있었다.
private User getUser(OAuthAttributes attributes, PlatformType platformType){
User findUser = userRepository.findByUserPlatformAndUserSocialId(platformType,
attributes.getOauth2UserInfo().getId())
.orElseGet(() -> saveUser(attributes, platformType));
return findUser;
}
여기서 나는 또 의문이 들었다.
userRepository의 메서드가 empty를 반환하면 orElseGet에서 saveUser 메서드가 실행된 후 어떤 값이 리턴되는가?
getUser 메서드는 User type을 리턴하게 되는데, orElseGet에서도 같은 타입을 리턴해야 한다.
saveUser가 User가 아닌 다른 타입을 리턴하게 되면 컴파일 에러가 발생한다.
'개발 > Java' 카테고리의 다른 글
[리팩토링] 함수형 인터페이스와 lambda (0) | 2023.08.16 |
---|---|
String, StringBuilder, StringBuffer, CharSequence 이해하기 (0) | 2023.08.06 |
Wrapper Class: int와 Integer (0) | 2023.07.09 |
댓글