๊ฐœ์š”

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()
}

 

Posted by doubler
,