Skip to content

JVM에서 HSQL 시작하기

실험적 기능

HSQL 지원은 인큐베이팅 단계이며, 방언(dialect)의 일부 기능이 아직 누락되어 있습니다. 지원되지 않는 방언 부분을 발견하면 sql-psi에 제보해 주세요.

먼저 프로젝트에 Gradle 플러그인을 적용하고.

kotlin
plugins {
  id("app.cash.sqldelight") version "2.1.0"
}
 
repositories {
  google()
  mavenCentral()
}

sqldelight {
  databases {
    register("Database") {
      packageName.set("com.example")
    }
  }
}
groovy
plugins {
  id "app.cash.sqldelight" version "2.1.0"
}

repositories {
  google()
  mavenCentral()
}

sqldelight {
  databases {
    register("Database") { // 이는 생성될 데이터베이스 클래스의 이름이 됩니다.
      packageName = "com.example"
    }
  }
}

elight은 데이터베이스의 스키마를 알아야 합니다. 일반적으로 데이터베이스 스키마를 설정하는 데는 두 가지 방식이 있습니다. "Fresh Schema" 방식은 빈 데이터베이스에서 시작하여 데이터베이스를 원하는 상태로 만드는 데 필요한 모든 구문을 한 번에 적용하는 것을 가정합니다. 반면 "Migration Schema" 방식은 이미 데이터베이스와 스키마가 설정되어 있다고(: 기존 운영 데이터베이스) 가정하며, 시간이 지남에 따라 마이그레이션을 점진적으로 적용하여 데이터베이스 스키마를 업데이트합니다.

elight에서 이러한 방식은 "[Fresh Schema](#fresh-schema)"를 위해 `.sq` 파일에 테이블 정의를 작성하거나, "[Migration Schema](#migration-schema)"를 위해 `.sqm` 파일에 마이그레이션 구문을 작성하는 방식으로 대응됩니다. 두 경우 모두 SQL *쿼리*는 ([여기에 표시된 대로](#typesafe-sql)) `.sq` 파일에 작성됩니다.

resh Schema

문을 `src/main/sqldelight` 아래의 `.sq` 파일에 작성하세요.
로 `.sq` 파일의 첫 번째 문은 테이블을 생성하지만, 인덱스를 생성하거나 기본 콘텐츠를 설정할 수도 있습니다.

ql title="src/main/sqldelight/com/example/sqldelight/hockey/data/Player.sq"
TE TABLE hockeyPlayer (
ayer_number INTEGER PRIMARY KEY NOT NULL,
ll_name TEXT NOT NULL


TE INDEX hockeyPlayer_full_name ON hockeyPlayer(full_name);

RT INTO hockeyPlayer (player_number, full_name)
ES (15, 'Ryan Getzlaf');

`.sq` 파일에 [런타임](#typesafe-sql)에 실행할 SQL 구문을 배치할 수 있습니다.

igration Schema

마이그레이션을 사용하여 스키마를 구성하도록 Gradle을 설정합니다.

"Kotlin"
sqldelight {
  databases {
    create("Database") {
      ...
      srcDirs("sqldelight")
      deriveSchemaFromMigrations.set(true)
    }
  }
}
```
groovy
sqldelight {
  databases {
    Database {
      ...
      srcDirs "sqldelight"
      deriveSchemaFromMigrations = true
    }
  }
}

마이그레이션 파일의 확장자는 .sqm이며, 파일 이름에는 마이그레이션 파일이 실행되는 순서를 나타내는 숫자가 포함되어야 합니다. 예를 들어, 다음과 같은 계층 구조가 있다고 가정해 보겠습니다.

src
`-- main
    `-- sqldelight
        |-- v1__backend.sqm
        `-- v2__backend.sqm

SQLDelight은 v1__backend.sqm을 적용한 다음 v2__backend.sqm을 적용하여 스키마를 생성합니다. 이 파일들에 일반적인 SQL CREATE/ALTER 구문을 배치하세요. 만약 다른 서비스(예: Flyway)가 마이그레이션 파일을 읽는 경우, 마이그레이션 관련 정보와 유효한 SQL을 출력하는 방법을 반드시 읽어보시기 바랍니다.

Typesafe SQL

런타임에 SQL 구문을 실행하려면 데이터베이스에 연결하기 위한 SqlDriver를 생성해야 합니다. 가장 쉬운 방법은 Hikari나 다른 커넥션 관리자로부터 얻은 DataSource를 사용하는 것입니다.

kotlin
dependencies {
  implementation("app.cash.sqldelight:jdbc-driver:2.1.0")
}
groovy
dependencies {
  implementation "app.cash.sqldelight:jdbc-driver:2.1.0"
}
kotlin
val driver: SqlDriver = dataSource.asJdbcDriver()

스키마를 새로운 CREATE TABLE 구문으로 지정하든 마이그레이션을 통해 지정하든 상관없이, 런타임 SQL은 .sq 파일에 작성합니다.

타입 세이프(Typesafe) 쿼리 정의하기

SQLDelight는 .sq 파일에 레이블(labeled)이 지정된 모든 SQL 문에 대해 타입 세이프 함수를 생성합니다.

sql
selectAll:
SELECT *
FROM hockeyPlayer;

insert:
INSERT INTO hockeyPlayer(player_number, full_name)
VALUES (?, ?);

insertFullPlayerObject:
INSERT INTO hockeyPlayer(player_number, full_name)
VALUES ?;

레이블이 지정된 문이 포함된 각 .sq 파일에 대해 "Queries" 객체가 생성됩니다. 예를 들어, 위에서 보여준 Player.sq 파일에 대해 PlayerQueries 객체가 생성됩니다. 이 객체를 사용하여 실제 SQL 문을 실행하는 생성된 타입 세이프 함수를 호출할 수 있습니다.

kotlin
fun doDatabaseThings(driver: SqlDriver) {
  val database = Database(driver)
  val playerQueries: PlayerQueries = database.playerQueries

  println(playerQueries.selectAll().AsList()) 
  // [HockeyPlayer(15, "Ryan Getzlaf")]

  playerQueries.insert(player_number = 10, full_name = "Corey Perry")
  println(playerQueries.selectAll().AsList()) 
  // [HockeyPlayer(15, "Ryan Getzlaf"), HockeyPlayer(10, "Corey Perry")]

  val player = HockeyPlayer(10, "Ronald McDonald")
  playerQueries.insertFullPlayerObject(player)
}

이상입니다! 다른 기능에 대해서는 사이드바의 다른 페이지들을 참조해 주세요.