feat(chat-talk-room): Room Database 설정 및 Entity 생성
refactor(chat-talk-room): 패키지 chat.room → chat.talk.room 마이그레이션 및 DI 모듈 분리 왜: 기능 영역 명확화(talk) 및 DI 책임 분리로 유지보수성과 확장성을 높이기 위함 무엇: - 모델/응답/enum 파일들을 chat.room → chat.talk.room 으로 이동 - Room DB 패키지를 chat.room.db → chat.talk.room.db 로 이동 - AppDatabase 클래스명을 역할에 맞게 ChatMessageDatabase로 변경 문서: - docs/chat-talk-room-package-migration-and-di-module.md 추가 - docs/chat-room-room-database.md 내용 클래스명/경로 갱신
This commit is contained in:
		@@ -1,7 +1,7 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 보이스온 - 채팅방 캐릭터 정보 모델
 | 
			
		||||
 */
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.room
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.talk.room
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.Keep
 | 
			
		||||
import com.google.gson.annotations.SerializedName
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 보이스온 - 채팅 메시지 모델 (서버 응답 기반)
 | 
			
		||||
 */
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.room
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.talk.room
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.Keep
 | 
			
		||||
import com.google.gson.annotations.SerializedName
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 보이스온 - 채팅 메시지 매핑 유틸리티
 | 
			
		||||
 */
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.room
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.talk.room
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.Keep
 | 
			
		||||
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 보이스온 - 점진적 메시지 로딩 응답 모델
 | 
			
		||||
 */
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.room
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.talk.room
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.Keep
 | 
			
		||||
import com.google.gson.annotations.SerializedName
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 보이스온 - 통합 채팅방 입장 응답 모델
 | 
			
		||||
 */
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.room
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.talk.room
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.Keep
 | 
			
		||||
import com.google.gson.annotations.SerializedName
 | 
			
		||||
@@ -0,0 +1,13 @@
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.talk.room
 | 
			
		||||
 | 
			
		||||
import kr.co.vividnext.sodalive.chat.talk.room.db.ChatMessageDatabase
 | 
			
		||||
import org.koin.android.ext.koin.androidContext
 | 
			
		||||
import org.koin.dsl.module
 | 
			
		||||
 | 
			
		||||
val chatTalkRoomModule = module {
 | 
			
		||||
    // Database
 | 
			
		||||
    single { ChatMessageDatabase.getDatabase(androidContext()) }
 | 
			
		||||
 | 
			
		||||
    // DAO
 | 
			
		||||
    single { get<ChatMessageDatabase>().chatMessageDao() }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 보이스온 - 채팅방 메시지 전송 상태 Enum
 | 
			
		||||
 */
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.room
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.talk.room
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.Keep
 | 
			
		||||
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 보이스온 - 채팅방 메시지 타입 Enum
 | 
			
		||||
 */
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.room
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.talk.room
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.Keep
 | 
			
		||||
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 보이스온 - 채팅 메시지 모델 (서버 응답 전용 DTO)
 | 
			
		||||
 */
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.room
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.talk.room
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.Keep
 | 
			
		||||
import com.google.gson.annotations.SerializedName
 | 
			
		||||
@@ -0,0 +1,17 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 보이스온 - 채팅 메시지 Room TypeConverters
 | 
			
		||||
 */
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.talk.room.db
 | 
			
		||||
 | 
			
		||||
import androidx.room.TypeConverter
 | 
			
		||||
import kr.co.vividnext.sodalive.chat.talk.room.MessageStatus
 | 
			
		||||
 | 
			
		||||
object ChatMessageConverters {
 | 
			
		||||
    @TypeConverter
 | 
			
		||||
    @JvmStatic
 | 
			
		||||
    fun fromStatus(value: MessageStatus?): String? = value?.name
 | 
			
		||||
 | 
			
		||||
    @TypeConverter
 | 
			
		||||
    @JvmStatic
 | 
			
		||||
    fun toStatus(value: String?): MessageStatus? = value?.let { MessageStatus.valueOf(it) }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,32 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 보이스온 - 채팅 메시지 DAO
 | 
			
		||||
 */
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.talk.room.db
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.Keep
 | 
			
		||||
import androidx.room.*
 | 
			
		||||
 | 
			
		||||
@Keep
 | 
			
		||||
@Dao
 | 
			
		||||
interface ChatMessageDao {
 | 
			
		||||
    @Query("SELECT * FROM chat_messages WHERE roomId = :roomId ORDER BY createdAt DESC LIMIT 20")
 | 
			
		||||
    suspend fun getRecentMessages(roomId: Long): List<ChatMessageEntity>
 | 
			
		||||
 | 
			
		||||
    @Insert(onConflict = OnConflictStrategy.REPLACE)
 | 
			
		||||
    suspend fun insertMessage(message: ChatMessageEntity)
 | 
			
		||||
 | 
			
		||||
    @Insert(onConflict = OnConflictStrategy.REPLACE)
 | 
			
		||||
    suspend fun insertMessages(messages: List<ChatMessageEntity>)
 | 
			
		||||
 | 
			
		||||
    @Update
 | 
			
		||||
    suspend fun updateMessage(message: ChatMessageEntity)
 | 
			
		||||
 | 
			
		||||
    @Query("DELETE FROM chat_messages WHERE roomId = :roomId AND createdAt < :cutoffTime")
 | 
			
		||||
    suspend fun deleteOldMessages(roomId: Long, cutoffTime: Long)
 | 
			
		||||
 | 
			
		||||
    @Query("DELETE FROM chat_messages")
 | 
			
		||||
    suspend fun deleteAllMessages()
 | 
			
		||||
 | 
			
		||||
    @Query("SELECT DISTINCT roomId FROM chat_messages")
 | 
			
		||||
    suspend fun getAllRoomIds(): List<Long>
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,37 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 보이스온 - 채팅방 Room Database (ChatMessage 테이블 포함)
 | 
			
		||||
 */
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.talk.room.db
 | 
			
		||||
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import androidx.room.Database
 | 
			
		||||
import androidx.room.Room
 | 
			
		||||
import androidx.room.RoomDatabase
 | 
			
		||||
import androidx.room.TypeConverters
 | 
			
		||||
 | 
			
		||||
@Database(
 | 
			
		||||
    entities = [ChatMessageEntity::class],
 | 
			
		||||
    version = 1,
 | 
			
		||||
    exportSchema = false
 | 
			
		||||
)
 | 
			
		||||
@TypeConverters(ChatMessageConverters::class)
 | 
			
		||||
abstract class ChatMessageDatabase : RoomDatabase() {
 | 
			
		||||
    abstract fun chatMessageDao(): ChatMessageDao
 | 
			
		||||
 | 
			
		||||
    companion object {
 | 
			
		||||
        @Volatile
 | 
			
		||||
        private var INSTANCE: ChatMessageDatabase? = null
 | 
			
		||||
 | 
			
		||||
        fun getDatabase(context: Context): ChatMessageDatabase {
 | 
			
		||||
            return INSTANCE ?: synchronized(this) {
 | 
			
		||||
                val instance = Room.databaseBuilder(
 | 
			
		||||
                    context.applicationContext,
 | 
			
		||||
                    ChatMessageDatabase::class.java,
 | 
			
		||||
                    "chat_database"
 | 
			
		||||
                ).build()
 | 
			
		||||
                INSTANCE = instance
 | 
			
		||||
                instance
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,22 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 보이스온 - 채팅 메시지 Room Entity
 | 
			
		||||
 */
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.talk.room.db
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.Keep
 | 
			
		||||
import androidx.room.Entity
 | 
			
		||||
import androidx.room.PrimaryKey
 | 
			
		||||
import kr.co.vividnext.sodalive.chat.talk.room.MessageStatus
 | 
			
		||||
 | 
			
		||||
@Keep
 | 
			
		||||
@Entity(tableName = "chat_messages")
 | 
			
		||||
data class ChatMessageEntity(
 | 
			
		||||
    @PrimaryKey val messageId: Long,
 | 
			
		||||
    val roomId: Long,
 | 
			
		||||
    val message: String,
 | 
			
		||||
    val profileImageUrl: String,
 | 
			
		||||
    val mine: Boolean,
 | 
			
		||||
    val createdAt: Long,
 | 
			
		||||
    val status: MessageStatus = MessageStatus.SENT,
 | 
			
		||||
    val localId: String? = null
 | 
			
		||||
)
 | 
			
		||||
@@ -146,6 +146,7 @@ import kr.co.vividnext.sodalive.mypage.profile.tag.MemberTagApi
 | 
			
		||||
import kr.co.vividnext.sodalive.mypage.profile.tag.MemberTagRepository
 | 
			
		||||
import kr.co.vividnext.sodalive.mypage.profile.tag.MemberTagViewModel
 | 
			
		||||
import kr.co.vividnext.sodalive.mypage.recent.recentContentModule
 | 
			
		||||
import kr.co.vividnext.sodalive.chat.talk.room.chatTalkRoomModule
 | 
			
		||||
import kr.co.vividnext.sodalive.mypage.service_center.FaqApi
 | 
			
		||||
import kr.co.vividnext.sodalive.mypage.service_center.FaqRepository
 | 
			
		||||
import kr.co.vividnext.sodalive.mypage.service_center.ServiceCenterViewModel
 | 
			
		||||
@@ -410,6 +411,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) {
 | 
			
		||||
        viewModelModule,
 | 
			
		||||
        repositoryModule,
 | 
			
		||||
        recentContentModule,
 | 
			
		||||
        chatTalkRoomModule,
 | 
			
		||||
        otherModule
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user