[MongoDB] User Shema / Model

Dorong·2023년 7월 21일
0

Node.js / MongoDB

목록 보기
20/23
post-thumbnail
  • User 스키마와 모델을 작성해 MongoDB에 담고 조회해보쟈
  • 비밀번호를 DB에 플레인(가공X)상태로 저장하는 것은 보안상 매우 위험!!
  • 따라서 단방향 해싱 함수를 지원해주는 bcrypt 라이브러리 사용

✅ 기본 스키마와 모델 만들기

// src/models/user.js 파일 생성해 작성
import mongoose, { Schema } from "mongoose";

const UserSchema = new Schema({
    username : String,
    hashedPassword : String,
})

const User = mongoose.model('User', UserSchema);
export default User;
  • 해시를 만드는 함수와 해시 검증 함수는 bcrypt 사용

    터미널> yarn add bcrypt



✅ 모델 메서드 만들기

  • 모델 메서드는 모델에서 사용할 수 있는 함수를 의미하며, 두 가지 종류가 있음
    1. 인스턴스 메서드 : 모델을 통해 만든 문서 인스턴스에서 사용 할 수 있는 함수
    2. 스태틱 메서드 : 모델에서 바로 사용할 수 있는 함수

🔸 인스턴스 메서드 만들기

  • 비밀번호를 파라미터로 받아서 계정의 hashedPassword 값을 설정해주는 setPassword 메서드
  • 파라미터로 받은 비밀번호가 해당 계정의 비밀번호가 맞는지 검증해주는 checkPassword 메서드
// src/models/user.js
import bcrypt from 'bycrpt';
...
UserSchema.methods.setPassword = async function(password){
    const hash = await bcrypt.hash(password, 10);
    this.hashedPassword = hash;
}

UserSchema.methods.checkPassword = async function(password) {
    const result = await bcrypt.compare(password, this.hashedPassword);
    return result;
}
...
  • 🌟 인스턴스 메서드를 작성할 대는 화살표 함수가 아닌 function 키워드 사용!!
    => 함수 내부에서 this(문서 인스턴스)에 접근해야 하기 때문

🔸 스태틱 메서드 만들기

  • username으로 데이터 찾을 수 있게 해주는 findByUsername 메서드
// src/models/user.js
...
UserSchema.statics.findByUsername = function(username) {
    return this.findOne({username})
}
...
  • 스태틱 함수에서 this는 모델을 가리킴(여기서는 User)
profile
🥳믓진 개발자가 되겠어요🥳

1개의 댓글

comment-user-thumbnail
2023년 7월 21일

블로그 글 정말 잘 읽었습니다. DB에 플레인 상태로 비밀번호를 저장하는 위험성을 새삼 느꼈고, bcrypt 라이브러리를 이용한 해시 생성과 검증, 그리고 데이터 조회 메서드에 대해 설명해주셔서 감사합니다. 항상 좋은 정보 공유해주셔서 감사합니다!

답글 달기