DataBase/MongoDB

[MongoDB] _class 필드 개념과 제거 방법

누구세연 2024. 6. 29. 21:33

MongoDB 에서 데이터를 입력하는데 _class라는 값이 입력되었다. (이게 모지😮)

_class에 대해 알아보고 제거하는 방법도 알아보겠습니다!

 

'_class' 필드란 무엇인가?

MongoDB는 NoSQL 데이터베이스로 JSON과 유사한 BSON 형식으로 데이터를 저장합니다.

MongoDB는 스키마가 없으므로 데이터를 유연하게 저장할 수 있지만, 애플리케이션의 객체 지향 구조와 MongoDB의 문서 구조를 매핑하는 과정에서 추가적인 메타 데이터가 필요할 수 있습니다. 그중 하나가 '_class' 필드입니다.

 

'_class' 필드의 역할

  • 객체 매핑
    '_class' 필드는 Spring Data MongoDB와 같은 ODM(Object-Document Mapping) 프레임워크에서 사용됩니다.
    이 필드는 MongoDB 문서가 매핑되는 Java 클래스 정보를 저장합니다.
  • 다형성 지원
    '_class' 필드는 상속 관계를 지원하며, 자식 클래스의 인스턴스를 저장할 때 부모 클래스의 필드를 포함하여 저장할 수 있도록 도와줍니다. 이는 객체의 유형을 MongoDB 문서에서 쉽게 식별할 수 있게 해 줍니다.

 

'_class' 필드를 제거하는 이유

불필요한 메타데이터

  • _class 필드는 객체의 클래스 정보를 저장하지만, 실제 비즈니스 로직에는 필요하지 않을 수 있습니다.
    특히, MongoDB의 스키마가 유연하기 때문에 이러한 메타데이터가 비즈니스 로직에서 필요하지 않을 수 있습니다.

쿼리 성능 개선

  • _class 필드는 MongoDB 문서의 크기를 증가시킬 수 있으며, 쿼리 성능에 영향을 줄 수 있습니다.
    특히 많은 문서가 _class 필드를 가지고 있다면, 이를 제거하여 문서 크기를 줄이고 쿼리 성능을 개선할 수 있습니다.

데이터 구조 단순화

  • _class 필드는 ODM 프레임워크에 의존하는 구조를 만들어 문서 구조를 복잡하게 만들 수 있습니다.
    이 필드를 제거함으로써 데이터 구조를 단순화하고, MongoDB와의 상호작용을 더 직접적으로 관리할 수 있습니다.

 

'_class' 필드 제거 방법

MongoDB의 '_class' 필드를 제거하는 방법은 여러 가지가 있습니다.

저는 MappingMongoConverter를 사용하여 제거하였습니다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.convert.DbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;

@Configuration
public class MongoDBConfig {
  @Bean
  public MappingMongoConverter mappingMongoConverter(
      MongoDatabaseFactory mongoDatabaseFactory,
      MongoMappingContext mongoMappingContext
  ) {
    DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDatabaseFactory);
    MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
    converter.setTypeMapper(new DefaultMongoTypeMapper(null));
    return converter;
  }
}

 

DefaultMongoTypeMapper의 생성자에 null을 전달하여 _class 필드의 생성을 방지하였습니다.

 

다시 Document를 생성해 보면 아래와 같이 _class 필드가 제거된 것을 확인할 수 있었습니다. 

실행 결과