반응형

spring boot mongodb connection 및 자동 _class 컬럼 insert 삭제 설정

몽고디비를 연결해주려면 스프링부트에서는 yml 설정에서 추가만 해도 되지만,

object 클래스를 넣어줄떄 자동으로 _class 라는 필드가 추가되게 된다.

_class 를 없애주려면 @Configuraion 으로 mongodb 세팅을 자바 코드로 설정을 해주어야 한다.

 

 

해당 내용은 스프링부트 spring-boot-stater-data-mongodb:2.3.3 RELEASE 버젼,

spring-data-mongodb:3.0.3 RELEASE 이다.

차이점은

spring-data-mongodb 2 버젼은 MongoDatabaseFactory 가 아니라 MongoDbFactory 이다.

3 버젼에서는 MongoDbFactory 가 deprecated 가 되어서 MongoDatabaseFactory 를 사용하자.

@Configuration
public class MongoDBConfig {

    @Value("${spring.data.mongodb.uri}")
    private String mongodb_uri;

    @Bean(name = "mongoTemplate1")
    public MongoTemplate mongoTemplate1()  {
        MongoClient mongoClient = MongoClients.create(mongodb_uri);
        MongoDatabaseFactory factory = new SimpleMongoClientDatabaseFactory(mongoClient, "collection1");
        MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(factory), new MongoMappingContext());
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));

        return new MongoTemplate(factory, converter);
    }

    @Bean(name = "mongoTemplate2")
    public MongoTemplate mongoTemplate2()  {
        MongoClient mongoClient = MongoClients.create(mongodb_uri);
        MongoDatabaseFactory factory = new SimpleMongoClientDatabaseFactory(mongoClient, "collection2");
        MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(factory), new MongoMappingContext());
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));

        return new MongoTemplate(factory, converter);
    }

    @Bean(name = "mongoTemplate3")
    public MongoTemplate mongoTemplate3()  {
        MongoClient mongoClient = MongoClients.create(mongodb_uri);
        MongoDatabaseFactory factory = new SimpleMongoClientDatabaseFactory(mongoClient, "collection3");
        MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(factory), new MongoMappingContext());
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));

        return new MongoTemplate(factory, converter);
    }

}

다음과 같이 document 가 여러개이면 document 마다 template 을 나누어서 빈을 등록해준다.

 _class 삭제방법

여기서 _class 를 없애는 방법은 위의 코드와 같이

converter.setTypeMapper(new DefaultMongoTypeMapper(null));

컨버터에 null 을 세팅을 기본으로 해주어야 한다.

 

방법은 여러가지가 있겟지만, 해당 방법이 코드량 적고 각각 document 마다 설정 가능하다는 점이 장점이다.

 

auto localhost 몽고 연결 수정

이대로만 하면 아마 spring boot 가 시작시 자동으로 localhost 27017 로 몽고디비가 연결을 시도한다.

이 점을 수정하려면 시작시에 자동으로 시작되는 class 를 제외시켜주면 된다.

@SpringBootApplication 에 exclude 에 MongoDataAutoConfiguration.class 를 추가해주자.

@SpringBootApplication(exclude = { MongoDataAutoConfiguration.class})
public class MongoApplication {

	public static void main(String[] args) {
		SpringApplication.run(MongoApplication.class, args);
	}

}

yml 파일도 설정해주자

spring:
  data:
    mongodb:
      uri: mongodb://아이디:비번@몽고디비url:27017

 

 

yml 로만 설정을 하게되면 스프링몽고디비 3 버젼에서는 로컬로만 연결이 됐다.

 

해결방법을 찾지 못해도 다음처럼 mongotemplate 을 구성한 이유도 있다.

@Value 로 설정값을 가져와서 연결하는 방법이다.

그래서 실질적으로 어플리케이션이 올라가면서 몽고디비 커넥션을 맺는방식은 아니고 빈을 생성시에 yml 에서 값을 가져와서 mongoTemplate 에 사용을 한다.

yml 에 굳이 계정정보를 넣지 않아도 되지만, 자바코드보다는 yml 에 설정값을 넣는 편이 낫다.

 

 

반응형

+ Recent posts