Skip to content
This repository was archived by the owner on Jul 7, 2025. It is now read-only.

Commit f0da549

Browse files
authored
Merge pull request #101 from ASAP-Lettering/ASAP-238
ASAP-238 refactor: 스페이스 이벤트를 도메인 안에 저장한 다음 영속화할 때 배포하도록 수정
2 parents 5ef5399 + 4301d8f commit f0da549

File tree

11 files changed

+140
-97
lines changed

11 files changed

+140
-97
lines changed

Application-Module/src/main/kotlin/com/asap/application/space/event/SpaceDeletedEvent.kt

Lines changed: 0 additions & 6 deletions
This file was deleted.

Application-Module/src/main/kotlin/com/asap/application/space/port/out/SpaceManagementPort.kt

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ interface SpaceManagementPort {
2020

2121
fun getAllIndexedSpace(userId: DomainId): List<IndexedSpace>
2222

23+
fun getAllSpaceBy(
24+
userId: DomainId,
25+
spaceIds: List<DomainId>,
26+
): List<Space>
27+
28+
fun getAllSpaceBy(userId: DomainId): List<Space>
29+
2330
fun save(space: Space): Space
2431

2532
fun update(space: Space): Space
@@ -31,17 +38,7 @@ interface SpaceManagementPort {
3138
orders: List<IndexedSpace>,
3239
)
3340

34-
fun deleteById(
35-
userId: DomainId,
36-
spaceId: DomainId,
37-
)
38-
39-
fun deleteAllBySpaceIds(
40-
userId: DomainId,
41-
spaceIds: List<DomainId>,
42-
)
43-
44-
fun deleteAllByUserId(userId: DomainId)
41+
fun deleteBy(space: Space)
4542

4643
fun countByUserId(userId: DomainId): Long
4744
}

Application-Module/src/main/kotlin/com/asap/application/space/service/SpaceCommandService.kt

Lines changed: 22 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.asap.application.space.service
22

3-
import com.asap.application.space.event.SpaceDeletedEvent
43
import com.asap.application.space.exception.SpaceException
54
import com.asap.application.space.port.`in`.CreateSpaceUsecase
65
import com.asap.application.space.port.`in`.DeleteSpaceUsecase
@@ -11,15 +10,13 @@ import com.asap.common.exception.DefaultException
1110
import com.asap.domain.common.DomainId
1211
import com.asap.domain.space.entity.Space
1312
import com.asap.domain.space.service.SpaceIndexValidator
14-
import org.springframework.context.ApplicationEventPublisher
1513
import org.springframework.stereotype.Service
1614
import org.springframework.transaction.annotation.Transactional
1715

1816
@Service
1917
@Transactional
2018
class SpaceCommandService(
2119
private val spaceManagementPort: SpaceManagementPort,
22-
private val applicationEventPublisher: ApplicationEventPublisher,
2320
) : CreateSpaceUsecase,
2421
UpdateSpaceNameUsecase,
2522
DeleteSpaceUsecase,
@@ -44,42 +41,39 @@ class SpaceCommandService(
4441
userId = DomainId(command.userId),
4542
spaceId = DomainId(command.spaceId),
4643
)
47-
val updatedSpace = space.updateName(command.name)
48-
spaceManagementPort.update(updatedSpace)
44+
space.updateName(command.name)
45+
spaceManagementPort.update(space)
4946
}
5047

5148
override fun deleteOne(command: DeleteSpaceUsecase.DeleteOneCommand) {
52-
spaceManagementPort.deleteById(
53-
userId = DomainId(command.userId),
54-
spaceId = DomainId(command.spaceId),
55-
)
56-
applicationEventPublisher.publishEvent(
57-
SpaceDeletedEvent(
58-
userId = command.userId,
59-
spaceId = command.spaceId,
60-
),
61-
)
49+
spaceManagementPort
50+
.getSpaceNotNull(
51+
userId = DomainId(command.userId),
52+
spaceId = DomainId(command.spaceId),
53+
).apply {
54+
delete()
55+
spaceManagementPort.deleteBy(this)
56+
}
6257
reIndexingSpaceOrder(DomainId(command.userId))
6358
}
6459

6560
override fun deleteAllBy(command: DeleteSpaceUsecase.DeleteAllCommand) {
66-
spaceManagementPort.deleteAllBySpaceIds(
67-
userId = DomainId(command.userId),
68-
spaceIds = command.spaceIds.map { DomainId(it) },
69-
)
70-
command.spaceIds.forEach {
71-
applicationEventPublisher.publishEvent(
72-
SpaceDeletedEvent(
73-
userId = command.userId,
74-
spaceId = it,
75-
),
76-
)
77-
}
61+
spaceManagementPort
62+
.getAllSpaceBy(
63+
userId = DomainId(command.userId),
64+
spaceIds = command.spaceIds.map { DomainId(it) },
65+
).forEach {
66+
it.delete()
67+
spaceManagementPort.deleteBy(it)
68+
}
7869
reIndexingSpaceOrder(DomainId(command.userId))
7970
}
8071

8172
override fun deleteAllBy(command: DeleteSpaceUsecase.DeleteAllUser) {
82-
spaceManagementPort.deleteAllByUserId(DomainId(command.userId))
73+
spaceManagementPort.getAllSpaceBy(DomainId(command.userId)).forEach {
74+
it.delete()
75+
spaceManagementPort.deleteBy(it)
76+
}
8377
}
8478

8579
override fun update(command: UpdateSpaceIndexUsecase.Command) {

Application-Module/src/test/kotlin/com/asap/application/space/service/SpaceCommandServiceTest.kt

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,15 @@ import io.kotest.core.spec.style.BehaviorSpec
1414
import io.mockk.every
1515
import io.mockk.mockk
1616
import io.mockk.verify
17-
import org.springframework.context.ApplicationEventPublisher
1817

1918
class SpaceCommandServiceTest :
2019
BehaviorSpec({
2120

2221
val spaceManagementPort = mockk<SpaceManagementPort>(relaxed = true)
23-
val applicationEventPublisher = mockk<ApplicationEventPublisher>(relaxed = true)
2422

2523
val spaceCommandService =
2624
SpaceCommandService(
2725
spaceManagementPort,
28-
applicationEventPublisher,
2926
)
3027

3128
given("스페이스 생성 요청이 들어왔을 때") {
@@ -75,7 +72,7 @@ class SpaceCommandServiceTest :
7572
)
7673
}
7774
verify {
78-
spaceManagementPort.update(mockSpace.updateName(spaceUpdateNameCommand.name))
75+
spaceManagementPort.update(mockSpace)
7976
}
8077
}
8178
}
@@ -91,9 +88,8 @@ class SpaceCommandServiceTest :
9188
spaceCommandService.deleteOne(spaceDeleteOneCommand)
9289
then("스페이스를 삭제한다") {
9390
verify {
94-
spaceManagementPort.deleteById(
95-
userId = DomainId(spaceDeleteOneCommand.userId),
96-
spaceId = DomainId(spaceDeleteOneCommand.spaceId),
91+
spaceManagementPort.deleteBy(
92+
any(Space::class),
9793
)
9894
}
9995
}
@@ -108,9 +104,8 @@ class SpaceCommandServiceTest :
108104
spaceCommandService.deleteAllBy(spaceDeleteAllCommand)
109105
then("여러 스페이스를 삭제한다") {
110106
verify {
111-
spaceManagementPort.deleteAllBySpaceIds(
112-
userId = DomainId(spaceDeleteAllCommand.userId),
113-
spaceIds = spaceDeleteAllCommand.spaceIds.map { DomainId(it) },
107+
spaceManagementPort.deleteBy(
108+
any(Space::class),
114109
)
115110
}
116111
}

Bootstrap-Module/src/main/kotlin/com/asap/bootstrap/letter/handler/SpaceLetterEventHandler.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.asap.bootstrap.letter.handler
22

33
import com.asap.application.letter.port.`in`.RemoveLetterUsecase
4-
import com.asap.application.space.event.SpaceDeletedEvent
4+
import com.asap.domain.space.event.SpaceEvent
55
import org.springframework.context.event.EventListener
66
import org.springframework.web.bind.annotation.RestController
77

@@ -10,12 +10,12 @@ class SpaceLetterEventHandler(
1010
private val removeLetterUsecase: RemoveLetterUsecase,
1111
) {
1212
@EventListener
13-
fun deleteBySpace(event: SpaceDeletedEvent) {
13+
fun deleteBySpace(event: SpaceEvent.SpaceDeletedEvent) {
1414
removeLetterUsecase.removeSpaceLetterBy(
1515
command =
1616
RemoveLetterUsecase.Command.SpaceId(
17-
userId = event.userId,
18-
spaceId = event.spaceId,
17+
userId = event.space.userId.value,
18+
spaceId = event.space.id.value,
1919
),
2020
)
2121
}

Bootstrap-Module/src/test/kotlin/com/asap/bootstrap/integration/space/SpaceApiIntegrationTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,10 +270,10 @@ class SpaceApiIntegrationTest : IntegrationSupporter() {
270270
// given
271271
val userId = userMockManager.settingUser()
272272
val accessToken = jwtMockManager.generateAccessToken(userId)
273-
val spaceId = spaceMockManager.settingSpace(userId)
273+
val space = spaceMockManager.settingSpace(userId)
274274
// when
275275
val response =
276-
mockMvc.delete("/api/v1/spaces/$spaceId") {
276+
mockMvc.delete("/api/v1/spaces/${space.id.value}") {
277277
header("Authorization", "Bearer $accessToken")
278278
}
279279
// then

Domain-Module/src/main/kotlin/com/asap/domain/space/entity/IndexedSpace.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
package com.asap.domain.space.entity
22

3+
import com.asap.domain.common.Aggregate
34
import com.asap.domain.common.DomainId
45

5-
data class IndexedSpace(
6-
val id: DomainId,
6+
class IndexedSpace(
7+
id: DomainId,
78
val userId: DomainId,
89
val name: String,
910
var index: Int,
1011
val templateType: Int,
11-
) {
12+
) : Aggregate<IndexedSpace>(id) {
1213
fun isMain(): Boolean = index == 0
1314

14-
fun updateIndex(index: Int) {
15+
fun updateIndex(index: Int) {
1516
check(index >= 0) { "Index must be greater than or equal to 0" }
1617
this.index = index
1718
}
Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,37 @@
11
package com.asap.domain.space.entity
22

3+
import com.asap.domain.common.Aggregate
34
import com.asap.domain.common.DomainId
5+
import com.asap.domain.space.event.SpaceEvent
46

5-
data class Space(
6-
val id: DomainId = DomainId.generate(),
7+
class Space(
8+
id: DomainId,
79
val userId: DomainId,
8-
val name: String,
10+
var name: String,
911
val templateType: Int,
10-
) {
12+
) : Aggregate<Space>(id) {
1113
companion object {
1214
fun create(
15+
id: DomainId = DomainId.generate(),
1316
userId: DomainId,
1417
name: String,
1518
templateType: Int,
1619
): Space =
1720
Space(
21+
id = id,
1822
userId = userId,
1923
name = name,
2024
templateType = templateType,
21-
)
25+
).also {
26+
it.registerEvent(SpaceEvent.SpaceCreatedEvent(it))
27+
}
2228
}
2329

24-
fun updateName(name: String): Space = this.copy(name = name)
30+
fun updateName(name: String) {
31+
this.name = name
32+
}
33+
34+
fun delete() {
35+
this.registerEvent(SpaceEvent.SpaceDeletedEvent(this))
36+
}
2537
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.asap.domain.space.event
2+
3+
import com.asap.domain.common.DomainEvent
4+
import com.asap.domain.space.entity.Space
5+
6+
sealed class SpaceEvent : DomainEvent<Space> {
7+
data class SpaceCreatedEvent(
8+
val space: Space,
9+
) : SpaceEvent()
10+
11+
data class SpaceDeletedEvent(
12+
val space: Space,
13+
) : SpaceEvent()
14+
}

0 commit comments

Comments
 (0)