From 75f23239f547ffcc09b04a127b89f091684150db Mon Sep 17 00:00:00 2001
From: sunwoong <sunwoong1122@gmail.com>
Date: Mon, 21 Oct 2024 14:22:35 +0900
Subject: [PATCH 1/5] =?UTF-8?q?DRAW-404=20refactor:=20=EB=A7=88=ED=94=BC?=
 =?UTF-8?q?=EC=95=84=20=EA=B2=8C=EC=9E=84=20=EA=B2=B0=EA=B3=BC=20=EC=A0=95?=
 =?UTF-8?q?=EA=B7=9C=ED=99=94=20=EC=9E=91=EC=97=85?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../kotlin/com/xorker/draw/mafia/DrawData.kt  |  7 +++
 .../draw/mafia/MafiaGameResultJpaEntity.kt    | 36 ++++++++++-
 .../com/xorker/draw/player/PlayerJpaEntity.kt | 61 +++++++++++++++++++
 .../xorker/draw/player/PlayerJpaRepository.kt |  5 ++
 ..._normalization_mafia_game_result_table.sql | 22 +++++++
 .../com/xorker/draw/player/ResultType.kt      |  9 +++
 .../kotlin/com/xorker/draw/player/RoleType.kt |  7 +++
 7 files changed, 145 insertions(+), 2 deletions(-)
 create mode 100644 adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/DrawData.kt
 create mode 100644 adapter/rdb/src/main/kotlin/com/xorker/draw/player/PlayerJpaEntity.kt
 create mode 100644 adapter/rdb/src/main/kotlin/com/xorker/draw/player/PlayerJpaRepository.kt
 create mode 100644 adapter/rdb/src/main/resources/db/migration/V6__normalization_mafia_game_result_table.sql
 create mode 100644 domain/src/main/kotlin/com/xorker/draw/player/ResultType.kt
 create mode 100644 domain/src/main/kotlin/com/xorker/draw/player/RoleType.kt

diff --git a/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/DrawData.kt b/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/DrawData.kt
new file mode 100644
index 00000000..efba3fc2
--- /dev/null
+++ b/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/DrawData.kt
@@ -0,0 +1,7 @@
+package com.xorker.draw.mafia
+
+import com.xorker.draw.user.UserId
+
+data class DrawData(
+    val draw: MutableList<Pair<UserId, Map<String, Any>>>,
+)
diff --git a/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/MafiaGameResultJpaEntity.kt b/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/MafiaGameResultJpaEntity.kt
index 6564d297..8656f181 100644
--- a/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/MafiaGameResultJpaEntity.kt
+++ b/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/MafiaGameResultJpaEntity.kt
@@ -1,12 +1,17 @@
 package com.xorker.draw.mafia
 
 import com.xorker.draw.BaseJpaEntity
+import com.xorker.draw.player.PlayerJpaEntity
 import jakarta.persistence.Column
 import jakarta.persistence.Entity
+import jakarta.persistence.FetchType
 import jakarta.persistence.GeneratedValue
 import jakarta.persistence.GenerationType
 import jakarta.persistence.Id
+import jakarta.persistence.OneToMany
 import jakarta.persistence.Table
+import org.hibernate.annotations.Cascade
+import org.hibernate.annotations.CascadeType
 
 @Entity
 @Table(name = "mafia_game_result")
@@ -20,13 +25,40 @@ internal class MafiaGameResultJpaEntity : BaseJpaEntity() {
     lateinit var gameResult: String
         protected set
 
+    @Column(name = "language", columnDefinition = "varchar(20)")
+    lateinit var language: String
+        protected set
+
+    @Column(name = "draw", columnDefinition = "TEXT")
+    lateinit var draw: String
+        protected set
+
+    @Column(name = "mafia_answer", columnDefinition = "varchar(50)")
+    var mafiaAnswer: String? = null
+        protected set
+
     @Column(name = "word_id", columnDefinition = "bigint")
     var wordId: Long = 0
+        protected set
+
+    @OneToMany(mappedBy = "mafiaGameResult", fetch = FetchType.LAZY)
+    @Cascade(CascadeType.PERSIST)
+    val players: MutableList<PlayerJpaEntity> = mutableListOf()
+
+    fun removePlayer(player: PlayerJpaEntity) {
+        players.remove(player)
+    }
+
+    fun addPlayer(player: PlayerJpaEntity) {
+        players.add(player)
+    }
 
     companion object {
-        internal fun of(gameResult: String, wordId: Long): MafiaGameResultJpaEntity {
+        internal fun of(locale: String, draw: String, mafiaAnswer: String?, wordId: Long): MafiaGameResultJpaEntity {
             return MafiaGameResultJpaEntity().apply {
-                this.gameResult = gameResult
+                this.language = locale
+                this.draw = draw
+                this.mafiaAnswer = mafiaAnswer
                 this.wordId = wordId
             }
         }
diff --git a/adapter/rdb/src/main/kotlin/com/xorker/draw/player/PlayerJpaEntity.kt b/adapter/rdb/src/main/kotlin/com/xorker/draw/player/PlayerJpaEntity.kt
new file mode 100644
index 00000000..1d46795f
--- /dev/null
+++ b/adapter/rdb/src/main/kotlin/com/xorker/draw/player/PlayerJpaEntity.kt
@@ -0,0 +1,61 @@
+package com.xorker.draw.player
+
+import com.xorker.draw.BaseJpaEntity
+import com.xorker.draw.mafia.MafiaGameResultJpaEntity
+import com.xorker.draw.user.UserJpaEntity
+import jakarta.persistence.Column
+import jakarta.persistence.Entity
+import jakarta.persistence.EnumType
+import jakarta.persistence.Enumerated
+import jakarta.persistence.FetchType
+import jakarta.persistence.GeneratedValue
+import jakarta.persistence.GenerationType
+import jakarta.persistence.Id
+import jakarta.persistence.JoinColumn
+import jakarta.persistence.ManyToOne
+import jakarta.persistence.Table
+
+@Entity
+@Table(name = "player")
+internal class PlayerJpaEntity : BaseJpaEntity() {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "player_id", nullable = false)
+    var id: Long = 0
+        protected set
+
+    @Enumerated(EnumType.STRING)
+    @Column(name = "result", columnDefinition = "varchar(20)")
+    lateinit var result: ResultType
+        protected set
+
+    @Enumerated(EnumType.STRING)
+    @Column(name = "role", columnDefinition = "varchar(20)")
+    lateinit var role: RoleType
+        protected set
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "user_id")
+    lateinit var user: UserJpaEntity
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "mafia_game_result_id")
+    lateinit var mafiaGameResult: MafiaGameResultJpaEntity
+
+    fun addMafiaGameResult(gameResult: MafiaGameResultJpaEntity) {
+        mafiaGameResult = gameResult
+        gameResult.addPlayer(this)
+    }
+
+    companion object {
+        fun of(result: ResultType, role: RoleType, user: UserJpaEntity, gameResult: MafiaGameResultJpaEntity): PlayerJpaEntity {
+            val player = PlayerJpaEntity().apply {
+                this.result = result
+                this.role = role
+                this.user = user
+            }
+            player.addMafiaGameResult(gameResult)
+            return player
+        }
+    }
+}
diff --git a/adapter/rdb/src/main/kotlin/com/xorker/draw/player/PlayerJpaRepository.kt b/adapter/rdb/src/main/kotlin/com/xorker/draw/player/PlayerJpaRepository.kt
new file mode 100644
index 00000000..e5004d8c
--- /dev/null
+++ b/adapter/rdb/src/main/kotlin/com/xorker/draw/player/PlayerJpaRepository.kt
@@ -0,0 +1,5 @@
+package com.xorker.draw.player
+
+import org.springframework.data.jpa.repository.JpaRepository
+
+internal interface PlayerJpaRepository : JpaRepository<PlayerJpaEntity, Long>
diff --git a/adapter/rdb/src/main/resources/db/migration/V6__normalization_mafia_game_result_table.sql b/adapter/rdb/src/main/resources/db/migration/V6__normalization_mafia_game_result_table.sql
new file mode 100644
index 00000000..41dca4da
--- /dev/null
+++ b/adapter/rdb/src/main/resources/db/migration/V6__normalization_mafia_game_result_table.sql
@@ -0,0 +1,22 @@
+alter table mafia_game_result
+    modify column game_result text NULL;
+alter table mafia_game_result
+    add column language varchar(20) NOT NULL;
+alter table mafia_game_result
+    add column draw text NOT NULL;
+alter table mafia_game_result
+    add column mafia_answer varchar(50) NULL;
+
+create table player
+(
+    player_id            bigint      NOT NULL AUTO_INCREMENT COMMENT 'PK',
+    result               varchar(20) NOT NULL COMMENT '게임 승리 여부',
+    role                 varchar(20) NOT NULL COMMENT '플레이어 역할',
+    created_at           datetime    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    updated_at           datetime    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    user_id              bigint      NOT NULL COMMENT 'FK - Users',
+    mafia_game_result_id bigint      NOT NULL COMMENT 'FK - MafiaGameResult',
+    PRIMARY KEY PK_player (player_id),
+    KEY IDX_createdat (created_at),
+    KEY IDX_updatedat (updated_at)
+) COMMENT '플레이어 정보';
diff --git a/domain/src/main/kotlin/com/xorker/draw/player/ResultType.kt b/domain/src/main/kotlin/com/xorker/draw/player/ResultType.kt
new file mode 100644
index 00000000..a80dcebd
--- /dev/null
+++ b/domain/src/main/kotlin/com/xorker/draw/player/ResultType.kt
@@ -0,0 +1,9 @@
+package com.xorker.draw.player
+
+enum class ResultType {
+    MAFIA_WIN,
+    MAFIA_LOSE,
+    CITIZEN_WIN,
+    CITIZEN_LOSE,
+    ;
+}
diff --git a/domain/src/main/kotlin/com/xorker/draw/player/RoleType.kt b/domain/src/main/kotlin/com/xorker/draw/player/RoleType.kt
new file mode 100644
index 00000000..2fa877ec
--- /dev/null
+++ b/domain/src/main/kotlin/com/xorker/draw/player/RoleType.kt
@@ -0,0 +1,7 @@
+package com.xorker.draw.player
+
+enum class RoleType {
+    MAFIA,
+    CITIZEN,
+    ;
+}

From 6c90e5fc476dae6585da872b93ea4a4a5c8c2baa Mon Sep 17 00:00:00 2001
From: sunwoong <sunwoong1122@gmail.com>
Date: Mon, 21 Oct 2024 14:22:52 +0900
Subject: [PATCH 2/5] =?UTF-8?q?DRAW-404=20refactor:=20=EB=A7=88=ED=94=BC?=
 =?UTF-8?q?=EC=95=84=20=EA=B2=8C=EC=9E=84=20=EA=B2=B0=EA=B3=BC=20=EC=A0=80?=
 =?UTF-8?q?=EC=9E=A5=20=EB=B9=84=EC=A6=88=EB=8B=88=EC=8A=A4=20=EB=A1=9C?=
 =?UTF-8?q?=EC=A7=81=20=EB=B3=80=EA=B2=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../draw/mafia/MafiaGameResultAdapter.kt      | 54 +++++++++++++++++--
 1 file changed, 49 insertions(+), 5 deletions(-)

diff --git a/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/MafiaGameResultAdapter.kt b/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/MafiaGameResultAdapter.kt
index 3a5482d0..d3e4305d 100644
--- a/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/MafiaGameResultAdapter.kt
+++ b/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/MafiaGameResultAdapter.kt
@@ -1,29 +1,73 @@
 package com.xorker.draw.mafia
 
 import com.fasterxml.jackson.databind.ObjectMapper
+import com.xorker.draw.exception.NotFoundUserException
 import com.xorker.draw.exception.NotFoundWordException
+import com.xorker.draw.player.PlayerJpaEntity
+import com.xorker.draw.player.ResultType
+import com.xorker.draw.player.RoleType
+import com.xorker.draw.user.UserJpaEntity
+import com.xorker.draw.user.UserJpaRepository
+import org.springframework.data.repository.findByIdOrNull
 import org.springframework.stereotype.Component
+import org.springframework.transaction.annotation.Transactional
 
 @Component
 internal class MafiaGameResultAdapter(
     private val objectMapper: ObjectMapper,
+    private val userJpaRepository: UserJpaRepository,
     private val mafiaGameResultJpaRepository: MafiaGameResultJpaRepository,
     private val wordJpaRepository: WordJpaRepository,
 ) : MafiaGameResultRepository {
 
+    @Transactional
     override fun saveMafiaGameResult(gameInfo: MafiaGameInfo) {
+        println()
+        println("save mafia game result")
+        val room = gameInfo.room
+
         val phase = gameInfo.phase
         assertIs<MafiaPhase.End>(phase)
 
         val keyword = phase.keyword
-        val findEntity = wordJpaRepository.findByKeyword(keyword.answer) ?: throw NotFoundWordException
+        val word = wordJpaRepository.findByKeyword(keyword.answer) ?: throw NotFoundWordException
+
+        val drawData = DrawData(phase.drawData)
+        val draw = objectMapper.writeValueAsString(drawData)
 
-        val mafiaGameResult = gameInfo.toMafiaGameResult()
+        val gameResult = MafiaGameResultJpaEntity.of(room.locale, draw, phase.answer, word.id)
 
-        val serializedMafiaGameResult = objectMapper.writeValueAsString(mafiaGameResult)
+        val mafia = phase.mafiaPlayer
+        room.players.forEach { player ->
+            println(player.toString())
+            val user = userJpaRepository.findByIdOrNull(player.userId.value) ?: throw NotFoundUserException
+            println(user.id)
+            val createPlayer = createPlayer(phase, mafia, player, user, gameResult)
+            println(createPlayer.toString())
+        }
+        println()
+        println("save save")
 
-        val entity = MafiaGameResultJpaEntity.of(serializedMafiaGameResult, findEntity.id)
+        mafiaGameResultJpaRepository.save(gameResult)
+    }
 
-        mafiaGameResultJpaRepository.save(entity)
+    private fun createPlayer(
+        phase: MafiaPhase.End,
+        mafia: MafiaPlayer,
+        player: MafiaPlayer,
+        user: UserJpaEntity,
+        gameResult: MafiaGameResultJpaEntity,
+    ) = if (phase.isMafiaWin) {
+        if (mafia.userId == player.userId) {
+            PlayerJpaEntity.of(ResultType.MAFIA_WIN, RoleType.MAFIA, user, gameResult)
+        } else {
+            PlayerJpaEntity.of(ResultType.CITIZEN_LOSE, RoleType.CITIZEN, user, gameResult)
+        }
+    } else {
+        if (mafia.userId == player.userId) {
+            PlayerJpaEntity.of(ResultType.MAFIA_LOSE, RoleType.MAFIA, user, gameResult)
+        } else {
+            PlayerJpaEntity.of(ResultType.CITIZEN_WIN, RoleType.CITIZEN, user, gameResult)
+        }
     }
 }

From 3e0a91fd5809a655edf4266aa6d047daabce5bdd Mon Sep 17 00:00:00 2001
From: sunwoong <sunwoong1122@gmail.com>
Date: Mon, 21 Oct 2024 14:23:44 +0900
Subject: [PATCH 3/5] =?UTF-8?q?DRAW-404=20chore:=20=EC=BD=94=EB=93=9C=20?=
 =?UTF-8?q?=EC=A0=95=EB=A6=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/xorker/draw/mafia/MafiaGameResultAdapter.kt    | 10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)

diff --git a/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/MafiaGameResultAdapter.kt b/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/MafiaGameResultAdapter.kt
index d3e4305d..6ec71a27 100644
--- a/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/MafiaGameResultAdapter.kt
+++ b/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/MafiaGameResultAdapter.kt
@@ -22,8 +22,6 @@ internal class MafiaGameResultAdapter(
 
     @Transactional
     override fun saveMafiaGameResult(gameInfo: MafiaGameInfo) {
-        println()
-        println("save mafia game result")
         val room = gameInfo.room
 
         val phase = gameInfo.phase
@@ -39,14 +37,10 @@ internal class MafiaGameResultAdapter(
 
         val mafia = phase.mafiaPlayer
         room.players.forEach { player ->
-            println(player.toString())
             val user = userJpaRepository.findByIdOrNull(player.userId.value) ?: throw NotFoundUserException
-            println(user.id)
-            val createPlayer = createPlayer(phase, mafia, player, user, gameResult)
-            println(createPlayer.toString())
+
+            createPlayer(phase, mafia, player, user, gameResult)
         }
-        println()
-        println("save save")
 
         mafiaGameResultJpaRepository.save(gameResult)
     }

From 2798a5c9ea4e4ff8e1584738f7f58d8396b2b0d7 Mon Sep 17 00:00:00 2001
From: sunwoong <sunwoong1122@gmail.com>
Date: Sun, 3 Nov 2024 22:42:02 +0900
Subject: [PATCH 4/5] =?UTF-8?q?DRAW-404=20refactor:=20=EC=BD=94=EB=93=9C?=
 =?UTF-8?q?=20=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../xorker/draw/mafia/MafiaGameResultAdapter.kt   | 12 ++++++------
 .../xorker/draw/mafia/MafiaGameResultJpaEntity.kt | 15 ++++++++++-----
 ...ayerJpaEntity.kt => PlayerHistoryJpaEntity.kt} |  8 ++++----
 ...epository.kt => PlayerHistoryJpaRepository.kt} |  2 +-
 .../kotlin/com/xorker/draw/player/ResultType.kt   | 12 +++++++-----
 .../kotlin/com/xorker/draw/player/RoleType.kt     |  8 +++++---
 6 files changed, 33 insertions(+), 24 deletions(-)
 rename adapter/rdb/src/main/kotlin/com/xorker/draw/player/{PlayerJpaEntity.kt => PlayerHistoryJpaEntity.kt} (88%)
 rename adapter/rdb/src/main/kotlin/com/xorker/draw/player/{PlayerJpaRepository.kt => PlayerHistoryJpaRepository.kt} (50%)

diff --git a/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/MafiaGameResultAdapter.kt b/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/MafiaGameResultAdapter.kt
index 6ec71a27..b9414aec 100644
--- a/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/MafiaGameResultAdapter.kt
+++ b/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/MafiaGameResultAdapter.kt
@@ -3,7 +3,7 @@ package com.xorker.draw.mafia
 import com.fasterxml.jackson.databind.ObjectMapper
 import com.xorker.draw.exception.NotFoundUserException
 import com.xorker.draw.exception.NotFoundWordException
-import com.xorker.draw.player.PlayerJpaEntity
+import com.xorker.draw.player.PlayerHistoryJpaEntity
 import com.xorker.draw.player.ResultType
 import com.xorker.draw.player.RoleType
 import com.xorker.draw.user.UserJpaEntity
@@ -33,7 +33,7 @@ internal class MafiaGameResultAdapter(
         val drawData = DrawData(phase.drawData)
         val draw = objectMapper.writeValueAsString(drawData)
 
-        val gameResult = MafiaGameResultJpaEntity.of(room.locale, draw, phase.answer, word.id)
+        val gameResult = MafiaGameResultJpaEntity.of(room.locale, draw, phase.answer, room.isRandomMatching, word.id)
 
         val mafia = phase.mafiaPlayer
         room.players.forEach { player ->
@@ -53,15 +53,15 @@ internal class MafiaGameResultAdapter(
         gameResult: MafiaGameResultJpaEntity,
     ) = if (phase.isMafiaWin) {
         if (mafia.userId == player.userId) {
-            PlayerJpaEntity.of(ResultType.MAFIA_WIN, RoleType.MAFIA, user, gameResult)
+            PlayerHistoryJpaEntity.of(ResultType.MAFIA_WIN, RoleType.MAFIA, user, gameResult)
         } else {
-            PlayerJpaEntity.of(ResultType.CITIZEN_LOSE, RoleType.CITIZEN, user, gameResult)
+            PlayerHistoryJpaEntity.of(ResultType.CITIZEN_LOSE, RoleType.CITIZEN, user, gameResult)
         }
     } else {
         if (mafia.userId == player.userId) {
-            PlayerJpaEntity.of(ResultType.MAFIA_LOSE, RoleType.MAFIA, user, gameResult)
+            PlayerHistoryJpaEntity.of(ResultType.MAFIA_LOSE, RoleType.MAFIA, user, gameResult)
         } else {
-            PlayerJpaEntity.of(ResultType.CITIZEN_WIN, RoleType.CITIZEN, user, gameResult)
+            PlayerHistoryJpaEntity.of(ResultType.CITIZEN_WIN, RoleType.CITIZEN, user, gameResult)
         }
     }
 }
diff --git a/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/MafiaGameResultJpaEntity.kt b/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/MafiaGameResultJpaEntity.kt
index 8656f181..d24e950f 100644
--- a/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/MafiaGameResultJpaEntity.kt
+++ b/adapter/rdb/src/main/kotlin/com/xorker/draw/mafia/MafiaGameResultJpaEntity.kt
@@ -1,7 +1,7 @@
 package com.xorker.draw.mafia
 
 import com.xorker.draw.BaseJpaEntity
-import com.xorker.draw.player.PlayerJpaEntity
+import com.xorker.draw.player.PlayerHistoryJpaEntity
 import jakarta.persistence.Column
 import jakarta.persistence.Entity
 import jakarta.persistence.FetchType
@@ -37,28 +37,33 @@ internal class MafiaGameResultJpaEntity : BaseJpaEntity() {
     var mafiaAnswer: String? = null
         protected set
 
+    @Column(name = "is_random_matching", columnDefinition = "boolean")
+    var isRandomMatching: Boolean = false
+        protected set
+
     @Column(name = "word_id", columnDefinition = "bigint")
     var wordId: Long = 0
         protected set
 
     @OneToMany(mappedBy = "mafiaGameResult", fetch = FetchType.LAZY)
     @Cascade(CascadeType.PERSIST)
-    val players: MutableList<PlayerJpaEntity> = mutableListOf()
+    val players: MutableList<PlayerHistoryJpaEntity> = mutableListOf()
 
-    fun removePlayer(player: PlayerJpaEntity) {
+    fun removePlayer(player: PlayerHistoryJpaEntity) {
         players.remove(player)
     }
 
-    fun addPlayer(player: PlayerJpaEntity) {
+    fun addPlayer(player: PlayerHistoryJpaEntity) {
         players.add(player)
     }
 
     companion object {
-        internal fun of(locale: String, draw: String, mafiaAnswer: String?, wordId: Long): MafiaGameResultJpaEntity {
+        internal fun of(locale: String, draw: String, mafiaAnswer: String?, isRandomMatching: Boolean, wordId: Long): MafiaGameResultJpaEntity {
             return MafiaGameResultJpaEntity().apply {
                 this.language = locale
                 this.draw = draw
                 this.mafiaAnswer = mafiaAnswer
+                this.isRandomMatching = isRandomMatching
                 this.wordId = wordId
             }
         }
diff --git a/adapter/rdb/src/main/kotlin/com/xorker/draw/player/PlayerJpaEntity.kt b/adapter/rdb/src/main/kotlin/com/xorker/draw/player/PlayerHistoryJpaEntity.kt
similarity index 88%
rename from adapter/rdb/src/main/kotlin/com/xorker/draw/player/PlayerJpaEntity.kt
rename to adapter/rdb/src/main/kotlin/com/xorker/draw/player/PlayerHistoryJpaEntity.kt
index 1d46795f..871f80bb 100644
--- a/adapter/rdb/src/main/kotlin/com/xorker/draw/player/PlayerJpaEntity.kt
+++ b/adapter/rdb/src/main/kotlin/com/xorker/draw/player/PlayerHistoryJpaEntity.kt
@@ -16,8 +16,8 @@ import jakarta.persistence.ManyToOne
 import jakarta.persistence.Table
 
 @Entity
-@Table(name = "player")
-internal class PlayerJpaEntity : BaseJpaEntity() {
+@Table(name = "player_history")
+internal class PlayerHistoryJpaEntity : BaseJpaEntity() {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "player_id", nullable = false)
@@ -48,8 +48,8 @@ internal class PlayerJpaEntity : BaseJpaEntity() {
     }
 
     companion object {
-        fun of(result: ResultType, role: RoleType, user: UserJpaEntity, gameResult: MafiaGameResultJpaEntity): PlayerJpaEntity {
-            val player = PlayerJpaEntity().apply {
+        fun of(result: ResultType, role: RoleType, user: UserJpaEntity, gameResult: MafiaGameResultJpaEntity): PlayerHistoryJpaEntity {
+            val player = PlayerHistoryJpaEntity().apply {
                 this.result = result
                 this.role = role
                 this.user = user
diff --git a/adapter/rdb/src/main/kotlin/com/xorker/draw/player/PlayerJpaRepository.kt b/adapter/rdb/src/main/kotlin/com/xorker/draw/player/PlayerHistoryJpaRepository.kt
similarity index 50%
rename from adapter/rdb/src/main/kotlin/com/xorker/draw/player/PlayerJpaRepository.kt
rename to adapter/rdb/src/main/kotlin/com/xorker/draw/player/PlayerHistoryJpaRepository.kt
index e5004d8c..80eab0ff 100644
--- a/adapter/rdb/src/main/kotlin/com/xorker/draw/player/PlayerJpaRepository.kt
+++ b/adapter/rdb/src/main/kotlin/com/xorker/draw/player/PlayerHistoryJpaRepository.kt
@@ -2,4 +2,4 @@ package com.xorker.draw.player
 
 import org.springframework.data.jpa.repository.JpaRepository
 
-internal interface PlayerJpaRepository : JpaRepository<PlayerJpaEntity, Long>
+internal interface PlayerHistoryJpaRepository : JpaRepository<PlayerHistoryJpaEntity, Long>
diff --git a/domain/src/main/kotlin/com/xorker/draw/player/ResultType.kt b/domain/src/main/kotlin/com/xorker/draw/player/ResultType.kt
index a80dcebd..8de29a81 100644
--- a/domain/src/main/kotlin/com/xorker/draw/player/ResultType.kt
+++ b/domain/src/main/kotlin/com/xorker/draw/player/ResultType.kt
@@ -1,9 +1,11 @@
 package com.xorker.draw.player
 
-enum class ResultType {
-    MAFIA_WIN,
-    MAFIA_LOSE,
-    CITIZEN_WIN,
-    CITIZEN_LOSE,
+enum class ResultType(
+    val description: String,
+) {
+    MAFIA_WIN("마피아 승리"),
+    MAFIA_LOSE("마피아 패배"),
+    CITIZEN_WIN("시민 승리"),
+    CITIZEN_LOSE("시민 패배"),
     ;
 }
diff --git a/domain/src/main/kotlin/com/xorker/draw/player/RoleType.kt b/domain/src/main/kotlin/com/xorker/draw/player/RoleType.kt
index 2fa877ec..915dee52 100644
--- a/domain/src/main/kotlin/com/xorker/draw/player/RoleType.kt
+++ b/domain/src/main/kotlin/com/xorker/draw/player/RoleType.kt
@@ -1,7 +1,9 @@
 package com.xorker.draw.player
 
-enum class RoleType {
-    MAFIA,
-    CITIZEN,
+enum class RoleType(
+    val description: String,
+) {
+    MAFIA("마피아"),
+    CITIZEN("시민"),
     ;
 }

From 42825460d4629b68d0fa63f7eb9e3c8cf8558383 Mon Sep 17 00:00:00 2001
From: sunwoong <sunwoong1122@gmail.com>
Date: Sun, 3 Nov 2024 22:42:50 +0900
Subject: [PATCH 5/5] =?UTF-8?q?DRAW-404=20refactor:=20=EC=BD=94=EB=93=9C?=
 =?UTF-8?q?=20=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../db/migration/V7__update_player_table.sql          | 11 +++++++++++
 .../db/migration/V8__update_player_history_table.sql  |  5 +++++
 2 files changed, 16 insertions(+)
 create mode 100644 adapter/rdb/src/main/resources/db/migration/V7__update_player_table.sql
 create mode 100644 adapter/rdb/src/main/resources/db/migration/V8__update_player_history_table.sql

diff --git a/adapter/rdb/src/main/resources/db/migration/V7__update_player_table.sql b/adapter/rdb/src/main/resources/db/migration/V7__update_player_table.sql
new file mode 100644
index 00000000..87361fb4
--- /dev/null
+++ b/adapter/rdb/src/main/resources/db/migration/V7__update_player_table.sql
@@ -0,0 +1,11 @@
+rename table player TO player_history;
+
+alter table mafia_game_result
+    modify column language varchar(20) NOT NULL COMMENT '게임 방 언어';
+alter table mafia_game_result
+    modify column draw text NOT NULL COMMENT '그림 데이터';
+alter table mafia_game_result
+    modify column mafia_answer varchar(50) NULL COMMENT '마피아 입력 단어';
+
+alter table player_history
+    add column is_random_matching boolean NULL COMMENT '마피아 입력 단어';
diff --git a/adapter/rdb/src/main/resources/db/migration/V8__update_player_history_table.sql b/adapter/rdb/src/main/resources/db/migration/V8__update_player_history_table.sql
new file mode 100644
index 00000000..d200b0b6
--- /dev/null
+++ b/adapter/rdb/src/main/resources/db/migration/V8__update_player_history_table.sql
@@ -0,0 +1,5 @@
+alter table player_history
+    drop column is_random_matching;
+
+alter table mafia_game_result
+    add column is_random_matching boolean NULL COMMENT '마피아 입력 단어';