orElse

    User user = userRepository.findByUsername(username).orElse(
        userRepository.save(User.builder()
            .username(username)
            .password(password)
            .email(email)
            .provider(provider)
            .providerId(providerId)
            .role(role)
            .build())
    );
        
    return user;

 

Optional의 값 유무와 상관 없이 실행된다.

 

Optional이 null이 아니라면 가져온 값 반환, null이라면 orElse로 실행된 값 반환.

 

즉, 위 코드에서 user 값이 있더라도 새로운 User 객체가 생성되어 저장된다.

 

 

 

orElseGet

    User user = userRepository.findByUsername(username).orElseGet(() ->
        userRepository.save(User.builder()
            .username(username)
            .password(password)
            .email(email)
            .provider(provider)
            .providerId(providerId)
            .role(role)
            .build())
    );
    
    return user;

 

Optional에 값이 없을 때만 실행된다.

 

위 코드에서 user 값이 있다면 orElseGet() 안에 있는 로직은 실행되지 않는다.

 

 

 

결론

orElse(null)과 같은 상황이 아닌, 객체를 저장하는 등의 CRUD 관련 로직의 경우 상황에 맞게 orElseGet으로 실행하는 것을 권장한다.

 

 

복사했습니다!