시냅스

Spring Webflux - MongoDB Programming 방식으로 Connection 설정 본문

Java, Spring

Spring Webflux - MongoDB Programming 방식으로 Connection 설정

ted k 2024. 8. 14. 22:41

 

@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

 

Connecting to MongoDB :: Spring Data MongoDB

While MongoClient is the entry point to the MongoDB driver API, connecting to a specific MongoDB database instance requires additional information, such as the database name and an optional username and password. With that information, you can obtain a Mon

docs.spring.io

Comments