SW 유지보수를 위한 Open Source 기반 툴체인(Tool-Chain) 개발 Tool-Chain Development based on Open Source for SW Maintenance 문소영 1) ㆍ변은영 1) ㆍ한정화 1) ㆍ최선 1) ㆍ이수진 2) 홍익대학교 컴퓨터정보통신공학과 1) 홍익대학교 디지털미디어학과 2) 멘토: 김영철 1) ㆍ김윤정 2) 홍익대학교 컴퓨터정보통신공학과 1) ㆍ한국과학기술정보연구원 2) 초록 본 연구는 Open Source를 활용하여 코드 정적 분석을 할 수 있는 프로세스를 구성하 여 코드 분석을 할 수 있는 툴체인을 개발하려고 한다. 코드 정적 분석을 위해 역공학 기 법을 적용한다. 기존의 역공학 도구와의 차별성을 위해 코드 복잡도(결합도/응집도) 가시 화 기법을 적용하여 개발한다. 또한 구체적인 코드 분석을 위해 자바를 위한 xcodeparser를 개발하여 다양한 개발 산출물 추출이 가능하도록 한다. 본 연구에서 개발 하는 코드 정적 분석기는 소프트웨어의 유지보수를 어렵게 만드는 특성인 비가시성 (Invisibility), 복잡성(Complexity), 변경성(Changeability)으로 인해 발생되는 문제들을 해 결할 것이다. This study is to develop the tool chain which can analyze code to configure the process to the static analysis of the code by using the open source. For static analysis, we take a reverse engineering. We adopted a visualization method with presenting code complexity(coupling/cohesion) for distinguishing of existed reverse engineering tool. Beside, We developed a xcodeparser for JAVA that is possible to get more development documents. It will help to more detail code analysis. Static code analyzer that proposed in this study will solve the problems caused by the changeability, invisibility, complexity which make it difficult to maintain the software. 키워드: Tool-Chain, SW Maintenance, xcodeparser, Reverse Engineering, UML
Ⅰ. 서론 1. 연구 필요성 및 목적 소프트웨어의 유지보수를 어렵게 만드는 특성으로는 비가시성, 복잡성, 변경성이 있 고 소프트웨어 개발에 있어 개발자 개인 의 존도가 높다. IT 벤처/중소 업체의 경우 히 트(Hit) 소프트웨어가 존재하지만, 요구사항 및 설계 문서가 없는 경우가 빈번하다. 이러 한 상황에서 소프트웨어를 패치(patch)하고, 유지보수를 하는 것은 계속적인 패치로 소프 트웨어의 크기가 증가하여 수정에 어려움이 있다. 소프트웨어의 수정 및 확장은 많은 에 러를 발생시키고 수정에 많은 노력과 비용이 발생한다. 또한 코드와 일치하는 설계문서가 존재하지 않고, 개발자의 이직으로 코드를 이해하는 사람이 없다. 따라서 코드를 이해 하여 소프트웨어 수정이나 유지보수를 하는 것은 많은 시간과 비용이 투자된다. SW 개발 프로세스와 방법론, 테스트 프로 세스 및 테스팅을 통한 품질 향상을 시키고 있지만, 이에 따르는 비용이 크다. 또한 이 방법들은 오류를 발견할 수는 있지만 소프트 웨어 아키텍처 개선과 코드 가시화는 어렵 다. 고품질 소프트웨어 개발을 위해 기존 코 드의 문제점이나 오류를 발견하여 수정 가능 해야 하고, 코드에 남아 있는 개발자들의 나 쁜 습관(Bad Smell)을 개선해야 한다. 역공학 도구들은 유지보수 행위 동안 복잡 한 소프트웨어 시스템들을 분석 이해하는 과 정에 있어서 소프트웨어 엔지니어들을 지원 하고, 이 도구들은 텍스트 및 그래픽 보고서 출력 등의 기능을 포함하고 있다. 그러나 기 존 도구들은 코드를 문서로 보여주는 기능만 을 갖고 있어 보완이 필요하다. 예로 Christian Collberg의 GEVOL[1]은 컴파일 에서 생성되는 자바 바이트코드를 분석하여 제어 흐름(control-flow) 그래프, 호출(call) 그래프, 상속(inheritance) 그래프를 그리는 방법을 제안했다. 그러나 이 방법은 시각적 으로 표현되는 정보가 거의 없어 SW에 대한 정보 파악이 어렵다. 코드 복잡도, 코딩규칙 준수 등을 적용하여 모듈 간 복잡도를 표현 하여 코드를 보여주는 오픈소스 기반 맞춤형 코드 정적 분석 도구는 존재하지 않다. 따라 서 본 연구에서는 코드 정적 분석기를 통해 기존 소프트웨어의 비가시성을 제거하고 소 프트웨어의 구조 개선을 위한 방안을 제시한 다. 첫째, 코드 복잡도 줄이는 방법과 리팩 토링(Refactoring) 방법을 제안하여 개발자 주도 코드 분석을 통해 코드 품질을 향상 시 킨다. 둘째, 고가의 상용 소프트웨어를 사용 할 수 없는 IT 벤처/중소기업의 소프트웨어 에 대한 체계적인 품질관리를 가능하도록 한 다. 셋째, 개발 문서와 코드의 불일치 해소 를 통해 소프트웨어의 유지보수성을 향상시 킨다. 본 논문 구성은 다음과 같다. 2장에서는 툴체인(Tool-Chain) 구성 방법과 다양한 타 겟 시스템을 대상으로 실험한다. 3장에서는 각 실험에 대한 결과를 설명한다. 마지막으 로 4장에서는 본 연구의 결과를 전달한다. Ⅱ. 실험 및 방법 1. 툴체인(Tool-Chain) 구성 기존 역공학 도구/코드 정적 분석 도구들 은 특정 회사의 아키텍처를 가시화하기에 어 려움이 있다. 본 논문에서 구성하는 코드 정 적 분석을 위한 Tool-Chain은 프로세스와 SW 품질 개선 방안을 목적으로 구성된다. 그림 1. 툴체인 프로세스 구성도
그림. 1의 Tool-Chain프로세스는 기존 오 픈소스를 활용하여 구성하였다. 다음은 각 단계에 대한 설명이다. l 1 단계: 소스 분석 소스 분석 단계에서는 SN(Source Navigator)로부터 소스코드를 분석한다. 분 석된 소스코드는 Parser의 형식에 맞게 파 일로 추출된다. 추출된 파일(SNDB Files)에 는 프로그램 코드의 전반적인 정보(클래스, 메서드, 지역변수, 전역변수, 파라미터 등)가 포함되어 있다. l 2 단계: SNDB 분석 SNDB Files는 SN에서 추출된 데이터가 종 류별로 바이너리 형식으로 저장되어 있다. 바이너리 파일로 되어 있는 내용을 분석하기 위해 SN 에서 제공하는 dbdump.exe를 내 부적으로 실행시켜 텍스트 형식으로 변환한 다. l 3 단계: SNDB를 통해 데이터베이스 생성 Step 2에서 분석한 데이터를 DB에 테이블을 생성하며 저장한다. 모든 분석이 가능하도록 하기 위해 추출된 모든 파일의 정보를 DB에 저장하는 단계이다. l 4 단계: 아키텍처를 위한 데이터 추출 아키텍처를 위한 데이터 추출 단계에서는 데 이터베이스에 분류된 정보를 미리 정의한 모 듈에 따라 재해석 하고 분류된 요소들로부터 모듈을 추출한다. 본 논문에서는 모듈 단위 를 클래스로 정의하여 클래스와 클래스, 클 래스와 메서드, 클래스와 변수의 연관관계 정보를 생성하는 쿼리문을 작성한다. 그리고 품질지표에 대한 정량적인 수치를 측정한다. l 5 단계: 가시화 가시화 단계에서는 4 단계에서 작성한 쿼리 를 실행하여 나온 결과를 재해석하여 Graphviz의 DOT를 실행할 수 있는 DOT script를 생성하여 그래프를 생성한다. l 6 단계: SW 품질 향상 고품질 소프트웨어 개발을 위해 모듈간 결합 도를 낮추고 응집도를 높여야 한다[2]. 본 논 문에서는 결합도(Coupling)를 품질지표로 정 의 하고 이에 대해 가시화를 수행한다. 2. SW 품질 향상을 위한 방법 1) 모듈 정의 모듈 정의 단계에서는 시각화 대상 소프트웨 어 코드에 적합한 모듈 단위를 정의한다. 본 연구에서는 클래스(Class)를 모듈로 정의한 다. 2) 품질 지표 정의 소프트웨어 설계 시, 모듈 간 결합도를 최소 화하고, 응집도를 높임으로써, 고품질의 소 프트웨어 개발이 가능하다. 따라서 결합도와 응집도는 정량적으로 측정 지표를 정한다[3]. 그림 2. 결합도 그림. 2는 결합도에 대한 좋은 상태에서 나 쁜 상태로의 표현을 보여준다. 결합도는 모 듈 간에 상호 의존하는 정도 또는 두 모듈 사이의 연관관계를 의미한다. 결합도가 높을 수록 모듈간 의존성이 강해서 변경, 유지보 수, 그리고 모듈의 재사용성에 나쁜 영향을 미치게 된다. 결합도는 독립적인 모듈이 되 기 위해서는 각 모듈 간의 결합도는 낮아야 하며, 의존성은 적어야 한다. 결합도는 자료, 스탬프, 제어, 외부, 공유, 내용 결합도로 구 성된다. 자료 결합도에서 내용 결합도로 갈 수록 모듈간의 상호의존성이 높아져 결합도 가 높아진다. 자료 결합도 모듈간의 인터페이스가 자료 요소만으로 구 성된 결합도이다. 한 모듈이 다른 모듈을 호 출하면서 매개 변수나 인수로 데이터를 넘겨 주고, 호출 받은 모듈은 받은 데이터에 대한 처리 결과를 돌려주는 방식으로 모듈 간의 내용을 전혀 알 필요가 없고 다른 모듈에 전 혀 영향을 미치지 않는 가장 바람직 한 결합
도이다. 스탬프 결합도 모듈간의 인터페이스로 배열이나 레코드 등 의 자료 구조가 전달되는 결합도이다. 두 모 듈이 동일한 자료 구조를 조회하는 방식이며 자료 구조의 변화는 실제로 조회하지 않는 모듈에까지도 영향을 미치게 된다. 제어 결합도 논리적인 흐름을 제어하는 데 사용하는 제어 요소 (FunctionCode, Switch, Tag, Flag) 가 전달되는 결합도이다. 상위 모듈이 하위 모듈의 상세한 처리 절차를 알고 통제하는 경우나 처리 기능이 두 모듈에 분리되어 설 계된 경우이다. 외부 결합도 한 모듈에서 외부로 선언한 데이터(변수)를 다른 모듈에서 참조하는 결합도이다. 공통 결합도 공유되는 공통 데이터 영역을 여러 모듈이 사용할 때의 결합도이다. 공통 데이터 영역 의 내용을 조금만 변경하더라도 이를 사용하 는 모든 모듈에 영향을 미치게 되므로 독립 성이 약하다. 내용 결합도 한 모듈의 다른 모듈의 내부 기능 및 그 내 부 자료를 직접 참조하거나 수정할 때의 결 합도이다. 표 1. 타켓 시스템 실험 방법 비교 3. 타겟 시스템 본 절에서는 4 종류의 타겟 시스템에 대해 간략히 설명한다. 1) 수력발전소 정비변수 통합관리 시스템[4] JAVA 기반 웹 시스템으로 발전소 성능개선 및 현대화에 따른 수명주기 설비관리를 통해 엔지니어링 역량을 강화, 발전소의 상태기반 정비를 위한 정비변수 통합관리 기반 시스템 이다. 2) 6족 로봇 시뮬레이터[5] C++ 기반 응용 프로그램으로 다관절 로봇의 동작제어를 도구 내의 컨트롤러로 쉽게 할 수 있도록 하는 6족 로봇 시뮬레이터이다. 3) UML 설계 도구 JAVA 기반 UML 설계 도구로 유스케이스 다이어그램, 클래스 다이어그램, 시퀀스 다 이어그램, 상태 다이어그램을 작성할 수 있 는 도구이다. 4) 안드로이드 기반 SQLite Manager[6] 안드로이드에서 SQLite DB 정보를 쉽게 볼 수 있도록 하는 프로그램으로 DB 내보내 기, DB 보기 등의 기능을 수행한다. 4. 실험 방법 본 절에서는 각 타겟 시스템의 소스를 분 석한다. 본 연구에서 정의한 품질지표를 적 용하고, 거기에 각 시스템 별로 아키텍처를 정의하여 그 시스템만의 결과를 생성한다. 분류 언어 모듈 품질특성 코딩표준 1) JAVA 클래스 유지보수성 코드 복잡도 개선 코드복잡도 낮추기 2) C++ 클래스 시간 반응성 자원 활용성 성능저하요소제거 오픈소스 Plug-in/Progr am PMD N SIQ Collector CPPCheck 3) JAVA 클래스 요구사항 추적성 요구사항 추적성 PMD 4) JAVA (Android) 클래스 변경성 PMD
표 1은 실험에 사용된 시스템 비교이다. 표 1에서 보는 바와 같이 각 시스템이 목표 로 하는 아키텍처가 다르다. 1)은 유지보수 성과 코드 복잡도 개선에 초점을 맞추고, 2) 는 소프트웨어의 성능저하 요소를 제거하기 위해 시간 반응성과 자원 활용성에 목적을 둔다. 3)은 시스템을 통해 요구사항에 해당 하는 모듈을 추적하는 것에 초점을 두어 실 험한다. 4)는 소프트웨어의 품질특성 중 유 지보수를 어렵게 하는 변경성에 초점을 맞춘 다. 그러나 4)의 경우에는 코딩 표준은 따로 정의하지 않았다. Ⅲ. 결과 및 토론 본 절에서는 2장에서 언급한 실험 방법을 통해 산출된 결과에 대해 설명한다. 표 2. 기존 정적 분석 도구 비교 우선 기존 정적 분석 도구와 본 연구에서 제 안한 툴체인(Tool-Chain) 기법을 비교하면 표 2와 같다. Source Navigator는 오픈소 스로 다양한 구문 분석을 제공하지만, 가시 화 측면에서는 약하고, SONARQUBE는 코딩 설계 및 구조등의 가시화를 제공하지만, 가 시화 기능과 관련하여 더 많은 기능을 사용 하려면 비용이 발생한다. 또한 유지보수를 위한 다양한 설계 다이어그램을 제공하지 않 는다. 마지막으로 SourceInsight는 상용이 기 때문에 개인 또는 중소/중견 기업에서 사 용하기에는 부담이 크다. 그러나 본 연구에 서 제안한 툴체인(Tool-Chain) 기법이 적용 된 도구는 첫째 오픈소스로 구성하였으며, 기본적으로 Source Navigator를 사용하지 만, Java의 경우, 본 연구에서 개발한 도구 Source Navigator (오픈소스) SONARQUBE (오픈/상용) SourceInsight (상용) Tool-Chain 기법 사용 가능 언어 (대표) Fortran, Cobol, Java, C++ Java, C/C++, C, C# C/C++, C#, Java Fortran, Cobol, Java, C++ 구문 분석 범위 class, function, variable, method, structures, 등 class, function, variable, method, structures, 등 functions, methods, global variables, structures, classes 및 다른 타입의 기호(symbol) Source Navigator가 제공하는 모든 범위에 대한 구문 분석이 가능하고, 특히 자바의 경우 구문 분석 가능한 작은 요소까지 가시화. 가시화 기능 코드 트리 브라우징 코딩 설계 및 구조등의 가시화 호출 그 래프 클 래 스 트리 다 이 어 그램 클 래 스, 시퀀스 다 이어그램, 모듈 결합 도, 성능저 하 요 소 추 출,요구사 항 추적 단점 가시화 기능이 약함. 다이어그램 제공되지 않음. 자바는 무료, 몇몇의 다른 플러그인은 유료 제공. 가시화 기능이 있지만, 다양한 설계 다이어그램 가시화는 제공하지 않음. 다양한 편집 기능이 제공되나, 출력되는 가시화 종류가 적음. 아키텍처 구성 커스터 마이징 X X X O
xcodeparser를 사용하여 Source Navigator에서 제공하지 못하는 구문 분석 들을 가시화 할 수 있어서 더 다양한 UML 다이어그램들을 추출할 수 있다. 또한 시스 템 별로 품질 지표를 정의하여 시스템 특성 에 맞는 품질 관리가 가능하다. 그리고 커스 터마이징이 가능하므로 추출하려는 모든 다 이어그램을 시도해 볼 수 있다. 다음은 본 연구의 결과를 자세히 설명한다. 1) 수력발전소 정비변수 통합관리 시스템 모듈 간에 어떠한 메서드와 연관이 있는지 에 대해 다이어그램과 함께 숫자로 메서드 연관 관계를 나타낸다. 그림 3을 보면 네모 박스의 모듈이름 옆에 다른 모듈이 그 모듈 을 몇 번 참조하는지를 나타내고, 하나의 모 듈에서 다른 모듈로 이어지는 화살표 방향으 로 가는 선에 표시된 숫자는 그 모듈이 상대 모듈을 참조하는 개수를 표시한다. 그림 4를 보면 모듈 간 결합도를 나타낸다. 결합도의 기준을 100으로 잡고 100 보다 결합도가 높 으면 빨간 선으로 표시하여 직관적으로 알 수 있도록 한다. 그림 5를 보면 파랑 선으로 표시된 것은 패키지를 나타내는데 패키지 단 위로 그룹을 만들어서 클래스 다이어그램을 표현한다. 클래스 다이어그램은 역공학 도구 가 가져야 하는 기본 기능인데 그 기능에 패 키지 단위로 묶어 클래스 간 상속 관계를 표 현했다. 나타내고, 기준 결합도를 초과했을 때는 빨 간 선으로 표시한다. 3) UML 설계 도구 그림 7은 결합도와 요구사항 추적을 보여 주는 다이어그램이다. 패키지 별로 나누어 동그라미 안에 표현된 내용은 Main 모듈이 참조하는 모듈 개수를 나타내고, REQ-F-001처럼 REQ가 붙은 내용은 그 모 듈에 REQ-F-001 요구사항이 적용된 것을 나타낸다. 그림 8은 클래스 다이어그램으로 모듈 간 상속관계와 각 모듈에 사용된 변수, 메서드를 표현한다. 그림 9는 유지보수성 향 상과 요구사항 추적성을 위한 시퀀스 다이어 그램이다. 4) 안드로이드 기반 SQLite Manager 그림 10은 패키지로 그룹 하여 모듈별로 정리된 모듈 결합도이다. 이 모듈 결합도는 화살표 방향 지시에 따라 얼마나 높은 결합 도로 참조하는지를 나타낸다. (1) 수력발전소 정비변수 통합관리 시스템 모듈 연관 관계 2) 6족 로봇 시뮬레이터 그림 6은 결합도 및 성능 관계도를 보여준 다. 파랑 박스는 패키지를 나타내고, 검은 박스는 모듈을 나타낸다. CRobotModelingSimulationView 모듈 옆 에 있는 괄호의 값 (110, 1239, 16)에서 110은 모듈 내에 있는 메서드의 개수, 1239 는 모듈의 코드 라인 수, 16은 성능을 저하 시키는 코딩룰을 위반한 개수를 나타낸다. 그리고 하나의 모듈에서 다른 모듈로 가는 화살표 위에 있는 숫자는 모듈간 결합도를 모듈 결합도 그림 3. 모듈 연관 관계 그림 4. 모듈 결합도
상속관계 (클래스 다이어그램) 그림 5. 클래스 다이어그램 (2) 6족 로봇 시뮬레이터 모듈 결합도 및 성능 관계도 그림 6. 결합도 및 성능 관계도
(3) UML 설계 도구 모듈 결합도 및 요구사항 추적 다이어그램 클래스 다이어그램 그림 7. 결합도 및 요구사항 추적 다이어그램 그림 8. 클래스 다이어그램
시퀀스 다이어그램 (4) 안드로이드 기반 SQLite Manager 모듈 결합도 그림 9. 시퀀스 다이어그램 그림 10. 모듈 결합도 Ⅳ. 결론 국내의 소프트웨어 개발 업계는 고품질 소프 트웨어를 위해, 개발/테스트 프로세스, 성숙 도 측정 등에 초점을 두고 있으나, 현실적으 로 소프트웨어 개발을 많이 하는 벤처/중소 /중견 업체의 고품질 소프트웨어 개발에는 큰 도움 주지 못하는 것이 현실이다. 본 연 구에서는 고품질의 소프트웨어 개발을 위해, 기존 코드의 문제점을 발견하고 변경(수정) 하는 것과 소프트웨어 개발자들의 나쁜 습관 을 개선하는 것이 목표이다. 그리고 고품질 소프트웨어를 위해 개발/테스트 프로세스, 성숙도 측정 등에 초점을 두면 개발자 관점
에서 개발 이외의 추가업무가 발생, 특히 기 존 레가시 시스템을 고품질화하기 위한 대안 이 될 수 없다. 이를 해결하고자, 우리가 제 안한 Tool-Chain Method를 통해서 모듈을 정의하고, 소프트웨어의 구조기반의 코드 복 잡도, 모듈 간의 관계빈도를 정량화, 더 나 아가 모듈도 정의와 결합도의 품질지표로 코 드의 품질을 수치화를 통한 소프트웨어 가시 화를 하였다. 이를 통해 나쁜 습관의 개발자 들도 스스로 리펙토링하여 코드 복잡도를 낮 추는 일이 가능하다. 향후에는 응집도에 대한 소프트웨어 품질을 가시화 할 예정이며, 상속관계를 표현하는 클래스 다이어그램 외에 역공학을 통해 도출 할 수 있는 설계문서들을 추출할 것이다. 또 한 소프트웨어의 품질 측정과 리펙토링을 지 속적으로 수행하여 소프트웨어의 품지를 향 상 시킬수 있는 패턴들을 찾아내고자 한다. 마지막으로 더 깊이 있는 정적 분석을 시도 하고 더 나아가 동적 분석 분야로도 확장시 키고자 한다. Code", KCC2014, pp.463-465, 2014. [4] 신성환, 박진호, 윤두병, 손기성, 수력발 전소 정비변수 및 회전체 통합관리시스 템 개발, 한국소음진동공학회논문집, 제 22권 6호, pp.574~581, 2012. [5] Hyun Seung Son, Woo Yeol Kim, Robert Young Chul Kim, Semi-Automatic Software Development based on MDD for Heterogeneous Multi-Joint Robots, Proc. of The International Symposium on Control and Automation, pp. 93~98, 2008. [6] Android SQLite Manager. About SQLite [Online]. Available: http://sourceforge.net/projects/asqli temanager Ⅴ. 참고문헌 [1] C. Collberg, S. Kobourov, J. Nagra, J. Pitts, K. Wampler, A System for Graph-Based Visualization of the Evolution of Software, Proc. of The SoftVis 03 ACM symposium on Software visualization, pp. 77-86, 2003. [2] Roger S, Pressman, Software Engineering: a practitioner s Approach (7th ed.), McGrawHill, 2010. [3] Bokyung Park, Haeun Kwon, Hyeoseok Yang, Soyoung Moon, Youngsoo Kim, R. Youngchul Kim, "A Study on Tool-Chain for statically analyzing Object Oriented