๊ฐ์
springboot ํ๊ฒฝ์์ ๋ชฝ๊ณ ๋๋น ๋ฒํฌ์ธ์ํธ๋ฅผ ํด๋ณธ๋ค.
์ฝ๋
@Component
class MongoDbInitializer(
private val mongoTemplate: MongoTemplate
) : CommandLineRunner {
private val log = LoggerFactory.getLogger(javaClass)
override fun run(vararg args: String?) {
this.bulkInsertUsers()
}
private fun bulkInsertUsers() {
userRepository.deleteAll()
val users = (1..31234).map { sequence ->
User(
userUniqueId = UUID.randomUUID().toString(),
name = "ํ๊ธธ๋-${UUID.randomUUID().toString().substring(1, 5)}",
sequence = sequence.toLong()
)
}
// (1) User ํ์
์ ๋ํ ์ค๊ฐ ์๋ฌ๋ฅผ ๋ฌด์ํ ๋ฒํฌ๋ชจ๋ ์ค์
val bulkOperation = mongoTemplate.bulkOps(BulkMode.UNORDERED, User::class.java)
// (2) users collection ์ ์ธ์ํธ
bulkOperation.insert(users)
// (3) ์ค์ ํธ๋์ญ์
์คํ
val bulkOperationResult = bulkOperation.execute()
// (4) ํธ๋์ญ์
๊ฒฐ๊ณผ์ ๋ฐ๋ฅธ ์ธ์ํธ๋ ๋ก์ฐ์ ๋ก๊น
log.debug("insertedCount : ${bulkOperationResult.insertedCount}")
}
}
BulkMode ์๋ UNORDERED / ORDERED ๊ฐ ์๋ค. : ORDERED ๋ฅผ ๋จผ์ ์ดํ๋ค.
- ORDERED : ์ธ์ํธ๋ฅผ ์ํํ๋ ์ปฌ๋ ์ ์ ์์ ์ค ํ๋๋ผ๋ ๋ฌธ์ ๊ฐ ์๊ธด๋ค๋ฉด, ๊ฑฐ๊ธฐ์ ๋ฉ์ถ๋ค. ์๋ฌ๊ฐ ๋ฐ์ํ๊ธฐ์ ์ ๋ค์ด๊ฐ ์์๋ค์ ํธ๋์ญ์ ์ฒ๋ฆฌ๋๋ค.
- UNORDERED : ์ธ์ํธ๋ฅผ ์ํํ๋ ์ปฌ๋ ์ ์ ์์ ์ค ํ๋๋ผ๋ ๋ฌธ์ ๊ฐ ์๊ธฐ๋๋ผ๋ ๋ฌด์ํ๊ณ , ๋๋จธ์ง ์์๋ค์ ์ฒ๋ฆฌํ๋ค.
mongoTemplate.bulkOps() ๊ฐ์ฒด ์์ฒด๋ ์ค๋ ๋ ์ธ์ดํํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ณ๋ ฌ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค. ๊ฒฐ๊ตญ ์๋์ ๊ฐ์ด ์ธ ์ ์๋ค. ์ฐ๊ณ ์ถ๋ค๋ฉด ๊ฐ๊ฐ์ forEach {} ๋ธ๋ญ ๋ด๋ถ์์ mongoTemplate.bulkOps() ๊ฐ์ฒด๋ฅผ ๋ฐ๋ก๋ฐ๋ก ๋ง๋ค์ด์ ์คํ์์ผ์ฃผ์ด์ผ ํ๋ค.
val documents = mutableListOf<Member>()
File(fileName).forEachLine { line -> documents.add(Member(line)) }
val bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.ORDERED, "member")
documents.chunked(50).parallelStream().forEach { chunk ->
bulkOps.insert(chunk)
bulkOps.execute()
}