๐Ÿ“‰์ค‘๋ณต ์ฒดํฌ๋กœ์ง ์„ฑ๋Šฅ ๊ฐœ์„ ํ•˜๊ธฐ by HashSet

๊น€์ข…์™„ยท2023๋…„ 3์›” 3์ผ
0
val transactionKeyList = paymentCancelRepo.findAllByPayment(payment).map{
    it.transactionKey
}

paymentDto.cancels?.forEach{cancel->
var isNew = true
    transactionKeyList.forEach{transactionKey->
if(cancel.transactionKey == transactionKey) isNew = false
}
if(isNew){
        val paymentCancel = paymentCancelMapper.toEntity(cancel, payment)
        paymentCancelRepo.save(paymentCancel)
    }
}

๋‚˜๋Š” ์œ„์™€๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค. ์ฝ”๋“œ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์ „์— ์ƒํ™ฉ์„ ์„ค๋ช…ํ•˜์ž๋ฉด ์ด๋ ‡๋‹ค.
ํ† ์ŠคํŽ˜์ด๋จผ์ธ ๋ฅผ ํ†ตํ•ด ๊ฒฐ์ œ ์ทจ์†Œ ๋กœ์ง์„ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

ํ† ์Šค๋Š” ๊ฒฐ์ œ ๊ด€๋ จ api๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ payment๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ ๋ถ€๋ถ„ ์ทจ์†Œ๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ํ•˜๋ฉด cancels ๊ฐ’ ์•ˆ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ cancel ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€์žˆ๋‹ค. ๊ทธ์ค‘ ๋‚˜๋Š” ์ƒˆ๋กœ์šด cancel ๊ฐ’์„ db์— ์ €์žฅํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” ์ด์ „์— ์ €์žฅํ•œ cancel ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ์œผ๋กœ ์ค‘๋ณต ์ฒดํฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๊ทธ๋ž˜์„œ ์ฒ˜์Œ์— ์ƒ๊ฐํ•ด๋‚ธ ๋ฐฉ๋ฒ•์€ ์œ„์™€๊ฐ™์ด foreach๋ฌธ์„ 2๋ฒˆ ๋Œ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. response ๋กœ ๋ฐ›์€ cancels๊ฐ’์„ ์ผ์ผ์ด db์— ์ €์žฅํ•ด๋‘” ๋ชจ๋“  ๊ฐ’๊ณผ ๋น„๊ตํ•ด๋ณด๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ค‘๋ณต ์ฒดํฌ๋ฅผ ํ•  ๊ฒฝ์šฐ O(n^2)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋˜์–ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์งˆ ๋•Œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์˜ ๊ฒฝ์šฐ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ hashSet์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ตํ•  ๋•Œ hash๋กœ ์ ‘๊ทผํ•œ๋‹ค๋Š” ์  ๋•๋ถ„์— O(n^2)์‹œ๊ฐ„ ๋ณต์žก๋„์—์„œ O(n) ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

์•„๋ž˜๋Š” ๊ฐœ์„ ๋œ ์ฝ”๋“œ์ด๋‹ค.

val transactionKeySet = paymentCancelRepo.findAllByPayment(payment).map{
    it.transactionKey
}.toHashSet()

paymentDto.cancels?.filter{cancel->!transactionKeySet.contains(cancel.transactionKey)}
?.forEach{cancel->
val paymentCancel = paymentCancelMapper.toEntity(cancel, payment)
    paymentCancelRepo.save(paymentCancel)
}

๊ธฐ์กด์— list๋กœ ์ƒ์„ฑํ•˜๋˜ transactionKeyList ๋ถ€๋ถ„์„ transactionKeySet์œผ๋กœ ๋ณ€๊ฒฝํ•˜์˜€๊ณ  kotlin์˜ filter ๊ธฐ๋Šฅ์„ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜์–ด ์žˆ์ง€ ์•Š์€ cancel๋“ค์„ n์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ์ฐพ์•„๋‚ด์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €์žฅ๋˜์–ด ์žˆ์ง€ ์•Š๋˜ cancel์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— insert ํ•˜๋„๋ก ํ–ˆ๋‹ค.

์œ„์™€๊ฐ™์ด ์ค‘๋ณต์ฒดํฌ๋ฅผ ํ•  ๋•Œ hashSet์„ ์‚ฌ์šฉํ•ด์„œ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์•˜๋‹ค.

profile
๊ฐœ๋ฐœ์— ์žฌ๋ฏธ๋ฅผ ๋А๋ผ๋ฉฐ ๊พธ์ค€ํžˆ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž ๊น€์ข…์™„ ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€