SQLite 추상화 계층의 설계 철학과 실무 적용 전략
1. Room Database란 무엇인가
Room Database는 Android Jetpack에 포함된 SQLite 추상화 라이브러리로,
로컬 데이터베이스를 **타입 안정성(Type-safety)**과 컴파일 타임 검증을 통해 보다 안전하고 일관되게 사용할 수 있도록 설계되었다.
Room은 단순한 ORM이 아니라,
SQLite를 직접 사용하면서 발생하는 오류 가능성을 구조적으로 제거하기 위한 아키텍처 레이어에 가깝다.
공식 정의에 따르면 Room은 다음 세 가지 주요 구성 요소로 이루어진다.
- Entity: 테이블 정의
- DAO (Data Access Object): SQL 접근 계층
- Database: 데이터베이스 홀더
2. 왜 Room이 필요한가
2.1 SQLite 직접 사용의 문제점
Android에서 SQLite를 직접 사용할 경우 다음과 같은 문제가 반복적으로 발생한다.
- SQL 문법 오류를 런타임에만 발견
- Cursor 기반 접근으로 인한 가독성 저하
- 컬럼명 오타, 타입 불일치로 인한 치명적인 런타임 에러
- 스레드 관리 및 트랜잭션 처리의 복잡성
Room은 이러한 문제를 컴파일 타임 검증으로 대부분 제거한다.
2.2 Room이 제공하는 핵심 이점
| SQL 검증 | 런타임 | 컴파일 타임 |
| 타입 안정성 | 낮음 | 높음 |
| 코드 가독성 | 낮음 | 높음 |
| 트랜잭션 처리 | 수동 | 선언적 |
| LiveData / Flow | 직접 구현 | 기본 지원 |
3. Room 아키텍처 구조
[ UI / ViewModel ]
↓
DAO
↓
RoomDatabase
↓
SQLite
Room은 UI 계층과 SQLite 사이의 중간 계층으로 동작하며,
애플리케이션이 SQL 자체보다는 데이터 모델 중심으로 설계되도록 유도한다.
4. 핵심 구성 요소 상세 설명
4.1 Entity – 테이블 정의
Entity는 SQLite 테이블과 1:1로 매핑된다.
- 클래스 = 테이블
- 필드 = 컬럼
- 어노테이션 기반 선언
Room은 Entity 정의를 기반으로 스키마를 자동 생성하며,
잘못된 타입이나 키 정의는 컴파일 단계에서 오류로 처리된다.
4.2 DAO – 데이터 접근 계층
DAO는 SQL 실행의 유일한 진입점이다.
- @Query, @Insert, @Update, @Delete 어노테이션 사용
- SQL 문법 오류, 반환 타입 불일치 → 컴파일 에러 발생
이는 Room 설계에서 가장 중요한 철학 중 하나다.
SQL 오류는 절대 런타임까지 가면 안 된다.
4.3 RoomDatabase – 데이터베이스 홀더
RoomDatabase는 다음 역할을 수행한다.
- SQLite 연결 관리
- DAO 인스턴스 제공
- 마이그레이션 적용
- 싱글톤 보장
Room은 멀티 인스턴스 생성을 금지하며,
하나의 앱 프로세스당 하나의 DB 인스턴스를 권장한다.
5. 스레드 정책과 비동기 처리
Room은 메인 스레드에서의 DB 접근을 기본적으로 차단한다.
이를 통해 다음을 강제한다.
- UI 프리징 방지
- 명시적인 비동기 설계
공식적으로 권장되는 방식은 다음과 같다.
- Kotlin Coroutines (suspend)
- Flow
- LiveData
이는 Room이 MVVM 아키텍처와 강하게 결합되는 이유이기도 하다.
6. 마이그레이션 전략
Room에서 마이그레이션은 선택이 아니라 필수 설계 요소다.
마이그레이션을 정의하지 않으면
- 앱 업데이트 시 데이터베이스 삭제
- 사용자 데이터 손실 발생
Room은 다음을 지원한다.
- 명시적 Migration 클래스
- Auto Migration (Android 12+)
마이그레이션 SQL 또한 컴파일 타임 검증 대상이다.
7. Room 사용이 적합한 경우
적합한 경우
- 오프라인 캐시
- 사용자 설정 저장
- 로컬 로그 / 히스토리
- 중소 규모 구조화 데이터
부적합한 경우
- 대용량 분석 데이터
- 고빈도 Write-heavy 시스템
- 서버 DB 대체 목적
Room은 서버 DB를 대체하기 위한 도구가 아니다.
8. Room과 다른 로컬 저장소 비교
| SharedPreferences | 단순 Key-Value |
| DataStore | 비동기 Key-Value |
| Room | 구조화된 관계형 데이터 |
| File | 대용량 비정형 데이터 |
9. 실무 적용 시 주의사항
- DAO는 비즈니스 로직을 포함하지 말 것
- 복잡한 Join은 Query 가독성 우선
- Entity와 UI Model 분리 권장
- Migration 테스트 필수
10. 정리
Room Database는 단순한 편의 라이브러리가 아니다.
Android 로컬 데이터 계층을 구조적으로 안정화하기 위한 표준 아키텍처 도구다.
- 컴파일 타임 안정성
- 명확한 계층 분리
- 현대 Android 아키텍처와의 완벽한 결합
이 세 가지가 필요한 경우, Room은 사실상 유일한 정답에 가깝다.
댓글