코코코딩공부/Spring

orElse 에서 생긴 문제 해결

Ocean_ 2023. 7. 30. 21:28

들어가며

프로젝트를 진행하던 중에 

로그인 -> 카페 좋아요 -> 새로고침 후 로그인 -> 좋아요 데이터 증발

하는 문제가 발생했다.

우리팀 폴로는 문제의 원인이 orElse 쪽 문제라고 알려주었다.

그래서 한번 보았다.

문제

final Member member = memberRepository.findById(memberInfo.openId())
                .orElse(saveNewMemberWithAllCafes(memberInfo));

우리의 예상은 찾은 멤버가 없어서 null 일 경우 saveNewMemberWithAllCafes(memberInfo)를 실행할 것 같았다.

 

근데! null이던 아니던 상관없이 saveNewMemberWithAllCafes(memberInfo)가 실행되는 것이었다!!!

 

    public T orElse(T other) {
        return value != null ? value : other;
    }

분명 null 이 아니면 value, null 이면 other 이라고 했는데 .. 

    public T orElseGet(Supplier<? extends T> supplier) {
        return value != null ? value : supplier.get();
    }

orElseGet은 우리가 의도한대로 잘 작동 되었다. 하지만 orElse에서 왜 안되는지를 생각을 해보았는데

 

public T orElse(saveNewMemberWithAllCafes()) {
    return value != null ? value : other;
}

이렇게 실행 될경우 orElse 메소드 입장에서는 T 제네릭 타입을 추론해야 하는데 메소드이기 때문에 추론을 할 수 가 없다.

그래서 saveNewMemberWithAllCafes()의 결과 값을 가져와서 타입을 추론해야한다.

 

하지만 우리는 saveNewMemberWithAllCafes() 메소드 내부에 repository에 멤버를 초기화하는 로직이 들어있다.

그래서 항상 멤버가 초기화 되었던 것이다...