[정리] Mongoose (1) 스키마와 모델

2021. 2. 8. 18:33프로그래밍-Web/MongoDB

1) Schema와 type의 정의

 

- 모든 스키마는 MongoDB의 콜렉션과 매핑되어 있다. 각 property의 자료형을 지정하여 Schema 객체를 생성한다. 이때 실제로 type과 schema에서 정의하는 type은 다르다. schema에 key를 type으로 설정하고 자료형을 정의한다면, 얘는 API가 스키마에 쉽게 접근하기 위한 방법이 될 뿐이지, 실제로 DB에 type으로 들어간다는 보장은 없다.

- 각 type에 대한 다양한 옵션들이 존재한다. (mongoosejs.com/docs/schematypes.html 참고하자)

 

- 그 후 API에서 직접 사용할 모델 인스턴스를 만들어 내보낸다. 실제 API들은 모델 인스턴스(예시코드의 경우 CBSModel)에 접근하여 find 등의 쿼리로직을 수행한다.

 

 

2) Mongoose가 리턴하는 객체

 

- 각 스키마는 Property에 대한 자료형을 정의해야 한다.

- POJO(Plain Old Javascript Object) : 단순 자바스크립트 객체. 그러나 Mongoose 쿼리를 통해 조회된 객체는 POJO가 아닌 Virtuals, getter, setter를 포함한 다양한 메소드를 담고 있다. Mongoose Document객체이기 때문이다. 해당 객체의 _doc로 접근해야 원하는 POJO를 받아올 수 있다.

- 순수하게 POJO만 받아내기 위해, 리턴받은 객체에 toObject()나 lean() 메소드를 사용할 수 있다.

- 만들어진 스키마는 model메소드를 통해 model객체로 변화시켜야 사용이 가능하다.

 

- mongoose에 대해 스키마에서 접근할때는 자동으로 ObjectID를 생성해주지만, model객체로 새로운 객체를 만들어 접근한다면 _id가 자동으로 만들어지지 않는다. 따라서 Document가 아니므로 save와 같은 메소드도 사용이 불가능하므로, id를 만들어주어야 한다.

 

- model로 instance를 생성하면 해당 instance는 document객체가 된다. 이때 this객체의 바인딩이 필요하므로 arrow function은 사용하지 않도록 한다.

 

 

3) statics, methods, vitural

 

- 모델객체에는 두가지 방법, statics과 method로 메소드를 만들 수 있다. 이때 statics는 모델 자체를, methods는 인스턴스를 가리킨다.

 

- 첫번째 방법은 statics이다. 여기서 this는 모델 자체를 가리키므로, static으로 선언한 메소드 안에 쿼리를 짜주고, 실제 사용시 statics의 메소드를 그대로 불러오면 된다.

 

- 두번째 방법은 mehods이다. 실제로 쿼리로직은 api에 존재하고, 자주쓰는 인스턴스에 대해서 메소드를 설정하는 것이다. 

 

- 쿼리헬퍼와 인덱스는 추후 포스팅

 

- vitual 메소드는 MongoDB에는 없지만 가공 후 사용해야 하는 API property들을 스키마에 정의해두는 것이다. 예시의 경우 fullName이라는 속성은 DB에 original 존재하는 property는 아니다. 그러나 virtual을 이용하여 name의 first와 last 를 붙여 fullName이라는 것을 가져오도록 만들었다.

- 실제로 axl이라는 모델 인스턴스에 fullName으로 접근하게 되면, 우리가 원하는 속성을 바로 얻어낼 수 있다. 

- 각각 getter와 setter를 설정할 수 있다.

 

 

4) 모델

 

- Mongoose를 사용한다는 것은, DB를 보고 Schema를 정의한 후, 그로부터 Model이라는 Contructor를 만들어 내어, 그 Instance에 접근한다는 것이다.

- Mongoose의 Schema 메소드로 schema를 만들어내고, model 메소드로 model를 만들어낸다. 

- 모델의 instance는 Document이다. 따라서 save로 내용 생성이 가능하다.