Todoary 릴리즈 후, 회원가입이 중복으로 일어나는 경우가 많이 보입니다. (현재는 일일이 대조 후 중복된 계정 중 미사용 계정은 모두 삭제했습니다.)
그 원인으로, 회원가입 버튼이 중복으로 눌려서 여러 차례 Request가 보내진 것으로 보입니다.
똑같은 상황을 테스트 해보았습니다.
동시성 테스트 by JUnit5
테스트 코드
develop-rds 환경에서 테스트했습니다.
10개의 쓰레드를 통해 동시에 Apple OAuth User를 저장해보았습니다.
@Transactional
@SpringBootTest
public class ConcurrencyTest {
@Autowired
MemberService memberService;
@Autowired
EntityManager em;
@Test
public void 회원가입_동시성_테스트() throws Exception {
String name = "concurrencyName";
String email = "concurrencyEmail";
String providerId = "concurrencyProviderId";
ExecutorService executorService = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) {
executorService.execute(() -> memberService.joinOauthMember(
createOauthMemberParam(name, email, ProviderAccount.appleFrom(providerId)))
);
}
executorService.shutdown();
executorService.awaitTermination(10, TimeUnit.SECONDS);
List<Member> members = em.createQuery("select m from Member m where m.name = :name", Member.class)
.setParameter("name", name)
.getResultList();
members.stream()
.map(member -> member.getId())
.forEach(System.out::println);
Assertions.assertThat(members.size()).isGreaterThan(1);
}
OauthMemberJoinParam createOauthMemberParam(String name, String email, ProviderAccount providerAccount) {
return new OauthMemberJoinParam(name, email, providerAccount, "ROLE_USER", true);
}
}
문제 상황 확인
console에 member id 출력 결과
실제 DB 상황
왜 10명이 아니라 9명이 생겼는지는 모르겠지만... 중복 계정이 생기는 것을 확인했습니다. (중복 request가 보내진 것이 맞아 보입니다.)
문제 해결
어떻게 해결하면 좋을 지 의견 부탁드립니다. @Todoary/todoary_serverdeveloper
(일단 아래의 mysql 커맨드로 해결은 했습니다.)
ALTER TABLE member ADD UNIQUE unique_name (email, provider);
결과 확인
console에 member id 출력
실제 DB 상황
결론
일단 DB에서 (member의 name & provider) set을 unique하게 함으로써 해결했지만, 실제 서비스에서 중복 요청이 또 들어오게 되면 예외 메시지가 앱에서 뜰 것이기에 중복 요청이 못 가도록 앱 버튼에 처리가 따로 필요해보입니다. @Todoary/todoary_iosdeveloper @yooyeri
Todoary 릴리즈 후, 회원가입이 중복으로 일어나는 경우가 많이 보입니다. (현재는 일일이 대조 후 중복된 계정 중 미사용 계정은 모두 삭제했습니다.)
그 원인으로,
회원가입 버튼이 중복으로 눌려서
여러 차례 Request가 보내진 것으로 보입니다.똑같은 상황을 테스트 해보았습니다.
동시성 테스트 by
JUnit5
테스트 코드
develop-rds
환경에서 테스트했습니다.10개의 쓰레드를 통해 동시에 Apple OAuth User를 저장해보았습니다.
문제 상황 확인
console에 member id 출력 결과
실제 DB 상황
왜 10명이 아니라 9명이 생겼는지는 모르겠지만... 중복 계정이 생기는 것을 확인했습니다. (중복 request가 보내진 것이 맞아 보입니다.)
문제 해결
어떻게 해결하면 좋을 지 의견 부탁드립니다. @Todoary/todoary_serverdeveloper (일단 아래의 mysql 커맨드로 해결은 했습니다.)
ALTER TABLE member ADD UNIQUE unique_name (email, provider);
결과 확인
console에 member id 출력
실제 DB 상황
결론
일단 DB에서 (member의 name & provider) set을 unique하게 함으로써 해결했지만, 실제 서비스에서 중복 요청이 또 들어오게 되면 예외 메시지가 앱에서 뜰 것이기에 중복 요청이 못 가도록 앱 버튼에 처리가 따로 필요해보입니다. @Todoary/todoary_iosdeveloper @yooyeri