Skip to content

♻️ verifyDiscordCode에서 디스코드 의존성 제거하도록 개선 #1309

Description

@uwoobeat

📌 Description

문제점

verifyDiscordCode에서는 디스코드 연동 혹은 재연동 시 필요한 정보를 아래와 같이 조회함

디스코드 유저네임, 닉네임, 인증하려는 4자리 코드 -> 요청 본문
디스코드 ID -> 디스코드 서버에서 디스코드 유저네임을 통해 조회함
발급된 4자리 코드 -> redis 인증코드 레포지터리

먼저 인증하려는 4자리 코드와 발급된 4자리 코드의 일치 여부를 확인 후,
유저네임 / 닉네임의 중복 여부를 체크한다.

그리고 인증이 완료되었으면 기존 인증코드는 삭제한다.

이미 디스코드 인증이 완료된 상태라면 -> 디스코드 연동정보만 변경. 디스코드 정보변경 이벤트 발행
미완료 상태라면 -> 디스코드 인증상태 바꿔주고, 연동정보도 변경. 준회원 승급조건 상태 충족 이벤트 발행

(중요)
이때 디스코드 유저네임, 닉네임은 요청 본문에서 가져오지만
디스코드 ID는 디스코드 서버를 통해 조회해온다. (discordUtil.getMemberIdByUsername)
이때 getCurrentGuild().getMembersByName(username, true).stream().findFirst(); 와 같이 서버의 모든 멤버 정보를 가져온 후 순회하는 방식으로 유저네임의 일치 여부를 확인한다.

이는 1) 비효율적일 뿐만 아니라 2) 디스코드 연동이라는 핵심 로직에서 외부 의존성을 하나 더 늘리는 것이므로, 개선해야 한다.

개선 방법

  • 디스코드 인증코드 발급 시 레디스에 인증코드 정보를 넣는다.

  • 이때 커맨드를 입력한 주체의 디스코드 ID를 함께 저장한다. 즉 DiscordVerificationCode에 discordId 필드를 추가한다.

    (참고) 이미 IssuingCodeCommandHandler에서는 디스코드 인증코드 발급 시 discord username을 사용하고 있다. 그리고 디스코드 인증 요청 본문에서도 discord username을 받고 있다. 즉 '이 인증코드의 소유자'를 증명할 때는 username을 사용하되, 추가적으로 discord id를 같이 저장하는 방식이다.

    (참고 2) 그렇다면 왜 username과 id를 같이 저장할까? 사실 둘 다 uniqueness가 보장되어야 하는 값이다. 다만 discord id의 경우 보다 internal 한 정보이고, 일반 사용자에게는 username이 더 친숙하다. 따라서 사용자와의 플로우에서는 username을 사용한다. 하지만 discord sdk를 사용할 때는 username보다 id 값을 사용하는 것이 더 좋다. 그 이유는 복잡한데... username은 디스코드 운영 정책에 더 좌우되는 값이다. 예전에 디스코드가 '닉네임#0000' 과 같은 구조를 썼던 것 기억하는가? 그런데 이제는 그런 구조를 쓰지 않는다. 이러한 정책 변경에 영향을 받지 않으려면, discord id를 함께 저장하는 편이 좋다.

  • 이제 DiscordVerificationCode에는 discordUsername 외에도 discordId가 함께 저장된다. verfiyDiscord에서 discordUtil을 사용하지 않고, code 엔티티에서 가져와서 같이 저장하면 된다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions