MongoDB에서 ObjectId로 Document 연결 해야만 하는 이유
MongoDB
에서 Document
를 연결할 때, 참조(Ref)
를 위해 ObjectId
를 사용하는 것이 좋은 이유에 대해 알아보겠습니다.
MongoDB에서 Document 연결
MongoDB
에서 Document
간의 관계를 표현하는 방법은 크게 2가지가 있습니다.
- 내장된 문서 (Embedded Document)
- 참조된 문서 (Referenced Document)
참조를 사용하여 연결된 Document
를 저장 할 때, _id
필드를 ObjectId
로 저장할 것인지, 문자열로 저장할 것인지 선택할 수 있습니다. 하지만, ObjectId
로 저장하는 것이 더 많은 이점을 가지고 있습니다.
ObjectId vs String
성능
MongoDB
는 기본적으로_id
필드를인덱싱
합니다.ObjectId
는12바이트
의 바이너리 데이터로 구성되어 있어,인덱싱
이 더 빠릅니다. 반면,문자열
은 크기가 더 크고, 비교 연산이 상대적으로 느립니다.공간 효율성
ObjectId
는 12바이트로 고정되어 있습니다. 반면, 문자열은 길이가 가변적이기 때문에, 저장 공간을 더 많이 차지할 수 있습니다.Aggregate pipeline과의 호환성
Mongoose
의populate
메소드는 참조된document
를 불러올 때, 참조 ID가ObjectId
든문자열
이든 상관없이 동작합니다. 그러나MongoDB
의aggregate pipeline
을 사용할 때,문자열 ID
를 사용하는 경우 추가적인 변환 작업이 필요합니다. 이는 성능 저하와 코드 복잡성을 초래할 수 있습니다.
Membership 모델
1 | import mongoose from "mongoose"; |
Membership
모델에서 User
모델을 참조하고 있습니다.
1 | Membership.create({ |
user
필드에 string
를 사용하여 Membership
모델을 생성합니다.
Populate에서 String ID 사용의 경우
Populate
메소드를 사용할 때, 참조 ID가 ObjectId
든 문자열
이든 상관없이 동작합니다. 아래 코드는 Mongoose
의 populate
메소드를 사용하여 ObjectId
와 문자열
ID를 참조하는 예시입니다.
1 | Membership.find() |
Membership
모델에서 user
필드를 참조하고 있습니다. populate
메소드를 사용하여 user
필드를 참조한 document
를 불러옵니다. 이때, user
필드가 ObjectId
든 문자열
이든 상관없이 동작합니다.
Aggregate Pipeline에서의 문제
Aggregate Pipeline
을 사용할 때, 문자열 ID
를 사용하게되면 ObjectId
로 변환해야 하는 경우가 자주 발생합니다. 이는 불필요한 변환 로직을 추가해야 하며, 코드의 복잡성과 유지보수 비용을 증가시킵니다. 아래 코드는 ObjectId
로 변환하는 예시입니다.
1 | Membership.aggregate([ |
위 코드에서 user
필드가 ObjectId
가 아닌 경우, userObjId
라는 새로운 필드를 생성하여 ObjectId
로 변환한 후, lookup
연산을 수행합니다. 이 과정은 코드의 가독성을 떨어뜨리며, 성능에도 영향을 미칠 수 있습니다. ObjectId
로 저장하면 이러한 변환 과정이 필요 없으며, 코드가 간결해집니다.
Membership 저장 시 ObjectId 사용
1 | Membership.create({ |
위 코드와 같이 Membership
모델에서 user
필드에 ObjectId
를 사용하여 Membership
모델을 생성, 수정을 하여야 합니다.
결론
MongoDB
에서 document
를 연결할 때 ObjectId
를 사용하는 것이 성능, 공간 효율성, 일관성 측면에서 더 나은 선택입니다. Node.js
와 Mongoose
를 사용하여 ObjectId
를 참조로 사용하는 방법도 간단하고 직관적입니다. 특히, Aggregate Pipeline
을 사용할 때 ObjectId
를 사용하면 추가적인 변환 로직 없이 효율적으로 데이터를 처리할 수 있습니다. ObjectId
를 사용하여 효율적이고 일관된 데이터 모델을 구축해 보세요.