DataGrip - 테이블 DDL을 코틀린 Data Class로 변환하는 스크립트

DataGrip에는 데이터 베이스의 테이블 DDL 정보를 손쉽게 특정 언어로 변환하는 기능이 있습니다. 바로 DataGrip의 Generate Code인데요. 예를 들어 기존 사용하는 데이터 베이스를 JPA를 이용해 사용하려고 할 때 일일이 직접 테이블 정보를 확인해서 @Entity 클래스 코드를 만들어야 하는 번거로움 덜어낼 수 있습니다.

 

 DataGrip의 Generate Code가 기본으로 제공하는 Generate POJOs.groovy 스크립트는 테이블 DDL을 자바 클래스 코드로의 변환을 도와줍니다. 간단하게 사용할 수 있는 기능이지만 조금 더 상세한 사용방법을 원하신다면, 공식 사이트의 Generate Code 기능 사용 방법을 확인해주세요.

DataGrip - Generate code 기능

코틀린 Data Class 스크립트 추가 하기 feat. Groovy

 현재 Generate Code가 지원하는 기본 스크립트는 Generate POJOs.groovy로 자바 코드로의 변환을 지원합니다. 기본으로 제공되는 스크립트는 자바만 호환이 되기 때문 Kotlin과 같이 다른 언어로 코드를 변환하기 위해서는 별도의 스크립트를 작성해주어야 합니다.

import com.intellij.database.model.DasTable
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil

/*
 * Available context bindings:
 *   SELECTION   Iterable<DasObject>
 *   PROJECT     project
 *   FILES       files helper
 */

packageName = "com.sample;"
typeMapping = [
  (~/(?i)int/)                      : "Int",
  (~/(?i)float|double|decimal|real/): "Double",
  (~/(?i)numeric/)                  : "BigDecimal",
  (~/(?i)varchar/)                  : "String",
  (~/(?i)char/)                     : "Boolean",
  (~/(?i)datetime|timestamp/)       : "LocalDateTime",
  (~/(?i)date/)                     : "java.sql.Date",
  (~/(?i)time/)                     : "java.sql.Time",
  (~/(?i)/)                         : "String"
]

FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
  SELECTION.filter { it instanceof DasTable }.each { generate(it, dir) }
}

def generate(table, dir) {
  def className = javaName(table.getName(), true)
  def fields = calcFields(table)
  new File(dir, className + ".kt").withPrintWriter { out -> generate(out, className, fields) }
}

def generate(out, className, fields) {
  out.println "package $packageName"
  out.println ""
  out.println ""
  out.println "data class ${className}("
  fields.each() {
    if (it.annos != "") {
      out.println "  ${it.annos}"
    }

    if (it.type == "Int") {
      out.println "    val ${it.name}: ${it.type} = 0"
    } else if (it.type == "Boolean") {
      out.println "    val ${it.name}: ${it.type} = false"
    } else {
      out.println "    val ${it.name}: ${it.type}? = null"
    }
  }
  out.println ")"
}

def calcFields(table) {
  DasUtil.getColumns(table).reduce([]) { fields, col ->
    def spec = Case.LOWER.apply(col.getDataType().getSpecification())
    def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
    fields += [[
                 name : javaName(col.getName(), false),
                 type : typeStr,
                 annos: ""]]
  }
}

def javaName(str, capitalize) {
  def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
    .collect { Case.LOWER.apply(it).capitalize() }
    .join("")
    .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
  capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
}

 DataGrip에 정의되어 있던 Generate POJOs.groovy를 가져와 일부 코드를 다시 작성해 코틀린의 Data Class로 변환이 가능하도록 스크립트를 작성하였습니다. 몇 가지 테스트를 하기는 했지만 그루비도 코틀린도 아직 시작하는 단계라 부족한 부분이 있을 수 있으니 사용 시 문제가 있다면 수정해서 사용하시면 될 것 같습니다.

 

 코틀린용 스크립트를 작성했다면 DataGrip에서 사용할 수 있도록 추가를 해주어야 합니다. 스크립트 파일을 추가하는 방법은 DataGrip의 상당 우측에 위치한 Files 탭을 클릭 후 Files 창이 활성화되면 위와 같이 Extensions > Database Tools and SQL > schema 위치에 코틀린용 변환 스크립트 코드를 넣어주면 됩니다.

 

 gist로도 해당 코드를 공유해 놓았습니다. 블로그에서 복사가 불편하신 분은 gist를 통해 공유한 코드를 사용하시면 됩니다.

반응형

댓글

Designed by JB FACTORY