[Android] DB

chaeny·2024년 12월 14일

@DAO

Data Access Object
Room 라이브러리에서 데이터베이스와 상호작용하는 메서드를 정의하는 인터페이스나 추상 클래스

@Entity

Room 라이브러리에서 데이터베이스의 테이블을 정의하는 데 사용

@Entity(tableName = "plants") // "plants"라는 데이터베이스 테이블 정의

@PrimaryKey

데이터베이스의 테이블에서 각 레코드를 고유하게 식별하기 위한 기본 키를 정의하는 데 사용

(autoGenerate = true)와 같은 설정을 사용하면, 기본 키 값이 자동으로 증가하도록 할 수 있다.
즉, 새 레코드가 추가될 때마다 기본 키 값이 자동으로 할당된다.

Table

데이터베이스에서 데이터를 구조화하여 저장하는 기본 단위
행 (Row): 각 행은 하나의 레코드를 나타낸다
열 (Column): 각 열은 특정 속성이나 필드를 나타낸다

DataBase

데이터를 체계적으로 저장, 관리, 검색할 수 있는 구조화된 시스템
여러 데이터 테이블을 포함하며, 이들 테이블은 서로 연관된 정보를 저장한다 (외래키로?)

Database
├── Table : GardenPlanting
└── Table : Plant

ForeignKey

한 테이블의 열이 다른 테이블의 기본 키를 참조하도록 설정하여 두 테이블 간의 관계를 정의한다

indices

indices = [Index("plant_id")] 
// plant_id 열에 인덱스를 생성

특정 열에 인덱스를 설정하여 데이터 검색 성능을 향상시킨다
데이터 삽입/삭제가 많고, 조회가 적다면 굳이 사용할 필요가 없다

@ColumnInfo

컬럼에 대한 추가 정보를 제공, 데이터베이스의 컬럼 이름이나 속성을 명확하게 정의할 수 있다
데이터 클래스의 속성과 데이터베이스의 컬럼 간의 매핑을 명확하게 할 수 있어, 데이터베이스 구조를 변경할 때 유용

@ColumnInfo(name = "plant_id") val plantId: String,
// plantId 속성을 "plant_id"라는 이름으로 저장

데이터베이스 마이그레이션

데이터 구조가 변경될 때 기존 데이터를 보존하며 새로운 구조로 전환하는 작업

  • @ColumnInfo 사용하지 않았을 때 plantId를 id로 변수명을 바꾸면, DB에서는 새로운 열 "id"로 인식한다
    기존 데이터와 호환되지 않아 데이터베이스 마이그레이션을 구현해야 한다.
  • @ColumnInfo를 사용하면 plantId 속성의 이름이 바뀌더라도, 데이터베이스 열 이름은 여전히 "id"로 유지된다

@Query

Room 라이브러리에서 데이터베이스에 대한 SQL 쿼리를 정의하는 데 사용
데이터베이스에서 데이터를 조회, 삽입, 수정, 삭제하는 쿼리를 쉽게 작성할 수 있다

List로 반환

Room은 쿼리를 통해 테이블의 모든 데이터를 반환할 때, 모든 행을 하나의 리스트로 반환한다

ORM

Object-Relational Mapping

테이블과 객체 간의 매핑뿐만 아니라, 테이블 간의 관계를 정의하고 그 관계에 따라 객체를 구성

두 테이블의 데이터를 함께 가져오고자 할 때는 관계를 정의하고 매핑 처리가 필요하다.
즉, 묶음 역할을 하는 데이터 클래스가 필요하다

Entity

ORM(Object-Relational Mapping)을 통해 생성된 객체
엔티티를 가져온다는 무슨뜻일까? 두 테이블 간의 데이터를 관계에 따라 자동으로 묶어서 앱에서 사용할 수 있도록 객체로 변환한다

Entity에서 테이블 간의 관계를 또 정의하는 이유

  • ForeignKey는 데이터베이스 레벨에서 부모-자식 관계를 설정, 데이터베이스 무결성을 위해 사용되며
  • @Relation는 앱 코드에서 테이블 간 관계를 정의, 자동 매핑과 객체 반환을 위해 사용된다

@Transaction

Room 라이브러리에서 여러 데이터베이스 작업을 원자적으로 수행할 수 있도록 도와준다
해당 메서드 내에서 수행되는 모든 데이터베이스 작업이 성공적으로 완료되어야만 반영되며, 하나라도 실패할 경우 모든 작업이 롤백된다

0개의 댓글