역공학 기반 코드 가시화를 통한 기능점수의 비용 추정 검증 방안 홍익대학교 소프트웨어공학연구실 문소영, 김영철 KCSE 2018, (2018.01.31) 평창 역공학 기반 코드 가시화를 통한 기능점수의 비용 추정 검증 방안 홍익대학교 소프트웨어공학연구실 문소영, 김영철
Contents 1. 연구 배경 및 방법 2. 역공학 기반 기능 점수 검증 3. 적용 사례 4. 결론 및 향후 연구
연구 배경 (1/4) 발 주 자 제안요청서(RFP, request for proposal) 소프트웨어 발주 전문성 부족의 문제 예산수립/ 심의단계 발주 준비 선정/계약 사업수행 종료 및 인수 유지관리 발 주 자 제안요청서(RFP, request for proposal) 소프트웨어 발주 전문성 부족의 문제 개발 중 빈번한 과업변경에 따른 개발기간 지연 소프트웨어 품질 저하와 참여기업의 개발 기간, 비용에 적신호 소프트웨어 개발자의 개발환경 악화
연구 배경 (2/4)
연구 배경 (3/4)
연구 배경 (4/4) 소프트웨어 규모 산정의 문제점 발주자 및 수주자 등 복잡한 기능점수 산정절차와 방법 적용 어려움 산출된 예산과 개발업무량(기능점수)간 상관성이 낮음 정보화사업 품질저하 및 SW산업경쟁력 낙후 기존의 다른 연구들… 해외 → 프로젝트 개발 비용 추정을 위해 기능점수 방법을 적용하고 문제점 보완을 하는 연구 [Low, Kemerer] 국내 → 기능점수에 따른 개발 비용 예측 [박찬규] 보다 더 정확한 비용 추정을 위해 도배지 가장 최신의 실제 운영되는 소스코드를 대상으로 기능점수 계산 및 비용 추정 필요
코드 가시화 (1/2) Reverse Engineering Forward Engineering 기존 개발자 부재 시, Refactoring 용이 코드 복잡도 가시화 용이 (Coupling & Cohesion) 재사용 모듈 단위 별 추출 설계 추출 아키텍처 추출 성능 추출 개발 시, 코드 리뷰 가능 각각의 개발자 당, 코드 진척율 파악 가능 미리 Test Driver/Stub 설계 가능
코드 가시화 (2/2) JDT Parser o 가시화 지표 가시화할 목적/목표가 설정되었다면, 이를 달성하기 위한 개발공정이 필요하고, 각 공정상에서 가시화목표에 부합되는 산출물(Work Product)에 대한 목표값을 정할 수 있으며, 이들 대다수는 기존에 SW공학에서 이야기 하는 품질지표를 활용할 수 있다 특히, SW가시화기술은 SW공학의 기본 목표인 SW개발프로젝트에서 일어날 수 있는 “SW의 위기상황”을 방지 혹은 해결하고자하는 기술적 패러다임이므로, 최소한 SW프로젝트의 성공요소인 “비용”, “범위/일정”, “품질”요소에 대한 가시화지표를 설정하는 것이 바람직하다.
기능점수 측정 절차 측정유형 결정 데이터 기능 측정 UFP 결정 AFP 계산 측정시스템 범위와 경계 결정 트랜잭션 기능 측정 개발 프로젝트 개선 프로젝트 어플리케이션 내부 논리 파일 (ILF: Internal Logical File) 외부 인터페이스 파일 (EIF: External Interface File) • UFP 미조정 기능 점수 (Unadjusted Function Point count) : 조정할 기능 점수 = 데이터 기능 + 트랜잭션 기능 • AFP 조정 기능 점수 (Adjusted Function Point count) = UFP * VAF <측정 방법> ILF측정규칙, EIF측정규칙에 따라 식별하여 DET/RET를 DET측정규칙, RET측정규칙으로 위의 복잡도 행렬에 대입하여 복잡도와 기여도를 측정 ( 표 ①을 사용 ) <측정 방법> 데이터 기능과 트랜잭션 기능을 측정하여 ILF, EIF, EI, EO, EQ별로 표 ③을 사용하여 미조정 기능점수를 측정 = 데이터기능 + 트랜잭션 기능 14개 일반적 시스템 특성 항목(GSC) GSC 영향도 (0~5) 1. Data Communication 2. Distributed Data Processing 3. Performance 4. Heavily Used Configuration 0 : 전혀 무영향 5. Transaction Rate 1 : 우연한 경우 6. Online Data Entry 2 : 조금 영향 7. End-User Efficiency 3 : 평균 8. Online Update 4 : 상당한 영향 9. Complex Processing 5 : 강한 영향 10. Reusability 11. Installation Ease 12. Operational Ease 13. Multiple Sites 14. Facilitate Change 측정시스템 범위와 경계 결정 트랜잭션 기능 측정 VAF 결정 • 측정범위에 포함될 요소 (서브시스템) 식별 • 측정대상 어플리케이션과 외부 사용자간의 경계 외부입력(EI: External Input) 외부출력(EO: External Output) 외부조회(EQ: External Inquiry) • VAF(Value Adjustment Factor) : 14개의 일반시스템 특성의 영향 (0~5)를 감안하여 만들어지는 조정인자 <측정 방법> EI, EO, EQ 측정규칙에 따라 식별하여 DET/FTR을 DET, FTR측정규칙을 적용하여 복잡도 행렬에 대입하여 복잡도와 기여도를 측정 (표 ②를 사용 ) <측정 방법> :14개 일반 시스템 특성을 기초로 산출 영향도(DI: Degree of Influence) 평가 :14개 항목에 대해 해당 시스템의 영향도 점수를 부여 총 영향도(TDI: Total DI) : 14개 영향도 항목을 모두 합산한 갓 VAF 산출: VAF = (총 영향도(TDI) * 0.01 ) + 0.65
기능점수 계산 구성 요소 ① ② ③ 기능점수 계산 구성 요소 외부 사용자 내부 논리 파일 어플리케이션 경계 다른 어플리케이션들 <기능 복잡도와 함께 미조정 기능 점수 값에 대한 기여도 결정을 위한 요소> • DET(Data Element Type) • RET(Record Element Type) • FTR(File Type Reference) ① 외부 입력 외부 출력 외부 조회 ② 내부 논리 파일 외부 인터페이스 파일 외부입력 ③ 외부출력 어플리케이션 경계 다른 어플리케이션들 • ILF: 어플리케이션 경계 내에서 저장 / 유지 보수되는 데이터 파일 • EIF: 어플리케이션 경계 외부로부터 참조되는 데이터 파일 • EI: 사용자로부터 입력, 수정, 데이터 파일에 저장, 수정 기능 • EO: 사용자가 해당 시스템 ILF로부터 데이터를 읽어 어플리케이션 경계 밖으로 보내는 기능 • EQ: ILF/EIF로부터 데이터를 조회하여 사용자에게 표현되는 정보 내에서 데이터를 조회하는 기능
역공학 기반 기능점수 추출 방법 코드로부터 기능점수 추출 절차 고객의 요구사항에 대한 기능 정의 분류가 되어 있어야 함. 코딩 규칙 적용 메서드 명명 규칙: EI_메서드명, EQ_메서드명, EO_메서드명, … 쿼리문은 메서드 내에 query라는 변수명으로 작성 (예: String query=“insert into customer values(?,?,?,?)”; 툴체인을 통해 코드 가시화 코드에 대한 데이터 축적 데이터 기능(내부 논리 파일, 외부 연계 파일), 트랜잭션 기능 검색 기능 복잡도 계산
역공학 기반 기능점수 추출 방법 1) 요구사항에 대한 기능 정의 No 업무 기능명 기능유형 기능1 로그인 외부조회 기능2 고객관리 고객등록 외부입력 기능3 고객수정 기능4 고객조회 기능5 고객삭제 고객테이블 내부논리파일 기능6 판매관리 판매등록 기능7 판매수정 기능8 판매조회 기능9 판매삭제 기능10 판매관리엑셀저장 외부출력 판매테이블 기능11 입고관리 입고등록 기능12 입고수정 기능13 입고조회 기능14 입고삭제 기능15 입고관리엑셀저장 입고테이블 기능16 수입/지출관리 수입지출조회 기능17 수입지출엑셀저장
역공학 기반 기능점수 추출 방법 2) 코딩 규칙
역공학 기반 기능점수 추출 방법 3) 툴체인을 통한 가시화
역공학 기반 기능점수 추출 방법 3) 툴체인을 통한 가시화 - 데이터베이스화
4) ILF(내부 논리 파일), EIF(외부 연계 파일) 검색 역공학 기반 기능점수 추출 방법 4) ILF(내부 논리 파일), EIF(외부 연계 파일) 검색 업무 기능명 쿼리문 고객관리 customer 고객등록 String query = "insert into customer values(?,?,?,?)"; 고객수정 String query = "update customer set carnum=?, carcat=? where customer_name=? and phonenum=?"; 고객조회 String query = "select CUSTOMER_NAME, PHONENUM, carnum, carcat from customer where customer_name LIKE ? AND phonenum LIKE ?"; 고객삭제 select CUSTOMER_NAME, PHONENUM, carnum, carcat from customer where customer_name LIKE ? AND phonenum LIKE ? 판매관리 sale 판매등록 String query = "insert into sale values(?,?,?,?,?,?,?,?,?,?)"; 판매수정 String query = "update sale set SALE_DATE=?, SALE_DETAIL=?, SALE_MODEL=?, CAR_PART=?, PRICE=?, PAYMENT=?, SALESPERSON=? " + "where CUSTOMER_NAME=? AND CUSTOMER_PHONENUM=? AND SALE_NAME=?"; 판매조회 String query = "select CUSTOMER_NAME, CUSTOMER_PHONENUM, SALE_DATE, SALE_NAME, SALE_DETAIL, SALE_MODEL, CAR_PART, PRICE, PAYMENT, SALESPERSON " + "from sale " + "where SALE_DATE between TO_DATE(?,'MM dd,yyyy HH24:MI') " + "and TO_DATE(?,'MM dd,yyyy HH24:MI')"; 판매삭제 String query = "delete from sale where CUSTOMER_NAME=? AND CUSTOMER_PHONENUM=? AND SALE_NAME=?"; 입고관리 stock_goods2 입고등록 String query = "insert into stock_goods2 values(GOODS_ID_SEQ.NEXTVAL,?,?,?,?,?,?,?,?,?)"; 입고수정 String query = "update stock_goods2 set GOODS_SPEC=?, GOODS_AMOUNT=?, GOODS_UNIT=?, UNIT_PRICE=?, TOTAL_PRICE=?, STOCK_DATE=?, NOTE=?, SALE_PRICE=?, GOODS_NAME=? " + "where GOODS_ID = ?"; 입고조회 String query = "select GOODS_ID, GOODS_NAME, GOODS_SPEC, GOODS_AMOUNT, GOODS_UNIT, UNIT_PRICE, TOTAL_PRICE, STOCK_DATE, NOTE, SALE_PRICE " + "from stock_goods2 " + "where STOCK_DATE between TO_DATE(?,'MM dd,yyyy HH24:MI') and TO_DATE(?,'MM dd,yyyy HH24:MI')"; 입고삭제 String query = "delete from stock_goods2 where GOODS_ID = ?"; 수입/지출관리 Sale 수입지출조회 String querySell = "select SALE_DATE, PRICE " + "where SALE_DATE between TO_DATE(?,'MM dd,yyyy HH24:MI') and TO_DATE(?,'MM dd,yyyy HH24:MI')"; String queryWear = "select STOCK_DATE, TOTAL_PRICE " 고객테이블 내부논리파일 1 4 낮음 7 판매테이블 8 입고테이블 9
역공학 기반 기능점수 추출 방법 4) 트랜잭션 기능 검색 EI (외부입력) DET: 4 DET: 3 (2 + 1)
적용사례 S썬팅샵 물품관리 프로그램 개발 언어: JAVA DB 연동: Oracle 유형: 업무처리용
코드 가시화를 통한 기능점수의 비용 추정 EI_customerMod EI_customerReg EI_SellDel +EI_customerReg(String, String, String, String): boolean +EI_customerDelete(String, String, String, String): boolean +EQ_customerSearch(String, String): ArrayList<HashMap<String, String>> +EQ_customerSellSearch(String, String): ArrayList<HashMap<String, String>> +EQ_login(String, String): HashMap<String, String> +EI_CustomerMod(String, String, String, String): void +EI_sellReg(String, Date, String, String, String, String, String, int, String, String): void +EI_sellMod(String, Date, String, String, String, String, String, int, String, String): void +EI_sellDel(String, String, String): void +EQ_sellSearch(Date. Date): ArrayList<HashMap<String, String>> +EI_wearReg(String, String, in, String, int, Date, int String): void +EI_wearMod(int, String, String, int, String, int, Date, int, String): void +EI_wearDel(int): void +EQ_wearSearch(Date, Date): ArrayList<HashMap<String, String>> +EQ_sellWearSearch(Date, Date): HashMap<String, Integer> +EO_exportExcelWear(TableModel, String): void +EO_exportExcelSell (TableModel, String): void +EO_exportExcelEarnSpend(TableModel, String): void -connectDB(): Boolean +setLoadingDialog(): void +loadDialogshow(): void +loadDialogDissmiss(): void No Function Name 기능유형 참조파일유형 데이터요소 유형 기능 복잡도 기능 점수 기능1 EI_customerMod 외부입력 1 4 낮음 3 기능2 EI_customerReg 7 기능3 EI_SellDel 6 기능4 EI_sellMod 10 기능5 EI_SellReg 기능6 EI_wearMod 13 기능7 EI_wearReg 기능8 EO_earnSpend 외부출력 2 보통 기능9 EO_exportExcelEarnSpend 11 기능10 EO_exportExcelSell 12 기능11 EO_exportExcelWear 기능12 EQ_customerDelete 기능13 EQ_customerSearch 외부조회 9 기능14 EQ_login 기능15 EQ_SellSearch 기능16 EQ_wearDel 기능17 EQ_wearSearch 단계 단계별 단가 총 기능점수 보정계수 개발원가 언어 어플리케이션유형 규모 품질 및 특성 분석 98,648 77 1.2000 1.00 0.6500 1.0000 5,924,798 설계 124,609 7,484,016 구현 166,145 9,978,668 시험 129,801 7,795,848 합계 519,203 31,183,330 보정계수결정 구분 적용기준 규모 보정계수 0.108 * log e(기능점수) + 0.2229 0.65 유형 보정계수 업무처리용 소프트웨어 언어 보정계수 JAVA 1.20 품질 및 특성 보정계수 0.025 * 총영향도(0) + 1
결론 및 향후 연구 결론 소프트웨어 개발 프로젝트에 대한 비용 추정은 프로젝트를 성공적으로 수행할 수 있도록 하는데 중요한 요소 역공학 기반 소스코드 가시화를 통해 소스코드에서 기능 유형을 찾아내어 각 기능에 대한 기능점수를 측정하여 데이터 기능과 트랜잭션 기능에 대한 총 기능점수를 산출 본 논문에서 제안한 방법으로 검증을 하고 이 데이터를 축적하여 다른 프로젝트 발주에도 활용을 한다면 프로젝트 규모 산정에 큰 도움을 줄 것 향 후 연 구 실제 프로젝트에 적용하여 비교 및 검증 시도 데이터 축적 통해 조직의 프로젝트 성과와 프로세스 개선
경청해 주셔서 감사합니다.