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์ ์ฌ์ฉํด์ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์๋ค.