[Mongo] 스프링 mongodb Bean 작동 방법

스프링 mongodb Bean 자동 생성

20210108_mongoMappingConverterBean

확실하진 않지만, maven dependency로 추가한 spring mongo에는, 위 설정으로 자동으로 org.springframework.data.mongodb.core.convert.MappingMongoConverter 이 Bean으로 생성되는 것 같다.

MappingMongoConverter 는 자바의 여러 객체들을 Mongo의 Document로 전환하기 위한 Converter이다.

MongoConverter that uses a MappingContext to do sophisticated mapping of domain objects to Document. by MappingMongoConverter

MappingMongoConverter write 메소드

private void writeProperties(Bson bson, MongoPersistentEntity<?> entity, PersistentPropertyAccessor<?> accessor, DocumentAccessor dbObjectAccessor, @Nullable MongoPersistentProperty idProperty) {
    Iterator var6 = entity.iterator();

    while(var6.hasNext()) {
        MongoPersistentProperty prop = (MongoPersistentProperty)var6.next();
        if (!prop.equals(idProperty) && prop.isWritable()) {
            if (prop.isAssociation()) {
                this.writeAssociation(prop.getRequiredAssociation(), accessor, dbObjectAccessor);
            } else {
                Object value = accessor.getProperty(prop);
                if (value != null) {
                    if (!this.conversions.isSimpleType(value.getClass())) {
                        this.writePropertyInternal(value, dbObjectAccessor, prop);
                    } else {
                        this.writeSimpleInternal(value, bson, prop);
                    }
                }
            }
        }
    }

}

Object를 Bson 객체로 만드는 메소드이다. 값이 null이 아닌경우 에만 this.writePropertyInternal 를 통해 Object 객체 안에 있는 값들을 bson으로 만들어준다.

Dto 안에 값이 null인 필드는 bson으로 전환되지 않는다

참고문서

  • https://stackoverflow.com/questions/30071464/spring-data-mongo-update-null-value-in-document-with-mappingmongoconverter

MongoConverter 커스터마이징

이 MongoConverter를 Customizing 할 수 있다. 그 방법은, 똑같은 이름으로 @Bean 을 설정하는 것이다.

기본 MongoMappingConverter는 Object의 class 형을 Document에 포함한다.

public MappingMongoConverter(DbRefResolver dbRefResolver, MappingContext<? extends MongoPersistentEntity<?>, MongoPersistentProperty> mappingContext) {
    // ... 생략
    this.typeMapper = new DefaultMongoTypeMapper("_class", mappingContext, this::getWriteTarget);
}

_class를 제외하고 싶다면 DefaultMongoTypeMapper(null)TypeMapper로 지정한 Bean을 하나 만들면 된다.

@Configuration
@EnableMongoAuditing
public class MongoConfig {

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

}

이와 같이, 스프링 몽고에서 기본적으로 띄우는 Conveter 나 설정 같은 것은, 커스터마이징을 할 수 있으며, 그 방법은 같은 이름으로 된 Bean을 올려서 주입하면 된다.

태그: ,

업데이트:

댓글남기기