ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [spring boot] mongodb 연결 및 _class 삭제
    Spring/spring boot 및 기타 2020. 9. 9. 00:56

    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 에 설정값을 넣는 편이 낫다.

     

     

    반응형

    댓글

Designed by Tistory.