Search
▪️

MongoDB & Mongoose

MongoDB 특징과 Compass

MongoDB와 같은 NoSQL은 RDB와 달리 Attributes 안에 객체 타입도 넣을 수 있다.
RDB와 달리 Attributes들이 엄격하지 않다. 똑같은 Attributes를 갖고 있지 않아도 된다. NoSQL은 빅데이터와 분산 서버에 주로 이용이 되는데, 어떤 Attributes를 가질지 미리 예측하는 것들이 어렵다. 따라서 비교적 자유로운 Attributes들을 가질 수 있다.
따로 Collection을 생성해야 하는지 판단 여부는, 고정된 길이의 배열이면 Attributes 안에 넣고, 계속 늘어날 것 같다면 Collection을 별도로 두는 것이 좋다.
Mongoose는 MongoDB에 제한을 걸지만, 편의성과 안정성을 추구한다.
** Programming에서 자유도가 높을수록 잘못된 Code를 작성할 가능성이 높아진다. JavaScript의 경우도 자유롭기 때문에, 실력 차이가 천차만별이다. 자유도를 잘 활용할 수 있어야 한다. MongoDB도 마찬가지이다. 자유롭지만 이에 대해 신중히 이용할 수 있어야 한다. Mongoose는 이런 자유도를 제한하고 개발자에게 조금 더 나은 편의성과 안정성을 주는 것이다.

Mongoose Schema 만들기

Mongoose에서 connect로 DB에 연결할 수 있는데, Error가 발생하여 DB와의 Connection이 종료된 경우 재연결을 시도할 수 있다. 이는 Event Listener를 달아 놓음으로써 가능하다. disconnected 라는 Event가 발생했을 때, 다시 연결하는 connect() Method를 호출하도록 한다. 마찬가지로 error라는 Event가 발생했을 때, Error Logging을 하는 Event Listener도 달 수 있다.
MongoDB는 자유로운 Attributes를 이용할 수 있는데, Mongoose는 MongoDB에 제약을 걸지만 편의성과 안정성을 가져다 주는 만큼, 정해진 데이터들만 허용하도록 한다. 이를 통해 예기치 못한 Attributes들이 들어오는 돌발 상황을 방지할 수 있다.
Attribute의 Option으로는 type, required, unique, default등을 설정할 수 있다.
** MySQL에서는 find는 1개만 찾고 findAll이 모두 찾기였다면, MongoDB에서는 find는 모두 찾고 findOne이 1개만 찾는 것이다.
** populate는 MySQL의 include와 유사한 역할을 수행한다. Populate를 수행하게 되면 MongoDB에서 해당 Schema를 한 번 더 조사하게 된다. Schema의 Attribute가 ref값이 설정 되어 있는지 확인 후, 해당 객체로 바꿔준다. (정확히 include와 같다고 할 수 없는 것이, Sequelize의 include의 경우 MySQL에 존재하는 JOIN 연산을 수행하는 것이고, Mongoose의 populate의 경우 MongoDB에 존재하지 않는 연산을 강제로 하게 만드는 것이다. 따라서 MongoDB에서는 없는 연산을 만들어 수행하게 되므로 JOIN 과 같은 결과를 낳기 위해 populate를 남발하는 것은 좋지 않다.)