들어가며
프로젝트를 진행하던 중에
로그인 -> 카페 좋아요 -> 새로고침 후 로그인 -> 좋아요 데이터 증발
하는 문제가 발생했다.
우리팀 폴로는 문제의 원인이 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에 멤버를 초기화하는 로직이 들어있다.
그래서 항상 멤버가 초기화 되었던 것이다...
'코코코딩공부 > Spring' 카테고리의 다른 글
restAssured를 이용한 restDocs 와 OAS (1) | 2023.08.10 |
---|---|
Spring Security 없이 Oauth 구현기 (0) | 2023.08.06 |
Repository 사용기 (0) | 2023.06.07 |
도메인은 id 값을 가져도 될까 ? (0) | 2023.05.28 |
[Spring] Argument Resolver 내부 구경 하기 (0) | 2023.04.30 |