상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
궁금한 상식 보기
오징어를 고르는 법, 8가지 팁!
저축을 통한 시간 관리: 4가지 팁
고혈압, 운동 시 주의해야 할 5가지 팁
유도, 자신감을 높이는 5가지 비결
태권도, 미래를 준비하는 7가지 준비서
태권도, 건강한 삶을 위한 4가지 동기
연봉 1억, 테크 기업의 10가지 기회
두바이에서만 즐길 수 있는 8개의 액티비티
두바이에서의 최고 스냅샷을 위한 7가지 추천
언어 감각을 높이는 5가지 영어 학습법!
문학으로 배우는 영어: 추천 도서 6가지!
Why English is Essential: 7 Reasons You Should Know!
Previous
Next
수정하기 - LiveData의 DAO 패턴 구현 방법은?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
LiveData를 활용한 DAO(Data Access Object) 패턴 구현 방법에 대해 자세히 설명드리겠습니다. 1. DAO 패턴 개요 DAO는 데이터 소스(예: 데이터베이스, 네트워크, 파일 등)에 접근하는 인터페이스를 추상화하여, 데이터 접근 로직과 비즈니스 로직을 분리하는 디자인 패턴입니다. 주로 데이터베이스 접근 시 Room 라이브러리와 함께 많이 사용됩니다. 2. LiveData의 역할 LiveData는 Lifecycle-aware 데이터 홀더로, 데이터 소스의 변화가 있을 때 UI에 자동으로 변경 사항을 알리기 위해 사용됩니다. 이를 DAO에 적용하면 데이터 변경사항을 실시간으로 UI에 반영할 수 있어 매우 효율적입니다. --- DAO 패턴 구현 절차와 방법 1) Entity 클래스 정의 Room 데이터베이스 테이블에 해당하는 Entity 클래스를 정의합니다. ```kotlin @Entity(tableName = "users") data class User( @PrimaryKey val id: Int, val name: String, val email: String ) ``` 2) DAO 인터페이스 정의 DAO 클래스는 데이터베이스에 접근하여 데이터를 조작하는 인터페이스 또는 추상 클래스로 작성합니다. LiveData를 반환형으로 지정하면 데이터 변경 시 자동으로 업데이트됩니다. ```kotlin @Dao interface UserDao { // 모든 사용자 데이터를 LiveData 리스트로 반환 @Query("SELECT * FROM users") fun getAllUsers(): LiveData<List<User>> // 특정 사용자 데이터 LiveData로 반환 @Query("SELECT * FROM users WHERE id = :userId") fun getUserById(userId: Int): LiveData<User> // 사용자 추가 @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertUser(user: User) // 사용자 삭제 @Delete suspend fun deleteUser(user: User) } ``` - `getAllUsers()`, `getUserById()` 메서드는 LiveData를 반환합니다. 이를 통해 UI에서 이 데이터를 `observe()`하면 DB 내용이 변경될 때 UI가 자동 갱신됩니다. - 데이터 삽입, 삭제 등의 작업은 `suspend` 함수로 정의해 코루틴 내에서 실행할 수 있도록 합니다. 3) Room 데이터베이스 클래스 구현 DAO를 포함하는 Room 데이터베이스 클래스를 설정합니다. ```kotlin @Database(entities = [User::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao companion object { @Volatile private var INSTANCE: AppDatabase? = null fun getDatabase(context: Context): AppDatabase { return INSTANCE ?: synchronized(this) { val instance = Room.databaseBuilder( context.applicationContext, AppDatabase::class.java, "app_database" ).build() INSTANCE = instance instance } } } } ``` 4) Repository 패턴 권장 (선택사항) Repository는 DAO와 ViewModel 사이 중계자 역할을 하면서 데이터 소스 변경 시 유연하게 대응하게 합니다. ```kotlin class UserRepository(private val userDao: UserDao) { fun getAllUsers(): LiveData<List<User>> = userDao.getAllUsers() fun getUserById(id: Int): LiveData<User> = userDao.getUserById(id) suspend fun insertUser(user: User) = userDao.insertUser(user) suspend fun deleteUser(user: User) = userDao.deleteUser(user) } ``` 5) ViewModel에서 LiveData 구독 ViewModel 내에서 Repository를 통해 LiveData를 받아 UI에 데이터를 제공합니다. ```kotlin class UserViewModel(private val repository: UserRepository) : ViewModel() { val allUsers: LiveData<List<User>> = repository.getAllUsers() fun insertUser(user: User) = viewModelScope.launch { repository.insertUser(user) } fun deleteUser(user: User) = viewModelScope.launch { repository.deleteUser(user) } } ``` 6) Activity/Fragment에서 관찰(Observer) 등록 마지막으로 UI 컴포넌트(Activity/Fragment)에서 LiveData를 구독하여 데이터 변경 시 자동으로 UI가 갱신되도록 합니다. ```kotlin userViewModel.allUsers.observe(viewLifecycleOwner) { users -> // users 데이터가 변경되면 UI 갱신 로직 작성 } ``` --- 요약 - Entity 정의 → Room DB 테이블 역할 - DAO 인터페이스에서 LiveData 타입을 반환해 변경 감지 구현 (`fun getAllUsers(): LiveData<List<User>>`) - DB 액션은 suspend 함수로 비동기 처리 - RoomDatabase 구현해 DAO 생성 - Repository 로 중간 계층 구현, ViewModel과 분리 - ViewModel 에서 LiveData 데이터를 관리하면서 UI에 제공 - UI(Activity/Fragment) 에서 `observe()`로 LiveData 구독하여 실시간 갱신 이렇게 구현하면 DB 데이터 변경 시 LiveData가 자동으로 통지되고 UI가 즉시 변화를 반영할 수 있어, 확장성과 유지보수성 높은 앱 구조를 만들 수 있습니다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기