프로젝트에서 비밀번호 변경 기능을 구현하면서 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 값만 잘 받아온 것을 볼 수 있습니다.
'코딩 공부 > Node.js' 카테고리의 다른 글
[Express] mongoose sequence plugin을 이용한 AutoIncrement 구현하기 (0) | 2024.05.23 |
---|