반응형
12월에 새로운 프로젝트를 진행하면서 세운 목표는 안 써본 기술을 사용해 보면서 해당 기술이 가진 장점과 기존 기술과의 차이를 파악하는 것이었습니다.
가장 궁금하고 학습하고 싶었던 기술로는 1. NoSQL 2. GraphQL 통신방법이 있어서 해당 2가지 기술을 프로젝트 개발에 앞서 프로젝트 셋팅과 연결 및 통신을 적용해 보며 새로운 기술과 친해지는 시간을 가졌습니다.
기본적인 세팅을 진행하면서 문서도 많이 바뀌고, 코틀린으로 적용하다 보니 서툰 점이 많았는데, 해당 글을 보는 사람들은 편하게 셋팅하면 좋겠다는 마음에 2024년 마지막 글을 작성해 봅니다.!!
MongoDB 보안 적용하기
- mongosh에 접속합니다.
- 사용할 데이터베이스로 use 합니다.
- 데이터베이스에 사용자를 생성합니다.
# 접속
mongosh
# DB 지정
use test_db
# user 생성
db.createUser({
user: "admin"
pwd: "admin1234"
roles: [{ role: "readWrite", db: "calendar_db" }]
})
사용자를 만들면, mongoDB가 설치된 경로에 mongod.conf 라는 설정 파일이 존재합니다. 해당 파일에 인증 활성화 코드를 추가합니다.
해당 파일에서 인증을 활성화해 주면 해당 데이터베이스에 접근할 때 username, pwd 정보가 필요로 합니다.
(mongoDB에서는 기본적으로 security 비활성화되어 있어 로그인 정보가 없어도 로그인이 가능 / 하지만 보안을 위해 인증 활성화는 필수적이므로 적용해 보겠습니다.)
Security 활성화
brew로 설치한 mongodb 적용 기준
cd /opt/homebrew/etc
# ls /usr/local/etc/mongod.conf
vi mongod.conf
# 아래 부분을 추가합니다 //
secutiry:
authorization: enabled
설정 파일을 변경한 후에 restart 하여 확인합니다.
# MongoDB 재시작
brew services restart mongodb-community
use test_db
show collections
# unAuthorized 오류 발생
db.auth('admin') # 인증 진행
Spring - MongoDB 연결
yaml을 통한 방법 1
spring:
data:
mongodb:
username: kylo
password: kylo3677
host: localhost
port: 27017
database: calendar_db
authentication-database: admin
yaml 파일에 username,password, host, port, database 정보를 작성하여 연결합니다.
MongoConfig을 통한 방법 2
AbstractMongoClientConfiguration 추상 클래스를 상속하여 MongoDB 연결과 다른 추가 설정을 진행합니다.
mongodbUri는 mongodb://{username}:{password}@{host}:{port}/{database} 값입니다.
@Value("\\${mongodb.uri}")
lateinit var mongodbUri: String
override fun mongoClient(): MongoClient {
val connectionString = ConnectionString(mongodbUri)
val mongoClientSettings = MongoClientSettings
.builder()
.applyConnectionString(connectionString)
.build()
return MongoClients.create(mongoClientSettings)
}
override fun getDatabaseName(): String {
return "calendar_db"
}
- MongoClient를 오버라이딩하여 연결합니다.
- ConnectionString에 host정보를 작성합니다.
- getDatabasename 메서드에는 데이터베이스 이름을 작성합니다.
⭐️ _class 필드 저장되는 문제 해결
@Bean
fun customMongoConverter(
mongoDatabaseFactory: MongoDatabaseFactory,
mongoMappingContext: MongoMappingContext
): MappingMongoConverter {
val dbRefResolver: DbRefResolver = DefaultDbRefResolver(mongoDatabaseFactory)
val converter = MappingMongoConverter(dbRefResolver, mongoMappingContext)
converter.setTypeMapper(DefaultMongoTypeMapper(null))
return converter
}
@Bean
override fun mongoTemplate(
mongoDatabaseFactory: MongoDatabaseFactory,
customMongoConverter: MappingMongoConverter,
): MongoTemplate {
return MongoTemplate(mongoDatabaseFactory, customMongoConverter)
}
데이터를 저장하고 MongoDB에 컬렉션을 조회하는데, _class라는 필드에 클래스 패키지 정보가 저장되는 것을 확인했습니다. 해당 필드 정보는 데이터 조회에서도 필요가 없고 관리 목적으로도 불필요하다고 느껴졌습니다. 사용하지 않는 데이터가 계속 쌓이면 용량만 잡아먹는다고 생각이 들어 _class 필드 제거하여 데이터를 저장하였습니다.
- customMongoConverter는 MappingMongoConverter를 커스텀하게 변형하여 등록한 빈입니다.
- mappingMongoConverter로 메서드명을 하게 되는 경우 기본 빈과 중복되어 제대로 등록되지 않아 다른 이름으로 정의해주어야 합니다.
- MongoTemplate에 설정한 Converter를 지정하여 _class를 제거합니다.
DateTimeProvider 설정
@Bean
fun mongoAuditingDateTimeProvider(): DateTimeProvider {
return DateTimeProvider {
Optional.of(OffsetDateTime.now(ZoneId.of("Asia/Seoul")))
}
}
알아야 하는 점
- MongoDB에 시간값은 기본적으로 UTC 기준으로 저장된다.
- 즉, 우리나라는 -9시간 한 시간으로 저장된다.
- 위처럼 설정을 해도 MongoDB에는 -9시간으로 설정되지만, 값을 조회해 올 때는 올바르게 서울 시간으로 조회된다.
- (시간 값 기준으로 쿼리를 보내야 하는 경우 서버 단에서 처리하는 것이 더 편해 보임)
반응형
'DB > MongoDB' 카테고리의 다른 글
[MongoDB] 몽고디비 Database, Collection 생성, 삭제 관리 (0) | 2024.12.26 |
---|