📌 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 엔티티에서 가져와서 같이 저장하면 된다.
📌 Description
문제점
verifyDiscordCode에서는 디스코드 연동 혹은 재연동 시 필요한 정보를 아래와 같이 조회함
디스코드 유저네임, 닉네임, 인증하려는 4자리 코드 -> 요청 본문
디스코드 ID -> 디스코드 서버에서 디스코드 유저네임을 통해 조회함
발급된 4자리 코드 -> redis 인증코드 레포지터리
먼저 인증하려는 4자리 코드와 발급된 4자리 코드의 일치 여부를 확인 후,
유저네임 / 닉네임의 중복 여부를 체크한다.
그리고 인증이 완료되었으면 기존 인증코드는 삭제한다.
이미 디스코드 인증이 완료된 상태라면 -> 디스코드 연동정보만 변경. 디스코드 정보변경 이벤트 발행
미완료 상태라면 -> 디스코드 인증상태 바꿔주고, 연동정보도 변경. 준회원 승급조건 상태 충족 이벤트 발행
(중요)
이때 디스코드 유저네임, 닉네임은 요청 본문에서 가져오지만
디스코드 ID는 디스코드 서버를 통해 조회해온다. (
discordUtil.getMemberIdByUsername)이때
getCurrentGuild().getMembersByName(username, true).stream().findFirst();와 같이 서버의 모든 멤버 정보를 가져온 후 순회하는 방식으로 유저네임의 일치 여부를 확인한다.이는 1) 비효율적일 뿐만 아니라 2) 디스코드 연동이라는 핵심 로직에서 외부 의존성을 하나 더 늘리는 것이므로, 개선해야 한다.
개선 방법
디스코드 인증코드 발급 시 레디스에 인증코드 정보를 넣는다.
이때 커맨드를 입력한 주체의 디스코드 ID를 함께 저장한다. 즉 DiscordVerificationCode에 discordId 필드를 추가한다.
이제 DiscordVerificationCode에는 discordUsername 외에도 discordId가 함께 저장된다. verfiyDiscord에서 discordUtil을 사용하지 않고, code 엔티티에서 가져와서 같이 저장하면 된다.