•
문제점:
OAuth를 통한 소셜로그인으로 회원가입을 할 때도, 휴대폰 번호로 회원가입 했을 때와 마찬가지로 회원가입 시 필요한 정보들을 기입해야하는 절차를 거치도록 해야합니다.
그런데, 일반 회원가입 (휴대폰 번호로 회원가입)과 달리 소셜로그인의 경우, 소셜로그인 api를 호출하는 시점(첫 번째 사진의 소셜 계정으로 로그인 버튼 클릭)과 회원가입 절차를 완료하는 시점(두번째 사진의 Sign-up 버튼 클릭)이 달라 회원가입 절차를 어떻게 처리할지 고민하게 됐습니다.
•
해결한 방법:
소셜로그인 api를 호출하고 성공했을 때, account, user 및 user와 1:1 관계에 있는 모든 entity를 생성하고, 회원가입 절차를 완료하는 시점에 그 entity들의 field 값들을 업데이트하는 방식으로 구현했습니다.
•
이어지는 문제점:
소셜로그인은 성공했지만 회원가입 절차를 완료하지 않고 그만두게 되면, 일단 account entity는 생성되었기 때문에 다시 소셜로그인을 시도했을 때 회원가입이 끝나지 않은 유저라고 인식을 하고 회원가입 절차로 안내하도록 해야합니다. 그러기 위해서는 회원가입 절차를 끝냈는지 여부를 알 수 있어야 합니다.
•
해결한 방법:
회원가입 절차를 끝냈는지 여부를 저장할 필요가 있고, 이를 redis에 저장합니다.
만약 회원가입 절차를 끝내지 않았다면 (redis에 ‘signup_completed_${userId}’ 키가 없다면)
isNewUser 가 true 가 되고, 끝냈다면 isNewUser 가 false 가 됩니다.
만약 소셜로그인을 시도하는데 isNewUser가 true 라면, 회원가입 페이지로 이동합니다.
•
이어지는 문제점:
◦
어찌됐건 DB 상에는 회원가입이 완료되지 않았는데도 불구하고 account 및 그와 1:1 관계를 가진 entity들의 record가 불완전한 상태로(null 값인 field들을 가진 상태로) 존재하게 됩니다.
◦
redis 에 회원가입 완료 flag를 저장한다고 하지만, 만료시간(TTL)을 설정해도 문제고(회원가입을 완료한 유저인데도 flag의 만료시간이 지나면 회원가입 절차를 완료하지 않은 유저로 판단하게 됨), 만료시간을 설정하지 않아도 문제가(redis는 단기간 저장하는 휘발성 메모리 역할을 해야하는데 무기한 저장되는 데이터가 계속 쌓이게 됨)됩니다.
◦
이러한 문제점이 socialSignIn에서 빈 계정을 만들고 socialSignUp에서 그 내용을 덮어씌기하기 때문에 생긴 문제점이라고 인식했습니다. 따라서 회원가입 시에만 계정이 생성되고, 회원가입 여부를 redis 이외의 것으로 처리해야된다는 생각을 했습니다.
•
해결 방안:
◦
소셜로그인을 호출했을 때 기디렉션되는 콜백 api에 계정 생성하는 로직을 빼고 소셜 회원가입할 때 생성되도록 변경했습니다. 따라서 회원가입 하기 전에 불완전한 상태의 계정이 만들어지지 않고 그런 계정과 매칭되는 일도 막았습니다.
◦
회원가입 유무를 redis에 저장하는 일은 ttl을 설정해도 문제가 되고 안해도 문제가 되었기 때문에 빼야겠다는 생각을 했습니다. 그러나 entity를 추가해서 생성하는 것은 부담이 있었기 때문에 다른 방안을 생각해 보았습니다.
소셜로그인 콜백이 되었을 때 계정이 없으면(계정 생성은 소셜회원가입 api로 다 보냈기 때문에) Token을 null로 반환하는 방법을 구상했습니다.
◦
토큰은 로그인 시 매번 발급하고 db에 저장할 필요가 없기 때문에 발급한 토큰이 없으면 프론트엔드에서 회원가입 페이지로 보내는 식으로 구성할 수 있습니다. 따라서 레디스에 저장할 필요도 없고 회원가입 여부를 나타내는 변수 또한 필요 없습니다. 코드도 더욱 간결해져서 마음에 드는 해결 방안이었습니다.