[환경]
몽고db 문서 - https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#repositories
springboot 2
gradle
mongodb replica set
spring으로 단순히 몽고db 연결하는 건 자료가 많다.
레플리카 셋으로 구성된 mongodb는 자료를 많이 찾지 못했다.
우선
https://falkenfighter.wordpress.com/2015/10/13/multiple-databases-with-spring-boot-mongodb-repositories/
이 사이트 기반으로 했다.
@Configuration
public
class
MongoConfiguration {
/**
* For a clustered Mongo environment we would want to load multiple
* hosts. This will work if we use a single host or clustered.
*
* If the mongo.hosts key could not be found defaults to localhost
*
* One of the following would exist in our Spring properties file
* 1) mongo.hosts = localhost
* 2) mongo.hosts = 10.1.1.1,10.1.1.2,10.1.1.3
*/
@Value
(
"#{'${mongo.hosts:localhost}'.split(',')}"
)
private
List<String> hosts;
/**
* The port our Mongo hosts are running on.
* Defaults to 27017
*/
@Value
(
"${mongo.port:27017}"
)
private
int
port;
/**
* Creates a base Mongo instance that can be configured for each
* implementation.
*
* NOTE: If you are trying to connect to multiple MongoDB's then
* you would want to create 2 instances of this method as beans
* loading the correct mongo hosts. For my implementation I just
* wanted different global configurations pointed at the same
* database.
*
* @return A generic Mongo instance pointed at the hosts.
* @throws Exception
*/
private
Mongo createMongo()
throws
Exception {
final
List<ServerAddress> serverList =
new
ArrayList<>();
for
(
final
String host : hosts) {
serverList.add(
new
ServerAddress(host, port));
}
// MongoClientOptions would be created here and passed into
// the MongoClient as it's second param.
return
new
MongoClient(serverList);
}
@Primary
@Bean
public
Mongo readFromSecondaryNodeMongo() {
final
Mongo mongo = createMongo();
// Do custom global configuration
mongo.setReadPreference(ReadPreference.secondaryPreferred());
return
mongo;
}
@Bean
public
Mongo readFromPrimaryNodeMongo() {
final
Mongo mongo = createMongo();
mongo.setReadPreference(ReadPreference.primaryPreferred());
return
mongo;
}
/**
* This is the default DB Factory and will have the
* readFromSecondaryNodeMongo() bean injected due to the @Primary
* annotation
*
* @param mongo auto injected using the @Primary bean
* @return a new MongoDbFactory
*/
@Bean
public
MongoDbFactory mongoDbFactory(Mongo mongo) {
return
new
SimpleMongoDbFactory(mongo,
"DatabaseName"
);
}
}
내가 개발해야되는게 기존 spring 을 springboot 로 옴겨야 하는 과정이다.
찾아보면 mongoclient 를 빈으로 만드는게 아니고, mongofactory 를 빈으로 생성하여 사용하는 자료가 많다.
factory를 생성하려면 database를 지정해주어야 한다. 그렇게 되면 database마다 bean이 생성되어서 지금상황과 맞지 않앗다.
몽고db에 접근해야할 database 가 많다. 그래서 factory로 bean을 선언하기가 좀 그렇다.
SimpleMongoDbFactory 로 작업을 하려했지만, 위와같은 이유로 MongoClient 로 사용했다.
// MongoTemplate templateOne = new MongoTemplate(new SimpleMongoDbFactory(new MongoClientURI("YOUR_MONGO_URL")));
// templateOne.setReadPreference(ReadPreference.secondaryPreferred());
다른 자료에는 이런식으로 mongotemplate 을 사용한다. 이렇게 사용하는 자료가 대다수엿다.
또한 MongoRepository 이걸 사용하여 자동으로 document 를 주입하는게 많았다. 커스텀하게 사용하기보다는 dto,vo를 생성하여 사용하는 느낌.
내 방식때문에
MongoClient 를 사용하고 @Autowired로 주입받아서 사용했다.
db2 = bb.getDatabase("permission");
MongoCollection<Document> PermissionCollection = db2.getCollection("userService")
.withReadPreference(ReadPreference.secondaryPreferred());
요런식으로 ..
최대한 bean으로 셋팅할수있는건 다 해보려고 했지만 지금으로선 여기까지가 최선
그리고
http://www.javaoptimum.com/multiple-mongodb-connections-spring-boot/
멀티 db를 구현시켜주는 거
'DB > MongoDB' 카테고리의 다른 글
[MongoDB] 몽고DB Index 생성 및 이용 (0) | 2020.09.16 |
---|---|
[mongo] 배열 데이터 삭제 (0) | 2020.09.16 |
mongoDB 에 json 값 저장하기 ( spring ) (0) | 2020.01.06 |
[studio 3t] mongoDB group by 하는 법 , count 방법 (0) | 2019.10.15 |
Multiple MongoDB connections with Spring Boot (0) | 2019.02.22 |
댓글