diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/user/application/service/ChangeReceiptCodeService.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/user/application/service/ChangeReceiptCodeService.kt index 6e1f40e..36a15f1 100644 --- a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/user/application/service/ChangeReceiptCodeService.kt +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/user/application/service/ChangeReceiptCodeService.kt @@ -43,8 +43,6 @@ class ChangeReceiptCodeService( if (user == null) { userEventProducer.sendReceiptCodeUpdateFailed( receiptCode = receiptCode, - userId = userId, - reason = "User not found", ) throw UserNotFoundException } @@ -52,13 +50,11 @@ class ChangeReceiptCodeService( val updatedUser = user.copy(receiptCode = receiptCode) saveUserPort.save(updatedUser) - registerAfterCommitCallback(receiptCode, userId) + registerAfterCommitCallback(receiptCode) } catch (e: Exception) { if (e !is UserNotFoundException) { userEventProducer.sendReceiptCodeUpdateFailed( receiptCode = receiptCode, - userId = userId, - reason = e.message ?: "Unknown error", ) } throw e // 예외 다시 던져서 롤백 발생 @@ -69,11 +65,9 @@ class ChangeReceiptCodeService( * 트랜잭션 커밋 후 접수코드 업데이트 완료 이벤트를 발행합니다. * * @param receiptCode 접수코드 - * @param userId 사용자 ID */ private fun registerAfterCommitCallback( receiptCode: Long, - userId: UUID, ) { /** * 트랜잭션 완료 후 콜백을 처리하는 객체입니다. @@ -81,7 +75,7 @@ class ChangeReceiptCodeService( val callback = object : TransactionSynchronization { override fun afterCommit() { - userEventProducer.sendReceiptCodeUpdateCompleted(receiptCode, userId) + userEventProducer.sendReceiptCodeUpdateCompleted(receiptCode) } } TransactionSynchronizationManager.registerSynchronization(callback) diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/configuration/KafkaTopics.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/configuration/KafkaTopics.kt index bd08676..6aaf8a0 100644 --- a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/configuration/KafkaTopics.kt +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/configuration/KafkaTopics.kt @@ -41,4 +41,6 @@ object KafkaTopics { const val USER_RECEIPT_CODE_UPDATE_FAILED = "user-receipt-code-update-failed" const val CANCEL_SUBMITTED_APPLICATION = "cancel-submitted-application" + + const val APPLICATION_STATUS_CREATE_FAILED = "application-status-create-failed" } diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/consumer/CancelApplicationConsumer.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/consumer/CancelApplicationConsumer.kt index 9daabb2..71bffa7 100644 --- a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/consumer/CancelApplicationConsumer.kt +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/consumer/CancelApplicationConsumer.kt @@ -14,7 +14,7 @@ class CancelApplicationConsumer( @KafkaListener( topics = [KafkaTopics.CANCEL_SUBMITTED_APPLICATION], - groupId = "update-user", + groupId = "delete-receipt-code", containerFactory = "kafkaListenerContainerFactory", ) fun execute(message: String) { diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/consumer/CreateStatusConsumer.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/consumer/CreateStatusConsumer.kt new file mode 100644 index 0000000..39ab2f6 --- /dev/null +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/consumer/CreateStatusConsumer.kt @@ -0,0 +1,24 @@ +package hs.kr.entrydsm.user.infrastructure.kafka.consumer + +import com.fasterxml.jackson.databind.ObjectMapper +import hs.kr.entrydsm.user.domain.user.application.port.`in`.DeleteReceiptCodeUseCase +import hs.kr.entrydsm.user.infrastructure.kafka.configuration.KafkaTopics +import org.springframework.kafka.annotation.KafkaListener +import org.springframework.stereotype.Component + +@Component +class CreateStatusConsumer( + private val mapper: ObjectMapper, + private val deleteReceiptCodeUseCase: DeleteReceiptCodeUseCase +) { + + @KafkaListener( + topics = [KafkaTopics.APPLICATION_STATUS_CREATE_FAILED], + groupId = "delete-receipt-code", + containerFactory = "kafkaListenerContainerFactory", + ) + fun applicationStatusCreateFailed(message: String) { + val receiptCode = mapper.readValue(message, Long::class.java) + deleteReceiptCodeUseCase.deleteReceiptCode(receiptCode) + } +} \ No newline at end of file diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/consumer/dto/UserReceiptCodeUpdateCompletedEvent.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/consumer/dto/UserReceiptCodeUpdateCompletedEvent.kt deleted file mode 100644 index 839a910..0000000 --- a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/consumer/dto/UserReceiptCodeUpdateCompletedEvent.kt +++ /dev/null @@ -1,17 +0,0 @@ -package hs.kr.entrydsm.user.infrastructure.kafka.consumer.dto - -import java.util.UUID - -/** - * 사용자 접수번호 업데이트 완료 이벤트 데이터를 담는 DTO 클래스입니다. - * - * 사용자 서비스에서 접수번호 업데이트가 성공적으로 완료되었을 때 - * 원서 서비스에 전달하는 이벤트 데이터를 정의합니다. - * - * @property receiptCode 업데이트된 접수번호 - * @property userId 접수번호가 업데이트된 사용자의 고유 식별자 - */ -data class UserReceiptCodeUpdateCompletedEvent( - val receiptCode: Long, - val userId: UUID, -) diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/consumer/dto/UserReceiptCodeUpdateFailedEvent.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/consumer/dto/UserReceiptCodeUpdateFailedEvent.kt deleted file mode 100644 index 6bba3f1..0000000 --- a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/consumer/dto/UserReceiptCodeUpdateFailedEvent.kt +++ /dev/null @@ -1,20 +0,0 @@ -package hs.kr.entrydsm.user.infrastructure.kafka.consumer.dto - -import java.util.UUID - -/** - * 사용자 접수번호 업데이트 실패 이벤트 데이터를 담는 DTO 클래스입니다. - * - * 사용자 서비스에서 접수번호 업데이트가 실패했을 때 원서 서비스에 전달하는 - * 이벤트 데이터를 정의합니다. 원서 서비스에서는 이 이벤트를 수신하여 - * 보상 트랜잭션으로 해당 원서를 삭제합니다. - * - * @property receiptCode 업데이트 실패한 접수번호 - * @property userId 접수번호 업데이트가 실패한 사용자의 고유 식별자 - * @property reason 업데이트 실패 사유 - */ -data class UserReceiptCodeUpdateFailedEvent( - val receiptCode: Long, - val userId: UUID, - val reason: String, -) diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/producer/UserEventProducer.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/producer/UserEventProducer.kt index 4e8ca40..1d41039 100644 --- a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/producer/UserEventProducer.kt +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/producer/UserEventProducer.kt @@ -1,7 +1,5 @@ package hs.kr.entrydsm.user.infrastructure.kafka.producer -import java.util.UUID - /** * 사용자 이벤트를 발행하는 Producer 인터페이스입니다. * @@ -13,23 +11,17 @@ interface UserEventProducer { * 접수번호 업데이트 완료 이벤트를 발행합니다. * * @param receiptCode 업데이트된 접수번호 - * @param userId 사용자 ID */ fun sendReceiptCodeUpdateCompleted( receiptCode: Long, - userId: UUID, ) /** * 접수번호 업데이트 실패 이벤트를 발행합니다. * * @param receiptCode 업데이트 실패한 접수번호 - * @param userId 사용자 ID - * @param reason 실패 사유 */ fun sendReceiptCodeUpdateFailed( receiptCode: Long, - userId: UUID, - reason: String, ) } diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/producer/UserEventProducerImpl.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/producer/UserEventProducerImpl.kt index fa8fd08..ba66205 100644 --- a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/producer/UserEventProducerImpl.kt +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/producer/UserEventProducerImpl.kt @@ -1,11 +1,8 @@ package hs.kr.entrydsm.user.infrastructure.kafka.producer import hs.kr.entrydsm.user.infrastructure.kafka.configuration.KafkaTopics -import hs.kr.entrydsm.user.infrastructure.kafka.consumer.dto.UserReceiptCodeUpdateCompletedEvent -import hs.kr.entrydsm.user.infrastructure.kafka.consumer.dto.UserReceiptCodeUpdateFailedEvent import org.springframework.kafka.core.KafkaTemplate import org.springframework.stereotype.Service -import java.util.UUID /** * 사용자 이벤트를 발행하는 Producer 구현체입니다. @@ -19,39 +16,12 @@ import java.util.UUID class UserEventProducerImpl( private val userEventKafkaTemplate: KafkaTemplate, ) : UserEventProducer { - /** - * 접수번호 업데이트 완료 이벤트를 발행합니다. - * - * 원서 서비스에서 요청한 접수번호 업데이트가 성공적으로 완료되었음을 - * 알리는 이벤트를 발행합니다. - * - * @param receiptCode 업데이트된 접수번호 - * @param userId 사용자 ID - */ - override fun sendReceiptCodeUpdateCompleted( - receiptCode: Long, - userId: UUID, - ) { - val event = UserReceiptCodeUpdateCompletedEvent(receiptCode, userId) - userEventKafkaTemplate.send(KafkaTopics.USER_RECEIPT_CODE_UPDATE_COMPLETED, event) + + override fun sendReceiptCodeUpdateCompleted(receiptCode: Long) { + userEventKafkaTemplate.send(KafkaTopics.USER_RECEIPT_CODE_UPDATE_COMPLETED, receiptCode) } - /** - * 접수번호 업데이트 실패 이벤트를 발행합니다. - * - * 원서 서비스에서 요청한 접수번호 업데이트가 실패했음을 알려 - * 원서 서비스에서 보상 트랜잭션을 수행하도록 합니다. - * - * @param receiptCode 업데이트 실패한 접수번호 - * @param userId 사용자 ID - * @param reason 실패 사유 - */ - override fun sendReceiptCodeUpdateFailed( - receiptCode: Long, - userId: UUID, - reason: String, - ) { - val event = UserReceiptCodeUpdateFailedEvent(receiptCode, userId, reason) - userEventKafkaTemplate.send(KafkaTopics.USER_RECEIPT_CODE_UPDATE_FAILED, event) + override fun sendReceiptCodeUpdateFailed(receiptCode: Long) { + userEventKafkaTemplate.send(KafkaTopics.USER_RECEIPT_CODE_UPDATE_FAILED, receiptCode) } }