JAVA

[JAVA] 작성된 Class 정보 추출하기(엑셀 출력 추가)

최강깜시 2025. 5. 16. 17:50

Gradle에 추가

    implementation 'com.github.javaparser:javaparser-core:3.25.7'
    implementation 'org.apache.poi:poi:5.2.5'
    implementation 'org.apache.poi:poi-ooxml:5.2.5'

 

ClassDocExtractor.java

package com.company;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

import com.github.javaparser.StaticJavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.Modifier;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;

public class ClassDocExtractor {

    // 📊 Excel로 출력할 데이터 저장 리스트 (헤더 포함)
    private static final List<List<String>> excelData = new ArrayList<>();

    public static void main(String[] args) throws Exception {
        // Java 소스 파일 경로 (예시)
        File rootDir = new File("프로젝트경로/src/main/java");

        if (!rootDir.exists() || !rootDir.isDirectory()) {
            System.err.println("루트 디렉토리 경로가 잘못되었어요: " + rootDir.getAbsolutePath());
            return;
        }

        // 📋 엑셀 헤더 추가
        excelData.add(Arrays.asList("파일", "클래스명", "클래스 주석", "종류", "이름", "타입/반환타입", "접근제어자/파라미터", "주석"));

        // 🚀 재귀 탐색 시작
        scanDirectory(rootDir);

        // 📥 Excel로 저장
        ExcelWriter.writeToExcel(excelData, "class_doc_output.xlsx");
        System.out.println("✅ Excel 저장 완료: class_doc_output.xlsx");
    }

    private static void scanDirectory(File dir) {
        File[] files = dir.listFiles();
        if (files == null) return;

        for (File file : files) {
            if (file.isDirectory()) {
                scanDirectory(file); // 재귀적으로 디렉토리 탐색
            } else if (file.getName().endsWith(".java")) {
                parseJavaFile(file);
            }
        }
    }

    // 📄 Java 파일 파싱 및 클래스 정보 출력
    private static void parseJavaFile(File file) {
        try {
            CompilationUnit cu = StaticJavaParser.parse(file);

            cu.findAll(ClassOrInterfaceDeclaration.class).forEach(clazz -> {
                String className = clazz.getNameAsString();
                Optional<String> classComment = clazz.getComment().map(c -> c.getContent().trim());

                System.out.println("📂 파일: " + file.getPath());
                System.out.println("🧩 클래스명: " + className);
                System.out.println("📝 클래스 주석: " + classComment.orElse("(없음)"));

                // 📌 필드 정보
                clazz.getFields().forEach(field -> {
                    String fieldType = field.getElementType().asString();
                    field.getVariables().forEach(var -> {
                        String fieldName = var.getNameAsString();
                        Optional<String> fieldComment = field.getComment().map(c -> c.getContent().trim());
                        String modifiers = field.getModifiers().stream()
                                .map(Modifier::toString)
                                .reduce("", String::concat).trim();

                        System.out.println();
                        System.out.println("    📌 속성: " + fieldName);
                        System.out.println("    📎 타입: " + fieldType);
                        System.out.println("    🛡️ 접근제어자: " + modifiers);
                        System.out.println("    🗒️ 주석: " + fieldComment.orElse("(없음)"));
                        System.out.println("    ------------------------------");

                        // Excel 행 추가
                        excelData.add(Arrays.asList(
                                file.getPath(),
                                className,
                                classComment.orElse(""),
                                "필드",
                                fieldName,
                                fieldType,
                                "",
                                fieldComment.orElse("")
                        ));
                    });
                });

                // 🔍 메서드 정보 추출
                clazz.getMethods().forEach(method -> {
                    String methodName = method.getNameAsString();
                    String returnType = method.getType().asString();
                    String parameters = method.getParameters().toString(); // List 형태
                    Optional<String> methodComment = method.getComment().map(c -> c.getContent().trim());

                    System.out.println();
                    System.out.println("    🔧 메서드: " + methodName);
                    System.out.println("    🎯 반환타입: " + returnType);
                    System.out.println("    📦 파라미터: " + parameters);
                    System.out.println("    🗒️ 메서드 주석");
                    System.out.println("         " + methodComment.orElse("(없음)"));
                    System.out.println("    ------------------------------");

                    // Excel 행 추가
                    excelData.add(Arrays.asList(
                            file.getPath(),
                            className,
                            classComment.orElse(""),
                            "메서드",
                            methodName,
                            returnType,
                            parameters,
                            methodComment.orElse("")
                    ));
                });

                System.out.println("======================================");
            });

        } catch (Exception e) {
            System.err.println("❌ 파싱 실패: " + file.getPath());
            e.printStackTrace();
        }
    }

}

 

ExcelWriter.java

package com.company;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.util.List;

public class ExcelWriter {

    public static void writeToExcel(List<List<String>> rows, String filePath) throws Exception {
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("Class Documentation");

        // 스타일 지정 (선택사항)
        CellStyle headerStyle = workbook.createCellStyle();
        Font font = workbook.createFont();
        font.setBold(true);
        headerStyle.setFont(font);

        for (int i = 0; i < rows.size(); i++) {
            Row row = sheet.createRow(i);
            List<String> columns = rows.get(i);

            for (int j = 0; j < columns.size(); j++) {
                Cell cell = row.createCell(j);
                cell.setCellValue(columns.get(j));

                if (i == 0) cell.setCellStyle(headerStyle); // 첫 줄은 헤더
            }
        }

        // 자동 너비 조정
        for (int i = 0; i < rows.get(0).size(); i++) {
            sheet.autoSizeColumn(i);
        }

        try (FileOutputStream out = new FileOutputStream(filePath)) {
            workbook.write(out);
        }
        workbook.close();
    }
}

 

클래스 정보를 모두 추출한다. 주석까지...