mongoose에서는 mongodb 내부에는 특정 column이 존재하지 않지만,
데이터를 조회할 때 가상의 column을 추가하여 좀 더 편리하게 데이터를 가공하거나 사용할 수 있도록 도와준다.
즉, 실제 DB에 저장되지 않는 가상의 column을 만들어 편리하게 데이터를 가공 및 사용할 수 있게 한다는 것이다.
가상 속성을 정의할 때 schema.virtual() 메서드를 사용한다.
이 메서드는 두개의 인자를 받는데, 첫번째는 가상 속성의 이름이고 두번째는 객체이다.
객체의 get 메서드를 정의하여 가상 속성의 값을 계산하고 반환할 수 있다.
set 메서드를 정의하여 가상 속성에 값을 설정할 수도 있다.
예시 코드 1
const userSchema = new mongoose.Schema({
firstName: String,
lastName: String
});
userSchema.virtual('fullName').get(function() {
return this.firstName + ' ' + this.lastName;
});
위의 예시 코드에서는 fullName 가상 속성을 정의하고 get 메서드를 사용해서 firstName과 lastName 필드의 값을 조합하여
계산된 값을 반환 하도록 설정했다. User 모델에서 fullName 속성을 사용할 수 있는 것이다.
예시 코드 2
const User = mongoose.model('User', userSchema);
const user = new User({
firstName: 'John',
lastName: 'Doe'
});
console.log(user.fullName); // 'John Doe'
위의 코드에서는 User 모델을 정의하고 fullName 속성을 사용하여
firstName과 lastName 필드의 값이 합쳐진 문자열을 반환한다.
예시 코드 3
// models/todo.js
const mongoose = require("mongoose");
const TodoSchema = new mongoose.Schema({
value: String,
doneAt: Date,
order: Number
});
TodoSchema.virtual("todoId").get(function () {
return this._id.toHexString();
});
TodoSchema.set("toJSON", {
virtuals: true,
});
module.exports = mongoose.model("Todo", TodoSchema);
오늘 강의에서는 데이터에 고유 번호를 붙여주기 위해 mongodb에 데이터를 저장했을 때 생기는 고유 id 값을 사용하는데
virtual 메서드를 이용했다. mongdb의 _id는 데이터 베이스를 직접 조회했을 때는 확인가능하지만 서버나 클라이언트에서 확인할 수는 없는 데이터이기 때문에 virtual 메서드를 이용해 가상의 column을 만들어 거기에 저장한 후 조회에 사용한 것이다. 이 외에도 활용할 수 있는 상황이 많이 있을 것 같다. 잘 기억해두었다가 유용하게 써먹어야겠다.
'Development > TIL' 카테고리의 다른 글
내가 만든 Cookie (0) | 2023.04.21 |
---|---|
try catch를 이용한 예외 처리 (0) | 2023.04.20 |
this에 대하여 (0) | 2023.04.18 |
mongoose objectId와 new 키워드 (0) | 2023.04.18 |
TIL - Promise와 await 연산자 (feat. vs GPT) (0) | 2023.04.16 |