개발자의 길

Intellij 에서 JPA 용 Mysql -> Entity 클래스 파일 자동 생성 본문

4. JAVA

Intellij 에서 JPA 용 Mysql -> Entity 클래스 파일 자동 생성

자르르 2024. 6. 4. 10:24


 

jpa 로 프로젝트를 시작할 때, 

 

먼저 jpa 의 entity 파일로 db 구조를 짜서, 자동으로 db에 create table 하는 방식은 쉽게 옵션으로 가능하다.

 

하지만 이미 짜여진 db 구조를 가지고 반대로 jpa entity 파일을 만들려고 하면, 노가다를 할 수 밖에 없다.

 

컬럼이 한두개면 괜찮지만, 너무 많은 컬럼과 테이블이 있으면, 이걸 하나하나 하기도 번거롭고, 오타도 많이 발생한다.

 

그래서 자동 생성을 찾아보던 중에 발견한 방법이다.

 

우선 나는 mysql 로만 테스트를 진행해봤다.

 

intellij 에서 mysql 연결을 먼저 한다.(오른쪽 사이드에 위치)

 

 

intellij 로 프로젝트를 진행 한다 하면, 왼쪽 프로젝트 하단에 Scratches and Consoles 이 보일것이다.

 

Scratches and Consoles > Extensions > Database Tools and SQL > schema

안에 보면, Generate POJOs.groovy 파일을 열어보자

 

이 안에 내용을 기반으로 약간 수정하여 입맛에 맞게 수정하였다.(아래에 내용 첨부)

 

다시 처음으로 돌아와서

 

mysql 연결된  db 안에 원하는 테이블을 마우스 오른쪽 클릭

 

 

 

나는 Generate POJOs_entity.groovy 라고 만들었다. 그러면

 

결과로

import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.time.LocalDateTime;


@Entity
@Table(name = "demo_board")
@Getter
@NoArgsConstructor
public class DemoBoardEntity {

  @Column(name = "board_id")
  private Integer boardId;

  @Column(name = "title")
  private String title;

  @Column(name = "contents")
  private String contents;

  @Column(name = "add_account_id")
  private Integer addAccountId;

  @Column(name = "add_date")
  private LocalDateTime addDate;

  @Column(name = "mod_date")
  private LocalDateTime modDate;

  @Column(name = "del_yn")
  private String delYn;

  @Column(name = "del_date")
  private LocalDateTime delDate;


}

 

이런식으로 Entity가 자동으로 만들어 진다.

 

이제 내가 만든 Generate 파일을 올리겠다. 알아서, 커스텀해서 쓰길.,,

 

파일명 : Generate POJOs_entity.groovy

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

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

packageName = "com.test.entity;"
typeMapping = [
  (~/(?i)int/)                      : "Integer",
  (~/(?i)float|double|decimal|real/): "Float",
  (~/(?i)datetime|timestamp|time/)  : "LocalDateTime",
  (~/(?i)date/)                     : "LocalDate",
  (~/(?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 ""
  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,
                 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]
}

 

 

 



이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공유하기 링크
Comments