Kotlin Academy · 강의

Table DSL로 테이블 정의하기

열, 기본 키 및 외래 키가 있는 타입 지정 테이블 스키마를 정의해 보세요.

레슨 2/413개 단계

Table DSL로 테이블 정의하기은(는) CoddyKit의 무료 Kotlin Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Kotlin Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

Exposed 테이블 객체

Exposed에서는 데이터베이스 테이블을 Table(쿼리 DSL) 또는 IntIdTable/LongIdTable/UUIDTable(DAO 계층)을 확장하는 Kotlin 싱글턴 object로 나타냅니다. 열 정의는 Kotlin 프로퍼티입니다.

기본 테이블 정의

Table을 확장하고 내장 열 팩토리 함수를 사용하여 열을 정의하십시오:

import org.jetbrains.exposed.sql.Table

object Users : Table("users") {
    val id    = long("id").autoIncrement()
    val name  = varchar("name", 100)
    val email = varchar("email", 255).uniqueIndex()
    val age   = integer("age").nullable()

    override val primaryKey = PrimaryKey(id)
}

열 유형

Exposed는 일반적인 SQL 유형을 위한 팩토리 함수를 제공합니다:

  • integer("col"), long("col"), short("col")
  • varchar("col", length), text("col")
  • bool("col"), double("col"), decimal("col", precision, scale)
  • datetime("col"), date("col"), timestamp("col")
  • blob("col"), uuid("col"), binary("col", length)

널 허용 열

어떤 열에서든 .nullable()을 호출하면 NULL 값을 허용할 수 있습니다. 그러면 Kotlin 유형도 널 허용 유형이 됩니다(String 대신 String?):

object Products : Table("products") {
    val id          = long("id").autoIncrement()
    val name        = varchar("name", 200)
    val description = text("description").nullable()
    override val primaryKey = PrimaryKey(id)
}

기본값

Kotlin 측 기본값(삽입 전에 적용)에는 .default(value)를 사용하고, 데이터베이스 측 SQL 기본값에는 .defaultExpression(expr)을 사용하십시오:

object Orders : Table("orders") {
    val id        = long("id").autoIncrement()
    val status    = varchar("status", 20).default("PENDING")
    val createdAt = datetime("created_at")
        .defaultExpression(CurrentDateTime)
    override val primaryKey = PrimaryKey(id)
}

인덱스 및 고유 제약 조건

열에서 직접 일반 인덱스를 만들려면 .index()를, 고유 인덱스를 만들려면 .uniqueIndex()를 호출하십시오. 복합 인덱스에는 Table의 index() 함수를 사용하십시오:

object Articles : Table("articles") {
    val id    = long("id").autoIncrement()
    val title = varchar("title", 300).index()
    val slug  = varchar("slug", 300).uniqueIndex()
    override val primaryKey = PrimaryKey(id)
}

외래 키

열 사이에 외래 키 제약 조건을 선언하려면 .references()를 사용하십시오. 참조할 열과 선택적으로 onDelete 및 onUpdate 작업을 전달하십시오:

object Posts : Table("posts") {
    val id       = long("id").autoIncrement()
    val authorId = long("author_id").references(Users.id, onDelete = ReferenceOption.CASCADE)
    val title    = varchar("title", 300)
    override val primaryKey = PrimaryKey(id)
}

IdTable 변형

DAO 계층에서는 일반 Table 대신 유형이 지정된 ID 테이블을 사용하십시오:

  • IntIdTable("name") — Int 자동 증가 기본 키의 이름은 id입니다
  • LongIdTable("name") — Long 자동 증가 기본 키
  • UUIDTable("name") — UUID 기본 키
object Users : LongIdTable("users") {
    val name  = varchar("name", 100)
    val email = varchar("email", 255).uniqueIndex()
}

복합 기본 키

여러 열을 PrimaryKey()에 전달하여 복합 기본 키를 정의하십시오:

object UserRoles : Table("user_roles") {
    val userId = long("user_id").references(Users.id)
    val roleId = long("role_id").references(Roles.id)
    override val primaryKey = PrimaryKey(userId, roleId)
}

열거형 열

enumerationByName() 또는 enumeration()을 사용하여 Kotlin 열거형 값을 문자열 또는 서수로 저장하십시오:

enum class Status { ACTIVE, INACTIVE, BANNED }

object Users : LongIdTable("users") {
    val name   = varchar("name", 100)
    val status = enumerationByName<Status>("status", 20)
}

스키마 변경 적용

SchemaUtils.createMissingTablesAndColumns()를 호출하면 기존 데이터를 삭제하지 않고 누락된 테이블과 열을 추가할 수 있습니다. 이는 개발 환경에서 안전한 마이그레이션 방법입니다. 운영 환경에서는 Flyway 또는 Liquibase와 같은 마이그레이션 도구를 사용하십시오.

transaction {
    SchemaUtils.createMissingTablesAndColumns(Users, Posts, Orders)
}

빠른 확인

Exposed의 Table DSL에서 Posts.authorId에서 Users.id로 이어지는 외래 키를 어떻게 선언하나요?

복습: Table DSL로 테이블 정의하기

핵심 내용:

  • 테이블은 Table, LongIdTable 등을 확장하는 object입니다
  • 열에는 varchar, integer, long, bool, datetime, uuid 등이 있습니다
  • .nullable(), .default(), .uniqueIndex(), .references()로 열을 수정합니다
  • 복합 기본 키는 PrimaryKey(col1, col2)로 정의합니다
  • SchemaUtils.create() 또는 createMissingTablesAndColumns()로 스키마를 적용합니다
무료로 시작

AI 튜터와 함께 Kotlin을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
51
레슨
203

자주 묻는 질문

“Table DSL로 테이블 정의하기” 강의는 무료인가요?

네 — “Table DSL로 테이블 정의하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Kotlin Academy 강의 전체를 잠금 해제할 수 있습니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“Table DSL로 테이블 정의하기”에서 뭘 배우나요?

열, 기본 키 및 외래 키가 있는 타입 지정 테이블 스키마를 정의해 보세요. 브라우저에서 직접 실행하는 실습 코드로 Kotlin Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Kotlin Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Kotlin Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“Table DSL로 테이블 정의하기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Kotlin Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Kotlin Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Exposed 설정: 데이터베이스 연결과 트랜잭션 DSL
  2. Table DSL로 테이블 정의하기
  3. Query DSL로 CRUD 수행하기: insert, select, update, delete
  4. Exposed DAO: 엔터티 클래스와 관계
← Kotlin Academy(으)로 돌아가기