프레임워크(Framework)/Ktor

[Ktor] Kotlin + Ktor 환경에서 Ktorm ORM 엔티티 작성 및 테이블 매핑하기

잇트루 2023. 7. 26. 20:32
반응형

Ktorm의 Table과 Entity

Ktorm에서 엔티티 정의와 테이블 매핑은 Table 클래스와 Entity 인터페이스를 통해 작성할 수 있다.

Table 클래스

Ktorm의 Table 클래스는 데이터베이스 테이블을 나타내는 클래스로 테이블의 구조와 열(Column)을 정의할 수 있다. Table 클래스를 통해 데이터베이스와 상호 작용할 수 있다. 데이터베이스의 타입에 대응하는 함수들과, 키 설정 함수, 엔티티와 매핑하기 위한 바인딩 함수 등을 제공한다.

타입 함수

  • long(), varchar(), int(), boolean(), date() 등

키 설정 함수

  • primaryKey() : 기본키 설정
  • references() : 외래키 설정
object Departments : Table<Department>("t_department") {
   val id = int("id").primaryKey().bindTo { it.id }
   val name = varchar("name").bindTo { it.name }
   val location = varchar("location").bindTo { it.location }
}

정의한 컬럼은 bindTo 함수를 통해 엔티티 프로퍼티와 매핑할 수 있다.

 

Entity 인터페이스

Ktorm에서 제공하는 Entity 인터페이스는 Table 클래스로 정의한 컬럼과 매핑하여 코틀린 객체로 표현할 수 있게 해준다. Entity는 데이터베이스 테이블과 1:1로 대응하며 데이터베이스와 객체 간의 상호작용을 가능하게 한다.

interface Department : Entity<Department> {
    val id: Int
    var name: String
    var location: String
}

 

정의한 Department 엔티티는 다음과 같이 생성하여 사용할 수 있다.

// Department 엔티티 객체 생성
val department = Department.create()

// 속성에 값을 설정
department.id = 1
department.name = "영업부"
department.location = "10층"

// 속성 값 가져오기
val departmentId = department.id
val departmentName = department.name
val departmentLocation = department.location

 

 

테이블과 엔티티 정의

간단한 예시로 id를 기본키로 하여 name과 age를 가지는 회원 엔티티를 작성해보자.

import org.ktorm.database.Database
import org.ktorm.entity.Entity
import org.ktorm.entity.sequenceOf
import org.ktorm.schema.Table
import org.ktorm.schema.int
import org.ktorm.schema.long
import org.ktorm.schema.varchar

object MemberTable : Table<Member>("member") {
    val id = long("id").primaryKey().bindTo { it.id }
    val name = varchar("name").bindTo { it.name }
    val age = int("age").bindTo { it.age }
}

interface Member : Entity<Member> {
    companion object : Entity.Factory<Member>()

    val id: Long
    var name: String
    var age: Int
}

MemberTable

  • MemberTable은 Member 테이블과 매핑되는 객체로 Table 클래스를 상속받는다.
  • Table<Member>의 Member는 테이블과 매핑될 Kotlin 클래스 타입이다.
  • id는 “id”라는 이름의 Long 타입 클럼을 선언하여 primarKey() 함수를 통해 기본키로 지정한다.
  • bindTo 함수는 Member 타입의 코틀린 객체의 프로퍼티와 매핑되도록 한다.

 

Member

  • Member는 Member 객체와 매핑되는 인터페이스다. Entity<Member>를 상속받아 Ktorm 엔티티를 표현한다.
  • companion object를 통해 Entity.Factory<Member>()를 선언하여 Member 인터페이스의 팩토리 객체를 나타낸다. Entity.Factory는 Member 엔티티를 생성하고 관리하는 데 사용된다.
  • 필드에 Table과 대응하는 id, name, age를 알맞는 코틀린 타입으로 선언하여 Member 객체를 MemberTable 컬럼과 매핑할 수 있다.

 

Ktorm을 통해 MemberTable과 Member 정의한 예시로 Member 객체를 데이터베이스 테이블과 매핑하여 데이터를 추가, 조회, 수정, 삭제할 수 있게 된다.

 

 

엔티티 간의 관계 설정

앞에서 작성한 Member 엔티티를 통해 관계를 설정해보자.

회원은 게시글을 작성할 수 있다고 가정하여 Article 테이블과 엔티티를 정의하여 Member 엔티티와 관계를 정의한다.

import com.example.member.entity.Member
import com.example.member.entity.MemberTable
import org.ktorm.entity.Entity
import org.ktorm.schema.Table
import org.ktorm.schema.long
import org.ktorm.schema.varchar

object ArticleTable : Table<Article>("article") {
    val id = long("id").primaryKey().bindTo { it.id }
    val title = varchar("name").bindTo { it.title }
    val content = varchar("content").bindTo { it.content }
    val category = varchar("category").bindTo { it.category }
    val memberId = long("member_id").references(MemberTable) { it.member }
}

interface Article : Entity<Article> {
    companion object : Entity.Factory<Article>()

    val id: Long
    var title: String
    var content: String
    var category: String
    val member: Member
}

ArticleTable

  • ArticleTable은 id(식별자), title(제목), content(본문), category(카테고리), memberId(회원 식별자)를 가지도록 테이블을 정의한다.
  • memberId는 회원의 id이자 외래키로 references() 함수를 통해 MemberTable을 지정한다.

 

Article

  • Article 엔티티는 글을 작성한 회원을 나타내는 Member 속성을 가진다. ArticleTable의 memberId 컬럼과 매핑되어 Member와 Article의 관계를 설정한다.

 

Member와 Article은 일대다 관계로 비즈니스 로직 구현을 통해 한 명의 회원은 여러 개의 글을 작성할 수 있도록 할 수 있다.

반응형