본문 바로가기

개발자의 logs

<트러블공부, 트공> 일반 유저와 소셜로그인 유저 중복검사 핸들링 문제 본문

개발 공부지식/*개발 공부*

<트러블공부, 트공> 일반 유저와 소셜로그인 유저 중복검사 핸들링 문제

주인장v 2022. 7. 21. 14:04

 

 

 

우리 조는 일반(회원가입을 통해 가입한 유저) 유저와 소셜로그인( 카카오톡, 네이버) 유저 두 분류로 나누어져 있었다.

 

 

두 유저는 받아오는 정보도 조금씩 다르고, 두 유저를 구분하는 것이 필요했기 때문에 스키마를 두개로 따로 나누어 관리하고 있었다.

 

 

하지만 어느날 , 이메일 중복가입 문제가 발생했다. 스키마가 다르다보니, 일반가입에서 이메일로 가입한 유저가 소셜로그인으로도 중복체크가 안되기 때문에, 새로 가입 할 수 있는 문제가 생겼다. 

 

 

이 둘은 같은 이메일을 가진 동일한 유저이기 때문에(물론 이메일만 같고 실제 사용자는 다를 수 있다. 이 부분은 이름까지 동일하면 동일인으로 처리하기로 했다.) 두 번 씩이나 가입을 유도하고 DB에 새로 저장하면 안된다. 

 

그렇지만 두 개의 스키마로 나누어져 있기 때문에 중복검사를 실시할 때 두 개의 스키마를 다 뒤져야하고, if 조건문이나 or 를 쓰는 일이 많아졌고 코드가 복잡해지고 에러가 날 확률이 높아졌다. 

 

그래서 내가 찾은 결론은 스키마를 통일시키는 방법을 썼다.

 

스키마를 통일시키면 한번의 find로 동일한 아이디나 이메일이 있는지 중복 검사를 할 수 있다.

 

다만 작은 문제가 있었는데, 기존 user의 변수들과 일치시키고 , 필요 없는 소셜로그인 변수들은 정리하는 작업이 필요했다.

 

아래는 그 결과의 코드다. 

 

 

 

    // controller/users.js
    
    // 가입하고자 하는 이메일이 존재하는 경우
    
    const exitstUsers = await User.findOne({ userEmail });
    if (exitstUsers) {
      return res.status(400).send({
        errorMessage: '중복된 이메일이 존재합니다.',
      });
    }

 

 

//schema/user.js

const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const saltRounds = 10;
const jwt = require('jsonwebtoken');

const userSchema = new mongoose.Schema({
  password: {
    type: String,
  },

  userName: {
    type: String,
  },

  userEmail: {
    type: String,
  },
  refresh_token: {
    type: String,
  },

  site: {
    type: String,
  },
});
const User = mongoose.model('User', userSchema);
module.exports = User;

 

 

문제 - 원인 -해결방법 (재요약)

 

 

문제 : 유저가 회원가입 도중 소셜로그인으로 한번 가입된 이메일이, 또 다시 중복가입되는 문제발생함 

 

원인 : 일반가입으로 일반유저 데이터가 데이터베이스에 저장되는 위치와, 소셜로그인으로 가입되는 유저들의 데이터베이스 위치가 서로 다름.

 

해결방법:  

 

  1. 첫번째 시도 : 일반 회원 가입과, 소셜회원 회원가입시 번씩 DB 조회함. => 회원가입시  DB 탐색하느라 로딩시간 비효율 발생, 알고리즘의 복잡도 증가 가독성 감소
  2. 두번째 시도 (채택) :  종류의 회원의 공통 데이터를 추려내고, 필요한 정보들만 모아서 종류의 데이터 스키마를 하나로 통합. =>  DB  중복검사하던 경우를 한번으로 축소. 로딩시간 감소 가독성 증가함.
Comments