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!!
}
}
}
}
반응형
'Web > Ktor' 카테고리의 다른 글
[Ktor] Ktor와 Koin을 사용해서 스프링부트 따라잡기 (1) | 2022.01.29 |
---|