Skip to content
Open
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
3 changes: 2 additions & 1 deletion api/domain/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ plugins {

allOpen {
annotation("javax.transaction.Transactional")
annotation("org.springframework.transaction.annotation.Transactional")
}

dependencies {
implementation(group = "org.jboss.spec.javax.transaction", name = "jboss-transaction-api_1.2_spec", version = "2.0.0.CR1")
implementation("org.springframework:spring-tx:5.3.27")
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import linkpool.link.folder.port.`in`.CreateFolderUseCase
import linkpool.link.folder.port.`in`.SaveFolderRequest
import linkpool.link.folder.port.out.FolderPort
import java.time.LocalDateTime
import javax.transaction.Transactional
import org.springframework.transaction.annotation.Transactional

@DomainComponent
@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import linkpool.common.DomainComponent
import linkpool.exception.NotAuthorizedForDataException
import linkpool.link.folder.port.`in`.DeleteFolderUseCase
import linkpool.link.folder.port.out.FolderPort
import javax.transaction.Transactional
import org.springframework.transaction.annotation.Transactional

@DomainComponent
@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import linkpool.exception.NotAuthorizedForDataException
import linkpool.link.folder.port.`in`.UpdateFolderRequest
import linkpool.link.folder.port.`in`.UpdateFolderUseCase
import linkpool.link.folder.port.out.FolderPort
import javax.transaction.Transactional
import org.springframework.transaction.annotation.Transactional

@DomainComponent
@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import linkpool.common.DomainComponent
import linkpool.link.folder.port.`in`.WithdrawalFolderUseCase
import linkpool.link.folder.port.out.FolderPort
import linkpool.user.user.model.UserSignedOutEvent
import javax.transaction.Transactional
import org.springframework.transaction.annotation.Transactional

@DomainComponent
@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import linkpool.link.folderlink.port.`in`.BulkCreateRequest
import linkpool.link.folderlink.port.`in`.CreateFolderLinkBulkUseCase
import linkpool.link.link.port.`in`.CreateLinkUseCase
import linkpool.link.link.port.`in`.SaveLinkRequest
import javax.transaction.Transactional
import org.springframework.transaction.annotation.Transactional

@DomainComponent
@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import linkpool.exception.NotAuthorizedForDataException
import linkpool.link.folder.port.`in`.DeleteFolderUseCase
import linkpool.link.folder.port.out.FolderPort
import linkpool.link.folderlink.port.`in`.DeleteFolderLinkUseCase
import javax.transaction.Transactional
import org.springframework.transaction.annotation.Transactional

@DomainComponent
@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import linkpool.link.link.port.`in`.CreateLinkUseCase
import linkpool.link.link.port.`in`.SaveLinkRequest
import linkpool.link.link.port.out.LinkPort
import java.time.LocalDateTime
import javax.transaction.Transactional
import org.springframework.transaction.annotation.Transactional

@DomainComponent
@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import linkpool.exception.DataNotFoundException
import linkpool.exception.NotAuthorizedForDataException
import linkpool.link.link.port.`in`.DeleteLinkUseCase
import linkpool.link.link.port.out.LinkPort
import javax.transaction.Transactional
import org.springframework.transaction.annotation.Transactional

@DomainComponent
@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import linkpool.common.DomainComponent
import linkpool.link.link.model.Link
import linkpool.link.link.port.`in`.GetLinksUseCase
import linkpool.link.link.port.out.LinkPort
import javax.transaction.Transactional
import org.springframework.transaction.annotation.Transactional

@DomainComponent
@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import linkpool.exception.NotAuthorizedForDataException
import linkpool.link.link.port.`in`.UpdateLinkRequest
import linkpool.link.link.port.`in`.UpdateLinkUseCase
import linkpool.link.link.port.out.LinkPort
import javax.transaction.Transactional
import org.springframework.transaction.annotation.Transactional

@DomainComponent
@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import linkpool.report.report.port.out.ReportPort
import linkpool.report.report.model.Report
import linkpool.report.report.model.ReportReason
import linkpool.report.report.model.ReportTarget
import javax.transaction.Transactional
import org.springframework.transaction.annotation.Transactional

@DomainComponent
@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import linkpool.report.report.model.Report
import linkpool.report.report.model.ReportTarget
import linkpool.report.report.port.`in`.GetReportUseCase
import linkpool.report.report.port.out.ReportPort
import javax.transaction.Transactional
import org.springframework.transaction.annotation.Transactional

@DomainComponent
@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import linkpool.exception.DataNotFoundException
import linkpool.user.jobgroup.model.JobGroup
import linkpool.user.jobgroup.port.`in`.JobGroupQuery
import linkpool.user.jobgroup.port.out.JobGroupPort
import javax.transaction.Transactional
import org.springframework.transaction.annotation.Transactional

@DomainComponent
@Transactional
Expand Down
3 changes: 2 additions & 1 deletion api/domain/src/main/kotlin/linkpool/user/user/model/User.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@ class User(
private var deleted: Boolean = false
) {

fun signOut() {
fun signOut(): UserSignedOutEvent {
profile = null
deleted = true
return UserSignedOutEvent(id)
}

fun activate() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import linkpool.user.user.port.`in`.CreateUserResponse
import linkpool.user.user.port.`in`.CreateUserUseCase
import linkpool.user.user.port.out.UserAuthPort
import linkpool.user.user.port.out.UserPort
import javax.transaction.Transactional
import org.springframework.transaction.annotation.Transactional

@DomainComponent
@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import linkpool.exception.NotSignedUpException
import linkpool.user.user.model.User
import linkpool.user.user.port.`in`.GetUserUseCase
import linkpool.user.user.port.out.UserPort
import javax.transaction.Transactional
import org.springframework.transaction.annotation.Transactional

@DomainComponent
@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,27 @@ import linkpool.user.user.port.`in`.GetUserUseCase
import linkpool.user.user.port.`in`.SignOutUseCase
import linkpool.user.user.port.out.UserPort
import linkpool.user.user.port.out.UserEventPublishPort
import linkpool.user.user.model.UserSignedOutEvent

import javax.transaction.Transactional
import org.springframework.transaction.annotation.Transactional
import org.springframework.transaction.reactive.TransactionalOperator
import org.springframework.transaction.reactive.executeAndAwait

@DomainComponent
@Transactional
class SignOutService(
private val getUserUseCase: GetUserUseCase,
private val userPort: UserPort,
private val userEventPublishPort: UserEventPublishPort
private val userEventPublishPort: UserEventPublishPort,
private val transactionalOperator: TransactionalOperator
): SignOutUseCase {

override suspend fun signOut(userId: Long) {
val user = getUserUseCase.getById(userId)
user.signOut()
userPort.patch(user)
userEventPublishPort.publishUserSignedOutEvent(UserSignedOutEvent(user.id))
transactionalOperator.executeAndAwait {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

'reactive transcation'을 제어하기위한 오퍼레이터 입니다.
콜백접근 방식과 코루틴 연산자를 제공하여 해당 연산자를 채택하였습니다.

'ReactiveTransactionManager'는 반드시 Mono, Flux 등의 reactor 연산자를 제공해야 합니다.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UserSignedOutEvent 생성 하는 영역을 User 애그리거트 안쪽으로 옮겨서 User 애그리거트에게 이벤트 생성 책임을 지우면 어떨까요?
참고: https://www.baeldung.com/spring-data-ddd

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좋은의견 감사합니다!
회원탈퇴에 의해 발생된 '이벤트 발행 객체'가 오로지 User 애그리거트에게 책임을 지울수있는 형태이니 의견주신 디자인을 적용해도 괜찮은 것 같습니다.

val user = getUserUseCase.getById(userId)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Hee-jin506 님, 의견주신대로 코드 수정하여 반영했습니다.
JPA가 아니다보니, 서비스레이어에 코드가 한줄 늘어버렸네요 ㅜㅜ

val event = user.signOut()
userPort.patch(user)
event
}?.let {
userEventPublishPort.publishUserSignedOutEvent(it)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import linkpool.user.user.port.`in`.GetUserUseCase
import linkpool.user.user.port.`in`.UpdateUserUseCase
import linkpool.user.user.port.`in`.ProfileRequest
import linkpool.user.user.port.out.UserPort
import javax.transaction.Transactional
import org.springframework.transaction.annotation.Transactional

@DomainComponent
@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,7 @@ class UserSignedOutEventListener(

@ServiceActivator(inputChannel = "signedOutEvent")
fun handleForSignedOutEventListener(@Payload message: Message<UserSignedOutEvent>) {
CoroutineScope(CoroutineExceptionHandler { _, exception ->
log.error("$exception in the handleForSignedOutEventListener")
} + Dispatchers.IO).launch {
CoroutineScope(Dispatchers.IO).launch {
val folderEventDeferred = safeAsync {
folderEventListener.deleteBatchAll(message.payload)
}
Expand All @@ -40,10 +38,11 @@ class UserSignedOutEventListener(

folderEventDeferred.await()
.onSuccess { log.info("succeed in folderEventListener from UserSignedOut... userId: ${message.payload.userId}") }
.onFailure { e -> log.info("Error in folderEventListener from UserSignedOut... userId: ${message.payload.userId} \n error: ${e.message}") }
.onFailure { e -> log.error("Error in folderEventListener from UserSignedOut... userId: ${message.payload.userId} \n error: ${e.message}") }
linkEventDeferred.await()
.onSuccess { log.info("succeed in linkEventListener from UserSignedOut... userId: ${message.payload.userId}") }
.onFailure { e -> log.info("Error in linkEventListener from UserSignedOut... userId: ${message.payload.userId} \n error: ${e.message}") }
.onFailure { e -> log.error("Error in linkEventListener from UserSignedOut... userId: ${message.payload.userId} \n error: ${e.message}") }

}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,14 @@ package linkpool.event

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import org.springframework.beans.factory.annotation.Qualifier
import kotlinx.coroutines.launch
import linkpool.user.user.model.UserSignedOutEvent
import linkpool.user.user.port.out.UserEventPublishPort
import org.springframework.beans.factory.annotation.Qualifier
import org.springframework.integration.config.EnablePublisher
import org.springframework.messaging.MessageChannel
import org.springframework.messaging.support.MessageBuilder
import org.springframework.stereotype.Component
import org.springframework.transaction.event.TransactionPhase
import org.springframework.transaction.event.TransactionalEventListener


@Component
Expand All @@ -20,9 +19,8 @@ class UserSignedOutEventPublisher(
private val outputChannel: MessageChannel
) : UserEventPublishPort {

@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
override fun publishUserSignedOutEvent(userSignedOutEvent: UserSignedOutEvent) {
CoroutineScope(Dispatchers.IO).run {
CoroutineScope(Dispatchers.IO).launch {
val message = MessageBuilder.withPayload(userSignedOutEvent).build()
outputChannel.send(message)
}
Expand Down
1 change: 1 addition & 0 deletions api/infra/src/main/resources/application-local.properties
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@ application.url=http://localhost:80

#logging.level.io.r2dbc=DEBUG
#logging.level.org.springframework.data.r2dbc=DEBUG
#logging.level.org.springframework.transaction=TRACE

logging.level.org.springframework.r2dbc.core=debug