DATABASE
[ODM]이란 무엇인가?
Haksae
2022. 3. 21. 03:58
MySQL의 ORM 중 하나인 Sequelize를 공부하다가, MongoDB의 Mongoose가 ORM이 아닌, ODM이라는 것을 알게되었다.
그리고 곰곰히 생각해보니 ORM은 Object-Relational Mapping인데, MongoDB는 관계 설정이 없으니 ORM이 아닌게 맞구나 라는 생각을 하게되었다.
그래서 오늘은 ODM에 대해서 살짝 정리해보고자 한다.
ODM (Object Data Mapping)
- ORM이란 무엇인가 편에서 살펴보았듯이, ORM은 기본적으로 객체 지향 패러다임을 이용하여 RDBMS에 대한 작업을 수행하는 역할을 담당한다.
https://haksae.tistory.com/131?category=958700
그렇다면 ORM과 ODM은 어떤 차이를 가지는가?
- 사실 ODM도 ORM과 근본적으로 하는 역할은 동일하다.
- 그렇다면 어떤 차이를 가지는가? 바로 데이터 매퍼가 사용되는 데이터베이스의 유형에서 갈린다.
- ORM은 SQL을 위해서, ODM은 NoSQL을 위해서 존재한다.
ODM의 역할
- NoSQL은 스키마(관계)가 없고, 문서는 JSON 형식으로 저장되는 특징을 가진다.
- 스키마가 없고, DB에 JSON 형식을 저장할 수 있다는 것은 유연한 개발을 돕지만, DB에 형식이 없이 데이터가 쌓인다는 단점이 존재한다는 것을 의미한다.
- 이러한 단점을 보완하기 위해 바로 ODM이 존재한다.
//user model
const User = mongoose.model("User", {
username: { type: String },
password: { type: String },
});
//new user object
const newUser = new User({
username: "john-doe",
password: "helloworld",
hello: "hello",
});
* 가령 위와 같은 경우이다. (예시는 Mongoose)
- 위에는 Mongoose를 통해서 User 컬렉션의 스키마를 설정해 놓았다.
- 그런데 그 스키마에 벗어난 hello 라는 필드를 생성해달라고 선언했다.
-> 만약 MongoDB 였다면 그대로 hello 라는 필드가 생성되었을 것이다.
-> 그러나 Mongoose는 스키마에서 벗어났기 때문에 해당 필드를 생성하지 않는다. (아래 결과 예시)
-> 왜냐하면 Mongoose가 User 모델에 따라 데이터를 데이터베이스에 매핑했기 때문이다.
*바로 이것이 Object Data Mapping이다.
> db.users.find().pretty()
{
"_id" : ObjectId("5faa7a2326478a301cf3e9f1"),
"username" : "john-doe",
"password" : "helloworld",
"__v" : 0
}
참고문서
https://medium.com/spidernitt/orm-and-odm-a-brief-introduction-369046ec57eb