스프링
[스프링] Optional [orElse vs orElseGet]
imcoding
2022. 11. 19. 19:39
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으로 실행하는 것을 권장한다.