JWT 를 사용한 회원가입, 로그인 비즈니스 로직을 만들어 PR 했는데 Optional 을 사용한 부분에서 orElse 를 사용한 의도에 대해서 피드백을 받았다.
지금까지 Optional 을 사용할 때 orElse 를 단순히 if 문의 else 처럼 사용하고 있었는데,
이번 기회에 더 디테일하게 알아보려고 정리하게 되었다.
// username 으로 Member 를 찾을 경우 반환
// 찾지 못하면 새로운 Member 를 저장 후 반환
public Member whenKakaoLogin(UserResponse response) {
return this.findByUsername(response.getUsername())
.orElse(this.createMember(response));
}
orElse
: null 일경우 파라미터값 (other) 이 반환됨orElseGet
: null 일경우 파라미터의 함수에서 생성된 결과를 반환함public Member whenKakaoLogin(UserResponse response) {
return this.findByUsername(response.getUsername())
.orElse(this.createMember(response));
}
@ExtendWith(MockitoExtension.class)
class MemberServiceTest {
@InjectMocks
MemberService memberService;
@Mock
MemberJpaRepository memberRepository;
@BeforeEach
void setup() {
when(memberRepository.findByUsername(anyString()))
.thenAnswer(invocation -> {
String username = (String) invocation.getArgument(0);
return username.equals("user1") ? Optional.of(createMember()) : Optional.empty();
});
when(memberRepository.save(any()))
.thenReturn(createMember());
}
@Test
void no1() {
String username = "user1";
memberService.whenKakaoLogin(getUserResponse(username));
}
// 결과
MemberService -- Username 으로 조회 메서드 실행
MemberService -- Member 생성 메서드 실행
public Member whenKakaoLogin(UserResponse response) {
return this.findByUsername(response.getUsername())
.orElseGet(() -> this.createMember(response));
}
// 결과
MemberService -- Username 으로 조회 메서드 실행
@Test
void no2() {
String username = "user2";
memberService.whenKakaoLogin(getUserResponse(username));
}
// 결과
MemberService -- Username 으로 조회 메서드 실행
MemberService -- Member 생성 메서드 실행
orElse()
→ 메서드라면 orElseGet()