package roomescape.common.util import io.github.oshai.kotlinlogging.KLogger import io.github.oshai.kotlinlogging.KotlinLogging import org.springframework.stereotype.Component import org.springframework.transaction.PlatformTransactionManager import org.springframework.transaction.TransactionDefinition import org.springframework.transaction.support.TransactionTemplate import roomescape.common.exception.CommonErrorCode import roomescape.common.exception.RoomescapeException private val log: KLogger = KotlinLogging.logger {} @Component class TransactionExecutionUtil( private val transactionManager: PlatformTransactionManager ) { fun withNewTransaction(isReadOnly: Boolean, action: () -> T): T { val transactionTemplate = TransactionTemplate(transactionManager).apply { this.isReadOnly = isReadOnly this.propagationBehavior = TransactionDefinition.PROPAGATION_REQUIRES_NEW } return transactionTemplate.execute { action() } ?: run { log.error { "[TransactionExecutionUtil.withNewTransaction] 트랜잭션 작업 중 예상치 못한 null 반환 " } throw RoomescapeException(CommonErrorCode.UNEXPECTED_SERVER_ERROR) } } }