본문 바로가기
개발/Java

[리팩토링] Optional과 orElseGet 그리고 함수형 인터페이스

by meanjung 2023. 8. 16.

다음과 같은 코드가 있었다. 

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가 아닌 다른 타입을 리턴하게 되면 컴파일 에러가 발생한다.

 

 

댓글