소프트웨어 자산을 되살리는 역공학·재공학·재사용
역공학·재공학·재사용을 연결해 레거시 시스템의 지식을 추출하고, 유지보수 가능한 자산으로 전환하는 소프트웨어 재사용 원리를 정리한다.
2026-08-14 · 최초 발행 2026-04-17
기존 시스템에서 다시 꺼내는 개발 자산
이미 운영 중인 시스템에는 코드뿐 아니라 설계 판단, 데이터 구조, 알고리즘, 컴포넌트처럼 다시 활용할 수 있는 지식이 축적되어 있다. 소프트웨어 재사용은 이런 산출물의 전부 또는 일부를 새 시스템 개발에 활용하는 과정이다.
3R은 재사용을 체계화하는 흐름이다. 기존 구현을 분석해 설계 정보와 원리를 찾는 역공학, 그 결과를 바탕으로 구조와 품질을 개선하는 재공학, 검증된 자산을 새로운 개발에 투입하는 재사용으로 이어진다. 각 활동은 분리된 절차가 아니라 기존 시스템의 가치를 다음 개발로 연결하는 연속된 과정이다.
구현물에서 설계 지식을 복원하는 역공학
역공학(Reverse Engineering)은 구현된 시스템을 분석해 상위 수준의 산출물을 도출하는 기법이다. 소스 코드만 남고 설계 문서가 사라진 레거시 시스템을 유지보수하거나, 내부 로직을 정확히 파악해야 할 때 활용한다.
분석 대상에 따라 논리 역공학과 자료 역공학으로 나눌 수 있다.
- 논리 역공학 (Logical Reverse Engineering): 원시 소스 코드에서 제어 흐름, 자료 흐름, 데이터 구조 등의 설계 정보를 추출하고 문서화한다. 블랙박스처럼 보이던 시스템 내부 로직을 가시화하는 데 쓰인다.
- 자료 역공학 (Data Reverse Engineering): 운영 중인 데이터베이스(DB) 스키마나 파일 구조를 분석해 데이터 관계를 파악하고 개념적·논리적 데이터 모델(ERD 등)을 얻는다. 데이터 마이그레이션과 시스템 통합에서 중요하다.
이렇게 확보한 시스템 조망도는 이후 재공학과 재사용의 기초 자료가 된다.
기능은 유지하고 내부 구조를 바꾸는 재공학
재공학(Re-engineering)은 역공학으로 얻은 정보를 바탕으로 아키텍처나 코드를 개선해 새 환경에 맞게 시스템을 다시 구성하는 과정이다. 기존 기능은 유지하면서 성능을 높이고 이후 유지보수 비용을 줄이는 데 목적이 있다.
재공학에는 다음 활동이 포함된다.
- 재구조화 (Restructuring): 외부 기능을 바꾸지 않은 채 내부 구조를 정돈한다. 스파게티 코드를 정리하거나 제어 로직을 단순화해 가독성과 효율성을 높인다.
- 재모듈화 (Remodularization): 비대해진 시스템을 독립 기능을 수행하는 작은 모듈로 다시 나눈다. 모듈 간 결합도를 낮추고 응집도를 높여 유연성을 확보한다.
- 의미론적 정보 추출 (Semantic Information Extraction): 코드 변환에 그치지 않고, 시스템에 담긴 비즈니스 규칙과 도메인 지식을 정제해 추출한다. 시스템이 현재 구조로 설계된 이유를 이해하는 데 도움이 된다.
재공학은 낡은 시스템을 수정하는 작업에만 머물지 않는다. 순공학(Forward Engineering)의 출발점이 되어 시스템 생명주기를 연장하는 방식이기도 하다.
검증된 자산을 개발 과정에 다시 투입하는 방법
재사용(Reuse)은 기능성과 안정성이 검증된 소프트웨어 자산을 다시 사용해 생산성을 높이는 방식이다. 재사용 대상은 코드에 한정되지 않으며, 설계서, 데이터베이스 구조, 알고리즘, 컴포넌트까지 포함한다. 검증된 자산을 활용하면 소프트웨어 품질을 상향 평준화하는 효과도 기대할 수 있다.
재사용은 여러 수준에서 구현된다.
- 코드 레벨 (Copy & Paste, Library): 자주 쓰는 기능을 함수나 클래스 라이브러리로 구성해 활용하는 가장 기초적인 형태다.
- 모듈 및 패키지 (Package, Component): 특정 기능을 담당하는 독립 소프트웨어 단위인 컴포넌트나 상용 패키지를 조립해 시스템을 구축한다.
- 객체지향 기법 (Object-Oriented): 상속성(Inheritance)과 다형성(Polymorphism)을 활용해 부모 클래스의 기능을 물려받거나, 인터페이스를 통해 기능을 확장한다.
재사용을 정착시키려면 자산을 찾고 조합할 수 있는 방식도 갖춰야 한다. 자산을 인덱싱해 저장소(Repository)에서 관리하는 분류(Classification), 반복되는 문제의 검증된 해결책을 템플릿으로 활용하는 디자인 패턴(Design Pattern), 컴포넌트를 조립해 시스템을 구성하는 CBD(Component Based Development)가 여기에 해당한다.
지식 추출에서 신규 시스템까지 이어지는 흐름
기존 시스템에서 얻은 지식은 재공학을 거쳐 재사용 가능한 자산이 되고, 순공학 과정에서 새로운 시스템의 구성 요소로 쓰인다.
이 구조에서 역공학은 복잡한 기존 시스템을 이해 가능한 설계 지식으로 바꾸고, 재공학은 그 지식을 현대적인 구조와 재사용 자산으로 정리한다. 정리된 자산은 새 시스템 개발에 다시 투입된다.
변경 대응과 유지보수에 주는 효과
이미 만들어진 컴포넌트를 조립하면 처음부터 코딩하는 방식보다 개발 기간을 줄일 수 있고, 개발자는 복잡한 비즈니스 로직에 집중할 수 있다.
불명확한 설계 정보와 스파게티 코드는 유지보수 단계의 오류와 난이도를 높인다. 역공학과 재공학으로 시스템 구조를 투명하게 만들면 유지보수가 쉬워지며, 검증된 자산을 재사용하면 초기 결함 발생률을 낮출 수 있다.
요구사항이 바뀔 때도 시스템 전체를 흔들기보다 모듈화된 자산을 교체하거나 확장할 수 있다. 이는 시장 변화에 대한 비즈니스 대응 속도(Time-to-Market)를 높이는 기반이 된다.
Sources
- IEEE Standard for Software Maintenance (IEEE Std 1219-1998)
- Software Reengineering by Robert S. Arnold (IEEE Computer Society Press)
- Component-Based Software Engineering: Putting the Pieces Together by Bill Councill and George Heineman
- 한국정보통신기술협회(TTA) 정보통신용어사전: 소프트웨어 재사용(Software Reuse)