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 @@ -5,8 +5,11 @@ import hs.kr.entrydsm.status.domain.status.application.port.out.QueryStatusPort
import hs.kr.entrydsm.status.domain.status.application.port.out.SaveStatusPort
import hs.kr.entrydsm.status.domain.status.model.ApplicationStatus
import hs.kr.entrydsm.status.domain.status.model.Status
import hs.kr.entrydsm.status.infrastructure.kafka.producer.StatusEventProducer
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import org.springframework.transaction.support.TransactionSynchronization
import org.springframework.transaction.support.TransactionSynchronizationManager

/**
* 상태 생성 서비스 클래스입니다.
Expand All @@ -19,6 +22,7 @@ import org.springframework.transaction.annotation.Transactional
class CreateStatusService(
private val queryStatusPort: QueryStatusPort,
private val saveStatusPort: SaveStatusPort,
private val statusEventProducer: StatusEventProducer
) : CreateStatusUseCase {
/**
* 새로운 지원자의 초기 상태를 생성합니다.
Expand All @@ -28,16 +32,35 @@ class CreateStatusService(
*/
@Transactional
override fun execute(receiptCode: Long) {
queryStatusPort.findByReceiptCode(receiptCode)
?: saveStatusPort.save(
Status(
id = null,
applicationStatus = ApplicationStatus.SUBMITTED,
examCode = null,
isFirstRoundPass = false,
isSecondRoundPass = false,
receiptCode = receiptCode,
),
)
try {
queryStatusPort.findByReceiptCode(receiptCode)
?: saveStatusPort.save(
Status(
id = null,
applicationStatus = ApplicationStatus.SUBMITTED,
examCode = null,
isFirstRoundPass = false,
isSecondRoundPass = false,
receiptCode = receiptCode,
),
)

registerAfterCommitCallback(receiptCode)
} catch (e: Exception) {
statusEventProducer.sendStatusCreatedFailed(receiptCode)
throw e
}
}

private fun registerAfterCommitCallback(
receiptCode: Long,
) {
val callback =
object : TransactionSynchronization {
override fun afterCommit() {
statusEventProducer.sendStatusCreatedCompleted(receiptCode)
}
}
TransactionSynchronizationManager.registerSynchronization(callback)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,10 @@ object KafkaTopics {
const val DELETE_USER = "delete-user"

const val CANCEL_SUBMITTED_APPLICATION = "cancel-submitted-application"

const val APPLICATION_STATUS_CREATE_COMPLETED = "application-status-create-completed"

const val APPLICATION_STATUS_CREATE_FAILED = "application-status-create-failed"

const val USER_RECEIPT_CODE_UPDATE_FAILED = "user-receipt-code-update-failed"
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,8 @@ class StatusConsumer(
createStatusUseCase.execute(createApplicationEvent.receiptCode)
}

/**
* 탈퇴한 유저의 원서 상태를 삭제합니다.
*
* @param message 탈퇴한 유저의 접수 번호
*/
@KafkaListener(
topics = [KafkaTopics.DELETE_USER, KafkaTopics.CANCEL_SUBMITTED_APPLICATION],
topics = [KafkaTopics.DELETE_USER, KafkaTopics.CANCEL_SUBMITTED_APPLICATION, KafkaTopics.USER_RECEIPT_CODE_UPDATE_FAILED],
groupId = "delete-status",
containerFactory = "kafkaListenerContainerFactory",
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package hs.kr.entrydsm.status.infrastructure.kafka.producer

interface StatusEventProducer {
fun sendStatusCreatedCompleted(receiptCode: Long)
fun sendStatusCreatedFailed(receiptCode: Long)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package hs.kr.entrydsm.status.infrastructure.kafka.producer

import hs.kr.entrydsm.status.infrastructure.kafka.config.KafkaTopics
import org.springframework.kafka.core.KafkaTemplate
import org.springframework.stereotype.Component

@Component
class StatusEventProducerImpl(
private val sendStatusCreatedCompletedTemplate: KafkaTemplate<String, Any>,
private val sendStatusCreatedFailedTemplate: KafkaTemplate<String, Any>
) : StatusEventProducer {

override fun sendStatusCreatedCompleted(receiptCode: Long) {
sendStatusCreatedCompletedTemplate.send(
KafkaTopics.APPLICATION_STATUS_CREATE_COMPLETED,
receiptCode
)
}

override fun sendStatusCreatedFailed(receiptCode: Long) {
sendStatusCreatedFailedTemplate.send(
KafkaTopics.APPLICATION_STATUS_CREATE_FAILED,
receiptCode
)
}
}
Loading