#Backend

Java 디컴파일러로 운영 서버와 형상관리 소스의 불일치를 해소하다

Java 디컴파일러로 운영 서버와 형상관리 소스의 불일치를 해소하다
01

Summary

10년 묵은 올리브영 레거시, '디컴파일러'와 'AI'로 코드 불일치 99% 해결한 비결

형상관리와 실서버 소스가 따로 놀 때, 시니어 개발자가 AI 분석 파이프라인으로 '단일 진실 공급원'을 되찾는 4단계 가이드

운영 서버 직접 수정과 레거시 배포 프로세스로 인해 소스 코드가 어긋나는 현상은 대형 시스템의 고질적인 문제입니다. 이 아티클은 올리브영 백오피스 개발팀이 여러 Java 디컴파일 기술과 AI 비교 파이프라인을 영리하게 결합하여, 가독성 저하나 로직 오류 없이 실서버 실행 코드와 형상관리 서버의 정합성을 완벽하게 일치시킨 생생한 트러블슈팅 과정을 다룹니다.

  • 01ANT 증분 배포 및 직접 파일 주입이 유발하는 형상 불일치와 장애 패턴 정밀 분석
  • 02JAD, CFR, Fernflower 등 디컴파일러별 코드 추론 특징과 한계 비교 검토
  • 03디컴파일, 포맷팅, AI 위험도 분석으로 이어지는 효율적인 일괄 검증 파이프라인 설계
  • 04재컴파일 클래스의 MD5/SHA-256 해시값 및 바이트코드 대조를 통한 안정성 확보
  • 05소스 동기화 완수 후 빌드 도구 현대화 및 SFTP 통제 등의 근본적 재발 방지책 수립

RECOMMENDATION

장기간 서비스하며 이력이 파편화된 대규모 자바 레거시 시스템을 리팩토링하거나, 마이그레이션 전 실서버 소스코드 정합성을 안전하게 복구해야 하는 플랫폼 엔지니어들에게 적극 추천합니다.

The Problem

10년 넘게 운영된 올리브영 백오피스 ERP 시스템에서 ANT 증분 배포의 누락과 SFTP를 이용한 운영 서버 직접 수정으로 인해 형상관리 소스코드와 운영 서버의 실행 코드 간 불일치가 발생하였고, 이로 인해 배포 시 기능이 오작동하는 장애가 반복적으로 발생했습니다.

The Solution

운영 서버의 클래스 파일을 CFR, JAD, Fernflower 등 다양한 디컴파일러를 사용해 복구한 뒤, AI 분석 파이프라인을 통해 소스 차이의 위험도를 상, 중, 하 등급으로 분류하였으며, 재컴파일된 클래스와 운영 클래스의 바이트코드 및 해시값을 대조하여 정합성을 최종 검증했습니다.

The Result

약 1,000개의 WAS 파일과 4,800개의 FE 화면 파일 중 불일치 대상을 선별하여 99%의 동일성을 확보하였으며, 단일 진실 공급원(SSOT)을 재확립하고 향후 빌드 현대화와 직접 수정 차단을 위한 기틀을 마련했습니다.

Trade-off

디컴파일 시 원본 주석이 유실되고 지역 변수명이 임의의 식별자로 변환되어 코드 가독성이 일부 저하되었으며, 디컴파일러 자체의 추론 한계로 인해 완전히 자동화된 정합성 일치는 불가능하여 최종 단계에서 일부 수동 검증 비용이 수반되었습니다.

03

Key Concepts

Concept · 01

Java Decompiler (Java 디컴파일러)

컴파일된 자바 바이트코드(.class) 파일의 구조를 분석하여 개발자가 읽고 수정할 수 있는 원본 소스코드(.java) 형태로 변환해 주는 역공학 도구입니다. 복원 수준은 도구의 추론 알고리즘과 타깃 자바 버전에 따라 다릅니다.

  • 최신 자바 구문을 완벽하게 지원하는 CFR을 주력 디컴파일러로 선정하여 분석을 시작했습니다.
  • 디컴파일러의 코드 추론 특성 때문에 발생하는 노이즈를 식별하기 위해 Fernflower와 JAD를 교차 활용했습니다.
Concept · 02

Single Source of Truth (단일 진실 공급원)

시스템 내 모든 데이터와 소스 코드가 오직 단 하나의 공식 경로(형상관리 리포지토리)를 통해서만 정의되고 관리되도록 하는 신뢰성 아키텍처 원칙입니다. 이를 위배할 경우 환경 간 동기화 장애가 발생하기 쉽습니다.

  • 운영 서버의 실제 클래스 파일과 Git의 소스 코드를 완전히 정렬함으로써 형상관리 서버의 신뢰성을 복구했습니다.
  • 배포 담당자의 개입이나 수동 수정을 지양하고 규격화된 CI/CD 흐름을 타도록 강제하는 기반을 마련했습니다.
Concept · 03

Bytecode Verification (바이트코드 검증)

텍스트 기반의 소스코드 비교를 넘어, 컴파일된 결과물의 기계어 수준인 바이트코드를 비교하거나 파일의 암호화 해시값을 대조함으로써 두 프로그램의 기능적 동작이 완전히 동등함을 수학적으로 보장하는 기법입니다.

  • 수정 복구된 소스를 다시 컴파일하여 생성한 클래스 파일의 해시값과 운영 클래스를 AI 스킬로 정밀 비교했습니다.
  • 라인 불일치나 디컴파일러 고유의 표현 차이 속에서도 비즈니스 로직의 완전한 무결성을 입증하는 신뢰 지표로 사용했습니다.