본문 바로가기

웹/school(MEAN)

Building a data model withMongoDB and Mongoose [1]

컨트롤러에 데이터를 넣지말고 db에 넣자

mvc패턴 관점에서 model에 데이터가 들어있어야 합니다.

 

 

mongodb에 데이터를 추가하고 heroku에 올려보자.

스키마를 컴파일한게 모델입니다.

 

 

db에서 직접 가져오는 것이 아닙니다.

복잡할 수 있습니다.

db를 사용하는 에플리케이션이 나올 때마다 연동하는 부분을 계속 만들어야 합니다.

 

중간에 api를 두어서 모든 app이 api를 통해서 db에 접근해서 데이터를 접근할 수 있게끔 만듭시다.

거의 모든 app은 이러한 방식입니다.

 

express, node.js를 이용해서 만듭니다.

즉, 라이브러리를 만드는 것 입니다.

 

처음에 만들때 어렵습니다.

 

 

Mongoose라는 패키지

navitve드라이버에 있는 기능들을 가지고 있습니다.

Mongoose를 만들어 봅시다.

 

데이터구조, 모델, 유지관리, db와 상호작용을 편하게 할 수 있도록 합니다.

스키마를 정의할 때 validation기능을 추가할 수 있도록합니다.

validation은 데이터의 무결성을 유지시켜주는 것입니다.

 

Mongoose는 애플리케이션과 데이터베이스 사이의 연결고리 역할을 한다

에플리케이션은 mongoose만하고 대화를 합니다.

 

 

mongoose를 깔아봅시다.

npm모듈로 깔아봅시다.

예전에는 --save라는 옵션을 적어줘야 packge.json에 들어갔는데 

이제는 바뀌었습니다. 무조건 dependencies에 넣어야 하기 때문입니다.

 

미리 만ㄷ르어 두지 않습니다.

관계형 db를 공부했습니다.

mongodb는 좀 다릅니다.

문서형 db 입니다.

 

애플리케이션 코드 안에서 모든 것을 처리할 수 있습니다.

크게 신경 쓰지 않아도 됩니다. 자동으로 증가, 감소가 됩니다.

 

connection file을 봅시다.

mvc중에 models폴더를 만들어 봅시다.

 

app.js부터 시작하니깐 db.js까지 가려면

app.js에서 requiring 해봅시다.

app.js의 윗부분에 다음 코드처럼 수정하자db.

 

connection하는 db uri 부분을 봅시다.

처음에 시작하면 27017포트 번호로 시작합니다.

mongodb를 설치했다면 윈도우가 시작될 때 mongodb 데모 프로그램이 돌아가고 있습니다.

 

localhost에서 db를 접속하는 것은 간단합니다.

username과 passwd를 물어볼 필요가 없습니다.

username과 passwd, 포트번호를 쓰지 않습니다.

Loc8r이란 db이름을 정합니다.

 

이게 수행되면 db가 수행되겠습니다.

 

db가 작동하는지 안하는지 눈으로 확인해 봅시다.

 

재 시작할 때마다 연결되지는 않습니다.

그래서 반드시 closing해줘야 합니다.

계속 중복된 연결들이 있게 됩니다.

 

그러면 언제 멈추는가를 모니터링하다가 close시켜야 합니다.

 

sigint하는 이벤트를 리스닝하면 됩니다.

nodemon을 쓰면 sigusr2라는 이벤트를 발생시킵니다.

heroku는 sigterm을 할때 closing시켜줍시다.

 

쉽게 하기 위해서 유틸리티 함수를 만듭시다.

 

프로세스들을 설정해서 종료될 때마다 함수를 호출하게 합니다.

이제 애플리케이션이 종료되면 실제로 종료되기 전에 Mongoose 연결이 정상적으로 closing 된다
마찬가지로 Nodemon 이 소스 파일의 변경으로 인해 애플리케이션을 다시 시작하면 , 애플리케이션은 먼저 현재의 Mongoose 연결을 닫는다
Nodemon 리스너는 SIGUSR2 이벤트를 한 번만 수신하려고 하므로 process.on 이 아닌 process.once
를 사용한다 .

 

 

 

이제 app.js위쪽 부분에다가 requiring을 해줘야 합니다.

 

 

 

맨 처음에 사용할 때 db가 필요합니다.

 

데이터 구조가 필요합니다.(= 반복적인 것을 설명하려고)

 

Loc8r홈페이지에 공통적인 데이터 세트가 있습니다.

 

현재는 데이터가 컨트롤러에 있습니다.

그럼 모델로 이동시켜야 합니다.

 

mongoose를 다시 정의해봅시다.

mongoose는 mongDB를 더 잘 다루기 위한 것입니다.

 

DB의 각 항목 = 다큐먼트

컬렉션 = 테이블

 

테이블안에 레코드들이 있었습니다.

컬렉션 안에 다큐먼트 들이 있습니다.

 

다큐먼트를 정의하는 것이 스키마 입니다.

필드 = 패스

 

 

명함철 예제를 이용해서 알아봅시다.

 

 

mongoose가 어떻게 모델 데이터를 처리 할까요?

key: value 로 저장합니다.

_id가 있고 ObjectId가 나옵니다.

 

전형적인 mongdb의 다큐먼트입니다.

 

이거를 정의해주는 스키마도 있습니다.

 

_id에 대하여

다큐먼트의 고유 식별자입니다.

 

PATH객체를 봐봅시다.

그냥 :String이라고 써도 됩니다.

8개 타입을 쓸 수 있습니다.

 

패스 이름 정하기

 

스키마도 js객체입니다. 정의해봅시다.

새로운 파일을 만듭시다.

 

locations라는 파일을 db에서 써야하니깐 db에서 require를 시켜줍시다.

 

 

 

스키마를 정의하는 방법

 

무엇을 정의해야 할까?

컨트롤러에 들어있는 내용을 보면 

아래 내용을 rendering시켜서 뷰에 보내줍니다.

 

컨트롤러에 표현된 것을 스키마로 표현해봅시다

위 처럼 쓰면 다큐먼트 스키마가 됩니다.

배열은 [String]으로 표현합니다.

 

유효성, 최소값,최대값, 디폴트값, 등 다양한 기능을 넣을 수 있습니다.

사용자가 맨처음에 접근 했을 때

처음에는 rating path를 정의할 때 type은 number로 하고 어떤 사용자도 없을 때는 기본값으로 0을 넣어줍니다.

 

 validation기능을 매우 중요합니다.

무결성은 꼭 지켜저야 합니다.

 

스키마에서 유효성 검사를 할 수 있게 합니다.

name이란 path가 비어있는지 없는지 확인하려면 required: ture를 설정합시다.

name이 없다면 db에 저장하지 못하게끔합니다.

 

최대값 최소값을 정할 수 있습니다.

최소0 최대5를 넘기면 저장이 안되도록 합니다.

 

Distance는 다른방식으로 저장해야 합니다.

지리 데이터를 경위도 좌표값을 이용 해가지고 저장할 수 있습니다.

인덱스가 있다면 쉽고 빠르게 db를 찾을 수 있습니다.

 

location에 대한 데이터를 저장해야 합니다.

GeoJSON이라는 포맷에 저장해야 합니다.

 

스키마에서 Geospatial path를 저장하도록 지원합니다.

index를 정의해야 합니다. 2dsphere으로 정의합시다.

GeoJSON스펙은 [경도, 위도] 순서로 배열에 입력하는 것을 요구합니다.

경도가 먼저나옵니다.

 

 

이제 평범한 스키마를 정의했었습니다.

세부정보를 표시하는 details페이지도 스키마로 정의해봅시다.

 

컨트롤러에 있는 데이터 입니다.

 

일반적으로 별도의 테이블로 만듭니다.

parent 다큐먼트 안에다가 자식 다큐먼트를 집어넣습니다.

 

서브 다큐먼트라는 개념이 있습니다.

자식도 자식만의 스키마가 있습니다.

 

새로운 스키마를 정의해봅시다.

반드시 locationsSchema앞에 있습니다.

 

서브 스키마로 넣어봅시다.

 

 

2번째 서브 스키마도 만들어 봅시다.

 

최종적으로 스키마를 정리해봅시다.

 

 

 

이렇게 만들어진 스키마로 어떻게 만들어지는지 알 수있습니다.

mongodb에서는 BSON으로 저장합니다.

_id로 다큐먼트를 관리합니다.

 

모델로 컴파일 시켜봅시다.

스키마를 컴파일하면 모델이라고 합니다.

이 모델(인스턴스)을 이용해서 create, read, save, delete할 수 있습니다.

 

 

location은 1:1로 될거같고

그 안에 

review나 locations들을 다:다 될거같습니다.

 

모델을 컴파일해봅시다.

첫 번째 아규먼트는 모델이름

두 번째 아규먼트는 스키마

세 번째 mongdb의 콜렉션이름

 

스키마에 기반해서 Locaitons라는 모델을 생성한다는 뜻입니다.

3번째는 생략이 가능합니다.

자동으로 생성이 되는데 

첫 번째 아규먼트의 첫 글자를 소문자로 만들고 뒤에 s를 붙힙니다.

이러면 locations라는 컬렉션 이름을 가진 모델이 나올 것입니다.

 

 

728x90