개발자의 logs
<트러블공부, 트공> 일반 유저와 소셜로그인 유저 중복검사 핸들링 문제 본문
우리 조는 일반(회원가입을 통해 가입한 유저) 유저와 소셜로그인( 카카오톡, 네이버) 유저 두 분류로 나누어져 있었다.
두 유저는 받아오는 정보도 조금씩 다르고, 두 유저를 구분하는 것이 필요했기 때문에 스키마를 두개로 따로 나누어 관리하고 있었다.
하지만 어느날 , 이메일 중복가입 문제가 발생했다. 스키마가 다르다보니, 일반가입에서 이메일로 가입한 유저가 소셜로그인으로도 중복체크가 안되기 때문에, 새로 가입 할 수 있는 문제가 생겼다.
이 둘은 같은 이메일을 가진 동일한 유저이기 때문에(물론 이메일만 같고 실제 사용자는 다를 수 있다. 이 부분은 이름까지 동일하면 동일인으로 처리하기로 했다.) 두 번 씩이나 가입을 유도하고 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;
문제 - 원인 -해결방법 (재요약)
문제 : 유저가 회원가입 도중 소셜로그인으로 한번 가입된 이메일이, 또 다시 중복가입되는 문제발생함
원인 : 일반가입으로 일반유저 데이터가 데이터베이스에 저장되는 위치와, 소셜로그인으로 가입되는 유저들의 데이터베이스 위치가 서로 다름.
해결방법:
- 첫번째 시도 : 각 일반 회원 가입과, 소셜회원 회원가입시 각 두 번씩 DB를 조회함. => 각 회원가입시 DB를 두 번 탐색하느라 긴 로딩시간 및 비효율 발생, 알고리즘의 복잡도 증가 및 가독성 감소
- 두번째 시도 (채택) : 두 종류의 회원의 공통 데이터를 추려내고, 필요한 정보들만 모아서 두 종류의 데이터 스키마를 하나로 통합. => 두 번 DB를 중복검사하던 경우를 한번으로 축소. 로딩시간 감소 및 가독성 증가함.
'개발 공부지식 > *개발 공부*' 카테고리의 다른 글
<개발공부, 개공> API 응답목록 200,401... (0) | 2022.07.21 |
---|---|
<개발공부, 개공> Multer란 무엇인가? (0) | 2022.07.21 |
<개발공부, 개공> TIL - kakao middleware? (0) | 2022.07.09 |
<개발공부, 개공> Artillery 부하 테스트 (0) | 2022.07.06 |
<개발공부 , 개공> MVC 패턴이란? (0) | 2022.07.05 |