Room
SQLite를 추상화한 객체이자 ORM(Object Relational Mapping)에 해당됨
객체를 사용하듯 DB를 사용할 수 있게 해줌
Room의 주요 Component
1. Entity : 데이터베이스 안에 있는 테이블
2. Database : DAO 객체를 제공해 데이터베이스를 이용할 수 있는 Access point
3. DAO(Data Access Object) : 데이터베이스에 접근하는 메서드가 있는 오브젝트
3개의 주요 룸 객체를 생성하고 정의하면 나머지는 라이브러리가 알아서 처리
JetPack의 ViewModel과 LiveData와 함께 쓰이도록 설계되었으며 이들과 같이 사용.
Entity
DB의 테이블과 구성요소를 표현한다.
Annotation ---
- @Entity(tableName = "이름" : 테이블 이름 설정
- @PrimaryKey : Entity를 Primary 키로 설정
- @NonNull : 이 Entity의 값은 null이 될 수 없음
- @ColumnInfo(name = "이름") : column 이름
-----
DAO
- Dao로 사용할 interface 생성 후 @DAO 선언
- 메서드와 SQLite의 쿼리를 매핑
- 메서드 위에 어노테이션으로 @Query("...") 설정
- 각 @Query메서드는 컴파일 타임에 확인되므로 쿼리에 문제 있으면 런타임 오류 대신 컴파일 에러
- 해당 메서드를 호출하면 설정한 쿼리로 데이터를 가져와 정해진 형식으로 반환
Annotation ---
- @Insert ( 쿼리문 작성 안해도 룸이 알아서 데이터 저장 )
- @Update ( 기본키와 일치하는 쿼리 사용 int를 반환해 수정된 행 수 확인 가능 )
- @Delete ( 기본키와 일치하는 쿼리 사용 int를 반환해 삭제된 행 수 확인 가능 )
-----
Room DB
- RoomDatabase 객체를 상속하는 추상 클래스
- DAO를 리턴하는 추상 메서드 보유
- Room.databaseBuilder를 이용해 추상 클래스를 객체로 만듬
- 구현할 때 DB에서 사용하는 Entity 클래스와 Version 정보를 Annotation으로 설정 필요
- 객체를 사용하는데 비용이 많이 들어 싱글톤 패턴으로 1개의 객체만 만들도록 권장
Repository
- 데이터 액세스하는 로직을 캡슐화
- 로컬 DB나 Network로 부터 특정 데이터 셋을 가져오거나 저장하는 방법 결정
- UI가 데이터 저장하거나 가져오는 것에 관여하지 않게 해줌
- 사용하지 않을 수 있으나 유지보수성이 좋기에 사용을 권장
Room은 SQLite에 추상화 레이어를 제공해 SQLite를 완벽히 활용하고 더 견고한 DB 액세스를 가능하게 한다.
1. Query의 유효성 검사 기능을 제공하지 못했던 점
2. Scheme가 바뀔 때 자동적으로 업데이트를 못했던 점
3. ORM(Object Relational Mapping : 객체와 관계형 DB의 데이터를 자동으로 매핑해주는 것)이 지원이 안된 점
4. Observer 패턴의 데이터를 생성하고 동작 시키기 위해 추가적인 코드를 작성해야 했던 점
모두를 해결했다.
'안드로이드 > 정리' 카테고리의 다른 글
[Android] NFC에 관해... (0) | 2021.11.02 |
---|---|
[Android] 프로젝트 템플릿에 관해... (0) | 2021.11.01 |
[Android] LiveData에 관해... (0) | 2021.10.29 |
[Android] Jetpack에 관해...[ Databinding ] (0) | 2021.10.28 |
[Android] Jetpack에 관해... [ ViewModel ] (0) | 2021.10.27 |