-
13장 mongoose(몽구스)를 이용한 index 활용, 데이터 검증MeanStack (deprecated) 2016. 6. 21. 22:43
이번에는 mongoose 모델에 색인을 넣어서 질의 검색을 좀 더 빠르게 하는 방법을 알아본다.
몽구스로 만든 모델에 색인을 넣는 방법은 간단하다. unique 라는 옵션을 주면 땡 이다.
예를 들어
username : {
type : String ,
trim : true ,
unique : true
}
위와 같은 식으로 옵션을 주면 username 은 RDBMS 에서 볼 수 있는 primary key 와 같은 형식이 된다.
여기에 추가로 보조 index 를 줄 수도 있는데 이 역시 index 라는 옵션을 주면 끝 이다.
email : {
type : String,
index : true
}
위 처럼 index 옵션을 주고 true 로 설정하면 이는 보조 색인이 되어 email 과 관련된 질의 를 할 경우
성능이 향상된다.
index 는 참 좋은 기능이지만 이미 중복된 데이터가 저장되어 있는 필드에 unique 옵션을 주면 어떤 재앙(?)을
초래 할지 모르니 RDBMS 처럼 모델링 단계에서 미리 정의하길 추천한다.
이번엔 검증에 대하여 알아보자.
먼저 데이터가 들어갈 때 값의 존재 유무를 검증하고 싶다면 required 옵션을 주면 된다.
username : {
type : String,
trim : true,
uinque : true,
required : true
}
이제 username 항목의 존재 유무를 검사하고 username 항목에 데이터가 없다면 저장하지 않을 것 이다.
이번엔 특정문자와 형식에 관련된 검증을 알아보자. 여기서는 match 옵션을 주면 된다.
email : {
type : String ,
index : true ,
match : /.+\@.+@..+/
}
위 처럼 값을 주면 정상적인 email 패턴이 아닐 경우 데이터를 저장하지 않는다.
또 다른 예제로는 enum 즉, 열거형 으로 검증을 하는 방식이다. 이 역시 enum 옵션을 주면 된다.
role : {
type : String ,
enum : ['Admin', 'Owner', 'User']
}
위 옵션으로는 role 필드에는 Admin, Owner , User 외의 데이터가 들어오면 저장하지 않을 것 이다.
이번에는 콜백함수를 이용한 맞춤식 검증을 하는 방법을 알아보자.
만약 패스워드의 길이 항목을 8자 이하로 하고 싶다면 다음처럼 옵션을 주면 된다.
password : {
type : String ,
validate : [
function(password) {
return password.length >= 8;
},
'Password should be longer'
]
}
validate 라는 옵션을 주면 내부에 검증 함수를 사용할 수 있고, 위처럼 지정한다면 패스워드가 8글자가 넘어간다면
저장이 되지 않을 것 이다. validate 옵션은 위와 같이 검증 함수와 오류 메시지를 포함한 배열이 되어야 한다.
클라이언트에서 위와 같은 검증을 해도 되지만 , 조금 더 안전하고 정확하게 하기 위해서는 서버에서도 위와 같은
검증은 꼭 필요할 것 이다.
마지막으로 몽구스의 DBRef 라는 문서 데이터간 참조 방식을 알아보자.
예를 들어 블로그에 글을 쓴다고 했을 때 그 글에는 글을 적은 유저 정보가 저장되야 한다.
기본적으로 생성되는 unique 한 필드인 objectid 를 저장하고 싶다고 한다면 블로그글의 모델은 다음과
같이 된다.
var PostSchema = new Schema({
title : {
type : String ,
required : true
},
content : {
type : String ,
required : true
},
author : {
type : Schema.ObjectId,
ref : 'User'
}
});
코드만 봐도 알아보기 쉬울 것 이다. author 의 type 는 Schema.OnjectId 이고 이 ObjectId 의 레퍼런스로
User Schema 를 사용한다고 설정하였다.
그리고 실제로 사용한다고 한다면 Post 모델의 author 에 User 인스턴스를 대입해야 한다.
var user = new User(); user.save(); var post = new Post(); post.author = user; // author 에 user 인스턴스를 대입한다. post.save();
위 코드처럼 post 의 author 속성에 user 인스턴스를 대입해 사용한다.
하지만 DBRef 는 실제 값이 들어간 것 이 아니고 외래키 형식으로 해당 값을 참조하는 것 이다.
이에 데이터를 채워 넣기위해서는 populate() 라는 함수를 사용해야 한다.
예를 들어 find() 메소드는 다음 코드 처럼 author 속성을 채워넣는다.
Post.find().populate('author').exec(function(err, posts) { ....... });
위 처럼 코드를 작성하면 find 함수를 이용하여 검색할 때 posts 컬렉션에 있는 모든 데이터를 인출해 author
필드를 채워 넣을 것 이다.
이로서 mongoose 의 기능에 대한 대략적인 부분은 모두 알아보았다. 이처럼 몽구스의 기능을 이용하면 모델을
좀더 조직화하고 멋지게 모델링이 가능하다.
다음 장에서는 passport 모듈을 사용해서 사용자 인증을 관리하는 것 을 해보자.
(끝)
(이번 장은 추가 파일 없음)
'MeanStack (deprecated)' 카테고리의 다른 글
15장 passport 모듈을 이용한 사용자 인증 (2) (4) 2016.06.26 14장 passport 모듈을 이용한 사용자 인증 (1) (8) 2016.06.23 12장 mongoose(몽구스) 를 이용한 스키마 확장 (1) 2016.06.19 11장 mongoose (몽구스) 를 이용한 MongoDB 스키마 생성, CRUD 작업 (2) (1) 2016.06.16 10장 mongoose (몽구스) 를 이용한 MongoDB 스키마 생성, CRUD 작업 (1) (4) 2016.06.16