Data Access Object
Room 라이브러리에서 데이터베이스와 상호작용하는 메서드를 정의하는 인터페이스나 추상 클래스
Room 라이브러리에서 데이터베이스의 테이블을 정의하는 데 사용
@Entity(tableName = "plants") // "plants"라는 데이터베이스 테이블 정의
데이터베이스의 테이블에서 각 레코드를 고유하게 식별하기 위한 기본 키를 정의하는 데 사용
(autoGenerate = true)와 같은 설정을 사용하면, 기본 키 값이 자동으로 증가하도록 할 수 있다.
즉, 새 레코드가 추가될 때마다 기본 키 값이 자동으로 할당된다.
데이터베이스에서 데이터를 구조화하여 저장하는 기본 단위
행 (Row): 각 행은 하나의 레코드를 나타낸다
열 (Column): 각 열은 특정 속성이나 필드를 나타낸다
데이터를 체계적으로 저장, 관리, 검색할 수 있는 구조화된 시스템
여러 데이터 테이블을 포함하며, 이들 테이블은 서로 연관된 정보를 저장한다 (외래키로?)
Database
├── Table : GardenPlanting
└── Table : Plant
한 테이블의 열이 다른 테이블의 기본 키를 참조하도록 설정하여 두 테이블 간의 관계를 정의한다
indices = [Index("plant_id")]
// plant_id 열에 인덱스를 생성
특정 열에 인덱스를 설정하여 데이터 검색 성능을 향상시킨다
데이터 삽입/삭제가 많고, 조회가 적다면 굳이 사용할 필요가 없다
컬럼에 대한 추가 정보를 제공, 데이터베이스의 컬럼 이름이나 속성을 명확하게 정의할 수 있다
데이터 클래스의 속성과 데이터베이스의 컬럼 간의 매핑을 명확하게 할 수 있어, 데이터베이스 구조를 변경할 때 유용
@ColumnInfo(name = "plant_id") val plantId: String,
// plantId 속성을 "plant_id"라는 이름으로 저장
데이터 구조가 변경될 때 기존 데이터를 보존하며 새로운 구조로 전환하는 작업
Room 라이브러리에서 데이터베이스에 대한 SQL 쿼리를 정의하는 데 사용
데이터베이스에서 데이터를 조회, 삽입, 수정, 삭제하는 쿼리를 쉽게 작성할 수 있다
Room은 쿼리를 통해 테이블의 모든 데이터를 반환할 때, 모든 행을 하나의 리스트로 반환한다
Object-Relational Mapping
테이블과 객체 간의 매핑뿐만 아니라, 테이블 간의 관계를 정의하고 그 관계에 따라 객체를 구성
두 테이블의 데이터를 함께 가져오고자 할 때는 관계를 정의하고 매핑 처리가 필요하다.
즉, 묶음 역할을 하는 데이터 클래스가 필요하다
ORM(Object-Relational Mapping)을 통해 생성된 객체
엔티티를 가져온다는 무슨뜻일까? 두 테이블 간의 데이터를 관계에 따라 자동으로 묶어서 앱에서 사용할 수 있도록 객체로 변환한다
Entity에서 테이블 간의 관계를 또 정의하는 이유
- ForeignKey는 데이터베이스 레벨에서 부모-자식 관계를 설정, 데이터베이스 무결성을 위해 사용되며
- @Relation는 앱 코드에서 테이블 간 관계를 정의, 자동 매핑과 객체 반환을 위해 사용된다
Room 라이브러리에서 여러 데이터베이스 작업을 원자적으로 수행할 수 있도록 도와준다
해당 메서드 내에서 수행되는 모든 데이터베이스 작업이 성공적으로 완료되어야만 반영되며, 하나라도 실패할 경우 모든 작업이 롤백된다