ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 모듈을 사용해서 사용자 인증을 관리하는 것 을 해보자. 


    (끝) 

    (이번 장은 추가 파일 없음)


    댓글