프로젝트에서 비밀번호 변경 기능을 구현하면서 user의 암호화된 password를 받아오려고 findOne 기능을 이용했습니다.

const user = await User.findOne({ userId });
const hashedPassword = user.password;

 

  이렇게 하다 보니 password 값만 받아오면 되는데 불필요하게 user의 모든 정보를 받아오는 것 같아서 바로 password를 받아올 수 없을까 고민했습니다.

const hashedPassword = await User.findOne({ userId }).password;

 

  그래서 이렇게 한 줄로 표현을 해봤지만 제대로 작동하지 않았습니다.

const hashedPassword = await User.findOne({ userId }, "password");

 

  하지만 이렇게 findOne 안의 중괄호 뒤에 원하는 필드 값을 넣어주면, 그 값을 받아올 수 있습니다. 참고로 "password" 대신 "-_id password" 라고 입력을 한다면, _id 부분을 제외하고 password 값만 객체로 받아옵니다. 어차피 객체에서 꺼내주는 작업을 해야하는 것은 똑같기 때문에 그냥 "password"라고 작성하겠습니다. 

// "password"를 입력했을 경우
{
  _id: new ObjectId('684e4ccc91757a381b66e7ad'),
  password: '$2b$10$sXCscjG5Wn6FKBEfn.lwF.NOVyAO/6EP5HDO.OBgn9GbXXCVzjIZS'
}

// "-_id password"를 입력했을 경우
{
  password: '$2b$10$sXCscjG5Wn6FKBEfn.lwF.NOVyAO/6EP5HDO.OBgn9GbXXCVzjIZS'
}

 

  console.log(hashedPassword)를 찍어보면 위와 같은 값이 return 된다는 것을 알 수 있습니다. 이 값안에는 mongoDB에서 자동으로 부여한 _id값과 password가 객체로 들어있으므로, 바로 사용할 수는 없고 password를 꺼내주는 작업을 해주어야 합니다.

const hashedPassword = await User.findOne({ userId }, "password")
  .lean()
  .then((user) => user?.password);

 

  이렇게 하면 user의 password만 가지고 와서 사용할 수 있습니다. findOne이 동기 처리 되어있기 때문에, then을 사용해서 findOne의 결과값을 받아온 후 optional chaining을 사용해 password 값을 가져옵니다. user가 존재하면 받아온 객체 안에 있는 password 값을 return해주고, user가 존재하지 않는다면 undefined 값을 반환해 줄 것입니다. 

  하나 더 참고할 것은 find나 findOne을 사용하면 필요한 정보뿐만 아니라 불필요한 정보도 다 가져오기 때문에, 서버의 부담을 줄이고 속도를 개선하기 위해서 간략한 정보만 가져오는 lean()을 사용합니다.

$2b$10$sXCscjG5Wn6FKBEfn.lwF.NOVyAO/6EP5HDO.OBgn9GbXXCVzjIZS

 

  다시 console.log(hashedPassword)를 찍어보면 위와 같이 password 값만 잘 받아온 것을 볼 수 있습니다.

+ Recent posts