ScanFilter
Windows/Linux 공통 개인정보 검출 라이브러리 리팩터링
섹션 제목: “Windows/Linux 공통 개인정보 검출 라이브러리 리팩터링”- 수행 기간: 2025.09–2026.10
- 개발 환경: C++17, Windows, Linux, CMake, PCRE2, DocuParser, OpenCV, ONNX Runtime
- 수행 업무: 레거시 SDK 재구성, 플랫폼 호환성 개선, OCR 통합·추상화, 빌드 및 의존성 정비
프로젝트 개요
섹션 제목: “프로젝트 개요”ScanFilter는 문서·이미지에서 텍스트를 추출하고 개인정보 패턴을 검사하는 C++ 네이티브 라이브러리입니다. C++ 애플리케이션에서 직접 호출하거나 Java에서 JNI를 통해 활용할 수 있습니다.
Linux 중심으로 개발된 기존 라이브러리를 Windows/Linux 공통 코드베이스로 재구성했습니다. 이후 문서 추출과 개인정보 검사, 설정·라이선스, OCR, 공통 로깅을 책임별로 분리하고 운영 환경별 호환성을 개선했습니다.
구조 개선: Before → After
섹션 제목: “구조 개선: Before → After”| 항목 | 기존 구조 | 개선 구조 |
|---|---|---|
| 코드 구성 | bluexray.cpp에 설정·라이선스·문서 추출·검사·결과 집계 집중 | Collector, Inspector, Setting, License 등으로 책임 분리 |
| 공개 API | bd_api_*, ST_PER_INFO 중심 | ScanFilter::init, getPlainText, scan* API |
| 설정 방식 | BLUEXRAY_HOME 및 INI 설정 | 호출자가 설정·라이선스 경로 지정, TOML 적용 |
| 검사 입력 | 파일 기반 처리 중심 | 파일·메모리 입력을 공통 inspectStream()으로 처리 |
| 플랫폼 지원 | Linux 중심의 플랫폼별 코드 | Windows/Linux 공통 로직과 OS별 입출력·링크 경계 분리 |
| OCR | 문서 본문 추출 중심 | BxrOCR 통합, PaddleOCR 및 Tesseract 백엔드 구성 |
| 빌드 구성 | 타깃별 옵션·의존성 분산 | CMake 공통 옵션 및 PUBLIC/PRIVATE 링크 의존성 정리 |
레거시 코드에서 공개 API, 설정·라이선스, 문서 추출, 검사 로직이 강하게 결합된 구조를 분석하고 기능 단위의 책임과 의존성을 재설계했습니다. 공통 검사 코어와 플랫폼별 입출력 경계를 분리해 Windows 지원, 메모리 입력 API 추가, OCR 백엔드 확장을 기존 검사 로직의 광범위한 변경 없이 진행할 수 있는 기반을 마련했습니다.
공통 라이브러리 구조
섹션 제목: “공통 라이브러리 구조”핵심 설계 1. Windows/Linux 호환성 경계 설계
섹션 제목: “핵심 설계 1. Windows/Linux 호환성 경계 설계”Windows 파일 시스템은 UTF-16 경로를 사용하지만, 일부 외부 문서 처리 API는 시스템 멀티바이트 문자열을 사용합니다. Linux 환경에서는 UTF-8 기반 바이트 경로를 사용하므로 한글 등 비ASCII 파일명에서 플랫폼 및 라이브러리별 처리 차이가 발생했습니다.
- 내부 경로 표현을 UTF-8 중심으로 정리하고
pathutil.hpp에 변환 처리 집중 - Windows 파일 시스템 접근 시 UTF-16, DocuParser 호출 시 시스템 멀티바이트 경로 사용
- Linux 문자열 변환·파일 경로·링크 설정 보정
- Windows OCR 이미지 로딩에 wide 경로 기반 파일 읽기와 OpenCV
imdecode적용 - UTF-8과 CP949 해석이 모호한 이미지 경로에 파일 읽기 결과를 활용한 대체 처리 구현
핵심 설계 2. CMake 및 외부 라이브러리 의존성 재구성
섹션 제목: “핵심 설계 2. CMake 및 외부 라이브러리 의존성 재구성”Windows DLL과 Linux .so를 동일한 소스에서 빌드하도록 CMake 구성을 정리하고, 외부 라이브러리와 플랫폼별 링크 차이를 반영했습니다.
- 반복되던 MSVC 옵션과 DLL·실행 파일 배치 규칙을 CMake 공통 함수로 구성
- Windows의 import library와 Linux 정적·공유 라이브러리 링크 경로 구분
- 공개 인터페이스에 필요한 의존성은
PUBLIC, 내부 구현용 의존성은PRIVATE으로 분리 - Boost 사용 부분을 표준 라이브러리 및 경량 라이브러리로 대체
- 정규식 엔진을 PCRE2로 정리하고 활성 빌드의 RE2·Abseil 의존성 제거
- Linux 파일명 대소문자, 문자열 변환 및 링크 오류 대응
- AddressSanitizer 빌드 옵션 및 개발용 성능 분석 도구 정비
핵심 설계 3. AI OCR 파이프라인 도입과 엔진 추상화
섹션 제목: “핵심 설계 3. AI OCR 파이프라인 도입과 엔진 추상화”문서 내부 이미지와 독립 이미지의 개인정보 검출 범위를 확대하기 위해 ONNX Runtime 기반 PaddleOCR 추론 파이프라인을 BxrOCR로 통합했습니다. 이후 OCR 구현을 공통 인터페이스와 백엔드로 분리해 ScanFilter의 호출 코드 변경 없이 엔진을 선택할 수 있도록 했습니다.
- PaddleOCR의 텍스트 검출·인식 모델을 ONNX Runtime CPU로 실행
- ONNX 및 YAML 모델 설정을 외부 파일로 관리하고 전처리·후처리에 반영
OcrEngine추상 인터페이스,PaddleEngine,TesseractEngine,OcrUtil분리BXR_OCR_BACKEND옵션으로 빌드 시 백엔드 선택- Tesseract 초기화 객체 재사용 및
unique_ptr기반 이미지 리소스 관리 - 문서 추출과 OCR의 공통 처리 시간·크기 제한 및 임시 파일 정리
- Windows OpenCV를 TIFF 디코딩 지원 빌드로 교체
핵심 설계 4. DLL 간 로깅 경계와 메모리 수명 관리
섹션 제목: “핵심 설계 4. DLL 간 로깅 경계와 메모리 수명 관리”여러 공유 라이브러리에서 사용하는 로그 기록을 BxrUtil 내부 API로 통합했습니다. 모듈별 로거의 설정 및 객체 소유 문제를 줄이고, 로그 설정 여부와 개인정보 검사 동작을 분리했습니다.
또한 PCRE2 컴파일 패턴과 매칭 데이터에 RAII 및 명시적인 해제를 적용하고, 메모리 오류를 진단할 수 있도록 AddressSanitizer 구성과 테스트·성능 측정 도구를 정비했습니다.
개발 결과
섹션 제목: “개발 결과”- Windows/Linux 공통 C++ 개인정보 검출 SDK의 모듈 구조 개선
- 설정·라이선스·문서 추출·검사 책임 분리 및 파일·메모리 공통 검사 API 제공
- 한글 파일 경로와 벤더 API 인코딩에 대한 플랫폼별 대응
- PaddleOCR와 Tesseract를 선택 가능한 OCR 계층으로 구성
- CMake 빌드 의존성·공통 로깅·메모리 관리 체계 개선