Java Spring Boot 프로젝트 암호화 자동 적용 도구
ApplyCrypto는 Java Spring Boot 기반 레거시 시스템에서 민감한 개인정보를 데이터베이스에 암호화하여 저장하도록 소스 코드를 자동으로 분석하고 수정하는 AI 기반 개발 도구입니다.
ApplyCrypto는 계층형 아키텍처로 설계되어 있으며, 각 레이어는 명확한 책임을 가집니다. 아래 다이어그램은 전체 시스템 구조를 시각화합니다.
주요 컴포넌트 및 레이어:
다이어그램은 8개의 주요 레이어로 구성되어 있으며, 각 레이어는 명확한 책임을 가집니다:
-
CLI Layer - 사용자 인터페이스 및 명령어 처리
CLIController: analyze, list, modify 명령어를 파싱하고 실행- 모든 하위 레이어를 조율하여 전체 워크플로우 관리
-
Configuration Layer - 설정 관리
ConfigurationManager: JSON 설정 파일 로드, 스키마 검증, 타입 안전한 설정값 제공ConfigMigration: 기존 설정 파일 마이그레이션 유틸리티- 프로젝트 경로, 파일 타입, SQL 래핑 타입, 암호화 대상 테이블/칼럼 정보 관리
- Framework Type, SQL Wrapping Type, Modification Type 설정 지원
-
Collection Layer - 소스 파일 수집
SourceFileCollector: 프로젝트 내 소스 파일을 재귀적으로 탐색하고 메타데이터 추출- 제외 디렉터리/파일 패턴 필터링, 중복 제거, 제너레이터 패턴으로 메모리 효율성 확보
-
Parsing Layer - 소스 코드 파싱
JavaASTParser: tree-sitter를 사용하여 Java 소스 코드를 AST로 파싱, 클래스/메서드 정보 추출XMLMapperParser: lxml을 사용하여 MyBatis Mapper XML 파일 파싱, SQL 쿼리 및 테이블/칼럼 정보 추출CallGraphBuilder: NetworkX를 사용하여 메서드 호출 관계 그래프 생성, 클래스 정보 맵 관리EndpointExtractionStrategy: Framework Type별 엔드포인트 추출 전략 (Strategy 패턴)SpringMVCEndpointExtraction: Spring MVC 프레임워크용 엔드포인트 추출AnyframeSarangOnEndpointExtraction: Anyframe SarangOn 프레임워크용 엔드포인트 추출
-
Analysis Layer - DB 접근 패턴 분석
DBAccessAnalyzer: 설정된 테이블/칼럼에 접근하는 소스 파일 식별SQLExtractor: SQL Wrapping Type별 SQL 추출 전략 (Strategy 패턴)MyBatisSQLExtractor: MyBatis XML Mapper에서 SQL 추출JDBCSQLExtractor: Java 소스 코드에서 JDBC SQL 추출JPASQLExtractor: JPA Entity 및 JPQL에서 SQL 추출AnyframeJDBCSQLExtractor: Anyframe 프레임워크의 StringBuilder 기반 JDBC SQL 추출
LLMSQLExtractor: LLM 기반 SQL 추출 (공통 유틸리티)- Call Graph를 역추적하여 Controller → Service → DAO → Mapper 레이어 경로 추적
-
Modification Layer - 코드 자동 수정
CodeModifier: LLM을 활용한 암호화 코드 자동 삽입의 메인 오케스트레이터BaseCodeGenerator: 코드 생성 추상 클래스ControllerOrServiceCodeGenerator: Controller/Service 레이어 코드 생성TypeHandlerCodeGenerator: MyBatis TypeHandler 코드 생성ServiceImplOrBizCodeGenerator: ServiceImpl/Biz 레이어 코드 생성
ContextGenerator: 수정 컨텍스트 배치 생성 및 관리BatchProcessor: 대량 파일을 효율적으로 처리하기 위한 배치 최적화CodePatcher: LLM 응답을 unified diff 형식으로 파싱하여 실제 코드 변경 적용ErrorHandler: 자동 재시도, 백업/롤백 기능 제공ResultTracker: 수정 이력 추적 및 통계 수집PromptTemplateManager: 레이어별 최적화된 LLM 프롬프트 템플릿 관리
-
LLM Layer - AI 모델 연동
LLMProvider: 추상 인터페이스 (call, validate_response, get_provider_name)LLMFactory: 설정에 따라 적절한 LLM 프로바이더 생성WatsonXAIProvider,OpenAIProvider,ClaudeAIProvider: 다양한 LLM 프로바이더 구현
-
Persistence Layer - 데이터 영속화
DataPersistenceManager: 분석 결과를 JSON 형식으로 직렬화/역직렬화CacheManager: 파싱 결과를 캐싱하여 성능 최적화
컴포넌트 간 의존성 흐름:
다이어그램에서 표현된 주요 의존성 관계:
- CLI → 모든 레이어:
CLIController는 모든 주요 컴포넌트를 조율하여 전체 워크플로우를 관리합니다 - Collection → Config: 설정 기반 파일 필터링 및 수집
- Parsing → Cache: 파싱 결과 캐싱으로 성능 최적화
- Analysis → Parsing: 파싱 결과를 활용하여 DB 접근 경로 추적
- Modification → LLM: LLM Layer를 통해 AI 기반 코드 수정 수행
- Persistence → Models: 모든 데이터 모델을 JSON 형식으로 영속화
주요 설계 패턴:
- 전략 패턴:
- LLM Provider 인터페이스를 통한 다양한 AI 모델 지원
- Framework Type별 엔드포인트 추출 전략 (
EndpointExtractionStrategy) - SQL Wrapping Type별 SQL 추출 전략 (
SQLExtractor) - Modification Type별 코드 생성 전략 (
BaseCodeGenerator하위 클래스)
- 팩토리 패턴:
- LLMFactory를 통한 프로바이더 생성
- EndpointExtractionStrategyFactory, SQLExtractorFactory, CodeGeneratorFactory
- 캐싱 패턴: CacheManager를 통한 파싱 결과 재사용
- 템플릿 패턴: PromptTemplateManager를 통한 프롬프트 관리
주요 클래스 및 패키지:
다이어그램은 패키지별로 클래스를 그룹화하여 구조를 명확히 표현합니다:
CLI 패키지:
CLIController: CLI 명령어 파싱 및 실행, analyze/list/modify 핸들러 제공
Config 패키지:
ConfigurationManager: JSON 설정 파일 관리, 스키마 검증, 프로젝트 설정 제공ConfigurationError: 설정 관련 예외 처리
Collector 패키지:
SourceFileCollector: 소스 파일 수집 및 메타데이터 추출
Parser 패키지:
JavaASTParser: Java AST 파싱, 클래스/메서드 정보 추출ClassInfo: 파싱된 클래스 정보 저장XMLMapperParser: MyBatis XML 파싱, SQL 쿼리 정보 추출SQLQuery: SQL 쿼리 정보 저장CallGraphBuilder: Call Graph 생성, 호출 체인 추적, 클래스 정보 맵 관리Endpoint: REST API 엔드포인트 정보 저장EndpointExtractionStrategy: Framework Type별 엔드포인트 추출 전략 (Strategy 패턴)SpringMVCEndpointExtraction: Spring MVC 프레임워크용 엔드포인트 추출AnyframeSarangOnEndpointExtraction: Anyframe SarangOn 프레임워크용 엔드포인트 추출
Analyzer 패키지:
DBAccessAnalyzer: DB 접근 패턴 분석, Call Graph 역추적SQLExtractor: SQL Wrapping Type별 SQL 추출 전략 (Strategy 패턴)MyBatisSQLExtractor: MyBatis XML Mapper에서 SQL 추출JDBCSQLExtractor: Java 소스 코드에서 JDBC SQL 추출JPASQLExtractor: JPA Entity 및 JPQL에서 SQL 추출AnyframeJDBCSQLExtractor: Anyframe 프레임워크의 StringBuilder 기반 JDBC SQL 추출
LLMSQLExtractor: LLM 기반 SQL 추출 (공통 유틸리티)
Modifier 패키지:
CodeModifier: LLM 기반 코드 수정 오케스트레이션BaseCodeGenerator: 코드 생성 추상 클래스ControllerOrServiceCodeGenerator: Controller/Service 레이어 코드 생성TypeHandlerCodeGenerator: MyBatis TypeHandler 코드 생성ServiceImplOrBizCodeGenerator: ServiceImpl/Biz 레이어 코드 생성
ContextGenerator: 수정 컨텍스트 배치 생성 및 관리BatchProcessor: 배치 처리 최적화CodePatcher: 코드 패치 적용 및 검증ErrorHandler: 오류 처리 및 재시도ResultTracker: 수정 이력 추적PromptTemplateManager: 프롬프트 템플릿 관리
LLM 패키지:
LLMProvider: 추상 기본 클래스LLMFactory: 프로바이더 팩토리WatsonXAIProvider,OpenAIProvider,ClaudeAIProvider: 구체적인 LLM 구현
Persistence 패키지:
DataPersistenceManager: 데이터 영속화 관리CacheManager: 캐시 관리
Models 패키지:
SourceFile: 소스 파일 메타데이터TableAccessInfo: 테이블 접근 정보Method,Parameter: 메서드 정보CallRelation: 메서드 호출 관계ModificationRecord: 수정 이력 기록
주요 클래스 관계 및 설계 패턴:
다이어그램에서 표현된 클래스 간 관계:
-
의존성 관계 (→)
CLIController→ 모든 주요 컴포넌트: 전체 워크플로우 조율DBAccessAnalyzer→CallGraphBuilder,XMLMapperParser,JavaASTParser: DB 접근 경로 분석CodeModifier→LLMProvider,BatchProcessor,CodePatcher: 코드 수정 오케스트레이션DataPersistenceManager→ 모든 Models: 데이터 영속화
-
생성 관계 (creates)
SourceFileCollector→SourceFile: 소스 파일 메타데이터 생성JavaASTParser→Method,CallRelation: 파싱 결과 생성XMLMapperParser→TableAccessInfo: 테이블 접근 정보 생성ResultTracker→ModificationRecord: 수정 이력 기록 생성
-
구현 관계 (..|>)
WatsonXAIProvider,OpenAIProvider,ClaudeAIProvider..|>LLMProvider: 전략 패턴 구현
-
포함 관계 (contains)
Method→Parameter: 메서드가 파라미터를 포함
설계 원칙:
- 단일 책임 원칙: 각 클래스는 하나의 명확한 책임을 가집니다
- 의존성 역전 원칙: 추상 인터페이스(
LLMProvider)를 통한 의존성 주입 - 개방-폐쇄 원칙: 새로운 LLM 프로바이더 추가 시 기존 코드 수정 없이 확장 가능
- 관심사의 분리: 레이어별로 명확히 분리된 책임
./scripts/setup.ps1.\venv\Scripts\activate # 가상환경 실행
# 템플릿 초기화 (최초 1회 및 템플릿 변경 시 실행)
python initialize_template.py
applycrypto --help# 모든 테스트 실행
pytest
# 커버리지 포함 테스트
pytest --cov=src --cov-report=htmlsamsung-life/
├── src/
│ ├── cli/ # CLI 인터페이스
│ │ └── cli_controller.py
│ ├── config/ # 설정 관리
│ │ └── config_manager.py
│ ├── collector/ # 소스 파일 수집
│ │ └── source_file_collector.py
│ ├── parser/ # 코드 파싱
│ │ ├── java_ast_parser.py
│ │ ├── xml_mapper_parser.py
│ │ ├── call_graph_builder.py
│ │ └── endpoint_strategy/ # 엔드포인트 추출 전략
│ │ ├── endpoint_extraction_strategy.py
│ │ ├── spring_mvc_endpoint_extraction.py
│ │ └── anyframe_sarangon_endpoint_extraction.py
│ ├── analyzer/ # DB 접근 분석
│ │ ├── db_access_analyzer.py
│ │ ├── sql_extractor.py
│ │ ├── sql_extractor_factory.py
│ │ └── sql_extractors/ # SQL 추출 전략
│ │ ├── mybatis_sql_extractor.py
│ │ ├── jdbc_sql_extractor.py
│ │ ├── jpa_sql_extractor.py
│ │ └── anyframe_jdbc_sql_extractor.py
│ ├── modifier/ # 코드 수정
│ │ ├── code_modifier.py
│ │ ├── context_generator.py
│ │ ├── batch_processor.py
│ │ ├── code_patcher.py
│ │ ├── error_handler.py
│ │ ├── result_tracker.py
│ │ ├── prompt_template_manager.py
│ │ ├── code_generator/ # 코드 생성기
│ │ │ ├── base_code_generator.py
│ │ │ ├── code_generator_factory.py
│ │ │ ├── controller_service_type/
│ │ │ ├── serviceimpl_biz_type/
│ │ │ └── typehandler_type/
│ │ └── llm/ # LLM 프로바이더
│ │ ├── llm_provider.py
│ │ ├── llm_factory.py
│ │ ├── watsonx_provider.py
│ │ ├── openai_provider.py
│ │ └── claude_ai_provider.py
│ ├── persistence/ # 데이터 영속화
│ │ ├── data_persistence_manager.py
│ │ ├── cache_manager.py
│ │ ├── json_encoder.py
│ │ ├── json_decoder.py
│ │ └── schemas.py
│ └── models/ # 데이터 모델
│ ├── source_file.py
│ ├── table_access_info.py
│ ├── method.py
│ ├── call_relation.py
│ └── modification_record.py
├── docs/ # 문서 및 다이어그램
│ ├── component_diagram.puml # 컴포넌트 다이어그램 소스
│ ├── component_diagram.png # 컴포넌트 다이어그램 이미지
│ ├── class_diagram.puml # 클래스 다이어그램 소스
│ ├── class_diagram.png # 클래스 다이어그램 이미지
│ ├── render_diagrams.py # Python 렌더링 스크립트
│ └── render_diagrams.sh # Bash 렌더링 스크립트
├── tests/ # 테스트 코드
├── main.py # CLI 진입점
├── config.example.json # 예제 설정 파일
├── requirements.txt
├── pyproject.toml
└── README.md
- 소스 파일 수집: 설정된 확장자(.java, .xml 등)의 모든 소스 파일을 재귀적으로 탐색
- Java AST 파싱: tree-sitter를 사용하여 Java 소스 코드를 파싱하고 클래스/메서드 정보 추출
- XML Mapper 파싱: MyBatis Mapper XML 파일에서 SQL 쿼리 및 테이블/칼럼 정보 추출
- Call Graph 생성: 메서드 호출 관계를 그래프로 구성하고 REST API 엔드포인트 식별
- DB 접근 분석: 설정된 테이블/칼럼에 접근하는 파일을 Call Graph 역추적을 통해 식별
- 소스 파일 목록: 수집된 모든 소스 파일 조회
- DB 접근 정보: 테이블별 접근 파일 목록 및 상세 정보
- 엔드포인트 목록: 식별된 REST API 엔드포인트 목록
- 호출 그래프: 특정 엔드포인트의 메서드 호출 체인 시각화
- 수정 이력: 암호화 코드가 적용된 파일 목록
- 자동 코드 삽입: LLM을 활용하여 식별된 파일에 암호화/복호화 코드 자동 삽입
- 레이어별 처리: Controller, Service, DAO, Mapper 레이어별로 최적화된 코드 수정
- 배치 처리: 대량 파일을 효율적으로 처리하기 위한 배치 최적화
- Dry-run 모드: 실제 수정 없이 미리보기만 수행
- 오류 처리: 자동 재시도 및 롤백 기능
- 설정 파일 준비:
config.json에 암호화 대상 테이블/칼럼 정보 설정 - 프로젝트 분석:
analyze명령어로 소스 파일 수집 및 DB 접근 패턴 분석 - 결과 확인:
list명령어로 분석 결과 확인 - 코드 수정:
modify명령어로 암호화 코드 자동 적용 (dry-run 모드로 먼저 확인 가능)
# 프로젝트 분석
python main.py analyze --config config.json
# 모든 소스 파일 목록 조회
python main.py list --all
# 테이블별 접근 파일 목록 조회
python main.py list --db
# REST API 엔드포인트 목록 조회
python main.py list --endpoint
# 특정 엔드포인트의 호출 그래프 조회
python main.py list --callgraph EmpController.login
# 수정된 파일 목록 조회
python main.py list --modified
# 파일 수정 (미리보기)
python main.py modify --config config.json --dry-run
# 파일 수정 (실제 수정)
python main.py modify --config config.json{
"target_project": "/path/to/spring-boot-project",
"source_file_types": [".java", ".xml"],
"framework_type": "SpringMVC",
"sql_wrapping_type": "mybatis",
"modification_type": "ControllerOrService",
"llm_provider": "watsonx_ai",
"access_tables": [
{
"table_name": "employee",
"columns": [
{"name": "ssn", "new_column": false},
{"name": "phone", "new_column": false},
{"name": "email", "new_column": false}
]
}
],
"exclude_dirs": ["test", "generated"],
"exclude_files": ["*Test.java", "*_test.java"]
}주요 설정 필드:
framework_type: 프레임워크 타입 (SpringMVC, AnyframeSarangOn 등)sql_wrapping_type: SQL 래핑 기술 (mybatis, jdbc, jpa)modification_type: 코드 수정 방식 (TypeHandler, ControllerOrService, ServiceImplOrBiz)llm_provider: LLM 프로바이더 (watsonx_ai, openai, claude_ai)
자세한 설정 가이드는 설정 파일 가이드를 참조하세요.
from config.config_manager import ConfigurationManager
from collector.source_file_collector import SourceFileCollector
from analyzer.db_access_analyzer import DBAccessAnalyzer
# 설정 파일 로드
config_manager = ConfigurationManager("config.json")
# 소스 파일 수집
collector = SourceFileCollector(config_manager)
source_files = list(collector.collect())
# DB 접근 분석
analyzer = DBAccessAnalyzer(config_manager)
table_access_info = analyzer.analyze(source_files)- 언어: Python 3.13+
- 파싱: tree-sitter (Java AST 파싱), lxml (XML 파싱)
- 그래프 분석: NetworkX (Call Graph 구성)
- AI 모델: WatsonX.AI, OpenAI, Claude AI
- 데이터 직렬화: JSON with custom encoder/decoder
커밋하기 전에 scripts/lint.ps1 실행하여 린팅
./scripts/lint.ps1./scripts/download_wheels.ps1
