기능점수(Function Point, FP) 방법은 사용자 관점에서의 요구 기능을 정량적으로 산정하여 소프트웨어 규모를 측정하고, 이를 바탕으로 소프트웨어 개발과 유지보수를 위한 비용과 자원 소요를 산정하는 방법이다. 즉, 기능점수는 측정의 일관성 유지를 위하여 소프트웨어 개발기술, 개발방법 등은 고려하지 않고 소프트웨어에 요구되어진 “요구사항의 복잡도”를 측정한다. 쉽게 말해서, 복잡하고 많은 요구사항을 가진 소프트웨어일수록 더 많은 점수를 가지게 되는 방식이며, 철저히 요구사항 위주의 측정방식이다.
사실 이 방식은 소프트웨어 분석단계에서도 그대로 적용하는 것이 맞다. 대부분 소프트웨어 개발에서 개발방법론의 잘못된 이해로, 분석 단계에서의 기능 도출을 물리적인 단위로 도출하는데, 이는 잘못된 것이며, 요구사항을 분해하여 논리적인 최소 업무단위로 도출하는 것이 분석단계의 업무기능분해/프로세스정의로 볼 수 있다. 프로젝트 초기에 기능점수를 잘 도출하였다면, 사실 분석단계에서 이를 그대로 사용할 수도 있다.
?기능점수 방법은 다음과 같은 특징을 가진다.
?
- 소프트웨어가 사용자에게 제공하는 기능적 요구사항을 측정한다.
-??????? 구현될 기능이 아니라 사용자가 요구한 기능이 어떤 것인지를 기능으로 도출하여야 한다.
-??????? 따라서, 도출되는 기능은 반드시 사용자에게 “의미”있는 것이어야 한다.
-??????? 즉, 사용자가 “인지”할 수 있는 기능이어야 한다.
?
- 기능점수는 “소프트웨어가 어떻게 구현되었는지”의 공급자 관점이 아니라 “사용자가 어떠한 기능을 요구했는지”의 수요자 관점에서 측정한다.
-??????? 반드시 기능은 사용자에게 인지될 수 있어야 하며, 개발자 측면에서 필요한 기능들은 도출되지 않는다. (공용모듈 등)
-??????? 기능은 사용자가 요구한 논리적인 업무의 최소단위이다.
-??????? 이는 개발방법론의 프로세스 분해와 매우 유사한 의미이다.
?
- 개발이전에 업무량을 측정할 수 있다.
- 개발은 물론 계획, 운영 등 전 수명주기에 걸쳐서 측정 가능하다.
- 소프트웨어 개발 및 유지보수의 업무량을 조직, 구현 기술, 공수 적용 방법론, 물리적 또는 기술적 컴포넌트와 무관하게 일관성 있게 측정할 수 있다.
?
기능을 실제 프로그램이 어떻게 구현될 것인가를 고려하여 도출하면 안된다. FP의 기능은 반드시 논리적인 사용자 측면에서의 기능, 즉 사용자가 인지 가능한 논리적인 최소 단위를 도출하여야 한다.
따라서, 개발시 구현되는 물리적인 모습이 FP에 반영되어서는 안된다.
또한, 반드시 사용자가 인지 가능한 기능만이 포함되어야 한다. 이는 FP의 정의가 사용자관점에서의 요구기능을 측정하는 것이기 때문이다.
?
위에서 설명한 것을 요약하자면,
?
기능점수 = 소프트웨어의 기능(Function)이 얼마나 복잡한가를 점수(Point)로 표현한 것 |
?
으로 설명할 수 있다. 즉, 어떤 소프트웨어 기능을 아래와 같이 얼마나 복잡한가를 판단하여 점수를 매기는 것이다.
따라서, 기능점수는 기능을 도출하는 방법과 각각의 기능이 가지는 유형을 정의하고 있으며, 각 유형별의 복잡도에 따라 점수를 매기는 법을 정의하고 있다.
기능점수를 설명하는 많은 자료는 주로 점수를 매기는 법에 대하여 설명하고 있다. 사실 기능점수를 처음 접하는 개발자라면, 이 점수체계가 매우 복잡하게 느껴질 수 있지만, 이는 어떤 규칙에 의하여 결정되는 것이므로 도구나 엑셀 등으로 쉽게 처리할 수 있다.
오히려 실제 기능점수 도출에 어려운 것은 점수의 도출이 아니라 “기능의 도출”이다. 이는 사실 어떤 자료에서도 제대로 설명해주지 않고 있으며, 대부분 기능점수 도출에서 잘못 도출되고 있는 부분이다.
“기능의 도출”은 사실 소프트웨어 분석에 해당하는 부분이며, 실제 소프트웨어 개발 프로세스에서의 분석도 잘못이루어지고 있는 경우가 많다. 따라서 이 글 전반에 걸쳐서, 기능은 “사용자의 요구”를 뜻하는 것이라고 반복적으로 강조하고 있다. 사실 거의 대부분 기능도출에서 이 부분이 잘못되고 있기 때문이다.
기능점수의 구성
?
위에서 기능점수는 기능을 도출하고 각 기능이 가지는 유형에 의하여 점수가 결정된다고 설명했다. 즉, 이미 기능이 도출되어 있는 상태라면, 각각의 기능이 가지는 기능유형만 알면 기능점수가 측정될 수 있다. (사실 뒤에 설명하는 간이법을 사용하면 유형결정 즉시 기능점수가 완료될 수 있다.) 각 기능이 가질 수 있는 유형은 아래 그림과 같다.
?
1.???? 데이터 기능
기능 점수에서 기능은 크게 “데이터기능”과 “트랜잭션기능”으로 나누어 진다. 사실 우리가 기능으로 생각하는 것은 트랜잭션 기능인데, 데이터 기능은 “사용자가 요구한 정보”를 의미한다. 즉, 사용자가 필요로 하는 데이터단위를 하나의 기능으로 인지한다는 것이다.
따라서, 실질적으로 기능점수를 도출할 때, 하나의 요구사항은 대부분 하나의 트랜잭션기능과 하나의 데이터기능으로 도출된다.
?
(예) 사용자조회 = 사용자조회(트랜잭션기능) + 사용자(데이터기능) |
?
?
데이터 기능은 다시 아래의 두가지 유형으로 나뉘어진다. 즉, 단 두가지 유형만을 가지니 둘 중하나로 결정하면 된다.
?
- 내부논리파일(Internal Logical File : ILF)
-?????? 사용자관점에서 식별가능한 논리적으로 연관된 하나의 데이터 그룹
-?????? 제어정보로서 측정대상 어플리케이션 내부에서 유지되는 파일
-?????? 즉, 기능점수 측정 대상 시스템 내부에서 관리되는 데이터를 의미
-?????? 이는 데이터베이스의 테이블일 경우가 많으나, 시스템 내부에서 다루는 모든 데이터 그룹이 ILF로 도출될 수 있다. 즉, 테이블이 아닐수도 있다.
-?????? 즉, 시스템 내부에서 다루는 파일, 클래스, 외부 인터페이스를 위한 Structure 등이 ILF가 될 수 있다.
-?????? 외부 인터페이스의 경우, 인터페이스의 주체가 내부시스템인 경우, 송수신데이터는 ILF로 도출된다.
?
- 외부연계파일 (External Interface File)
-?????? 측정대상 어플리케이션 내부에서는 오직 참조만 되고 다른 어플리케이션에서 유지되는 파일
-?????? 즉, 외부 연계 시스템에 존재하는 데이터
?
쉽게 말하자면, 이번 프로젝트에서 생성하여 관리하는 데이터는 ILF이고, 이번 프로젝트에서 만들지 않고, 다른 프로젝트에서 생성하였으나 이번 프로젝트의 기능이 참조(연계)하는 데이터는 EIF이다.
?
2.???? 트랜잭션 기능
트랜잭션 기능은 우리가 일반적으로 생각하는 업무기능이다. 기능점수에서 트랜잭션 기능의 복잡도는 단지 기능이 입력이냐 조회냐에 의하여만 결정한다. 즉, 정보를 관리를 하는 기능이냐, 정보의 조회만 하는 기능이냐를 구분하여 이에 따라 복잡도를 결정한다.
따라서 아래의 세가지 유형을 가지며, 기능점수 산출 시, 각 기능이 이 세가지 유형을 몇 개나 가지느냐에 따라 복잡도가 결정된다.
?
- 외부입력 (EI, External Input)
-?????? 어플리케이션 경계 밖에서 들어오는 데이터나 제어정보를 처리하는 단위프로세스
-?????? 하나 이상의 논리파일을 변경하거나 시스템 동작을 변경함
-?????? 즉, 특정 데이터를 특정 논리적인 파일(ILF, EIF)에 저장하는 기능
-?????? 데이터베이스 관점에서는 Create, Update, Delete에 해당함
-???????외부연계 입장에서는 수신은 외부시스템으로부터 데이터가 입력되므로 EIF에 대한 EI에 해당함
?
- 외부출력 (EO, External Output)
-?????? 데이터나 제어정보를 사용자에게 보여주는 프로세스
-?????? 처리로직은 하나 이상의 수학적 계산, 공식 또는 파생 데이터를 포함하거나,
-?????? 하나 이상의 내부논리파일의 유지관리 작업이 발생하거나 시스템의 동작 변경이 수반됨
-?????? 즉, 통계와 같이 데이터를 수학적인 계산에 의하여 처리하여 표시하는 경우에 해당함
?
- 외부조회 (EQ, External Inquiry)
-?????? 데이터나 제어정보를 단순히 사용자에게 제공
-?????? 즉, 검색이나 정보조회와 같이 단순히 데이터를 조회하여 그대로 표시하는 경우에 해당함
-???????외부연계(I/F)의 경우, 송신프로세스는 외부시스템에 정보를 출력하는 경우에 해당하므로 ILF에 대한 EQ에 해당함
?
즉, CRUD(Create,Read,Update,Delete) 중 CUD는 EI 이며, R은 통계형식일 때 EO, 단순조회일 때 EQ이다. 사실 이 부분은 기능이 도출되면 매우 명확하기 때문에 쉽게 도출가능하다. 또한 하나의 기능이 하나의 유형만을 가지는 것이 아니라, 여러가지 유형을 모두 가지는 경우, 각각을 모두 점수에 합산하게 된다. (관리 기능은 CRUD를 모두 가지므로 EI가 3개, EQ가 1개로 표현된다.)
?
트랜잭션 기능 유형의 규칙
트 랜잭션 기능의 유형을 살펴보면 모두 “외부(External)”이 붙어 있음을 알
수 있다. 이 “외부”는 측정하고자하는 시스템 입장에서의 “외부”이다. 즉, 기능점수는 시스템의 기능입장에서 (시스템이 1인칭이다.) 외부와
내부를 구별하여 그 관계를 유형으로 결정하는데, 모든 기능유형이 “외부”가 붙어 있다는 것은 시스템의 외부와 어떤 입출력이 이루어져야만 기능으로
인정한다는 것을 나타낸다.
즉, 시스템 입장에서 외부에서 입력이 이루어지거나 시스템의 외부로 정보가 출력되어야만 기능으로 본다는
것이다.
여기서 시스템의 외부는 사용자 또는 연계되는 다른 시스템 등이 될 수 있다. 즉, 기능점수의 기능유형은 시스템이
외부와 통신할 때만 측정되며, 내부에서 일어나는 트랜잭션은 기능으로 측정하지 않는다.
대부분의 시스템외부는 사용자가 될 것이므로, 서두에서
얘기한 “사용자에게 의미 있는 기능만을 측정”한다는 것은 바로 이 원리 때문이다.
?
기능점수의 종류
?
기능점수 산출방식은 상황에 따라 여러가지 방법이 존재한다.
?
1. 간이법 / 정통법
국내에서 주로 사용되고 있는 기능점수 방식은 “간이법”이다. 영어로 표현하자면 “Estimate(추산)”인데 영어식표현이 더 정확한 의미를 전달하는 것 같다. 이는 프로젝트 초기 단계에서 각 기능의 정확한 요소를 모르는 경우, 유형별 평균적인 점수를 지정하여 사용하는 것이다.
현재 국내의 소프트웨어 대가 산정시 이 간이법을 기본으로 사용하며, 한국소프트웨어산업협회에서 간이법 사용시의 유형별 평균복잡도 점수를 표준으로 제시하고 있다. 따라서 기능점수 산출시에 이 가이드에 따라 점수를 책정하면 되며, 이후 모든 기능점수 산출에 관한 설명은 “간이법”을 기준으로 한다.
정통법은 위에서 설명한 각 유형에 각 기능이 사용하는 데이터요소의 수를 이용하여 복잡도를 계산한다. 따라서, DET/RET/FTR 등의 추가적인 개념을 알아야 하는데, 이와 같은 데이터요소의 수는 설계가 완료되기 이전에는 도출되기 힘드므로 정통법은 프로젝트 초기 단계에서 잘 사용되지 않는다.
사실 간이법은 각 유형에 따른 평균적인 데이터요소 수를 지정하여 평균점수를 책정한 방식이다.
?
2. 신규개발 / 재개발
기능을 모두 신규로 개발할 때와 기존에 존재하는 기능을 재개발할 때는 다른 산출방식을 사용한다. 위에서 설명한 것은 모두 신규개발 방식이며, 재개발은 신규개발 시에 비교하여 설계와 코드/시험이 얼마나 변경되는 가의 비율을 산출하여 측정하게 된다. 재개발 기능점수 산출방법은 후에 다시 설명하기로 한다.