SPRING

Mongo DB - 다중 Config 설정

라구엘 2024. 3. 20. 10:19

개요 : 

Mongo DB의 DataBase가 늘어나면서

Spring Boot의 application.yml에 default config 세팅으로는 여러 DataBase를 연결 할 수 없었다.

다중 Config 설정을 위해 CustomConfig의 생성이 필요하다.

 

-- 변경 전 예시 (applicationl.yml)

   - 1개의 애플리케이션당 1개의 connection만 연결 가능했었다.

spring:
  data:
    mongodb:
      host: demo_host
      port: 27017
      authentication-database: demo_auth
      username: demo_username
      password: demo_password
      database: demo_database

 

-- 1. 변경 후 (Java 8 버전 레거시 시스템 - Spring Framework 4.3.0.RELEASE)

  - Lib Version :

     - spring-data-mongodb - 1.10.23.RELEASE

     - bson - 3.12.14

     - mongodb-driver-core - 3.12.14

     - mongodb-driver-sync - 3.12.14

     - mongo-java-driver - 3.12.14

 

  - 라이브러리 버전을 custom 하게 잡은 이유는 여러 버전으로 테스트 했지만
    Spring 4버전, Java 8버전에 맞는 최적의 라이브러리 버전이라 적용하였다.

@Configuration
public class MongoAdminDBConfig {

    @Value("#{prop['service.mongodb.host']}")
    private String host;

    @Value("#{prop['service.mongodb.port']}")
    private String port;

    @Value("#{prop['service.mongodb.username']}")
    private String username;

    @Value("#{prop['service.mongodb.password']}")
    private String password;

    @Value("#{prop['service.mongodb.database.everon-admin']}")
    private String database;

    @Value("#{prop['service.mongodb.authentication-database']}")
    private String authenticationDatabase;

    @Bean(name = "mongoAdminClient")
    public MongoClient mongoClient(@Qualifier("mongoAdminMongoClientURI") MongoClientURI mongoClientURI) {
        return new MongoClient(mongoClientURI);
    }

    @Bean(name = "mongoAdminDbFactory")
    public MongoDbFactory mongoDbFactory(@Qualifier("mongoAdminClient") MongoClient mongoClient) {
        return new SimpleMongoDbFactory(mongoClient, this.database);
    }

    @Bean(name = "mongoEveronAdminTemplate")
    public MongoTemplate mongoTemplate(@Qualifier("mongoAdminDbFactory") MongoDbFactory mongoDbFactory
        , @Qualifier("mongoAdminConverter") MongoConverter mongoConverter) {
        return new MongoTemplate(mongoDbFactory, mongoConverter);
    }

    @Bean(name = "mongoAdminMappingContext")
    public MongoMappingContext mongoMappingContext() {
        return new MongoMappingContext();
    }

    @Bean(name = "mongoAdminConverter")
    public MongoConverter mongoConverter(@Qualifier("mongoAdminDbFactory") MongoDbFactory mongoDbFactory,
        @Qualifier("mongoAdminMappingContext") MongoMappingContext mongoMappingContext)  {
        DbRefResolver resolver = new DefaultDbRefResolver(mongoDbFactory);

        MappingMongoConverter converter = new MappingMongoConverter(resolver, mongoMappingContext);
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));
        return converter;
    }

    @Bean(name = "mongoAdminMongoClientURI")
    public MongoClientURI mongoClientURI() {
        String uri = "mongodb://"+this.username+":"+this.password+"@"+this.host+":"
            +Integer.valueOf(this.port)+"/?authSource="+this.authenticationDatabase;
        return new MongoClientURI(uri);
    }
}

 

-- 2. 변경 후 (Java 17 버전 신규 시스템 - Spring Boot)

  - Lib Version : spring-boot-starter-data-mongodb - 2.7.2

@Configuration
public class MongoErrlogDBConfig {

    @Value("${service.mongodb.host}")
    private String host;

    @Value("${service.mongodb.port}")
    private String port;

    @Value("${service.mongodb.username}")
    private String username;

    @Value("${service.mongodb.password}")
    private String password;

    @Value("${service.mongodb.database.errlog}")
    private String database;

    @Value("${service.mongodb.authentication-database}")
    private String authenticationDatabase;


    @Bean(name = "mongoErrlogClient")
    public MongoClient mongoClient(@Qualifier("mongoErrlogClientSettings") MongoClientSettings mongoClientSettings) {
        return MongoClients.create(mongoClientSettings);
    }

    @Bean(name = "err_log")
    public MongoTemplate mongoTemplate(@Qualifier("mongoErrlogDbFactory") MongoDatabaseFactory mongoDbFactory
        , @Qualifier("mongoErrlogConverter") MongoConverter mongoConverter) {
        return new MongoTemplate(mongoDbFactory, mongoConverter);
    }

    @Bean(name = "mongoErrlogDbFactory")
    public MongoDatabaseFactory mongoDbFactory(@Qualifier("mongoErrlogClient") MongoClient mongoClient) {
        return new SimpleMongoClientDatabaseFactory(mongoClient, this.database);
    }

    @Bean(name = "mongoErrlogMappingContext")
    public MongoMappingContext mongoMappingContext() {
        return new MongoMappingContext();
    }

    @Bean(name = "mongoErrlogConverter")
    public MongoConverter mongoConverter(@Qualifier("mongoErrlogDbFactory") MongoDatabaseFactory mongoDbFactory
        , @Qualifier("mongoErrlogMappingContext") MongoMappingContext mongoMappingContext)  {
        DbRefResolver resolver = new DefaultDbRefResolver(mongoDbFactory);

        MappingMongoConverter converter = new MappingMongoConverter(resolver, mongoMappingContext);
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));
        return converter;
    }

    @Bean(name = "mongoErrlogConnectionString")
    public ConnectionString connectionString() {
        return new ConnectionString("mongodb://"+this.username+":"+this.password+"@"+this.host+":"
            +Integer.valueOf(this.port)+"/?authSource="+this.authenticationDatabase);
    }

    @Bean(name = "mongoErrlogCredential")
    public MongoCredential mongoCredential() {
        return MongoCredential.createCredential(this.username, this.database, this.password.toCharArray());
    }

    @Bean(name = "mongoErrlogClientSettings")
    public MongoClientSettings mongoClientSettings(@Qualifier("mongoErrlogConnectionString") ConnectionString connectionString
        , @Qualifier("mongoErrlogCredential") MongoCredential mongoCredential) {
        return MongoClientSettings.builder()
            .applyConnectionString(connectionString)
            .credential(mongoCredential)
            .build();
    }

}