Skip to content

Kotlin/JS에서 SQLDelight 시작하기

INFO

동기식 sqljs-driver (2.0 이전 버전)는 비동기식 web-worker-driver로 대체되었습니다. 이를 위해서는 Gradle 설정에서 generateAsync 설정을 구성해야 합니다.

먼저 프로젝트에 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"
    }
  }
}

문을 `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');

문들을 바탕으로 SQLDelight는 데이터베이스를 생성하고 SQL 문을 실행하는 데 사용할 수 있는 연관된 `Schema` 객체를 포함한 `Database` 클래스를 생성합니다. `Database` 클래스는 `generateSqlDelightInterface` Gradle 태스크에 의해 생성되며, 이 태스크는 `.sq` 파일을 편집할 때 SQLDelight IDE 플러그인에 의해 자동으로 실행되거나 일반적인 Gradle 빌드의 일부로 실행됩니다.

"Kotlin"
kotlin {
  sourceSets.jsMain.dependencies {
    implementation("app.cash.sqldelight:web-worker-driver:2.1.0")
    implementation(devNpm("copy-webpack-plugin", "9.1.0"))
  }
}
```
groovy
kotlin {
  sourceSets.jsMain.dependencies {
    implementation "app.cash.sqldelight:web-worker-driver:2.1.0"
    implementation devNpm("copy-webpack-plugin", "9.1.0")
  }
}

웹 워커(Web Worker) 드라이버를 사용하면 SQLDelight가 Web Worker에서 실행 중인 SQL 구현체와 통신할 수 있습니다. 이를 통해 모든 데이터베이스 작업을 백그라운드 프로세스에서 처리할 수 있습니다.

INFO

웹 워커 드라이버는 브라우저 타겟(browser targets)과만 호환됩니다.

웹 워커 설정하기

SQLDelight의 웹 워커 드라이버는 특정 워커 구현에 종속되지 않습니다. 대신 드라이버는 표준화된 메시지 세트를 사용하여 워커와 통신합니다. SQLDelight는 SQL.js를 사용하는 워커 구현체를 제공합니다.

프로젝트 설정에 대한 자세한 내용은 SQL.js 워커 페이지를, 직접 워커를 구현하는 방법에 대한 자세한 내용은 커스텀 워커 페이지를 참조하세요.

웹 워커 사용하기

웹 워커 드라이버 인스턴스를 생성할 때, 모든 SQL 작업을 처리하는 데 사용할 웹 워커에 대한 참조를 전달해야 합니다. Worker 생성자는 워커 스크립트를 참조하는 URL 객체를 인자로 받습니다.

Webpack은 URL 생성자의 두 번째 인자로 import.meta.url을 전달하여 설치된 NPM 패키지의 워커 스크립트를 참조하는 기능을 특별히 지원합니다. Webpack은 빌드 시점에 참조된 NPM 패키지에서 워커 스크립트를 자동으로 번들링합니다. 아래 예제는 SQLDelight의 SQL.js 워커를 사용하여 워커를 생성하는 방법을 보여줍니다.

kotlin
val driver = WebWorkerDriver(
  Worker(
    js("""new URL("@cashapp/sqldelight-sqljs-worker/sqljs.worker.js", import.meta.url)""")
  )
)

WARNING

Webpack이 번들링 중에 이 URL을 올바르게 해석하도록 하려면, 위 예시처럼 import.meta.url 인자와 함께 js() 블록 내에서 전체 URL 객체를 생성해야 합니다.

이 시점부터는 다른 SQLDelight 드라이버와 동일하게 드라이버를 사용할 수 있습니다.

쿼리 사용하기

타입 세이프(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)
}

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