Web/Ktor

[Ktorm] Ktor에서 Ktorm 사용해보기

MarrRang 2022. 9. 7. 19:02

Ktor의 ORM

Ktor에서는 ORM으로 Exposed(익스포즈드)와 Ktorm(케이텀)이 대표적입니다. 이 중에서 제가 실험하는 토이 프로젝트의 크기나 설정상 Ktorm이 사용하기 편해 보이더라고요. 그래서 Ktorm의 간단한 사용법을 알아보려 합니다.

DB 연결부터 Ktorm을 이용한 CRUD까지의 내용으로 진행됩니다.

 

1. Ktorm dependency 추가

//Maven 기준
<dependency>
    <groupId>org.ktorm</groupId>
    <artifactId>ktorm-core</artifactId>
    <version>${ktorm_version}</version>
<dependency>
<dependency>
    <groupId>org.ktorm</groupId>
    <artifactId>ktorm-jackson</artifactId>
    <version>${ktorm_version}</version>
<dependency>

// MySQL 사용하기 위한 dependency
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>{connector_version}</version>
</dependency>

 

2. DB 연결

가장 먼저 DB 연결부터 해야 합니다. 저는 MySQL, HikariCP 기반으로 작성하였습니다.

 

import com.zaxxer.hikari.HikariConfig
import com.zaxxer.hikari.HikariDataSource
import org.ktorm.database.Database

class DatabaseConfiguration() {
	suspend fun initDatabase(): Database {
    	return Database.connect(
            HikariDatasource(
           	    hikariConfiguration(url, userName, password) // 이 부분은 자기의 설정에 맞춰서
            )
        )
    }
    
    private fun hikariConfiguration(url: String, userName: String, password: String) {
    	HikariConfig().apply {
            driverClassName = "com.mysql.cj.jdbc.Driver"
            jdbcUrl = url
            username = userName
            password = password
        }
    }
}

 

3. Database 객체 등록

우선은 Database에 접근하는 객체를 매번 선언하기에는 문제가 있기에 Koin이 관리하는 객체로 만들어주려고 합니다.

startKoin {
    val databaseModule = module {
        single {
            runBlocking {
                DatabaseConfiguration().initDatabase()
            }
        }
    }
    
    modules(databaseModule)
}

* 만약에 Database를 여러개 설정하고 싶다면 koin의 named를 활용하여 구분할 수 있습니다. 구분한 다음에는 주입받을 때 named에 설정한 이름으로 주입받거나 수동으로 지정해주면 됩니다.

 

startKoin {
    val databaseModule = module {
        single(named("firstDatabase") {
            runBlocking {
                DatabaseConfiguration().initDatabase()
            }
        }
        
        single(named("secondDatabase") {
            runBlocking {
                DatabaseConfiguration().initDatabase()
            }
        }
    }
    
    modules(databaseModule)
}

 

4. 서비스에서 사용

이제는 실제로 사용만 하면 끝입니다. 아래의 예제에서는 간단하게 CRUD(생성, 조회, 수정, 삭제)에 대해서 알아보겠습니다.

 

4.1 조회할 테이블 Entity 만들기

import org.ktorm.schema.*

object MyDataTable: Table<Nothing>("my_table") {
    val testId: int("TEST_ID")
    val testContent: varchar("TEST_CONTENT")
}

 

4.2 조회되는 모델 만들기

data class MyData(
    var testId: Int?,
    var testContent: String?
)

 

4.3 CRUD

import com.*.MyTable
import com.*.MyData
import org.ktorm.database.Database
import org.ktorm.dsl.*

class MyService(private val firstDatabase: Database) {
    fun get() {
        firstDatabase.from(MyDataTable)
            .select()
            .where {
                MyDataTable.testId eq 1
                MyDataTable.testContent eq "테스트컨텐츠"
            }
    }
    
    fun add(myData: MyData) {
        firstDatabase.useTransaction {
            firstDatabase.insert(MyDataTable) {
                set(it.testId, myData.testId)
                set(it.testContent, myData.testContent)
            }
        }
    }
    
    fun modify(myData: MyData) {
        firstDatabase.useTransaction {
            firstDatabase.update(MyDataTable) {
                set(it.testContent, myData.testContent)
                where {
                    it.testId eq myData.testId!!
                }
            }
        }
    }
    
    fun remove(myData: MyData) {
        firstDatabase.useTransaction {
            firstDatabase.delete(MyDataTable) {
                it.testId eq myData.testId!!
            }
        }
    }
}
반응형