Skip to content

Kotlin/JS에서 SQLDelight 시작하기

INFO

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

먼저 프로젝트에 Gradle 플러그인을 적용합니다.

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

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

repositories {
  google()
  mavenCentral()
}

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

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

sql
CREATE TABLE hockeyPlayer (
  player_number INTEGER PRIMARY KEY NOT NULL,
  full_name TEXT NOT NULL
);

CREATE INDEX hockeyPlayer_full_name ON hockeyPlayer(full_name);

INSERT INTO hockeyPlayer (player_number, full_name)
VALUES (15, 'Ryan Getzlaf');

이 구문들로부터, SQLDelight는 데이터베이스를 생성하고 그 위에서 구문을 실행하는 데 사용될 수 있는, 관련된 Schema 객체를 가진 Database 클래스를 생성합니다. Database 클래스는 .sq 파일을 편집할 때 SQLDelight IDE 플러그인에 의해 자동으로 실행되고, 일반 Gradle 빌드의 일부로도 실행되는 generateSqlDelightInterface 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")
  }
}

웹 워커 드라이버를 사용하면 SQLDelight가 웹 워커에서 실행되는 SQL 구현체와 통신할 수 있습니다. 이를 통해 모든 데이터베이스 작업이 백그라운드 프로세스에서 수행될 수 있습니다.

INFO

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

웹 워커 구성하기

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

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

웹 워커 사용하기

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

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

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

DANGER

Webpack이 번들링 중에 이 URL을 올바르게 해석하려면, 위에서 import.meta.url 인자와 함께 보여준 바와 같이 URL 객체를 js() 블록 내에서 완전히 구성해야 합니다.

여기에서부터 다른 SQLDelight 드라이버와 마찬가지로 드라이버를 사용할 수 있습니다.

쿼리 사용하기

타입 안전 쿼리 정의

SQLDelight는 .sq 파일에 있는 레이블이 지정된 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)
}

이것으로 끝입니다! 사이드바의 다른 페이지에서 다른 기능들을 확인하십시오.