> [!abstract] Introduction > 소프트웨어 개발, 유지관리, 그리고 운영에는 돈, 시간, 노동력 등의 자원이 필요합니다. 그래서 소프트웨어 개발비를 산정해야 하는데, 이번 글에서는 소프트웨어 개발비를 산정할 때 사용하는 기능점수, 그리고 기능점수로 소프트웨어 개발비를 산정하는 방법에 대해 알아봅니다. # 기능점수 기능점수*function point*란, 사용자 관점에서 측정된 소프트웨어 기능의 양으로서, 사용자에게 제공되는 소프트웨어 기능의 규모를 측정하는 단위다. 소프트웨어 기능은 사용자 관점에서 갖는 논리적 의미에 따라 크게 데이터 측면의 기능과 트랜잭션 특면의 기능으로 구분되는데, 이들을 다시 세분하면 데이터 기능에는 내부논리파일*Internal Logic File*과 외부연계파일*External Interface File*의 2가지 유형이 있으며, 트랜잭션 기능에는 세부적으로 외부입력*External Input*, 외부출력*External Output*, 외부조회*External Query*의 3가지 유형이 있다. ![[SoftwareFunctionTypeClassification.png]] 기능점수는 데이터 기능점수와 트랜잭션 기능점수를 합한 것이기 때문에 기능점수에 대해 이해하기 위해서는 먼저 데이터 기능점수와 트랜잭션 기능점수에 대해 이해해야 한다. ## 데이터 기능점수 데이터 기능점수는 사용자의 내부 및 외부 데이터 요구사항을 충족시키기 위한 기능의 양으로서, 내부논리파일과 외부연계파일의 두 가지 유형이 있다. 이들의 개수와 각각의 복잡도(가중치)에 의해 데이터 기능점수가 결정된다. 우선 내부논리파일과 외부연계파일이 무엇인지 이해해보자. ### 내부논리파일과 외부연계파일 - 내부논리파일: 사용자 관점에서 식별 가능한, 논리적으로 연관된 하나의 데이터그룹 또는 제어정보로서 측정대상 애플리케이션 내부에서 유지되는 파일. - 외부연계파일: 사용자 관점에서 식별 가능한, 사용자가 식별할 수 있는 논리적으로 연관된 하나의 데이터그룹 또는 제어정보로서 측정대상 애플리케이션 내부에서는 오직 참조만 되고 다른 애플리케이션에서 유지되는 파일. 두 개념 모두 애플리케이션의 내부와 외부를 구분하는 것을 확인할 수 있다. 그렇다면 애플리케이션의 내부와 외부를 구분짓는 경계는 무엇일까? ### 애플리케이션 경계 기능점수는 애플리케이션 외부의 사용자 관점에서 관찰되는 기능을 대상으로 측정한다. 그래서 특정 애플리케이션에 대한 기능점수를 측정하기 위해서는 해당 애플리케이션과 다른 애플리케이션의 경계 및 해당 애플리케이션과 외부 사용자 사이의 경계를 구분해야 하는데, 이를 애플리케이션 경계라고 한다. 두 개 이상의 애플리케이션 사이에 경계를 정의할 때는 반드시 사용자의 관점에서 해당 애플리케이션들이 명확히 구분될 수 있어야만 한다. 애플리케이션 경계는 사용자 관점에 기초하여 분리된 기능 영역으로 결정되는 것으로, 기술적 고려사항에 의한 것이 아니다. 또한 기능점수 측정은 설정된 애플리케이션 경계단위로 측정한 후 각 애플리케이션별 측정된 기능점수들을 합쳐서 총 기능점수를 산출해야 한다. 따라서 신뢰할 수 있는 기능점수를 위해서는 애플리케이션 경계를 잘 정하는 것이 핵심이다. ## 트랜잭션 기능점수 트랜잭션 기능은 사용자에게 의미있는 데이터를 처리하는 기능을 제공하는 단위프로세스의 집합을 말하며, 외부입력, 외부출력, 외부조회 기능으로 구분되어 기능점수로 산정된다. 우선 외부입력, 외부출력, 외부조회 기능부터 알아보자. ### 외부입력, 외부출력, 외부조회 - 외부입력: 애플리케이션 경계 밖에서 들어오는 데이터나 제어정보를 처리하는 단위프로세스로서, 하나 이상의 논리파일을 변경하거나 시스템 동작을 변경한다. - 하나 이상의 논리파일 변경: 등록, 수정, 삭제, 설정, 승인 등 단위프로세스 실행 시 특정 논리파일이 변경되는 활동을 의미한다. - 시스템 동작 변경: 특정 시점에 수행되던 단위프로세스가 업무환경 변경에 따라 단위프로세스 실행 시점이 변경되는 활동을 의미한다. - 외부출력: 외부조회에 추가적인 처리 로직을 포함하여 데이터나 제어정보를 애플리케이션 경계 밖으로 보여주는 단위프로세스로서, 처리로직은 하나 이상의 수학적 계산, 공식, 또는 파생 데이터를 포함하거나, 하나 이상의 내부논리파일을 유지하거나, 시스템의 동작 변경을 수행해야 한다. - 외부조회: 데이터나 제어정보를 애플리케이션 경계 밖으로 보여주는 단위프로세스로서, 데이터나 제어정보를 단순히 검색하여 사용자에게 제공한다. 외부조회는 4가지 처리로직인 수학적 계산이나 공식을 사용하지 않으며, 파생 데이터도 생성하지 않는다. 처리 과정에서 내부논리파일을 유지하지 않으며 시스템의 동작도 변경하지 않는다. 트랜잭션 기능으로 식별되기 위해서는 반드시 단위프로세스 요건을 충족해야 하는데, 이때 단위프로세스 요건은 사용자에게 의미 있고 자기 완결적이며 비즈니스를 일관된 상태로 유지할 수 있는 완전한 트랜잭션을 구성하는 사용자의 기능별 요구사항의 가장 작은 단위활동을 말한다. # 기능점수 방법 기능점수 방법은 사용자 관점에서 사용자에게 제공되는 소프트웨어 소프트웨어의 규모를 측정하는 방법으로 소프트웨어 개발, 유지관리 및 운영을 위한 비용과 자원 소모를 산정하는데 가장 중요한 요소 중 하나다. 기능점수는 수요자 관점에서 측정된다. 소프트웨어 개발 및 유지관리의 업무량을 조직, 구현 기술, 공수, 적용 방법론, 물리적 또는 기술적 컴포넌트와 무관하도록 일관성 있게 측정할 수 있다. 또한 개발 이전의 업무량을 측정할 수 있으며 개발은 몰론 기획, 운영 등 전 수명주기에 걸쳐서 측정할 수 있다. 단 기능점수 방식 적용이 불합리한 다음과 같은 사업 유형에 한하여 예외적으로 투입공수 방식을 적용할 수 있다. - 홈페이지 디자인, 웹 접근성 개선, 영상 등 콘텐츠 관련 정보화사업 - R&D 성격의 소프트웨어 개발 사업 - 사용자에게 식별되는 기능규모에 비해 내부처리 복잡도가 현저히 높아 기능점수 방식의 대가체계 적용이 불합리하다고 인정되는 소프트웨어개발 사업 - 데이터 튜닝 및 최적화, 테스트 등 기능점수 산정이 불가능한 경우 - 소프트웨어개발 관련 예산이 5000만원 미만인 사업 가능점수 방식으로 소프트웨어의 개발규모를 산정할 수 있는데 여기에는 일반적인 기능점수 산정방법(정통법)과 평균 복잡도를 적용하는 방법(간이법)이 있다. - 정통법: 소프트웨어의 기능을 도출하고, 각 기능의 유형별 복잡도를 고려하여 정확한 기능점수 산정을 필요로 할 경우 사용되는 일반적인 방법이다. 통상적으로 소프트웨어 개발 공정 상 설계공정 후 사용된다. - 간이법: 기능의 복잡도를 판단하기 어려운 경우 적용하는 방법으로 계산 절차는 정통법과 동일하나 기능점수 산정 시 기능 유형별 평균 복잡도를 적용하여 기능점수를 산출한다. 통상적으로 기획 및 발주단계에서의 기능점수 측정에 사용된다. | 구분 | 정통법 | 간이법 | | ---- | --------------------------------------------- | ------------------------------------------------------- | | 장점 | 규모측정 정확도가 간이법 대비 상대적으로 높음 | 기능점수 측정 소요시간과 측정 지식 습득시간이 정통법 대비 상대적으로 짧음 | | 단점 | 기능점수 측정 소요시간과 측정 지식 습득시간이 간이법 대비 상대적으로 긺 | 규모측정 정확도가 정통법 대비 상대적으로 낮음 | | 적용시점 | 개발요건 및 요건별 상세설계정보가 제공되는 시점. 즉, 설계공정 이후부터 폐기까지 | 개발요건만 정의되면 예산수립, 사업발주, 개발, 운영 및 유지보수, 폐기까지 모든 단계에서 적용가능 | ## 소프트웨어 개발비 산정 과정 기능점수 방식에 의한 소프트웨어 개발비는 크게 소프트웨어 개발원가, 직접경비, 이윤의 세부분으로 구성된다. 소프트웨어 개발원가는 기능점수로 측정되는 소프트웨어 개발규모에 기능점수당 단가를 곱하고 여기에 보정계수[^1]를 곱하여 산정된다. 직접경비는 해당 소프트웨어 개발사업에 소요되는 직접적인 경비를 의미한다. 이윤은 개발원가의 25% 이내에서 계상[^2]된다. 이상의 부문을 포괄하여 소프트웨어 개발비를 산정하는 구조를 그림으로 나타내면 다음과 같다. ![[SoftwareDevCostComponents.png]] 기능점수를 통해 소프트웨어의 개발비를 산정할 수가 있는데, 이번 글은 소프트웨어 개발비에 대한 글이 아니기 때문에 기능점수에 관련된 부분만 살펴볼 것이다. 그래도 전체를 이해한다는 느낌으로 기능점수 방식에 의한 소프트웨어 개발비 산정 절차 전체를 살펴보자. ![[FunctionPointCostEstimationProcedure.png]] 이제 기능점수를 어떻게 산정하는지 본격적으로 이해해보자. # 기능점수 산정하기 앞서 설명한 바와 같이 기능점수는 데이터 기능점수와 트랜잭션 기능점수의 합으로 계산된다. 그러므로 데이터 기능점수와 트랜잭션 기능점수를 별도의 섹션에서 설명하도록 한다. ## 데이터 기능점수 산정하기 이제 데이터 기능점수의 산정 방식을 설명할 수 있게 되었다. 데이터 기능점수의 산정 방식은 다음과 같다. 1. 개발대상 소프트웨어에서 내부논리파일과 외부연계파일을 식별하고, 각각의 개수를 산정한다. 2. 내부논리파일과 외부연계파일별로 각각의 복잡도와 가중치를 산정한다. 3. 데이터 기능점수를 산정한다. 데이터 기능점수는 각각의 내부논리파일 및 외부연계파일의 가중치를 모두 더하여 계산된다. 1. 간이법에서 사용하는 평균복잡도 가중치는 내부논리파일의 경우 7.5, 외부연계파일의 경우 5.4로 명시되어 있다. 2. 정통법에서 사용하는 가중치는 내부논리파일과 외부연계파일 각각에 대해 데이터요소유형*Data Entity Type*과 레코드요소유형*Record Entity Type*을 식별하여 기능 복잡도에 따라 가중치를 결정하는데, 그 값이 아래 표3-9와 표3-10에 명시되어 있다.![[IlfComplexityAndFpWeight.png]]![[EifComplexityAndFpWeight.png]] > [!tip] 레코드요소유형과 데이터요소유형 > - 내부논리파일이나 외부연계파일 내에 데이터 서브그룹이 없다면 내부논리파일이나 외부연계파일 자체를 하나의 레코드요소유형으로 식별한다. > - 만약 내부논리파일이나 외부연계파일 내에 데이터 서브그룹이 있다면, 각각의 데이터 서브그룹을 하나씩의 레코드요소유형으로 식별한다. > - 서브그룹은 필수적 서브그룹과 선택적 서브그룹으로 구분된다. > - 필수적 서브그룹: 사용자가 데이터의 인스턴스를 추가 또는 생성하는 단위프로세스에서 적어도 하나이상의 서브그룹을 사용해야 하는 것을 말한다. > - 선택적 서브그룹: 사용자가 데이터의 인스턴스를 추가 또는 생성하는 단위프로세스에서 서브그룹을 사용할 수도 있고 사용하지 않을 수도 있는 것을 말한다. > - 데이터요소유형은 사용자가 인식 가능하고 반복되지 않는 유일한 속성을 말한다. > - 두 개의 서로 다른 애플리케이션이 동일한 내부논리파일 혹은 외부연계파일을 유지관리하거나 참조한다면, 각각의 애플리케이션이 사용하는 속성만 데이터요소유형으로 식별한다. > - 서로 다른 내부논리파일 혹은 외부연계파일들끼리 관계를 맺기 위하여 사용된 속성은 각 내부논리파일 혹은 외부연계파일에서 하나의 데이터요소유형으로 식별한다. ## 트랜잭션 기능점수 산정하기 트랜잭션 기능점수는 다음의 절차에 따라 측정한다. 1. 개발대상 소프트웨어의 외부입력, 외부출력, 외부조회 기능을 식별하고, 각각의 개수를 산정한다. 2. 외부입력, 외부출력, 외부조회 각각의 복잡도와 가중치를 산정한다. 1. 간이법에서 사용하는 평균복잡도 가중치는 외부입력의 경우 4.0, 외부출력의 경우 5.2, 외부조회의 경우 3.9로 정해져 있다. 2. 정통법에서는 외부입력, 외부출력, 외부조회 각각에 대해 참조파일유형과 데이터요소유형을 식별하여 복잡도(가중치)를 결정한다. 참조파일유형과 데이터요소유형이 식별되면 외부입력/외부출력/외부조회 각각에 대하여 다음 표를 이용하여 복잡도와 가중치를 산정한다.![[EiComplexityAndFpWeight.png]]![[EoComplexityAndFpWeight.png]]![[EqComplexityAndFpWeight.png]] 3. 외부입력, 외부출력, 외부조회 각각의 가중치를 모두 더하면 트랜잭션 기능점수가 계산된다. > [!tip] 참조파일유형과 데이터요소유형 > - 참조파일유형은 트랜잭션 기능에 의해 읽히거나 유지되는 내부논리파일 또는 트랜잭션 기능에 의해 읽히는 외부연계파일이다. > - 외부입력/외부출력/외부조회 프로세스 처리 과정에서 참조되는 내부논리파일과 외부연계파일 각각을 하나씩 참조파일유형으로 식별한다. > - 수정과 조회가 동시에 적용되는 내부논리파일은 한번만 참조파일유형으로 식별한다. > - 트랜잭션 기능이 수행되는 동안 경계로 넘나드는 사용자가 인식할 수 있는 유일하고 반복되지 않는 각 속성을 하나씩 데이터요소유형으로 식별한다. > - 각 트랜잭션 기능에서 다수의 메시지가 존재하더라도 애플리케이션 응답 메시지를 보내는 기능에 대하여 트랜잭션 기능 당 오직 한번만 데이터요소유형으로 식별한다. > - 동작을 시작하게 하는 여러 수단이 존재하더라도 트랜잭션 기능 당 오직 하나의 데이터요소유형으로 식별한다. # 기능점수로 개발원가 계산하기 이제 기능점수를 모두 구했다. 여기에 기능점수당 단가를 곱하면 보정전 개발원가가 산정되고, 현재 가장 최근에 정해진 기능점수당 단가는 605,784원이다. 이렇게 끝나면 좋겠지만 개발원가를 계산하기 위해서는 여러가지 변수를 고려해야 한다. ## 일부 단계만 수행한 경우 소프트웨어 개발 사업이 소프트웨어 개발의 전체 단계가 아닌, 일부 단계만을 수행하는 경우도 있다. 소프트웨어 개발 사업이 분할 발주되어 분석·설계와 구현·시험이 별도의 사업으로 수행되는 경우 등이 이러한 예에 해당된다. 이때는 기능점수당 단가에 해당 단계별 기능점수 가중치를 곱하여 이를 합산한 값을 적용한다. 각 단계별 가중치는 아래와 같다. ![[FunctionPointWeightByDevPhase.png]] ## 보정계수 기능점수당 단가는 개발 프로젝트의 복잡도가 보통인 경우를 전제로 하여 산정된 것이다. 그러나 실제의 개발비용은 프로젝트 규모에 따른 생산성과 발주기관의 비기능적인 요구사항에 따른 프로젝트의 복잡도 수준에 의해 영향을 받게 되어, 이에 대한 보정이 필요하다. 그래서 실제 개발 비용에 영향을 미치는 요인 중에서 예산 수립 또는 제안 단계에서 정량적으로 파악 가능한 요소들을 중심으로 보정계수를 정의하고, 이를 개발원가에 적용하여 보정후 개발원가를 산정한다. 이 단계에서 보정전 개발원가에 규모, 연계복잡성 수준, 성능요구 수준, 운영환경 호환성, 보안성 수준의 5가지 보정계수를 곱하여 보정후 개발원가를 산정한다. ### 규모 소프트웨어 개발사업 규모가 커지면 생산성은 증가하고, 일정 규모 이상이 되면 생산성이 다시 감소하는 추세를 보이고 있다. 따라서 사업규모의 증가에 따른 생산성 변화에 대한 보정이 필요하며, 이를 감안하는 것이 규모 보정계수이다. 규모 보정계수는 다음과 같이 산정된다. 만약 한 사업에서 여러 개의 애플리케이션을 통합 구축하는 경우에는 통합 규모를 대상으로 규모 보정계수를 적용한다. ![[ScaleCorrectionFactor.png]] ### 애플리케이션 사용자가 애플리케이션 시스템에 요구하는 특정한 복잡도는 소프트웨어 개발의 생산성에 영향을 미치게 된다. 따라서 사용자가 애플리케이션 시스템에 요구하는 복잡도 수준에 따른 보정계수를 적용하여야 한다. ![[ApplicationComplexityCorrectionFactor.png]] 애플리케이션 복잡도는 연계복잡성 수준, 성능요구 수준, 운영환경 호환성, 보안성 수준의 4가지로 구분된다. 각각의 의미는 다음과 같다. #### 연계복잡성 수준 대상 애플리케이션의 연계 기관수가 증가함에 따른 프로젝트 관리의 복잡성을 의미한다. 연계 기관수가 많을수록 높은 값을 가진다. #### 성능요구 수준 응답시간 또는 처리율에 대한 사용자 요구수준의 복잡성을 의미한다. 성능요구 수준이 복잡할수록 높은 값을 가진다. #### 운영환경 호환성 응용SW의 설치 운영환경의 상이한 정도를 의미한다. 상이한 운영환경이 요구되거나, 상이한 하드웨어와 소프트웨어 운영환경을 지원하도록 개발되는 요구정도가 복잡할수록 높은 값을 가진다. 제안요청서에 하나 또는 그 이상의 운영환경에 대한 요구사항 또는 서버 이중화 요구 여부 및 애플리케이션이 운영되는 하드웨어 및 소프트웨어 환경의 유사한 정도를 판단하여 측정할 수 있다. #### 보안성 수준 시큐어 코딩, 웹 취약점 점검, 암호화 점검, 개인정보보호 등 보안성에 대한 요구수준을 의미한다. 보안성에 대한 요구정도가 복잡할수록 높은 값을 가진다. 위 4가지 보안 요구사항은 보안과 관련된 대표적인 요구사항을 나열한 것으로 4가지 외 보안요구사항을 포함하여 보안요구사항의 총 개수로 복잡도 수준을 측정할 수 있다. ## 보정후 개발원가 계산하기 5가지 보정계수가 각각 산정되면 아래의 산정식에 따라 보정후 개발원가를 산정한다. ![[CorrectedDevCost.png]] --- # 출처 - 2025년 SW사업 대가산정 가이드 [^1]: 사용자가 애플리케이션 시스템에 요구하는 특정한 복잡도는 소프트웨어 개발의 생산성에 영향을 미치게 된다. 따라서 사용자가 애플리케이션 시스템에 요구하는 복잡도 수준에 따른 보정계수를 적용하게 된다. [^2]: 計上. 계산한 금액을 장부에 기록하거나 반영하는 행위를 말한다.