일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- IT
- JPA
- redis
- spring webflux
- Heap
- react
- OS
- Galera Cluster
- design pattern
- MSA
- 디자인 패턴
- 자바
- C
- Spring
- 알고리즘
- Java
- 파이썬
- c언어
- 네트워크
- Algorithm
- Proxy
- Kafka
- mongoDB
- JavaScript
- 자료구조
- 컴퓨터구조
- Data Structure
- 운영체제
- 백준
- MySQL
Archives
- Today
- Total
시냅스
Spring Webflux - MongoDB Programming 방식으로 Connection 설정 본문
@EnableReactiveMongoAuditing
@Configuration
public class MongoConfig extends AbstractReactiveMongoConfiguration {
private static final String DB_NAME = "testdb";
@NotNull
@Override
@Bean
public MongoClient reactiveMongoClient(
@Value("${spring.data.mongodb.uri}"}) final String mongoUri
) {
ConnectionString connection = new ConnectionString(mongoUri);
// connection pool 설정
MongoClientSettings settings = MongoClientSettings.builder()
.retryWrites(true)
.applyConnectionString(connection)
.applyToConnectionPoolSettings((ConnectionPoolSettings.Builder builder) -> {
builder.maxSize(10)
.minSize(10)
.maxConnectionLifeTime(100, TimeUnit.SECONDS)
.maxConnectionIdleTime(100, TimeUnit.SECONDS)
.maxWaitTime(5, TimeUnit.SECONDS);
})
.applyToSocketSettings(builder -> {
builder.connectTimeout(100, TimeUnit.SECONDS);
})
.applicationName("TEST")
.build();
return MongoClients.create(settings);
}
@Bean
public ReactiveMongoTemplate reactiveMongoTemplate(MongoClient reactiveMongoClient) {
return new ReactiveMongoTemplate(reactiveMongoClient, getDatabaseName());
}
@Bean(name = "mongoTx")
// MongoDB 는 기본값으로 Transaction 을 지원하지 않는다 -> BASE 이기 때문에.
// Transaction을 사용하려면 아래와 같이 TransactionManager 를 정의한다.
// TransactionManager 가 MongoDB 하나라면 @Transactional 로 사용할 수 있지만 (TransactionManager 가 1개이기 때문에)
// 만약 다른 DB 와 함께 사용 중이라면 서비스 로직에 @Transactional("mongoTx") 를 기입해야 Transaction 이 정상 작동한다.
// 근데... ChainedTransactionManger 는 Deprecated 된 상태고
// XA 로 2PC 관리하자니 management point 가 너무 비대해진다...
public ReactiveMongoTransactionManager reactiveMongoTransactionManager(ReactiveMongoDatabaseFactory dbFactory) {
return new ReactiveMongoTransactionManager(dbFactory);
}
@NotNull
@Override
public String getDatabaseName() { // 접속할 Database 명시
return DB_NAME;
}
@Override
public boolean autoIndexCreation() { // 자동으로 index 설정 여부
return true;
}
}
MongoDB 를 사용하며 여러가지 테스트를 하던 도중에 프로그래밍 방식으로 Connection 을 맺으려니 자꾸 에러가 났다.
AbstractReactiveMongoConfiguration 를 상속받아 mongoClient 를 재정의하니
com.mongodb.client.MongoClient 가 없다는 에러가 계속 발생했다.
나는 reactive mongo 를 쓰고 있어서 com.mongodb.reactivestreams.client.MongoClient 를 쓰는데...
찾고 찾다가 reactiveMongoClient 를 재정의하니 connection 이 잘 맺어졌다.
역시 공식문서를 참고하는 게 오히려 빠를 때가 많다...
참고
https://docs.spring.io/spring-data/mongodb/reference/mongodb/configuration.html
'Java, Spring' 카테고리의 다른 글
Spring 으로 구현하는 MSA 기반 배달 주문 시스템(+ Kafka, Debezium) (0) | 2024.08.24 |
---|---|
Spring 으로 구현하는 MSA 기반 재고관리 시스템 (+Redis, Kafka) (0) | 2024.07.27 |
Spring 으로 구현하는 선착순 쿠폰 발급 시스템 (+ Redis, Kafka) (5) | 2024.07.20 |
Spring WebFlux 에서 ProxySQL 을 사용할 때 문제점 (1) | 2024.02.07 |
구현하며 이해하는 Spring WebFlux (1) | 2024.02.04 |
Comments