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]이란 무엇인가

1. ORM ORM이란 Object-Relational Mapping의 약자로서, 객체(클래스)와 관계(RDB)와의 설정을 의미한다. ORM은 객체와 관계형 데이터베이스의 데이터를 매핑해주는 역할을 수행한다. 객체 지향 프로그래밍

haksae.tistory.com

 

그렇다면 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