개발하는 두부

Kotlin + Spring 프로젝트 MongoDB 설정

by 뚜부니

Spring WebFlux 프로젝트에서 MongoDB 설정을 하는 중 어려움을 좀 겪었어요 😂 이 게시글을 보시는 분들은 조금 더 쉽게 설정하실 수 있도록 설정 방법에 대해 정리해서 공유해보려고 해요. Spring Webflux 프로젝트이기는 하나 Spring Data MongoDB를 사용하기 때문에 어떤 Spring 프로젝트이던 방법은 비슷할 것 같아요.

 

Gradle 설정

먼저 Spring Data MongoDB를 사용하기 위해 Dependency에 다음 내용을 추가합니다. 참고로 저는 Gradle이 kotlin으로 되어 있어요.

implementation("org.springframework.boot:spring-boot-starter-data-mongodb-reactive")

 

yaml 설정

그다음 application.yaml을 아래 내용과 같이 생성합니다.

spring:
  application:
    name: project
  jackson:
    property-naming-strategy: SNAKE_CASE
  data:
    mongodb:
      uri: mongodb://localhost:27017
      database: project
      username: master
      password: master
      authentication-database: admin

저는 프로젝트에서 사용할 데이터베이스는 project, 계정 정보는 admin에 있어서 application.yaml에 따로 적었어요.

계정 정보가 프로젝트에서 사용할 데이터베이스에 있다면 authentication-database를 입력하지 않아도 됩니다.

만약, 계정 정보가 있는 admin 데이터베이스가 project 데이터베이스에 대한 권한이 없으면 Exception authenticating MongoCredential에러가 발생할 수 있습니다. mongoDB 내에서 project 데이터베이스에 대한 권한을 주면 해당 문제를 해결할 수 있습니다. 관련 내용은 MongoDB 설치하기를 참고해주세요.

 

config 구성

그다음 위 application.yaml 설정을 바탕으로 MongoDB Config를 작성해 보겠습니다.

@Configuration
@EnableReactiveMongoAuditing
class MongoConfig(private val mongoProperties: MongoProperties) : AbstractReactiveMongoConfiguration() {

    override fun getDatabaseName(): String {
        return mongoProperties.database
    }

    @Bean
    override fun reactiveMongoClient(): MongoClient {
        val credential = MongoCredential.createCredential(mongoProperties.username, mongoProperties.authenticationDatabase, mongoProperties.password)
        val connectionString = ConnectionString(mongoProperties.uri)
        return MongoClients.create(
            MongoClientSettings.builder()
                .applyConnectionString(connectionString)
                .credential(credential)
                .build()
        )
    }

    @Bean
    fun reactiveMongoTemplate(): ReactiveMongoTemplate {
        return ReactiveMongoTemplate(reactiveMongoClient(), databaseName)
    }

    @Bean
    @Primary
    fun objectMapper(): ObjectMapper {
        return ObjectMapper().apply {
            propertyNamingStrategy = PropertyNamingStrategies.SNAKE_CASE
        }
    }
}

AbstractReactiveMongoConfiguration를 상속받아 구성하였으며, getDatabaseName()에서는 실제로 사용할 데이터베이스를 연결합니다. 그리고 credential에는 실제 계정 정보가 있는 데이터베이스를 설정합니다.

 

API 호출해 보기

여기서 API에 대한 내용은 생략했습니다. 실제로 API를 호출해 보면 204로 정상적으로 저장했음을 응답으로 내려줍니다.

image

DB에도 데이터가 잘 들어가 있네요 :D

image

 

참고

블로그의 정보

개발하는 두부

뚜부니

활동하기