Spring Webflux 프로젝트에 MongoDB 설정하려고 하는데,
중간에 어려움을 겪어 이 게시글을 보시는 분들은 좀 더 쉽게 설정하실 수 있도록 내용 공유합니다.
Spring Webflux 프로젝트이기는 하나 Spring Data MongoDB
를 사용하기 때문에 다른 Spring 프로젝트여도 방법은 비슷할 것 같네요.
먼저 Spring Data MongoDB
를 사용하기 위해 Dependency에 다음 내용을 추가합니다.
참고로 저는 Gradle이 kotlin으로 되어 있어요.
implementation("org.springframework.boot:spring-boot-starter-data-mongodb-reactive")
그 다음 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 설치하기를 참고해주세요.
그 다음 위 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 테스트를 해보면 204로 정상적으로 저장했음을 응답으로 내려줍니다.
DB에도 데이터가 잘 들어가있네요 :D