반응형
이 글에서는 우리가 Mongoose를 사용할때 정의하는 static과 method의 차이점에 대해서 서술한다.
사용되는 곳의 차이점
instance method는 모델을 통해 생성된 인스턴스에서 사용가능한 메서드이고, statics method는 모델 자체에서 사용가능한 메서드이다.
이 말만으로는 잘 이해가 가지 않으니 코드를 통해서 확인해보자.
예시로 아래와 같은 User 모델이 있다고 가정한다. 현재 static method와 instance method가 동시에 선언 되어 있는 상태이다.
- 본 글에서는 typescript로 작성되었다고 가정하고 진행한다.
- typescript로 활용하는 방법은 아래 글을 참고하자
- https://systorage.tistory.com/entry/Mongoose-mongoose를-typescript와-사용하는-방법
import {Schema, model, Model} from 'mongoose';
interface DBUser {
name: string;
email: string;
gender: boolean;
}
interface DBUserMethods {
fullName(): string;
}
interface DBUserModel extends Model<DBUser, {}, DBUserMethods> {
return42(): number;
}
const userSchema = new Schema<DBUser,DBUserModel, DBUserMethods>({
name: { type: String, required: true },
email: { type: String, required: true },
gender:{ type: Boolean, required: true }
});
userSchema.static('return42', function () {
return 42;
})
userSchema.method('fullName', function fullName(): string {
return this.name + ' ' + this.email;
});
const User = model<DBUser,DBUserModel>('User', userSchema);
export { User };
static method는 모델에 정의되는 메서드이고, methods는 모델을 통해서 생성된 인스턴스에 정의되는 메서드이다.
method 정의 시 주의할 점은 instance method와 static method는 기본적으로 많은 메서드들을 가지고 있기 때문에 이를 재정의하지 않도록 주의해서 사용해야한다.
이 때 각각의 메서드는 사용되는 곳이 다르다. 예시로 살펴보자
// 새로운 유저 생성
const test = new User({name: 'testName', email: 'test@naver.com', gender: true})
// instance method
// User model에서 생성한 인스턴스에서 사용
const test2 = test.nameWithEmail()
// static method
// User model에서 직접 사용
const test3 = User.myStaticMethod();
this 바인딩의 차이점
methods를 사용할 때의 this는 method를 호출한 객체 자체가 this가 되고,
statics를 사용할 때의 this는 모델 자체이다.
userSchema.static('return42', function () {
// Model{ User }
console.log(this);
return 42;
})
userSchema.method('fullName', function fullName(): string {
// {
// name: 'test',
// email: 'testEmail',
// gender: true,
// _id: new ObjectId('...')
// }
console.log(this);
return this.name + ' ' + this.email;
});
const test1 = User.return42();
const test2 = new User({ name: 'test', email: 'testEmail', gender: true });
test2.fullName(); // 호출시
반응형
'DataBase > MongoDB' 카테고리의 다른 글
[MongoDB] The value of "offset" is out of range. It must be >= 0 && <= 17825792 (0) | 2022.11.14 |
---|---|
[Error] MongoServerError: ns not found (0) | 2022.11.08 |
[Mongoose] mongoose 사용시 save가 느린 현상 해결 방법 (0) | 2022.07.03 |
[MongoDB] MongoDB Version Upgrade 하는 방법 (Standalone) (0) | 2022.05.12 |
[MongoDB] MongoDB에서 계정 생성 (0) | 2022.05.10 |