티스토리 뷰

반응형

 

 

 



 

 

intellijidea

 

 

Spring JPA 프로젝트를 하다보면

DTO나 Entity 를 DB Table 정보에 맞게 작성해야 한다.

작은 규모일 때는 직접 작성해도 무방하지만 

규모가 커지거나 Table 컬럼정보가 너무 많을 경우 

너무너무나 귀찮다.

 

그래서 인텔리제이와 groovy script 를 가지고 이를 해결해보고자 한다.

 

 

 

 

 

 


1. 인텔리제이에 Database 연결하기

 

 

View - Tool windows - Database

 

 

 

 

연결할 Data Source 를 선택

 

 

 

 

사용하는 DB정보 입력

 

 

 

 

 

 

 

driver files 를 다운받고 Test Connection 을 성공 시키면 됩니다.

 

 

 

 

 

 

DB 연결 성공!

 

 

 

 

 

 

 

 

 

 


2. POJOs.groovy 스크립트 커스텀하여 실행

 

 

Database를 연결하면 Generate POJOs.groovy 스크립트가 생성됩니다.

위치와 접근방법은 아래와 같습니다.

 

 

1. project 트리하단으로 직접 접근

 

 

 

 

 

2. 데이터베이스에서 콘텍스트 메뉴 접근 또는 스크립트 실행

 

 

 

 

 

해당 위치에 groovy 스크립트가 존재하고

해당 스크립트를 커스텀해서 실행시키면 스크립트에 맞게 DB 정보를 가지고 파일을 생성합니다.

 

 

 

 

커스텀 해봄

 

 

 

저는 Entity 와 DTO 의 기본틀을 추출하는 groovy 스크립트를 커스텀 해보았습니다.

 

아래 SAMPLE 테이블을 제가 만든 

Generate POJOs_dto.groovyGenerate POJOs_entity.groovy 로 실행한 후

디렉토리를 지정한 위치에 아래와 같이 파일이 생성됩니다.

 

 

 

 

SAMPLE table

 

 

 

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 생성 스크립트는 엔티티 관련 어노테이션만 제거하여 사용하시면 될 것 같습니다.

 

 

 

 

 

 


 


 

 

 

 

 

 

 

 

 

 

 

[Spring Boot] Intellij를 이용한 Entity 자동 생성

[Spring Boot] 인텔리제이를 이용한 Entity 자동 생성 테이블 생성 후 해당 테이블과 맵핑 되는 Entity를 수동으로 만드는 작업이 지루하고 반복적인 일이 될 수 있다.Intellij를 이용하면 이부분을 자동

jink1982.tistory.com

 

 

 

 

반응형
댓글
반응형
최근에 올라온 글
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Total
Today
Yesterday