Type ORM 이용한 중복 확인 로직에서의 문제

Yi Kanghoon·2023년 1월 15일
1

개요

updateUser api를 만들고 테스트 중, 2명 이상의 유저가 존재할때 중복 확인 로직에 걸림 (물론 중복되지 않았음)

기존 코드

const nicknameDuplication = Boolean(
  await manager.findOne(User, {
    where: {
      nickname: updateUserDto.nickname,
      id: Not(user.id),
    },
  })
);
const phoneDuplication = Boolean(
  await manager.findOne(User, {
    where: {
      phone: updateUserDto.phone,
      id: Not(user.id),
    },
  })
);

와 같이 작성하고, 한 명의 유저만 등록되어 있을때의 테스트에서는 문제가 발생하지 않음. 그러나 두 명 이상의 유저 등록 후 테스트시 유저 가입을 승인하기 위한 요청에서 항상 중복확인에 걸렸는데....

원인?

유저 가입을 승인하기 위해 사용한 RequestBody에는 isApproved라는 하나의 속성만 있음. 이 상태에서 updateUser 요청을 보내면, 당연히 다른 속성들은 undefined로 넘어감. 따라서
1. updateUserDto.phone은 undefined
2. where.phone : updateUserDto.phone로, 옵션으로 주었다고 생각한 phone 컬럼이 옵션으로 들어가지 않음.
3. findOne를 사용했기에 조건에 맞는 첫번째 유저 (=가장 첫 번째 유저)의 값을 가져옴.

변경한 코드

const nicknameDuplication = Boolean(
  await manager.findOne(User, {
    where: {
      nickname: updateUserDto.nickname ? updateUserDto.nickname : user.nickname,
      id: Not(user.id),
    },
  })
);
const phoneDuplication = Boolean(
  await manager.findOne(User, {
    where: {
      phone: updateUserDto.phone ? updateUserDto.phone : user.phone,
      id: Not(user.id),
    },
  })
);

추가로

현재의 로직대로면 user를 db에서 찾아오는 과정이 무조건 필요한데, 다른 부분에서 유저의 다른 정보가 필요하지 않다면 현재의 삼항연산자를 사용하는 방식보다는 body에 해당 속성이 존재한다면 중복 검사를 하는 방식으로 변경해야 성능 이슈가 발생하지 않을듯 (쓰다 보니 생각났네.....)

profile
Full 'Snack' Developer

0개의 댓글