본문 바로가기

프로그래밍

Spring boot mongo DB replica set 설정하기, xml에서 java config로 전환

application.yml을 통해서 spring.data.mongodb.uri 값을 지정하여 입력하였는데,
이를 인식하지 못하는 것인지 starter에서 host와 port를 내놓으라고 한다. 

yml 내용

spring:
  data:
    mongodb:
      uri: mongodb://192.168.0.12:27017,mongodb://192.168.0.13:27017
      database: test-replica
      repositories:
        type: auto

아래 내용을 보면서 했는데 이해를 못하겠다.

원래는 xml로 세팅해서 사용하는게 있었는데 편해질줄 알고 starter를 쓰고 있는데 오히려 힘들어졌다.

기존에 정의되었던 xml을 java config로 바꾸는것도 여간 귀찮은게 아니다..

<mongo:mongo-client replica-set="${mongo.replicaset}">
    <mongo:client-options
        connections-per-host="8"
        threads-allowed-to-block-for-connection-multiplier="4"
        connect-timeout="1000"
        max-wait-time="1500"
        socket-keep-alive="false"
        socket-timeout=“1500"
    />
</mongo:mongo-client>
<mongo:mapping-converter id="mongoConverter" type-mapper-ref="defaultMongoTypeMapper" />
<mongo:db-factory dbname="${mongo.database}" mongo-ref="mongo"/>
<mongo:repositories base-package="com.test.**.repository"  />
<bean id="defaultMongoTypeMapper" class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper">
    <constructor-arg name="typeKey"><null/></constructor-arg>
</bean>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
    <constructor-arg name="mongoConverter" ref="mongoConverter" />
</bean>


위와 같은 내용을 java config로 바꿔보자.
뭔가 코드만 계속 보게 되어서 xml로 설정할 때보다 기분상 좋은 것 같기도하고, 여차해서 나중에 bean 자체에 대한 자유도도 높아지니
인내하고 하나씩 바꿔 나가보고 있다. 
하나씩 해보자 mongo:mongo-client와 내부의 mongo:client-options 부터 
참고한 내용을 보면 AbstractMongoConfiguration을 상속받아 구현한 클래스는 mongoTemplate을 만들 필요가 없다. 
이 방식으로 하기로 하고 작성한다. 

package com.test.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.config.AbstractMongoConfiguration;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientURI;
@Configuration
@EnableMongoRepositories({“com.test.**.repository"})
public class MongoDBConfig extends AbstractMongoConfiguration {
     @Value("${mongodb.uri}")
     private String uri;
     @Value("${mongodb.database}")
     private String databaseName;
     
     @Override
     public MongoClient mongoClient() {
         MongoClient client = new MongoClient(new MongoClientURI(this.uri, MongoClientOptions.builder()
                 .connectionsPerHost(8)
                 .threadsAllowedToBlockForConnectionMultiplier(4)
                 .connectTimeout(1000)
                 .maxWaitTime(1500)
                 .socketTimeout(1500)
                 .socketKeepAlive(false)));
         return client;
     }
     @Override
     protected String getDatabaseName() {
         return this.databaseName;
     }
}



위에 기술한 형태와 동일한 기능을 한다. 
차이가 약간 있는데 uri, replica set의 정보에 mongodb://를 추가해서 앞에 붙여야한다고 나온다.
프로토콜을 붙이는 것 말고 설정정보는 변경없이 그대로 동작한다.