feat(gift): 신청번호 생성기를 추가한다

This commit is contained in:
2026-09-30 13:35:47 +09:00
parent 8ae722c8df
commit 760005c266
2 changed files with 111 additions and 0 deletions
@@ -0,0 +1,43 @@
package kr.co.vividnext.sodalive.v2.gift.application
import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.v2.gift.adapter.out.persistence.GiftApplicationNoSequence
import kr.co.vividnext.sodalive.v2.gift.adapter.out.persistence.GiftApplicationNoSequenceRepository
import org.springframework.dao.DataIntegrityViolationException
import org.springframework.stereotype.Service
import org.springframework.transaction.PlatformTransactionManager
import org.springframework.transaction.support.TransactionTemplate
import java.time.LocalDateTime
import java.time.ZoneId
import java.time.format.DateTimeFormatter
@Service
class GiftApplicationNoGenerator(
private val repository: GiftApplicationNoSequenceRepository,
transactionManager: PlatformTransactionManager
) {
private val transactionTemplate = TransactionTemplate(transactionManager)
fun generate(now: LocalDateTime = LocalDateTime.now(SEOUL_ZONE)): String {
val sequenceDate = now.format(DATE_FORMATTER)
for (attempt in 1..MAX_RETRY_COUNT) {
try {
return transactionTemplate.execute {
val sequence = repository.findBySequenceDateForUpdate(sequenceDate)
?: repository.saveAndFlush(GiftApplicationNoSequence(sequenceDate = sequenceDate, lastSequence = 0))
sequence.lastSequence += 1
"G$sequenceDate${sequence.lastSequence.toString().padStart(6, '0')}"
} ?: throw SodaException(messageKey = "common.error.invalid_request")
} catch (_: DataIntegrityViolationException) {
if (attempt == MAX_RETRY_COUNT) throw SodaException(messageKey = "gift.application_no.generate_failed")
}
}
throw SodaException(messageKey = "gift.application_no.generate_failed")
}
companion object {
private val SEOUL_ZONE = ZoneId.of("Asia/Seoul")
private val DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd")
private const val MAX_RETRY_COUNT = 3
}
}