Skip to content

Release에서 회원가입이 중복으로 일어나는 Issue #259

@60jong

Description

@60jong

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 출력 결과

스크린샷 2023-04-08 011204

  • 실제 DB 상황

스크린샷 2023-04-08 011151

왜 10명이 아니라 9명이 생겼는지는 모르겠지만... 중복 계정이 생기는 것을 확인했습니다. (중복 request가 보내진 것이 맞아 보입니다.)

문제 해결

어떻게 해결하면 좋을 지 의견 부탁드립니다. @Todoary/todoary_serverdeveloper
(일단 아래의 mysql 커맨드로 해결은 했습니다.)

ALTER TABLE member ADD UNIQUE unique_name (email, provider);

결과 확인

  • console에 member id 출력

스크린샷 2023-04-08 011917

  • 실제 DB 상황

스크린샷 2023-04-08 011929

결론

일단 DB에서 (member의 name & provider) set을 unique하게 함으로써 해결했지만, 실제 서비스에서 중복 요청이 또 들어오게 되면 예외 메시지가 앱에서 뜰 것이기에 중복 요청이 못 가도록 앱 버튼에 처리가 따로 필요해보입니다. @Todoary/todoary_iosdeveloper @yooyeri

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions