Spring Data MongoDB ์—ฐ๊ฒฐ ์„ค์ •ํ•˜๊ธฐ

NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” MongoDB๋ฅผ Spring Data MongoDB ๋ฅผ ํ†ตํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด ๋ณด๊ณ ์ž ํ•œ๋‹ค. ์ƒ˜ํ”Œ ์ฝ”๋“œ๋Š” spring boot 3.2.1 ๋ฒ„์ „์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑํ•˜์˜€๋‹ค.

Dependency

gradle

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.1'
    id 'io.spring.dependency-management' version '1.1.4'
}

...

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
    ...
}
Groovy

spring boot MongoDB properties

Spring boot์—์„œ MongoDB๋ฅผ ์œ„ํ•œ ์„ค์ • ์ •๋ณด๋ฅผ ์ฃผ์ž…๋ฐ›๋Š” ํด๋ž˜์Šค๋Š” MongoProperties ํด๋ž˜์Šค์ด๋‹ค.
MongoProperties ํด๋ž˜์Šค์— ์ฃผ์ž… ๋ฐ›๋Š” ์†์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

@ConfigurationProperties(
    prefix = "spring.data.mongodb"
)
public class MongoProperties {
    public static final int DEFAULT_PORT = 27017;
    public static final String DEFAULT_URI = "mongodb://localhost/test";
    private String host;
    private Integer port = null;
    private List<String> additionalHosts;
    private String uri;
    private String database;
    private String authenticationDatabase;
    private final Gridfs gridfs = new Gridfs();
    private String username;
    private char[] password;
    private String replicaSetName;
    private Class<?> fieldNamingStrategy;
    private UuidRepresentation uuidRepresentation;
    private final Ssl ssl;
    private Boolean autoIndexCreation;

    ...

    public static class Ssl {
        private Boolean enabled;
        private String bundle;

        public Ssl() {
        }

        public boolean isEnabled() {
            return this.enabled != null ? this.enabled : this.bundle != null;
        }

        public void setEnabled(boolean enabled) {
            this.enabled = enabled;
        }

        public String getBundle() {
            return this.bundle;
        }

        public void setBundle(String bundle) {
            this.bundle = bundle;
        }
    }

    ...
}
Java

@ConfigurationProperties ์–ด๋…ธํ…Œ์ด์…˜์˜ prefix๋ฅผ ํ†ตํ•ด์„œ MongoDB ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œ์ž‘ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

spring.data.mongodb.*
Java

application.yml ์—์„œ MongoDB ๊ด€๋ จ ํ”„๋กœํผํ‹ฐ ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

spring:
  data:
    mongodb:
      database: <๊ธฐ๋ณธ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ช…>
      authentication-database: <์ธ์ฆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ช…>
      username: <์ ‘์†์•„์ด๋””>
      password: <์ ‘์†๋น„๋ฐ€๋ฒˆํ˜ธ>
      host: <MongoDB ํ˜ธ์ŠคํŠธ>
      port: <MongoDB ํฌํŠธ>
      uuid-representation: <UUID๋ฅผ BSON์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉํ•  ํ‘œํ˜„ ๋ฐฉ์‹>
      replica-set-name: <replica set ์ด๋ฆ„>
      field-naming-strategy: <ํ•„๋“œ ์ด๋ฆ„ ๋ณ€ํ™˜ ๋ฐฉ์‹>
      auto-index-creation: <์ธ๋ฑ์Šค ์ž๋™์ƒ์„ฑ ์—ฌ๋ถ€>
      ssl:
        bundle: <ssl ์ ‘์†์„ ์œ„ํ•œ bundle ์„ค์ • ์ด๋ฆ„>
        enabled: <ssl ์ ‘์† ์‚ฌ์šฉ ์—ฌ๋ถ€>
YAML

uuid-representation ์„ค์ • ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • standard: UUID๋ฅผ BSON์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ํ‘œ์ค€ ๋ฐฉ์‹ (subtype4)
  • c_sharp_legacy: C# ๋“œ๋ผ์ด๋ฒ„์—์„œ ์‚ฌ์šฉ๋œ UUID ๊ธฐ์กด ํ‘œํ˜„ ๋ฐฉ์‹ (subtype3)
  • java_legacy: ์ž๋ฐ” ๋“œ๋ผ์ด๋ฒ„์—์„œ ์‚ฌ์šฉ๋œ UUID ๊ธฐ์กด ํ‘œํ˜„ ๋ฐฉ์‹ (subtype3)
  • python_legacy: ํŒŒ์ด์ฌ ๋“œ๋ผ์ด๋ฒ„์—์„œ ์‚ฌ์šฉ๋œ UUID ๊ธฐ์กด ํ‘œํ˜„ ๋ฐฉ์‹. standard
    ๋ฐฉ์‹๊ณผ ๋™์ผํ•˜๋‚˜ subtype3์„ ์‚ฌ์šฉํ•จ.

field-naming-strategy ์„ค์ • ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • org.springframework.data.mapping.model.SnakeCaseFieldNamingStrategy
  • org.springframework.data.mapping.model.CamelCaseAbbreviatingFieldNamingStrategy

field-naming-strategy์— ์„ค์ •๋œ ๊ฐ’์— ๋”ฐ๋ผ์„œ MongoDB์— ์ €์žฅ๋˜๋Š” ํ•„๋“œ๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝ๋œ๋‹ค.
์ €์žฅํ•˜๋Š” ํด๋ž˜์Šค ์ •์˜๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๋•Œ

@Document(collection = "person")
@Getter
@ToString
public class Person {
    @Id
    private final UUID personId;
    private final String personName;
    private final Integer personAge;

    @Builder
    public Person(UUID personId, String personName, Integer personAge) {
        this.personId = personId;
        this.personName = personName;
        this.personAge = personAge;
    }
}
Java

SnakeCaseFieldNamingStrategy๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ €์žฅ๋œ๋‹ค.

_id: UUID('xxxxxx')
person_name: '์ด๋ฆ„'
person_age: ๋‚˜์ด
_class: "xxxx"
Java

CamelCaseAbbreviatingFieldNamingStrategy๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ €์žฅ๋œ๋‹ค.

_id: UUID('xxxxxx')
pn: '์ด๋ฆ„'
pa: ๋‚˜์ด
_class: "xxxx"
Java

spring boot MongoDB auto configuration

org.springframework.boot:spring-boot-autoconfigure ๋ชจ๋“ˆ์—๋Š” MongoDB์™€ ๊ด€๋ จ๋œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ auto configuration ์ด ์ œ๊ณต๋œ๋‹ค.

MongoAutoConfiguration ํด๋ž˜์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

@AutoConfiguration
@ConditionalOnClass(MongoClient.class)
@EnableConfigurationProperties(MongoProperties.class)
@ConditionalOnMissingBean(type = "org.springframework.data.mongodb.MongoDatabaseFactory")
public class MongoAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean(MongoConnectionDetails.class)
    PropertiesMongoConnectionDetails mongoConnectionDetails(MongoProperties properties) {
        return new PropertiesMongoConnectionDetails(properties);
    }

    @Bean
    @ConditionalOnMissingBean(MongoClient.class)
    public MongoClient mongo(ObjectProvider<MongoClientSettingsBuilderCustomizer> builderCustomizers,
                             MongoClientSettings settings) {
        return new MongoClientFactory(builderCustomizers.orderedStream().toList())
                      .createMongoClient(settings);
    }

    @Configuration(proxyBeanMethods = false)
    @ConditionalOnMissingBean(MongoClientSettings.class)
    static class MongoClientSettingsConfiguration {

        @Bean
        MongoClientSettings mongoClientSettings() {
            return MongoClientSettings.builder().build();
        }

        @Bean
        StandardMongoClientSettingsBuilderCustomizer standardMongoSettingsCustomizer(MongoProperties properties, MongoConnectionDetails connectionDetails, ObjectProvider<SslBundles> sslBundles) {
            return new StandardMongoClientSettingsBuilderCustomizer(
                            connectionDetails.getConnectionString(),
                            properties.getUuidRepresentation(),
                            properties.getSsl(),
                            sslBundles.getIfAvailable());
        }
    }
}
Java
  • spring.data.mongodb.* ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ‘์† URI๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • StandardMongoClientSettingsBuilderCustomizer๋ฅผ ํ†ตํ•ด์„œ MongoClientSettings์— connection ์ •๋ณด, uuid representation, ssl ์—ฐ๊ฒฐ ์„ค์ •์„ ์„ธํŒ…ํ•œ๋‹ค.
  • MongoClientSettings ์ธ์Šคํ„ด์Šค๋ฅผ ์ ์šฉํ•œ MongoClient ๋นˆ์„ ์ƒ์„ฑํ•œ๋‹ค.

MongoDataAutoConfiguration ํด๋ž˜์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

@AutoConfiguration(after = MongoAutoConfiguration.class)
@ConditionalOnClass({ MongoClient.class, MongoTemplate.class })
@EnableConfigurationProperties(MongoProperties.class)
@Import({ MongoDataConfiguration.class, MongoDatabaseFactoryConfiguration.class,
        MongoDatabaseFactoryDependentConfiguration.class })
public class MongoDataAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean(MongoConnectionDetails.class)
    PropertiesMongoConnectionDetails mongoConnectionDetails(MongoProperties properties) {
        return new PropertiesMongoConnectionDetails(properties);
    }
}
Java

MongoDataAutoConfiguration์—์„œ Import ํ•˜๋Š” MongoDataConfiguration, MongoDatabaseFactoryConfiguration,
MongoDatabaseFactoryDependentConfiguration์„ ํ†ตํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  • spring.data.mongodb.field-naming-strategy์— ์ง€์ •๋œ ๋„ค์ด๋ฐ ํด๋ž˜์Šค๋ฅผ ์ ์šฉํ•œ๋‹ค.
  • MongoClient ๋นˆ์„ ๊ธฐ๋ฐ˜์œผ๋กœ SimpleMongoClientDatabaseFactory ๋นˆ์„ ๋“ฑ๋กํ•œ๋‹ค.
  • MappingMongoConverter ๋นˆ์„ ๋“ฑ๋กํ•œ๋‹ค.
  • MongoDatabaseFactory, MongoConverter ๋นˆ์„ ๊ธฐ๋ฐ˜์œผ๋กœ MongoTemplate ๋นˆ์„ ๋“ฑ๋กํ•œ๋‹ค.

MongoClientSettings ๋นˆ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ธฐ

auto configuration์„ ํ†ตํ•ด์„œ ์ƒ์„ฑ๋œ MongoClient ๋นˆ์— ์ ์šฉ๋˜๋Š” MongoClientSettings๋Š” ๋””ํดํŠธ ์„ค์ •๋“ค์ด ์ ์šฉ๋œ๋‹ค.
AutoConfiguration์— ์˜ํ•ด์„œ ์ž๋™ ์ƒ์„ฑ๋œ MongoClientSettings์— ์ ์šฉ๋˜๋Š” ์„ค์ •๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

created with settings MongoClientSettings{
  readPreference=primary,
  writeConcern=WriteConcern{w=null, wTimeout=null ms, journal=null},
  retryWrites=true, retryReads=true, readConcern=ReadConcern{level=null},
  credential=MongoCredential{mechanism=null, userName='root', source='admin', password=<hidden>, mechanismProperties=<hidden>},
  transportSettings=null,
  streamFactoryFactory=null,
  commandListeners=[],
  codecRegistry=ProvidersCodecRegistry{codecProviders=[ValueCodecProvider{}, BsonValueCodecProvider{}, DBRefCodecProvider{}, DBObjectCodecProvider{}, DocumentCodecProvider{}, CollectionCodecProvider{}, IterableCodecProvider{}, MapCodecProvider{}, GeoJsonCodecProvider{}, GridFSFileCodecProvider{}, Jsr310CodecProvider{}, JsonObjectCodecProvider{}, BsonCodecProvider{}, EnumCodecProvider{}, com.mongodb.client.model.mql.ExpressionCodecProvider@3292d91a, com.mongodb.Jep395RecordCodecProvider@5921b93c, com.mongodb.KotlinCodecProvider@faea4da]},
  loggerSettings=LoggerSettings{maxDocumentLength=1000},
  clusterSettings={hosts=[127.0.0.1:53675], srvServiceName=mongodb, mode=SINGLE, requiredClusterType=UNKNOWN, requiredReplicaSetName='null', serverSelector='null', clusterListeners='[]', serverSelectionTimeout='30000 ms', localThreshold='15 ms'},
  socketSettings=SocketSettings{connectTimeoutMS=30000, readTimeoutMS=30000, receiveBufferSize=0, proxySettings=ProxySettings{host=null, port=null, username=null, password=null}},
  heartbeatSocketSettings=SocketSettings{connectTimeoutMS=30000, readTimeoutMS=30000, receiveBufferSize=0, proxySettings=ProxySettings{host=null, port=null, username=null, password=null}},
  connectionPoolSettings=ConnectionPoolSettings{maxSize=50, minSize=10, maxWaitTimeMS=120000, maxConnectionLifeTimeMS=60000, maxConnectionIdleTimeMS=0, maintenanceInitialDelayMS=0, maintenanceFrequencyMS=60000, connectionPoolListeners=[], maxConnecting=2},
  serverSettings=ServerSettings{heartbeatFrequencyMS=10000, minHeartbeatFrequencyMS=500, serverListeners='[]', serverMonitorListeners='[]'},
  sslSettings=SslSettings{enabled=false, invalidHostNameAllowed=false, context=null},
  applicationName='null',
  compressorList=[],
  uuidRepresentation=STANDARD,
  serverApi=null,
  autoEncryptionSettings=null,
  dnsClient=null,
  inetAddressResolver=null,
  contextProvider=null
}
Plaintext

์œ„ ์ •๋ณด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ org.mongodb.driver.client ์—์„œ ์ƒ์„ฑํ•œ ๋กœ๊ทธ์ด๋‹ค.
์œ„ ํ•ญ๋ชฉ์— ์žˆ๋Š” ์„ธํŒ… ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด MongoClientSettings ๋นˆ์„ ์ง์ ‘ ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด connection pool settings๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด MongoClientSettings ๋นˆ์„ ์ƒ์„ฑํ•œ๋‹ค.

@Configuration
@RequiredArgsConstructor
public class MongoDBConfiguration {
    @Bean
    public MongoClientSettings mongoClientSettings() {
        return MongoClientSettings.builder()
                .applyToConnectionPoolSettings( connectionPoolSettingsBuilder ->
                        connectionPoolSettingsBuilder
                                .maxSize( 50 )
                                .minSize( 10 )
                                .maxConnectionLifeTime( 1, TimeUnit.MINUTES )
                )
                .applyToSocketSettings( socketSetting ->
                        socketSetting
                                .connectTimeout( 30, TimeUnit.SECONDS )
                                .readTimeout( 30, TimeUnit.SECONDS )
                )
                .build();
    }

    @Bean
    public StandardMongoClientSettingsBuilderCustomizer standardMongoSettingsCustomizer(
                          MongoProperties properties,
                          MongoConnectionDetails connectionDetails, 
                          ObjectProvider<SslBundles> sslBundles) {
        return new StandardMongoClientSettingsBuilderCustomizer(
                        connectionDetails.getConnectionString(),
                        properties.getUuidRepresentation(), 
                        properties.getSsl(), 
                        sslBundles.getIfAvailable());
    }
}
Java

StandardMongoClientSettingsBuilderCustomizer ๋นˆ์˜ ์—ญํ• ์€ MongoClient์— ์ ์šฉ๋˜๋Š” MongoClientSettings ์ธ์Šคํ„ด์Šค์— ConnectionDetail, UuidRepresentation, SSL ์„ค์ • ์ •๋ณด๋ฅผ ์ ์šฉ์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•˜๋Š”๋ฐ MongoAutoConfiguration ํด๋ž˜์Šค์— ๋ณด๋ฉด MongoClientSettings ๋นˆ์„ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ƒ์„ฑ๋˜๋ฏ€๋กœ ์ง์ ‘ MongoClientSettings ๋นˆ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” StandardMongoClientSettingsBuilderCustomizer ๋นˆ์ด ์ƒ์„ฑ๋˜์ง€ ์•Š์•„ ConnectionDetail, UuidRepresentation, SSL ์„ค์ • ์ •๋ณด๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ StandardMongoClientSettingsBuilderCustomizer ๋นˆ์„ ์ƒ์„ฑํ•ด ์ฃผ๊ฑฐ๋‚˜ย  ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด mongoClientSettings() ๋นˆ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ์—์„œ MongoClientSettings์— ์ง์ ‘ ConnectionDetail, UuidRepresentation, SSL ์„ค์ • ์ •๋ณด๋ฅผ ์„ธํŒ…ํ•ด์•ผ ํ•œ๋‹ค.

@Bean
public MongoClientSettings mongoClientSettings(
        MongoProperties mongoProperties,
        MongoConnectionDetails connectionDetails,
        ObjectProvider<SslBundles> sslBundlesProvider) {

    MongoClientSettings.Builder builder = MongoClientSettings.builder()
            .applyConnectionString( connectionDetails.getConnectionString() )
            .uuidRepresentation( mongoProperties.getUuidRepresentation() )
            .applyToConnectionPoolSettings( connectionPoolSettingsBuilder -> connectionPoolSettingsBuilder
                    .maxSize( 50 )
                    .minSize( 10 )
                    .maxConnecting( 10 )
                    .maxConnectionLifeTime( 1, TimeUnit.MINUTES )
            )
            .applyToSocketSettings( socketSetting ->
                    socketSetting
                            .connectTimeout( 30, TimeUnit.SECONDS )
                            .readTimeout( 30, TimeUnit.SECONDS )
            );

    if ( mongoProperties.getSsl().isEnabled() ) {
        builder.applyToSslSettings( sslSetting -> {
            if ( mongoProperties.getSsl().getBundle() != null ) {
                sslSetting.enabled( true );
                SslBundles sslBundles = sslBundlesProvider.getIfAvailable();
                SslBundle sslBundle = sslBundles.getBundle( mongoProperties.getSsl().getBundle() );
                Assert.state( !sslBundle.getOptions().isSpecified(), "SSL options cannot be specified with MongoDB");
                sslSetting.context( sslBundle.createSslContext() );
            }
        } );
    }

    return builder.build();
}
Java

๋งˆ์ง€๋ง‰์œผ๋กœ AbstractMongoClientConfiguration ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•œ @Configuration ๋นˆ์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

@Configuration
@RequiredArgsConstructor
public class MongoDBConfigurationBySupport extends AbstractMongoClientConfiguration {
    private final MongoConnectionDetails mongoConnectionDetails;
    private final MongoProperties mongoProperties;
    private final ObjectProvider<SslBundles> sslBundlesObjectProvider;

    @Bean
    @Override
    @NonNull
    public MongoClient mongoClient() {
        return super.mongoClient();
    }

    @Override
    @NonNull
    public String getDatabaseName() {
        return "test";
    }

    @Override
    protected void configureClientSettings( MongoClientSettings.Builder builder ) {
        builder.applyConnectionString( mongoConnectionDetails.getConnectionString() )
                .uuidRepresentation( mongoProperties.getUuidRepresentation() )
                .applyToConnectionPoolSettings( connectionPoolSettingsBuilder ->
                        connectionPoolSettingsBuilder
                                .maxSize( 50 )
                                .minSize( 10 )
                                .maxConnectionLifeTime( 1, TimeUnit.MINUTES )
                )
                .applyToSocketSettings( socketSetting ->
                        socketSetting
                                .connectTimeout( 30, TimeUnit.SECONDS )
                                .readTimeout( 30, TimeUnit.SECONDS )
                );

        if ( mongoProperties.getSsl().isEnabled() ) {
            builder.applyToSslSettings( sslSetting -> {
                if ( mongoProperties.getSsl().getBundle() != null ) {
                    sslSetting.enabled( true );
                    SslBundles sslBundles = sslBundlesObjectProvider.getIfAvailable();
                    SslBundle sslBundle = sslBundles.getBundle( mongoProperties.getSsl().getBundle() );
                    Assert.state(!sslBundle.getOptions().isSpecified(), "SSL options cannot be specified with MongoDB");
                    sslSetting.context( sslBundle.createSslContext() );
                }
            } );
        }
    }
}
Java

AbstractMongoClientConfiguration ํด๋ž˜์Šค์˜ configureClientSettings() ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ ํ•˜์—ฌ MongoClientSettings์— ์ƒ์„ธ ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด ๋ฐฉ์‹ ์—ญ์‹œย ConnectionDetail, UuidRepresentation, SSL ์„ค์ • ์ •๋ณด๋ฅผ ์ง์ ‘ MongoClientSettings์— ์„ธํŒ…ํ•ด์•ผ ํ•œ๋‹ค.
AbstractMongoClientConfiguration ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” MongoClient, MongoTemplate,ย  MongoDatabaseFactory ๋นˆ์ด ๋จผ์ € ์ƒ์„ฑ๋˜๋ฏ€๋กœ auto configuration ์ด ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.

spring boot์—์„œ ์ œ๊ณตํ•˜๋Š” MongoDB Auto Configuration๊ณผ application.yml ์—์„œ spring.data.mongodb.*์„ ์„ค์ •์„ ์ด์šฉํ•˜์—ฌ MongoDB์— ๋ฐ”๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. MongoDB ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ์•„๋ฌด๋Ÿฐ Configuration ์—†์ด๋„ ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์กฐ๊ธˆ ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ์—ฐ๊ฒฐ ์„ค์ •์„ ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” MongoClientSettings ๋นˆ์„ ์ง์ ‘ ์ƒ์„ฑํ•˜๋ฉด์„œ ํ•„์š”ํ•œ ์„ค์ •๋งŒ ์ง€์ •ํ•ด ์ฃผ๋ฉด ๋˜๋Š” ์ •๋„์ด๋‹ค.


์ƒ˜ํ”Œ ์ฝ”๋“œ gitlab ๋งํฌ

์ƒ˜ํ”Œ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋œ mongodb ๋Š” spring boot docker compose๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

spring boot docker compose์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ 

spring boot docker compose support ๋กœ์ปฌ์—์„œ ์ธํ”„๋ผ ์˜ฌ๋ ค์„œ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ (spring boot 3.1)