Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -43,22 +43,18 @@ class ChangeReceiptCodeService(
if (user == null) {
userEventProducer.sendReceiptCodeUpdateFailed(
receiptCode = receiptCode,
userId = userId,
reason = "User not found",
)
throw UserNotFoundException
}

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 // 예외 다시 던져서 롤백 발생
Expand All @@ -69,19 +65,17 @@ class ChangeReceiptCodeService(
* 트랜잭션 커밋 후 접수코드 업데이트 완료 이벤트를 발행합니다.
*
* @param receiptCode 접수코드
* @param userId 사용자 ID
*/
private fun registerAfterCommitCallback(
receiptCode: Long,
userId: UUID,
) {
/**
* 트랜잭션 완료 후 콜백을 처리하는 객체입니다.
*/
val callback =
object : TransactionSynchronization {
override fun afterCommit() {
userEventProducer.sendReceiptCodeUpdateCompleted(receiptCode, userId)
userEventProducer.sendReceiptCodeUpdateCompleted(receiptCode)
}
}
TransactionSynchronizationManager.registerSynchronization(callback)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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)
}
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package hs.kr.entrydsm.user.infrastructure.kafka.producer

import java.util.UUID

/**
* 사용자 이벤트를 발행하는 Producer 인터페이스입니다.
*
Expand All @@ -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,
)
}
Original file line number Diff line number Diff line change
@@ -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 구현체입니다.
Expand All @@ -19,39 +16,12 @@ import java.util.UUID
class UserEventProducerImpl(
private val userEventKafkaTemplate: KafkaTemplate<String, Any>,
) : 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)
}
}
Loading