설모의 기록

mongoDB 사용법 본문

데이터베이스

mongoDB 사용법

hyyyy8 2017. 10. 9. 19:43

이전 포스트에서 몽고디비 설치에 대해 포스팅 했습니다.

이번에는 몽고디비 명령어에 대해 정리해보겠습니다.

몽고디비의 기본 포트번호는 27017 입니다.




# mongo 명령어 

  • use local                                                // use 데이터베이스_이름 으로 데이터베이스 지정
  • db.users.insert(JSON객체)                     // users 라는 컬렉션에 객체 추가
  • db.users.find( )                                      // users 라는 컬렉션에 들어있는 문서를 모두 보여줌
  • db.users.find( ).pretty()                         // users 라는 컬렉션에 들어있는 문서를 JSON 형태로 줄바꿈되어 보여줌
  • db.users.remove(JSON객체)                  // 예) db.users.remove({name: /hyeona/}) 와 같이 regexp 표현식 이용가능






# 로그인 기능 예제

1. 사용자 조회 예제
    • var MongoClient = require('mongodb').MongoClient;                          // 몽고디비 모듈 사용해 변수 선언
    • databaseUrl 변수에 데이터 베이스 연결정보 정의                                    // 예) mongodb://IP주소:포트번호/데이터베이스이름


    • 데이터베이스내에 일치하는 문서가 있는지 조회하는 함수 authUser( )
    • database.collection(‘users’) : users 라는 콜렉션 정보 불러오기
    • users.find(JSON객체).toArray(function (err, docs) {} ) : JSON객체를 users 콜렉션에서 찾고, 객체배열로 변환해 docs 인자로 받는다.



2. 사용자 추가 예제
    • 데이터베이스에 문서를 추가하는 함수 addUser( )
    • database.collection(‘users’) : users 라는 콜렉션 정보 불러오기
    • users.insertMany([JSON객체들], function (err, result) {} ) : JSON객체 배열을 users 콜렉션에 저장한다. 콜백메소드의 result인자의 insertedCount 속성에 추가된 레코드 개수가 저장되어 있다.



3. mongoose 사용예제
  • mongoose 모듈 선언

    • 데이터베이스 관련 변수 선언


    • mongoose 를 이용해 데이터베이스에 연결하는 함수 connectDB( )
  • mongoose.connect(데이터베이스주소) : 데이터베이스와 연결
  • ‘open’ 이벤트 : 데이터베이스와 연결되었을 때 발생
  • ‘error’ 이벤트 : 데이터베이스 연결이 제대로 되지 않았을 때 발생
  • ‘disconnected’ 이벤트 : 데이터베이스와 연결이 끊어졌을 떄 호출
  • mongoose.Schema(JSON형태로 정의) : ‘속성이름: 속성타입’ 쌍으로 이루어진 JSON객체로 스키마 정의
    • 속성타입(스키마 타입) 종류 : String, Number, Boolean, Array, Buffer, Date, ObjectId, Mixed(혼합타입)
    • {password: {type: String, required: true, unique: false}} 이런식으로 정의 가능 (required === not null, unique === unique)
  • mongoose.model(콜렉션이름, 스키마객체) : 스키마와 콜렉션 연결


    • 몽구스 모델을 이용해 사용자 인증하는 함수 authUser( )
  • UserModel.find(JSON객체, function (err, results) {} ) : UserModel의 콜렉션에서 JSON 객체 데이터를 조회
  • UserModel.where(JSON객체).update(JSON객체, function (err, results) {} ) : UserModel의 콜렉션에서 JSON 객체를 찾은 후 업데이트

                    => 예) UserModel.where({id: ‘hyeona’}).update({name: “현아”}, function (err, results) {} )

  • UserModel.remove(JSON객체, function (err, results) {} ) : UserModel의 콜렉션에서 JSON객체 삭제


    • mongoose 를 이용해 사용자를 등록하는 함수 addUser( )
      • user.save(function (err, results) {} ) : save( ) 메소드는 모델 객체에서 사용하는 것이 아니라 모델 객체의 인스턴스인 user를 생성해 사용해야 한다.



4. 인덱스 생성
    • 인덱스 사용 이유 : 검색 속도가 빨라진다. 조회가 필요한 속성에 인덱스를 생성한다. 위치기반 서비스에서는 경도와 위도에 인덱스를 설정하는 것이 좋다.
    • id 속성의 값으로 전달된 객체처럼 unique: true 로 설정하면 자동으로 인덱스가 생성된다.
    • name 속성의 값으로 전달된 객체는 index 를 ‘hashed’ 로 설정했다.


5. mongoose 스키마 객체에 메소드 추가
  • 스키마객체.static(‘함수이름’, 함수정의) : 스키마 객체에서 사용가능한 함수 정의
  • 스키마객체.method(‘함수이름’, 함수정의) : 모델 인스턴스 객체에서 사용가능한 함수 정의

    • _doc 속성 : 각 문서 객체의 정보


6. 비밀번호 암호화하기
  • 단방향 암호화 : 한 방향으로만 암호화 가능, 즉 복호화할 수 있는 방법이 없다.
  • 양방향 암호화 : 암호화한 데이터를 다시 복호화해 원본을 구할 수 있다.
  • mongoose 의 virtual( ) 함수 이용 : 문서 객체에 실제로 저장되는 속성이 아니라 가상의 속성을 지정
            => 예) 비밀번호를 저장하는 속성 이름이 hashed_password 라면, 실제로 저장되는 속성은 아닌 password 속성을 만든 후 이 속성에 값을 
                      넣어 저장할 때 hashed_password 속성으로 저장되도록 한다. 

      • 문자열을 받아 빈칸을 제거한 후 첫번째 단어는 id로, 두번째 단어는 name으로 저장한다.
      • info 속성의 값을 불러올 때는 id 속성값 + ‘ ‘ + name 속성값 을 불러온다.


      • user.id 는 test01, user.name 은 소녀시대 이다.
      • 실제 데이터베이스에는 info 속성값은 저장되지 않으며 id, name 속성값만 저장된다.

    • crypto 모듈 이용하여 비밀번호 암호화
=> npm install crypto --save




    • encryptPassword(password) : password 와 salt 값을 crypto 모듈로 암호화한다.
    • makeSalt( ) : 랜덤값 생성


      • authenticate(password, salt값, hashed_password) : password 와 salt값으로 암호화된 비밀번호가 hashed_password와 같은지를 반환


      • 인스턴스 객체인 user 를 생성하여 저장하면 실제로는 password 속성이 아니라 _password, salt, hashed_password 속성들이 저장된다.


      • password 와 results[0]._docs.hashed_password 가 같은지 체크한다.