프로그램/Java

spring boot mongodb

milktea.kang 2021. 5. 14. 14:40
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

 

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.core.convert.converter.Converter;
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.core.convert.DefaultDbRefResolver;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;

import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;

@Configuration
public class DbMongoConf {
    @Bean("mongoClient")
    public MongoClient mongoClient(@Qualifier("mongoConnectionString") String mongoConnectionString) {
        return MongoClients.create(mongoConnectionString);
    }

    @Profile({"LOCAL","DEV"})
    @Bean("mongoConnectionString")
    public String mongoConnectionStringStg() {
        return "mongodb://계정:비번@123.123.123.123:12345/myservice";
    }
    
    @Profile({"PROD"})
    @Bean("mongoConnectionString")
    public String mongoConnectionStringProd() {
        return "mongodb://계정:비번@123.123.123.123:12345/myservice";
    }

    // https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/
    // 7.4.1. Auto Index Creation
    @Bean
    public MongoTemplate mongoTemplate(
        @Qualifier("mongoClient") MongoClient mongoClient
        ,@Qualifier("mongoConnectionString") String mongoConnectionString
        ,@Qualifier("customConversions") MongoCustomConversions customConversions
    ) {
        MongoDatabaseFactory dbFactory = new SimpleMongoClientDatabaseFactory(mongoConnectionString);
        DefaultDbRefResolver dbRefResolver = new DefaultDbRefResolver(dbFactory);
        MongoMappingContext mappingContext = new MongoMappingContext();
        mappingContext.setAutoIndexCreation(true);
        mappingContext.afterPropertiesSet();
        
        MappingMongoConverter mongoConverter = new MappingMongoConverter(dbRefResolver, mappingContext);
        mongoConverter.setMapKeyDotReplacement("#");
        mongoConverter.afterPropertiesSet();
        mongoConverter.setCustomConversions(customConversions);
        
        MongoTemplate mongoTemplate = new MongoTemplate(dbFactory,mongoConverter);
        return mongoTemplate;
    }
    
    @Bean
    public MongoCustomConversions customConversions() {
        List<Converter<?, ?>> converterList = new ArrayList<Converter<?, ?>>();
        converterList.add(new MongoLocalDateTimeFromStringConverter());
        return new MongoCustomConversions(converterList);
    }
    
    private static final class MongoLocalDateTimeFromStringConverter implements Converter<String, LocalDateTime> {
        @Override
        public LocalDateTime convert(String source) {
            return source == null ? null : LocalDateTime.parse(source);
        }
    }