IT 일기장

[Java] MVC2 패턴 기본 CRUD 자동 파일 생성 본문

프로그래밍 언어/Java

[Java] MVC2 패턴 기본 CRUD 자동 파일 생성

뽕슈 2024. 11. 6. 10:20
반응형

SI 프로젝트 중간에 투입하면서 가장 곤란한 부분이 파일명과 Java 함수에 대한 명칭 등..

제대로 된 명명 규칙이 안 정해져 있을 때이다. 참고할 만한 용어정의서나 문서 같은 것들도 없다면

만들던가 아니면 번역기 돌려서 새로 만들던가.. 사소한데 쌓이면 시간을 여간 잡아먹는게 아니다.

 

어떤 프로젝트를 투입하든 바로바로 쓸 수 있는건.. 그 프로젝트들마다 규칙이 다르기 때문에 욕심이고

적어도 현재 프로젝트에서는 사용할 수 있도록 구현.. 이 프로젝트는 Impl를 사용하지 않았다.

 

 

 

/*

포탈 DB 테이블명과 컬럼명들을 쉼표로 구분해서 입력하면 Controller, Service, Mapper, xml 파일 생성

## 입력 예시

테이블명을 입력하세요 : bpp_por_test
컬럼명을 쉼표(,)로 구분하여 입력하세요 : pptSeq,pptSkin,pptSeq,pptName,pptMemo

## 출력 예시

BppPorTestController.java 파일이 생성됐습니다.
BppPorTestService.java 파일이 생성됐습니다.
BppPorTestMapper.java 파일이 생성됐습니다.
BppPorTest-mapper.xml 파일이 생성됐습니다.

## 공통 생성 코드 예시

Controller Annotation : @RestController, @RequestMapping
Controller 공통 RequestMapping : /portal/por/test
Controller PostMapping Name : count[BppPorTest], selectList[BppPorTest], select[BppPorTest], insert[BppPorTest], update[BppPorTest], delete[BppPorTest]
Controller 공통 매개변수 : @RequestBody Map<String, Object> map
Controller package : com.bizpack.portal.controller.por

Service Annotation : @Service, @Transactional
Service package : com.bizpack.portal.service.por

Mapper Annotation : @Mapper
Mapper package : com.bizpack.portal.mapper.por

BppPorBrd-mapper.xml : MyBatis이고 위에 작성한 함수들의 SELECT, INSERT, UPDATE. DELETE 기본 CRUD 세팅.
BppPorBrd-mapper namespace : com.bizpack.portal.mapper.por.BppPorTestMapper


## 참고

- 1번째로 입력하는 값은 기본키 or Seq여야 함

*/

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class UpGradeMyBatisSqlGenerator {

    private static final String BASE_PACKAGE = "com.bizpack.portal";  // 공통 패키지명
    private static final String BASE_PATH = "C:\\bizpack_dev\\bizpack\\src\\main\\java\\" + BASE_PACKAGE.replace(".", "\\");
    private static final String CONTROLLER_PATH = "controller";
    private static final String SERVICE_PATH = "service";
    private static final String MAPPER_PATH = "mapper";
    private static final String XML_PATH = "C:\\bizpack_dev\\bizpack\\src\\main\\resources\\mapper\\portal";

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("테이블명을 입력하세요 : ");
        String tableName = scanner.nextLine().trim();

        System.out.print("컬럼명을 쉼표(,)로 구분하여 입력하세요 : ");
        String columns = scanner.nextLine().trim();
        List<String> columnList = Arrays.asList(columns.split(","));
        String primaryColumn = columnList.get(0).trim();

        String className = convertToCamelCase(tableName, true);
        String packageName = extractPackageName(tableName);

        generateController(className, packageName);
        generateService(className, packageName);
        generateMapper(className, packageName);
        generateXmlFile(tableName, className, columnList, packageName, primaryColumn);
    }

    private static void generateController(String className, String packageName) {
        String fileName = BASE_PATH + "\\" + CONTROLLER_PATH + "\\" + packageName + "\\" + className + "Controller.java";
        String content = "package " + BASE_PACKAGE + ".controller." + packageName + ";\n\n"
                + "import org.springframework.web.bind.annotation.*;\n"
                + "import org.springframework.beans.factory.annotation.Autowired;\n"
                + "import java.util.Map;\n"
                + "import java.util.List;\n"
                + "import " + BASE_PACKAGE + ".service." + packageName + "." + className + "Service;\n\n"
                + "@RestController\n"
                + "@RequestMapping(\"/portal/" + packageName + "/" + decapitalize(className) + "\")\n"
                + "public class " + className + "Controller {\n\n"
                + "    @Autowired\n"
                + "    private final " + className + "Service " + decapitalize(className) + "Service;\n\n"
                + "    public " + className + "Controller(" + className + "Service " + decapitalize(className) + "Service) {\n"
                + "        this." + decapitalize(className) + "Service = " + decapitalize(className) + "Service;\n"
                + "    }\n\n"
                + generateControllerMethods(className)
                + "}\n";

        writeFile(fileName, content);
    }

    private static String generateControllerMethods(String className) {
        String[] methods = {"count", "selectList", "select", "insert", "update", "delete"};
        StringBuilder sb = new StringBuilder();
        for (String method : methods) {
            if (method.equals("selectList")) {
                sb.append("    @PostMapping(\"/").append(method).append(className).append("\")\n")
                  .append("    public List<Map<String, Object>> ").append(method).append(className).append("(@RequestBody Map<String, Object> map) {\n")
                  .append("        return ").append(decapitalize(className)).append("Service.").append(method).append(className).append("(map);\n")
                  .append("    }\n\n");
            } else if (method.equals("select")) {
                sb.append("    @PostMapping(\"/").append(method).append(className).append("\")\n")
                  .append("    public Map<String, Object> ").append(method).append(className).append("(@RequestBody Map<String, Object> map) {\n")
                  .append("        return ").append(decapitalize(className)).append("Service.").append(method).append(className).append("(map);\n")
                  .append("    }\n\n");
            } else {
                sb.append("    @PostMapping(\"/").append(method).append(className).append("\")\n")
                  .append("    public int ").append(method).append(className).append("(@RequestBody Map<String, Object> map) {\n")
                  .append("        return ").append(decapitalize(className)).append("Service.").append(method).append(className).append("(map);\n")
                  .append("    }\n\n");
            }
        }
        return sb.toString();
    }

    private static void generateService(String className, String packageName) {
        String fileName = BASE_PATH + "\\" + SERVICE_PATH + "\\" + packageName + "\\" + className + "Service.java";
        String content = "package " + BASE_PACKAGE + ".service." + packageName + ";\n\n"
                + "import org.springframework.beans.factory.annotation.Autowired;\n"
                + "import org.springframework.stereotype.Service;\n"
                + "import org.springframework.transaction.annotation.Transactional;\n"
                + "import java.util.Map;\n"
                + "import java.util.List;\n"
                + "import " + BASE_PACKAGE + ".mapper." + packageName + "." + className + "Mapper;\n\n"
                + "@Service\n"
                + "@Transactional\n"
                + "public class " + className + "Service {\n\n"
                + "    @Autowired\n"
                + "    private " + className + "Mapper " + decapitalize(className) + "Mapper;\n\n"
                + generateServiceMethods(className)
                + "}\n";

        writeFile(fileName, content);
    }

    private static String generateServiceMethods(String className) {
        String[] methods = {"count", "selectList", "select", "insert", "update", "delete"};
        StringBuilder sb = new StringBuilder();
        for (String method : methods) {
            if (method.equals("selectList")) {
                sb.append("    public List<Map<String, Object>> ").append(method).append(className).append("(Map<String, Object> map) {\n")
                  .append("        return null; // Implement\n")
                  .append("    }\n\n");
            } else if (method.equals("select")) {
                sb.append("    public Map<String, Object> ").append(method).append(className).append("(Map<String, Object> map) {\n")
                  .append("        return null; // Implement\n")
                  .append("    }\n\n");
            } else {
                sb.append("    public int ").append(method).append(className).append("(Map<String, Object> map) {\n")
                  .append("        return 0; // Implement\n")
                  .append("    }\n\n");
            }
        }
        return sb.toString();
    }

    private static void generateMapper(String className, String packageName) {
        String fileName = BASE_PATH + "\\" + MAPPER_PATH + "\\" + packageName + "\\" + className + "Mapper.java";
        String content = "package " + BASE_PACKAGE + ".mapper." + packageName + ";\n\n"
                + "import org.apache.ibatis.annotations.Mapper;\n"
                + "import java.util.Map;\n"
                + "import java.util.List;\n\n"
                + "@Mapper\n"
                + "public interface " + className + "Mapper {\n\n"
                + generateMapperMethods(className)
                + "}\n";

        writeFile(fileName, content);
    }

    private static String generateMapperMethods(String className) {
        String[] methods = {"count", "selectList", "select", "insert", "update", "delete"};
        StringBuilder sb = new StringBuilder();
        for (String method : methods) {
            if (method.equals("selectList")) {
                sb.append("    List<Map<String, Object>> ").append(method).append(className).append("(Map<String, Object> map);\n\n");
            } else if (method.equals("select")) {
                sb.append("    Map<String, Object> ").append(method).append(className).append("(Map<String, Object> map);\n\n");
            } else {
                sb.append("    int ").append(method).append(className).append("(Map<String, Object> map);\n\n");
            }
        }
        return sb.toString();
    }

    private static void generateXmlFile(String tableName, String className, List<String> columns, String packageName, String primaryColumn) {
        String fileName = XML_PATH + "\\" + packageName + "\\" + className + "-mapper.xml";
        String columnList = String.join(", ", columns);
        String content = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"
                + "<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n"
                + "<mapper namespace=\"" + BASE_PACKAGE + ".mapper." + packageName + "." + className + "Mapper\">\n\n"
                + generateXmlCrudStatements(tableName, className, columns, primaryColumn)
                + "</mapper>\n";

        writeFile(fileName, content);
    }

    private static String generateXmlCrudStatements(String tableName, String className, List<String> columns, String primaryColumn) {
        String columnList = String.join(", ", columns);
        StringBuilder sb = new StringBuilder();

        sb.append("    <select id=\"count").append(className).append("\" resultType=\"int\">\n")
          .append("        SELECT COUNT(*) FROM ").append(tableName).append("\n")
          .append("    </select>\n\n");

        sb.append("    <select id=\"selectList").append(className).append("\" resultType=\"map\">\n")
          .append("        SELECT ").append(columnList).append(" FROM ").append(tableName).append("\n")
          .append("    </select>\n\n");

        sb.append("    <select id=\"select").append(className).append("\" parameterType=\"map\" resultType=\"map\">\n")
          .append("        SELECT ").append(columnList).append(" FROM ").append(tableName).append(" WHERE ").append(primaryColumn).append(" = #{").append(primaryColumn).append("}\n")
          .append("    </select>\n\n");

        sb.append("    <insert id=\"insert").append(className).append("\" parameterType=\"map\">\n")
          .append("        INSERT INTO ").append(tableName).append(" (").append(columnList).append(")\n")
          .append("        VALUES (").append(generateParameterList(columns)).append(")\n")
          .append("    </insert>\n\n");

        sb.append("    <update id=\"update").append(className).append("\" parameterType=\"map\">\n")
          .append("        UPDATE ").append(tableName).append("\n")
          .append("        SET ").append(generateUpdateSet(columns)).append("\n")
          .append("        WHERE ").append(primaryColumn).append(" = #{").append(primaryColumn).append("}\n")
          .append("    </update>\n\n");

        sb.append("    <delete id=\"delete").append(className).append("\" parameterType=\"map\">\n")
          .append("        DELETE FROM ").append(tableName).append(" WHERE ").append(primaryColumn).append(" = #{").append(primaryColumn).append("}\n")
          .append("    </delete>\n\n");

        return sb.toString();
    }

    private static String generateParameterList(List<String> columns) {
        StringBuilder sb = new StringBuilder();
        for (String column : columns) {
            sb.append("#{").append(column.trim()).append("}, ");
        }
        return sb.substring(0, sb.length() - 2);
    }

    private static String generateUpdateSet(List<String> columns) {
        StringBuilder sb = new StringBuilder();
        for (String column : columns) {
            sb.append(column.trim()).append(" = #{").append(column.trim()).append("}, ");
        }
        return sb.substring(0, sb.length() - 2);
    }

    private static String convertToCamelCase(String text, boolean capitalizeFirst) {
        StringBuilder result = new StringBuilder();
        boolean capitalize = capitalizeFirst;
        for (char c : text.toCharArray()) {
            if (c == '_') {
                capitalize = true;
            } else if (capitalize) {
                result.append(Character.toUpperCase(c));
                capitalize = false;
            } else {
                result.append(Character.toLowerCase(c));
            }
        }
        return result.toString();
    }

    private static String extractPackageName(String tableName) {
        String[] parts = tableName.split("_");
        return parts.length > 0 ? parts[1] : "default";
    }

    private static String decapitalize(String text) {
        if (text == null || text.isEmpty()) {
            return text;
        }
        return Character.toLowerCase(text.charAt(0)) + text.substring(1);
    }

    private static void writeFile(String fileName, String content) {
        try {
            File file = new File(fileName);
            File directory = file.getParentFile();
            if (directory != null && !directory.exists()) {
                directory.mkdirs();
            }
            try (FileWriter writer = new FileWriter(file)) {
                writer.write(content);
                System.out.println(fileName + " 파일이 생성됐습니다.");
            }
        } catch (IOException e) {
            System.out.println(fileName + " 파일 생성 중 오류가 발생했습니다: " + e.getMessage());
        }
    }
}

 

 

 

 

반응형
Comments