티스토리 뷰
Spring JPA 프로젝트를 하다보면
DTO나 Entity 를 DB Table 정보에 맞게 작성해야 한다.
작은 규모일 때는 직접 작성해도 무방하지만
규모가 커지거나 Table 컬럼정보가 너무 많을 경우
너무너무나 귀찮다.
그래서 인텔리제이와 groovy script 를 가지고 이를 해결해보고자 한다.
1. 인텔리제이에 Database 연결하기
driver files 를 다운받고 Test Connection 을 성공 시키면 됩니다.
2. POJOs.groovy 스크립트 커스텀하여 실행
Database를 연결하면 Generate POJOs.groovy 스크립트가 생성됩니다.
위치와 접근방법은 아래와 같습니다.
해당 위치에 groovy 스크립트가 존재하고
해당 스크립트를 커스텀해서 실행시키면 스크립트에 맞게 DB 정보를 가지고 파일을 생성합니다.
저는 Entity 와 DTO 의 기본틀을 추출하는 groovy 스크립트를 커스텀 해보았습니다.
아래 SAMPLE 테이블을 제가 만든
Generate POJOs_dto.groovy 와 Generate POJOs_entity.groovy 로 실행한 후
디렉토리를 지정한 위치에 아래와 같이 파일이 생성됩니다.
package com.sample.entity;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "SAMPLE")
@Getter
@NoArgsConstructor
public class SampleEntity {
@Column(name = "GUID")
private String guid;
@Column(name = "USER_NAME")
private String userName;
@Column(name = "USER_EMAIL")
private String userEmail;
}
package com.sample.entity;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Data
@NoArgsConstructor @AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class SampleDTO {
private String guid;
private String userName;
private String userEmail;
}
위와 같이 Table 구조대로 각각의 파일이 생성되었습니다.
기본적인 틀을 생성시키고 그 외 추가적인 작업을 진행하시면 아주 편리하겠습니다.
원래 그냥 직접 타이핑 하였는데
개발속도를 쫌 올리고자 해당 기능을 사용하게 되었습니다.
제 groovy 스크립트는 아래 공유하도록 하겠습니다.
3. entity 생성 groovy 스크립트 공유!
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.entity;"
typeMapping = [
(~/(?i)int/) : "long",
(~/(?i)float|double|decimal|real/): "double",
(~/(?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) + "Entity"
def fields = calcFields(table)
def tableName = table.getName()
new File(dir, className + ".java").withPrintWriter { out -> generate(out, className, fields, tableName) }
}
def generate(out, className, fields, tableName) {
out.println "package $packageName"
out.println ""
out.println ""
out.println "import lombok.Getter;"
out.println "import lombok.NoArgsConstructor;"
out.println "import javax.persistence.*;"
out.println "import java.time.LocalDateTime;"
out.println ""
out.println ""
out.println "@Entity"
out.println "@Table(name = \"$tableName\")"
out.println "@Getter"
out.println "@NoArgsConstructor"
out.println "public class $className {"
out.println ""
fields.each() {
if (it.annos != "") out.println " ${it.annos}"
out.println " @Column(name = \"${it.column}\")"
out.println " private ${it.type} ${it.name};"
}
out.println ""
out.println "}"
}
def calcFields(table) {
DasUtil.getColumns(table).reduce([]) { fields, col ->
def spec = Case.LOWER.apply(col.getDasType().getSpecification())
def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
fields += [[
name : javaName(col.getName(), false),
type : typeStr,
column : col.getName(),
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]
}
@Table name과 @Column name을 DB 구조 그대로 작성해줄 수 있게 커스텀 했습니다.
생성하시고 그 외 어노테이션과 빌더 같은 부분을 직접 작성하시면 됩니다.
DTO 생성 스크립트는 엔티티 관련 어노테이션만 제거하여 사용하시면 될 것 같습니다.
'Tools > IntelliJ' 카테고리의 다른 글
[IntelliJ] Github, Third-party application access policy 설정하는 법 (0) | 2024.06.18 |
---|---|
[IntelliJ] java 파일 cannot find symbol 해결하기. (0) | 2024.04.03 |
[IntelliJ] VM options 최적 설정. (feat.내가쓰는) ver.2 (0) | 2024.03.05 |
[intelliJ] VCS 메뉴 재설정하기 (Git 또는 SVN 으로 변경) (2) | 2023.10.13 |
[IntelliJ] eclipse - Dynamic Web project 를 인텔리제이에 import 하기 (0) | 2023.09.07 |