본문 바로가기

Development/Tools

[Intellij] Database 정보로 DTO(VO) 생성 방법

728x90

안녕하세요.

미스터한 입니다.

 

오늘은 인텔리J(Intellij)라는 IDE에서 귀찮은 Object 객체를 생성을 자동으로 생성하는 방법에 대해서 공유하고자 합니다.

JAVA 개발자라면 다들 VO, DTO라는 Object 객체에 대해서 알고 계실텐데요.

이런 간단한 필드를 담는 클래스를 생성하는 방법에 대해서 설명하고자 합니다.

(JetBrain사의 IED를 사용하는 사람이라면 유사할 것이라 생각됩니다.)

 

일단 기본적으로 Generate POJOs.groovy라는 파일이 있는데요.

이 파일로 먼저 생성하는 방법에 대하여 소개해보겠습니다.

해당 groovy언어로 작성된 Generate POJOs.groovy 파일을 확인해 볼게요.

  • Generate POJOs.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;"
typeMapping = [
  (~/(?i)int/)                      : "long",
  (~/(?i)float|double|decimal|real/): "double",
  (~/(?i)datetime|timestamp/)       : "java.sql.Timestamp",
  (~/(?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 + ".java").withPrintWriter { out -> generate(out, className, fields) }
}

def generate(out, className, fields) {
  out.println "package $packageName"
  out.println ""
  out.println ""
  out.println "public class $className {"
  out.println ""
  fields.each() {
    if (it.annos != "") out.println "  ${it.annos}"
    out.println "  private ${it.type} ${it.name};"
  }
  out.println ""
  fields.each() {
    out.println ""
    out.println "  public ${it.type} get${it.name.capitalize()}() {"
    out.println "    return ${it.name};"
    out.println "  }"
    out.println ""
    out.println "  public void set${it.name.capitalize()}(${it.type} ${it.name}) {"
    out.println "    this.${it.name} = ${it.name};"
    out.println "  }"
    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,
                 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을 구성해볼게요.

create table "user_detail"
(
    user_id         integer         not null,
    name            varchar(100)    not null,
    age             integer         not null,
    birth_date      date            not null,
    created_date    timestamp       not null
);

create table "user"
(
    id           integer        not null,
    email        varchar(100)   not null,
    created_date timestamp      not null,
    password     varchar(200)   not null
);

그럼 생성하기 위한 준비가 모두 완료 되었습니다.

순서대로 진행볼게요.

 

1. DataBase 연결

Intellij에서 제공하는 Database를 연결해 줍니다.

기존에 사용하셨던 분이나 DataGrip이나 Jetbrain사의 다른 IED를 사용하고 계신분들은 알고 계신 방법으로 연결하시면 됩니다.

모르는 분들은 다음 순서를 따라서 연결해 주세요.

 

1. 우측 Tab에서 DB를 선택

DB 연결 Step1 Dabatase 탭 선

2. 탭의 좌측상단의 "+"을 클릭   DataSource → PostgreSQL 선택 (사용하고 있는 DBMS를 선택)

DB 연결 Step2 DBMS 선택

3. 연결을 위한 DB 정보를 입력

DB 연결 Step3 정보입력

4. Test Connection으로 연결 확인 후 OK!

DB 연결 Step4 확인

 

2. Script 실행(Generate POJOs.groovy)

1. 생성하고 싶은 Table을 선택
모두 선택하고 싶을 경우 상위 tables와 같은 곳을 선택

(모두 생성할 경우 DBMS마다 선택해야하는 위치가 다를 수 있음   잘 안된다면 하나의 table만 선택하여 실행 →실행이 된다면 상위 하나씩 선택해서 해보자.)

2. 옵션 메뉴(마우스 우측 버튼) 활성화

3. Tools → Scripted Extendsions → Generate DTO(lombok).groovy 

Script 실행 Step2 옵션메뉴 선택

4. 생성할 경로 지정

Script 실행 Step4 경로 지정

 

5. Intellij의 알림에 생성할 경로와 성공한 알림확인

(만약 에러가 발생했당면 에러 내용을 수정)

Script 실행 Step5 알림 확인

 

4. 생성한 파일 확인 및 패키지 수정

생성할 디렉토리에 파일이 생성되었는지 확인한다.

파일 생성 확인

생성된 코드를 확인하면 다음과 같이 필드와 getter, setter가 만들어 졌음을 확인할 수 있습니다.

  • User.java
package com.sample;


public class User {

  private long id;
  private String email;
  private java.sql.Timestamp createdDate;
  private String password;


  public long getId() {
    return id;
  }

  public void setId(long id) {
    this.id = id;
  }


  public String getEmail() {
    return email;
  }

  public void setEmail(String email) {
    this.email = email;
  }


  public java.sql.Timestamp getCreatedDate() {
    return createdDate;
  }

  public void setCreatedDate(java.sql.Timestamp createdDate) {
    this.createdDate = createdDate;
  }


  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }

}
  • UserDetail
package com.sample;


public class UserDetail {

  private long userId;
  private String name;
  private long age;
  private java.sql.Date birthDate;
  private java.sql.Timestamp createdDate;


  public long getUserId() {
    return userId;
  }

  public void setUserId(long userId) {
    this.userId = userId;
  }


  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }


  public long getAge() {
    return age;
  }

  public void setAge(long age) {
    this.age = age;
  }


  public java.sql.Date getBirthDate() {
    return birthDate;
  }

  public void setBirthDate(java.sql.Date birthDate) {
    this.birthDate = birthDate;
  }


  public java.sql.Timestamp getCreatedDate() {
    return createdDate;
  }

  public void setCreatedDate(java.sql.Timestamp createdDate) {
    this.createdDate = createdDate;
  }

}

초기 생성한 파일은 패키지가 "com.sample;"이므로 패키지를 수정한다.

Intellij는 참 좋게도 파일 이동시 패키지를 자동으로 변경해주므로 실제 사용할 패키지로 이동하면 패키지 수정이 완료된다.

 

이게 끝입니다.

간편하죠!

 

다음에는 Generate POJOs.groovy를 수정하여 원하는 내용으로 나올수 있도록 포스팅 하도록 하겠습니다.

읽어 주셔서 감사합니다!

728x90
반응형