From a36e0bbaaae005f6bcd670919fcc92e051ac1533 Mon Sep 17 00:00:00 2001 From: coehgns Date: Sun, 18 Jan 2026 22:41:08 +0900 Subject: [PATCH 1/9] refactor ( #38 ): KafkaTopics --- .../user/infrastructure/kafka/configuration/KafkaTopics.kt | 2 ++ 1 file changed, 2 insertions(+) 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" } From 5481726c696a6b94625c13448abcf0bac61eaa26 Mon Sep 17 00:00:00 2001 From: coehgns Date: Sun, 18 Jan 2026 22:41:28 +0900 Subject: [PATCH 2/9] refactor ( #38 ): CancelApplicationConsumer --- .../infrastructure/kafka/consumer/CancelApplicationConsumer.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) { From 53874056fc2ef4859bc919decf59d944253c32e8 Mon Sep 17 00:00:00 2001 From: coehgns Date: Sun, 18 Jan 2026 22:41:37 +0900 Subject: [PATCH 3/9] refactor ( #38 ): ChangeReceiptCodeService --- .../application/service/ChangeReceiptCodeService.kt | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) 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) From 45559e3d0e2bfefdc93f52fba717a9fafd407340 Mon Sep 17 00:00:00 2001 From: coehgns Date: Sun, 18 Jan 2026 22:41:59 +0900 Subject: [PATCH 4/9] refactor ( #38 ): UserEventProducer --- .../user/infrastructure/kafka/producer/UserEventProducer.kt | 6 ------ 1 file changed, 6 deletions(-) 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..0a20bf5 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 @@ -13,23 +13,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, ) } From 27e38bf7ad3cacea01a061c51c3185923e7edbd2 Mon Sep 17 00:00:00 2001 From: coehgns Date: Sun, 18 Jan 2026 22:42:03 +0900 Subject: [PATCH 5/9] refactor ( #38 ): UserEventProducermpl --- .../kafka/producer/UserEventProducerImpl.kt | 32 +++---------------- 1 file changed, 5 insertions(+), 27 deletions(-) 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..7343a43 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 @@ -19,39 +19,17 @@ 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) + 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, + receiptCode: Long ) { - val event = UserReceiptCodeUpdateFailedEvent(receiptCode, userId, reason) - userEventKafkaTemplate.send(KafkaTopics.USER_RECEIPT_CODE_UPDATE_FAILED, event) + userEventKafkaTemplate.send(KafkaTopics.USER_RECEIPT_CODE_UPDATE_FAILED, receiptCode) } } From 03b22d46188983a8e9a18045b964ac6be02af9d2 Mon Sep 17 00:00:00 2001 From: coehgns Date: Sun, 18 Jan 2026 22:44:03 +0900 Subject: [PATCH 6/9] =?UTF-8?q?chore=20(=20#38=20):=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EB=A1=9C=EC=A7=81=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserReceiptCodeUpdateCompletedEvent.kt | 17 ---------------- .../dto/UserReceiptCodeUpdateFailedEvent.kt | 20 ------------------- 2 files changed, 37 deletions(-) delete mode 100644 casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/consumer/dto/UserReceiptCodeUpdateCompletedEvent.kt delete mode 100644 casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/consumer/dto/UserReceiptCodeUpdateFailedEvent.kt 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, -) From 0258606e6aa4fb110e612b8fb16d7ffb5aa0b650 Mon Sep 17 00:00:00 2001 From: coehgns Date: Sun, 18 Jan 2026 22:44:16 +0900 Subject: [PATCH 7/9] refactor ( #38 ): UserEventProducer --- .../user/infrastructure/kafka/producer/UserEventProducer.kt | 2 -- 1 file changed, 2 deletions(-) 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 0a20bf5..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 인터페이스입니다. * From da93b906e8cd03298099c3954dc59f7a41f641bc Mon Sep 17 00:00:00 2001 From: coehgns Date: Sun, 18 Jan 2026 22:44:20 +0900 Subject: [PATCH 8/9] refactor ( #38 ): UserEventProducerImpl --- .../kafka/producer/UserEventProducerImpl.kt | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) 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 7343a43..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 구현체입니다. @@ -20,16 +17,11 @@ class UserEventProducerImpl( private val userEventKafkaTemplate: KafkaTemplate, ) : UserEventProducer { - override fun sendReceiptCodeUpdateCompleted( - receiptCode: Long, - ) { + override fun sendReceiptCodeUpdateCompleted(receiptCode: Long) { userEventKafkaTemplate.send(KafkaTopics.USER_RECEIPT_CODE_UPDATE_COMPLETED, receiptCode) } - - override fun sendReceiptCodeUpdateFailed( - receiptCode: Long - ) { + override fun sendReceiptCodeUpdateFailed(receiptCode: Long) { userEventKafkaTemplate.send(KafkaTopics.USER_RECEIPT_CODE_UPDATE_FAILED, receiptCode) } } From a22ae132760c4e7b660e5173a9dcc91f57008e3b Mon Sep 17 00:00:00 2001 From: coehgns Date: Sun, 18 Jan 2026 22:44:46 +0900 Subject: [PATCH 9/9] refactor ( #38 ): CreateStatusConsumer --- .../kafka/consumer/CreateStatusConsumer.kt | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 casper-user/src/main/kotlin/hs/kr/entrydsm/user/infrastructure/kafka/consumer/CreateStatusConsumer.kt 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