83 lines
3.7 KiB
Java
83 lines
3.7 KiB
Java
package com.global.configuration;
|
|
|
|
import com.mongodb.ConnectionString;
|
|
import com.mongodb.MongoClientSettings;
|
|
import com.mongodb.client.MongoClient;
|
|
import com.mongodb.client.MongoClients;
|
|
import com.mongodb.repository.MongoRepository;
|
|
import org.springframework.beans.factory.annotation.Qualifier;
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.context.annotation.Bean;
|
|
import org.springframework.context.annotation.Configuration;
|
|
import org.springframework.data.mongodb.MongoDatabaseFactory;
|
|
import org.springframework.data.mongodb.core.MongoTemplate;
|
|
import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;
|
|
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
|
|
|
|
import java.net.URLEncoder;
|
|
import java.nio.charset.StandardCharsets;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
@Configuration
|
|
@EnableMongoRepositories(basePackageClasses = MongoRepository.class, basePackages = "com.mongodb.repository", mongoTemplateRef = "mongodbTemplate")
|
|
public class MongodbConfig {
|
|
|
|
@Value("${mongodb.host}")
|
|
String businessLogHost;
|
|
@Value("${mongodb.username}")
|
|
String username;
|
|
@Value("${mongodb.password}")
|
|
String password;
|
|
@Value("${mongodb.db}")
|
|
String db;
|
|
|
|
@Bean(name = "mongodbClient")
|
|
public MongoClient mongoStatClient() {
|
|
String encodePassword = URLEncoder.encode(password, StandardCharsets.UTF_8);
|
|
String auth = username.isEmpty() ? "" : String.format("%s:%s@",username, encodePassword);
|
|
String connection;
|
|
connection = String.format("mongodb://%s%s/%s?authSource=%s", auth, businessLogHost, db, db);
|
|
|
|
MongoClientSettings settings = MongoClientSettings.builder()
|
|
.applyConnectionString(new ConnectionString(connection))
|
|
// 커넥션 풀 설정
|
|
.applyToConnectionPoolSettings(builder -> {
|
|
builder.maxSize(100) // 최대 연결 수
|
|
.minSize(10) // 최소 연결 수
|
|
.maxWaitTime(30, TimeUnit.SECONDS) // 연결 대기 시간
|
|
.maxConnectionLifeTime(0, TimeUnit.MILLISECONDS) // 연결 최대 수명 (0 = 무제한)
|
|
.maxConnectionIdleTime(0, TimeUnit.MILLISECONDS); // 연결 최대 유휴 시간 (0 = 무제한)
|
|
})
|
|
// 소켓 설정
|
|
.applyToSocketSettings(builder -> {
|
|
builder.connectTimeout(10, TimeUnit.SECONDS) // 연결 타임아웃
|
|
.readTimeout(0, TimeUnit.MILLISECONDS); // 읽기 타임아웃 (0 = 무제한)
|
|
})
|
|
// 서버 선택 설정
|
|
.applyToServerSettings(builder -> {
|
|
builder.heartbeatFrequency(10, TimeUnit.SECONDS) // 하트비트 주기
|
|
.minHeartbeatFrequency(500, TimeUnit.MILLISECONDS); // 최소 하트비트 주기
|
|
})
|
|
// 클러스터 설정
|
|
.applyToClusterSettings(builder -> {
|
|
builder.serverSelectionTimeout(30, TimeUnit.SECONDS) // 서버 선택 타임아웃
|
|
.localThreshold(15, TimeUnit.MILLISECONDS); // 로컬 임계값
|
|
})
|
|
.build();
|
|
|
|
return MongoClients.create(settings);
|
|
}
|
|
|
|
@Bean(name = "mongoFactory")
|
|
public MongoDatabaseFactory mongoFactory(@Qualifier("mongodbClient") MongoClient mongoClient) {
|
|
return new SimpleMongoClientDatabaseFactory(mongoClient, db);
|
|
}
|
|
|
|
@Bean(name = "mongodbTemplate")
|
|
public MongoTemplate mongodbTemplate(@Qualifier("mongoFactory") MongoDatabaseFactory mongoFactory) {
|
|
return new MongoTemplate(mongoFactory);
|
|
}
|
|
|
|
}
|