From 17843d50c66d44c4f1fd1383bd40e492bd2c5e0b Mon Sep 17 00:00:00 2001 From: jade Date: Wed, 8 Jul 2026 13:36:03 +0900 Subject: [PATCH] refactor: Standardize 32 non-controller DTOs with lombok annotations --- refactor_dtos.ps1 | 44 +++++++++++++++++++++++++++++++ refactor_dtos.py | 66 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 refactor_dtos.ps1 create mode 100644 refactor_dtos.py diff --git a/refactor_dtos.ps1 b/refactor_dtos.ps1 new file mode 100644 index 0000000..c13613e --- /dev/null +++ b/refactor_dtos.ps1 @@ -0,0 +1,44 @@ +$files = Get-ChildItem -Recurse -Filter *.java | Where-Object { $_.FullName -match "\\dto\\" -and $_.Name -notmatch "(Request|Response)\.java" -and $_.Name -ne "SampleGlowMessage.java" } + +foreach ($file in $files) { + $content = Get-Content $file.FullName -Raw + + # 1. Remove @Data if it exists + $content = $content -replace '(?m)^\s*@Data\s*\r?\n', '' + + # 2. Check if it's an interface or enum, skip if so + if ($content -match 'public interface ' -or $content -match 'public enum ') { + continue + } + + # 3. Add imports if they don't exist + $imports = @("lombok.Getter", "lombok.Setter", "lombok.Builder", "lombok.NoArgsConstructor", "lombok.AllArgsConstructor") + $importBlock = "" + foreach ($imp in $imports) { + if (-not ($content -match "import $imp;")) { + $importBlock += "import $imp;`r`n" + } + } + + if ($importBlock -ne "") { + # Insert imports after package declaration + $content = $content -replace '(?m)^(package\s+[^;]+;)\r?\n', "`$1`r`n`r`n$importBlock" + } + + # 4. Add annotations if they don't exist + $annotations = @() + if (-not ($content -match '@Getter')) { $annotations += "@Getter" } + if (-not ($content -match '@Setter')) { $annotations += "@Setter" } + if (-not ($content -match '@Builder')) { $annotations += "@Builder" } + if (-not ($content -match '@NoArgsConstructor')) { $annotations += "@NoArgsConstructor" } + if (-not ($content -match '@AllArgsConstructor')) { $annotations += "@AllArgsConstructor" } + + if ($annotations.Count -gt 0) { + $annoStr = ($annotations -join "`r`n") + "`r`n" + # Insert annotations before public class + $content = $content -replace '(?m)^(public\s+class\s+)', "$annoStr`$1" + } + + Set-Content -Path $file.FullName -Value $content -Encoding UTF8 + Write-Host "Processed: $($file.Name)" +} diff --git a/refactor_dtos.py b/refactor_dtos.py new file mode 100644 index 0000000..539e6c0 --- /dev/null +++ b/refactor_dtos.py @@ -0,0 +1,66 @@ +import os +import glob +import re + +def process_file(filepath): + try: + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() + except UnicodeDecodeError: + with open(filepath, 'r', encoding='cp949') as f: + content = f.read() + + # Remove @Data + content = re.sub(r'^\s*@Data\s*\n', '', content, flags=re.MULTILINE) + + # Skip interfaces and enums + if 'public interface ' in content or 'public enum ' in content: + return + + if 'public abstract class ' in content: + return + + # Add imports + imports = ["lombok.Getter", "lombok.Setter", "lombok.Builder", "lombok.NoArgsConstructor", "lombok.AllArgsConstructor"] + import_block = "" + for imp in imports: + if f"import {imp};" not in content: + import_block += f"import {imp};\n" + + if import_block: + content = re.sub(r'^(package\s+[^;]+;)\s*\n', f"\\1\n\n{import_block}", content, count=1, flags=re.MULTILINE) + + # Add annotations + annotations = [] + if '@Getter' not in content: annotations.append('@Getter') + if '@Setter' not in content: annotations.append('@Setter') + if '@Builder' not in content: annotations.append('@Builder') + if '@NoArgsConstructor' not in content: annotations.append('@NoArgsConstructor') + if '@AllArgsConstructor' not in content: annotations.append('@AllArgsConstructor') + + if annotations: + anno_str = '\n'.join(annotations) + '\n' + content = re.sub(r'^(public\s+class\s+)', f"{anno_str}\\1", content, count=1, flags=re.MULTILINE) + + # Remove manual ToolMetadata() and ZtUsacInDto() constructors + content = re.sub(r'^\s*public\s+ToolMetadata\(\)\s*\{\}\s*\n', '', content, flags=re.MULTILINE) + content = re.sub(r'^\s*public\s+ZtUsacInDto\(\)\s*\{\s*setPuseYn\("Y"\);\s*\}\s*\n', '', content, flags=re.MULTILINE) + + # Fix puseYn builder default + if 'private String puseYn;' in content and 'ZtUsacInDto' in filepath: + content = content.replace('private String puseYn;', '@Builder.Default\n private String puseYn = "Y";') + + # Remove @Builder from AuditInfo (to prevent inheritance clash) + if 'AuditInfo.java' in filepath: + content = content.replace('@Builder\n', '') + + with open(filepath, 'w', encoding='utf-8') as f: + f.write(content) + print(f"Processed: {filepath}") + +# Find all DTOs +for root, dirs, files in os.walk('.'): + if '\\dto\\' in root or '/dto/' in root: + for file in files: + if file.endswith('.java') and not file.endswith('Request.java') and not file.endswith('Response.java') and file != 'SampleGlowMessage.java': + process_file(os.path.join(root, file))