Skip to content

Latest commit

 

History

History
96 lines (72 loc) · 3.66 KB

001.Connecting_to_MongoDB_in_Spring.md

File metadata and controls

96 lines (72 loc) · 3.66 KB

001. Kotlin + Spring 프로젝트에 MongoDB 설정하기

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에 따로 적었는데 만약 계정 정보가 프로젝트에서 사용할 데이터베이스에 있다면 authenticationDatabase를 입력하지 않아도 됩니다.

만약 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

참고