프로그램/Spring Boot
[Spring Boot] Intellij를 이용한 Entity 자동 생성
승미니1024
2023. 7. 15. 10:00
[Spring Boot] 인텔리제이를 이용한 Entity 자동 생성
테이블 생성 후 해당 테이블과 맵핑 되는 Entity를 수동으로 만드는 작업이 지루하고 반복적인 일이 될 수 있다.Intellij를 이용하면 이부분을 자동으로 생성 할 수 있어 지루함을 덜고 더 생산적인 업무를 진행할 수 있으니 알아보도록 하겠다.
[수행 환경]
Windows 10 IntelliJ 2020.3.4 MariaDB 10.11 java 11 gradle-7.6 |
[테이블 생성] |
CREATE TABLE `agree` ( `SEQ` int(11) NOT NULL AUTO_INCREMENT COMMENT '시퀀스', `MEM_ID` varchar(50) NOT NULL COMMENT '아이디', `PHONE` varchar(50) DEFAULT NULL COMMENT '전화번호', `EMAIL` varchar(50) DEFAULT NULL COMMENT '이메일', `CONTENTS_SEQ` int(11) NOT NULL COMMENT '동의서 컨텐츠 아이디', `AGREE_YN` varchar(1) DEFAULT NULL COMMENT '동의여부', `SYS_CREATE_DT` datetime DEFAULT current_timestamp() COMMENT '등록한시간', `SYS_CREATE_USR` varchar(50) NULL COMMENT '등록한사람', `SYS_UPDATE_DT` datetime DEFAULT current_timestamp() COMMENT '등록한시간', `SYS_UPDATE_USR` varchar(50) NULL COMMENT '수정한사람', PRIMARY KEY (`SEQ`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci; |
[Intellij에서 테이블 확인] |
[엔티티 자동생성 디렉토리 이동] |
[폴더 이동 이후 새로운 파일 생성] |
이동된 폴더에 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.main.service.data.entity;" typeMapping = [ (~/(?i)int/) : "long", (~/(?i)float|double|decimal|real/): "double", (~/(?i)datetime|timestamp/) : "LocalDateTime", (~/(?i)date/) : "LocalDateTime", (~/(?i)time/) : "LocalDateTime", (~/(?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 "import lombok.*;" out.println "import javax.persistence.*;" out.println "import java.time.LocalDateTime;" out.println "import java.math.BigDecimal;" out.println "" out.println "@Entity" out.println "@Getter" out.println "@Setter" out.println "@Builder" out.println "@NoArgsConstructor" out.println "@AllArgsConstructor" out.println "public class $className {" out.println "" fields.each() { out.println " /**" out.println " * " out.println " */" if (it.annos != "") out.println " ${it.annos}" 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.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 = co m.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] } |
[Entity 자동 생성 실행] |
[실행 후 확인] |
[생성된 Entity 확인] |
import lombok.*; import javax.persistence.*; import java.time.LocalDateTime; import java.math.BigDecimal; @Entity @Getter @Setter @Builder @NoArgsConstructor @AllArgsConstructor public class Agree { /** * */ private long seq; /** * */ private String memId; /** * */ private long contentsSeq; /** * */ private String agreeYn; /** * */ private LocalDateTime sysCreateDt; /** * */ private String sysCreateUsr; /** * */ private LocalDateTime sysUpdateDt; /** * */ private String sysUpdateUsr; } |
키 값 설정 애노테이션이 존재하지 않아 오류가 날 것이다. |
[생성된 Entity 수정] |
/** * */ @Id //<-- 해당 컬럼이 ID 임을 지정 @GeneratedValue(strategy = GenerationType.IDENTITY) //시퀀스 값을 DB로 부터 어떤 방식으로 가져올지 지정 private long seq; |
반응형