z

출처:http://blog.daum.net/_blog/BlogTypeView.do?blogid=0ISrw&articleno=7864740&categoryId=125700®dt=20131205024731

 

5분만에 배우는 기능점수(Function Point) 산정방법

S/W 프로젝트를 하다보면 꼭 한번쯤은 기능점수(Function Point) 계산을 해 달라는 요구가 있습니다. 그런데... 기능점수 막상 계산하려고 보면, 낯선 용어들만 잔뜩 들어 있고, 도대체 뭘 해야

blog.daum.net

 

S/W 프로젝트를 하다보면 꼭 한번쯤은 기능점수(Function Point) 계산을 해 달라는 요구가 있습니다. 그런데... 기능점수 막상 계산하려고 보면, 낯선 용어들만 잔뜩 들어 있고, 도대체 뭘 해야 할 지도 모르겠고 어지러운 경험, 다들 한번씩은 있을 것입니다. 그래서 준비했습니다.

 

5분만에 배우는 기능점수 계산.

 

S/W 개발 규모/공수를 산정하는 정부의 권고안이 Man/Month 기준에서 기능점수(Function Point) 기준으로 바뀌어 대부분의 공공과제는 Function Point를 사용합니다.

 

결론만 말씀 드리죠. 이것만 계산하면 끝입니다.

 

(1) 간편 추정법:  기능 목록을 작성하고, 그 갯수 x 4.7 을 하면 기능점수 추정치가 나옵니다. 끝. 쉽죠? (국내 공공프로젝트 분석 결과에 기반하면 그렇다는 뜻입니다.)

 

(2) 정식 계산법: 개발 기능목록을 먼저 확보 해야 합니다.

     기능 하나하나에 대해서, 다음의 적용 여부를 판단하고, 적용되면 +1 해주면 됩니다.

     해당 기능이 내부 데이터 참조가 있느냐? +1 증가: 내부논리파일(ILF)

     해당 기능이 외부 데이터 연계가 있느냐? +1 증가: 외부연계파일(EIF) 

     해당 기능이 외부 입력/수정/삭제가 있느냐? 입력/수정/삭제 각각에 대해서 +1씩 증가: 외부입력(EI) 

     해당 기능이 외부 출력기능이 있느냐ㅑ? +1 증가: 외부출력(EO)

     해당 기능에 보고서/도표 형태의 외부 조회가 있느냐? +1증가: 외부조회(EQ)

     결과적으로 모든 카운트값을 모두 더한 값이 기능점수 총점임.

 

여기까지만 하면 끝입니다. 이 이후에 더 많은 내용들이 많이 있지만, 여기까지만 기억하시면 됩니다. 이후에 나오는 내용은 "보정계수"라고 해서, 규모에 따라서, 사용 언어에 따라서, 위험도에 따라서, 대상 분야에 따라서 0.5 ~ 2.0 범위의 숫자를 보정계수로 가중치 곱이 들어갑니다. (자세한 내역은 전혀 몰라도 상관없습니다.)

 

주의(1). 기능이라 함은, 구현하는 개발자 입장이 아니라, 요청자가 인식하는 기능을 말니다. 따라서 고객의 입장에서 식별되는 기능을 말합니다. (아마도 대부분 UI로 반영되고, 기능 목록으로도 표현됩니다.)

 

따라서 UI 화면 하나당 기능 하나씩이라고 볼 수도 있으니, 각각의 화면당, 그 한 화면을 구현하려면 내부참조/외부연계/외부입력,수정,삭제/외부출력/외부조회가 있는지 없는지를 0/1로 표기하기만 하면 끝입니다.

 

주의(2). 내부/외부 구분 기준은 구축하는 시스템 자체에서 쌓인 데이터를 보느냐 아니면 구축 범위 밖에 있는 자료 참조를 하느냐로 판단합니다. 사용자는 시스템 밖에 있습니다.

 

주의(3). 결국 ILF, EIF, EI, EO, EQ 카운트 값 5개를 알아내는 것이 핵심인 것이죠. 기능목록을 확보하고 여기까지만 오면 사실은 일은 다 끝난 것입니다.

 

그 다음부터는 다음 사이트를 들어가서 5개의 값을 입력하고 차례로 다음/다음 클릭해 가면서 상식적인 판단으로 5~6단계에 걸쳐서 적당한 보정계수를 선택하는 화면을 거치면, 최종적으로 개발 원가를 출력해 줍니다.

 

   http://www.sw.or.kr/business/calculate/cost_calculate01.asp (기능점수 계산 사이트)

 

참~~ 쉽죠 잉!

 

--上善若水, 2013-12-05

 

기타참고:

https://it-license.tistory.com/33?category=808126

 

기능점수 (Function Point) - 1탄

기능점수 (Function Point) 의 정의 기능점수(Function Foint)의 가장 큰 특징은 소프트웨어의 규모를 산정할 때 개발자 즉 공급자 입장이 아닌 사용자 입장에서 그 규모를 산정한다는 점이다. 즉 사용자의 업무적..

it-license.tistory.com

 

AND

https://offbyone.tistory.com/262

 

 

 

Tomcat SSL 적용시 https로 자동 리다이렉트 설정하기

요즘은 대부분의 사이트들이 SSL을 사용해서 https:// 로 연결을 합니다. SSL을 사용하던 초창기에는 성능 문제로 로그인, 회원가입 등 주요한 데이터가 전달되는 곳에 부분적으로 적용을 하였는데, 요즘은 서버와..

offbyone.tistory.com

 

AND

 

출처: http://www.nextree.co.kr/p2847/

 

빅데이터: RDB Capacity 테스트

프로젝트를 수행하다 보면 고객의 요구사항을 최대한 수용해주고 싶지만 그럴 수 없는 상황을 만나곤 한다. 이번 프로젝트에서도 그러한 상황이 발생했는데 바로 빅데이터를 오라클에 저장하고 싶은 고객의 요청이 그러했다. 빅데이터 분석 프로젝트를 진행하면서 여러가지 상황을 접해 보았고 여러가지 기술들을 비교해보고 다양한 방법으로 빅데이터를 분석해 보았다. 그렇게 빅데이터 분석에 자신감이 붙었지만 위의 고객의

www.nextree.co.kr

 

 Nextree  Dec 29, 2013  0 Comments

프로젝트를 수행하다 보면 고객의 요구사항을 최대한 수용해주고 싶지만 그럴 수 없는 상황을 만나곤 한다. 이번 프로젝트에서도 그러한 상황이 발생했는데 바로 빅데이터를 오라클에 저장하고 싶은 고객의 요청이 그러했다. 빅데이터 분석 프로젝트를 진행하면서 여러가지 상황을 접해 보았고 여러가지 기술들을 비교해보고 다양한 방법으로 빅데이터를 분석해 보았다. 그렇게 빅데이터 분석에 자신감이 붙었지만 위의 고객의 요구사항만큼은 시스템적으로 수용될지 확신이 서지 않았다. 이를 확인해 보기 위해서 과연 오라클이 얼마나 많은 데이터를 하루에 수용할 수 있는지 프로토 타입을 구성해서 테스트 해보기로 결정했다.

빅데이터 스토리지에 대해서 간략하게 알아보자

흔히 부르는 Big Data는 데이터가 크기가 큰 것만을 이야기 하는 것은 아니다. 데이터의 양(Volume), 형태(variety), 생성속도(velocity)도 Big Data영역에 포함된다. 이러한 Big Data를 다루는 작업은 무엇보다 저장된 데이터를 효율적으로 분석할 수 있어야 한다. 이러한 요건들을 만족시키지는 여러 가지 스토리지가 나와있는데 NoSql군에 속하는 저장소가 그러한 것들이다. NoSQL은 “Not Only SQL” 약어다. NoSQL은 데이터가 크기가 크거나 데이터가 정형화 되어 있지 않은 경우가 많아 SQL로 모든 데이터 조회가 쉽지 않으므로 자체적으로 데이터를 조회 및 분석 할 수 있는 매커니즘을 제공하는데 대표적인 것이 우리가 흔히 부르는 Map/Reduce라는 Functional한 함수 형태의 분석 매커니즘이다. 또한 NoSQL 군의 스토리지는 대부분 다루는 데이터양이 많다. 따라서 분산해서 데이터를 저장할 필요가 있으므로 분산모드를 제공하는 경우가 많다.

고객의 요구사항과 설계사이에서 갈등이 발생

정형화된 데이터가 단지 용량만 어느 정도 많이 차지할 때 RDB와 Big Data 스토리지 사이에 어느 것을 사용할지 갈등이 발생하게 된다. 하루에 정확히 얼마나 많은 데이터를 RDB가 수용될 지 모르는 상황에서 우리는 고객의 요구사항을 들어줄 수 있는지 없는지 확신이 서지 않았고 이를 해결하기 위해 과연 RDB가 얼마나 많이 데이터를 수용할 수 있는지 프로토타입을 만들어 보기로 했다. 아래는 우리가 겪은 문제점을 구체적으로 적어보았다.

고객의 목표는 약 14~15개 테이블에 약 600만~16억개씩의 Row를 매일 적재하는 것이 목표였고 하루에 적재되는 모든 테이블의 Row수를 합치면 대략 20억개의 Row가 되었다. 고객은 RDB에 데이터를 적재하기를 원했다. 정형화 되어 있는 데이터는 SQL로 얼마든지 데이터를 조회 해 볼 수 있을 것이라 생각했었던 것 같고 따라서 데이터를 24시간 안에 모든 데이터를 적재할 수 있으면 목표를 달성 할 수 있으리라 생각했던 것 같다.

Big Data를 RDB(오라클)로 적재 성능 테스트

약 14~16개의 테이블에 매일 총 20억개의 row를 쌓는 일은 리스크가 많았다. 따라서 개인적은 소견으로는 RDB보다 NoSQL군의 스토리지를 사용하기를 원했으나 뜻대로 할 수 있는 부분은 아니였다.

프로토타입 구성

PM과 협의하여 20억개의 Row를 어떻게 처리할지 기초 설계를 수립하였다. 기초안은 Hadoop의 HDFS에 데이터가 적재되고 Hadoop의 Map/Reduce를 이용해서 테이블에 적재될 데이터를 만들고 이를 스프링 배치에서 Spring Data, Mybatis를 연동하여 데이터를 읽고 저장하도록 애플리케이션을 구성하기로 했다.

위의 프로토타입은 인력부족으로 대부분 홀로 수행하게 되었는데 약 3주정도가 지나고 나서 위의 모습대로 프로토타입을 만들 수 있었다. 완성된 애플리케이션은 생각보다 굉장히 만족도가 높았다

스프링 배치와 하둡의 연동(Map/Reduce 및 HDFS 연동)은 Spring For Apache Hadoop과 Spring Data를 사용해서 처리하였는데 특별히 버그를 발견할 수 없었고 스프링과 Hadoop을 잘 연계시켜 주었다.

위의 애플리케이션 수행절차는 다음과 같다.

  1. HDFS에 적재된 로그를 기반으로 Map/Reduce를 수행하여 14개 테이블에 적재될 수 있는 데이터를 HDFS에 생성한다.
  2. HDFS 생성된 데이터를 스프링 배치에서 읽어 MyBatis 배치모드로 데이터를 적재한다.

RDB에 적재테스트 환경

  • DB는 오라클이고 대기업의 실제 운영DB(사양을 정확히 공개하지는 않겠다)를 기준으로 테스트를 수행.
  • 적재에 필요한 기술셋으로는 Spring Data, Mybatis, Spring Batch를 적용
  • DB는 적재 성능 측정은 단일 쓰래드를 사용함
  • commit Interval은 10000을 적용

테스트 결과 정리

적재 대상 테이블

적재대상 데이터

내용

결과

단일 쓰래드로 총 6,260,526 row를 7개의 컬럼을 가지는 테이블에 적재하는데 총 6분 27초 소요되었다.


적재 대상 테이블

적재대상 데이터

내용

결과

단일 쓰래드로 총 6,260,526 row를 24개의 컬럼을 가지는 테이블에 적재하는데 총 8분 55초 소요되었다.


적재 대상 테이블

적재대상 데이터

내용

결과

단일 쓰래드로 총 9,794,449 row를 5개의 컬럼을 가지는 테이블에 적재하는데 총 6분 1초 소요되었다.


적재 대상 테이블

적재대상 데이터

내용

결과

단일 쓰래드로 총 6,286,093 row를 14개의 컬럼을 가지는 테이블에 적재하는데 총 5분 31초 소요되었다.


적재 대상 테이블

적재대상 데이터

내용

결과

단일 쓰래드로 총 393,778 row를 6개의 컬럼을 가지는 테이블에 적재하는데 총 16초 소요되었다.


적재 대상 테이블

적재대상 데이터

내용

결과

단일 쓰래드로 총 6,260,526 row를 17개의 컬럼을 가지는 테이블에 적재하는데 총 6분 5초 소요되었다.


적재 대상 테이블

적재대상 데이터

내용

결과

단일 쓰래드로 총 6,260,513 row를 9개의 컬럼을 가지는 테이블에 적재하는데 총 8분 1초 소요되었다.


적재 대상 테이블

적재대상 데이터

내용

결과

단일 쓰래드로 총 9,794,410 row를 8개의 컬럼을 가지는 테이블에 적재하는데 총 6분 33초 소요되었다.


적재 대상 테이블

적재대상 데이터

내용

결과

단일 쓰래드로 총 9,794,575 row를 17개의 컬럼을 가지는 테이블에 적재하는데 총 8분 42초 소요되었다.


적재 대상 테이블

적재대상 데이터

내용

결과

단일 쓰래드로 총 9,794,565 row를 8개의 컬럼을 가지는 테이블에 적재하는데 총 6분 52초 소요되었다.


적재 대상 테이블

적재대상 데이터

내용

결과

단일 쓰래드로 총 25,580 row를 8개의 컬럼을 가지는 테이블에 적재하는데 총 1초 소요되었다.


적재 대상 테이블

적재대상 데이터

내용

결과

단일 쓰래드로 총 276,179,101 row를 9개의 컬럼을 가지는 테이블에 적재하는데 약 5~6 시간 소요된다.


적재대상 데이터

결과

컬럼이 31개인 16억개의 row는 앞서 테스트한 TSD_LINK의 최소 20배 이상의 데이터 크기를 가진다.
이는 단일 쓰래드로 테스트가 불가능하고 의미조차 없다. TSD가 약 6시간정도 소요되는걸 감안했을 때 16억개의 row는 처리가 불가능하다. 따라서 테스트는 생략했다.


테스트를 마치면서

프로토타입을 마친 후 PM과 고객이 함께 모여서 위의 결과를 놓고 토론를 했다. 하루 20억 Row를 오라클에 적재하는 일은 여러가지 문제점이 많다는 사실을 고객이 이해했고 다른 방법으로 위의 문제를 풀기로 결정을 내렸다. 위의 프로토타입을 수행함으로서 고객의 요구사항을 들어줄 수 없다는 결정을 이끌어 내게 되어서 개인적으로 좀 안타까웠다. 하지만 이렇게 테스트를 수행함으로써 고객과 원할한 소통을 할 수 있었고 이 내용을 공유함으로써 다른 사람이 나와 같은 고민을 하지 않아도 된다고 생각하니 조금은 마음의 위안이 된다.

프로토 타입 구성 방법을 아래에 간략히 정리한다.

필요한 라이브러리 설정

스프링과 Hadoop을 연계하기 위해서 Maven에 아래와 같은 dependency를 추가

<!-- spring for apache hadoop --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-core</artifactId> <version>1.0.1</version> </dependency> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy</artifactId> <version>1.8.5</version> </dependency> <!-- spring data --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-hadoop</artifactId> <version>1.0.1.RELEASE</version> </dependency>

Hadoop에서 제공하는 HDFS 및 Map/Reduce를 사용하기 위해서 Hadoop 정보를 스프링에 설정

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:hdp="http://www.springframework.org/schema/hadoop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/hadoop http://www.springframework.org/schema/hadoop/spring-hadoop.xsd"> <hdp:configuration> fs.default.name=${hd.fs} mapred.job.tracker=${hd.jt} </hdp:configuration> <hdp:resource-loader id="hadoopResourceLoader" /> </beans>

Hadoop의 Map/Reduce를 Spring배치와 연동하기 위해 Tasklet 설정

<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/hadoop" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:batch="http://www.springframework.org/schema/batch" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/hadoop http://www.springframework.org/schema/hadoop/spring-hadoop.xsd"> <!-- map/Reduce pre-action script --> <script-tasklet id="pre-action-tasklet" script-ref="pre-action-script" scope="step"/> <script id=" pre-action-script" location="script/pre-action.groovy"> <property name="outputDir" value="${job.hdfs.output.root.location}"/> </script> <!-- data generation job --> <job-tasklet id="data-generation-tasklet" job-ref="data-generation-job"/> <job id="data-generation-job" input-path="${job.hdfs.input.root.location}/#{jobParameters['mr.input']}" output-path="${job.data.generator.hdfs.output.location}" mapper="generator.data.mapreduce.DataGeneratorMapper" reducer=" generator.data.mapreduce.DataGeneratorReducer" libs="file:${job.data.generator.jars.location}/*.jar" scope="step" /> </beans:beans>

맵리듀스 pre Action 스크립트(pre-action-script) 파일

스크립트로 HDFS파일을 다룰 수 있다. 필요에 따라서 Map/Reduce를 수행하거나 또는 수행한 후 데이터를 지우거나 삭제하거나 데이터를 위치를 옮길 수 있다

if (fsh.test(outputDir)) { fsh.rmr(outputDir) }

HDFS에서 데이터를 읽도록 ResourceItemReader를 구성

<bean id="hdfsMultiResourceItemReader" class="HdfsMultiResourceItemReader" scope="step" > <constructor-arg> <list> <value>${job.data.generator.hdfs.output.location}/part-r-00000</value> </list> </constructor-arg> <constructor-arg ref="hadoopResourceLoader"/> <property name="delegate" ref="dataFlatFileItemReader"/> </bean> <bean id=" dataFlatFileItemReader” class="org.springframework.batch.item.file.FlatFileItemReader"> <property name="lineMapper"> <bean class="DataLineMapper"/> </property> </bean> <bean id="rpLogPacketWriter" class="DataWriter" />

Spring Data에서 제공하는 HdfsResourceLoader를 사용하여 스프링 배치에서 HDFS파일을 바로 억세스 할 수 있도록 MultiResourceItemReader를 구성

public class HdfsMultiResourceItemReader<T> extends MultiResourceItemReader<T> { /** * 리소스 리스트 */ private List<String> resourceList; /** * 리소스 로더 */ private HdfsResourceLoader hdfsResourceLoader; /** * 기본 생성자 */ public HdfsMultiResourceItemReader(){ super(); } /** * 생성자 * * @param resourceList * @param hdfsResourceLoader */ public HdfsMultiResourceItemReader(List<String> resourceList, HdfsResourceLoader hdfsResourceLoader) { super(); this.resourceList = resourceList; this.hdfsResourceLoader = hdfsResourceLoader; init(); } /** * 초기화 */ public void init(){ if(resourceList == null || resourceList.size() == 0) return; Resource[] resources = new Resource[resourceList.size()]; for(int i=0; i<resourceList.size(); i++){ resources[i] = hdfsResourceLoader.getResource(resourceList.get(i)); } super.setResources(resources); } }

Spring Batch와 Hadoop을 연계한 워크플로우를 작성

<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/hadoop" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:batch="http://www.springframework.org/schema/batch" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/hadoop http://www.springframework.org/schema/hadoop/spring-hadoop.xsd"> <batch:job id="rplog-persist-rdb"> <!-- pre-action --> <batch:step id="pre-action" next="data-generation"> <batch:tasklet ref="pre-action-tasklet"/> </batch:step> <!-- generate data --> <batch:step id="data-generation" next="data-rdb-persistence"> <batch:tasklet ref="data-generation-tasklet" /> </batch:step> <!-- persist data --> <batch:step id="data-rdb-persistence" parent="hdfs-rdb-persistence"> <batch:tasklet> <batch:chunk reader="hdfsMultiResourceItemReader" writer="dataWriter"> <batch:skippable-exception-classes> <batch:include class="SkipException" /> </batch:skippable-exception-classes> </batch:chunk> </batch:tasklet> </batch:step>  빅데이터, Big Data, RDB Nextree

Read more posts by this author.

AND

소프트웨어중심사회

 

소프트웨어 중심사회

 

www.software.kr

 

산업정보 이동> SW산업 지원 이동> SW공공구매 혁신 이동 SW사업 기획

공공부문 SW사업 대가산정

개요

국가기관 등에서 SW사업 추진 시 예산수립, 사업발주, 계약 시 적정대가를 산정하기 위한 기준으로 활용하기 위해 'SW사업 대가산정 가이드' 공표 및 운영중

주요내용

SW사업 대가산정 가이드 구성

구분대가산정핵심요소비용 구성

정보전략계획 (ISP)수립비 컨설팅지수

① 컨설팅대가 = 공수 x (컨설팅지수)0.95 + 10.000.000

② 직접경비

투입공수

① 직접인건비 ② 제경비 = 직접인건비의 110% - 120%

③ 기술료 = (직접인건비 + 제경비)의 20% - 40% ④ 직접경비

정보전략계획 및 업무재설계(ISP/BPR)수립비 투입공수

① 직접인건비 ② 제경비 = 직접인건비의 110% - 120%

③ 기술료 = (직접인건비 + 제경비)의 20% - 40% ④ 직접경비

전사적아키텍쳐(EA/ITA)수립비 투입공수

① 직접인건비 ② 제경비 = 직접인건비의 110% - 120%

③ 기술료 = (직접인건비 + 제경비)의 20% - 40% ④ 직접경비

정보시스템마스터플랜 (ISMP)수립비 투입공수

① 직접인건비 ② 제경비 = 직접인건비의 110% - 120%

③ 기술료 = (직접인건비 + 제경비)의 20% - 40% ④ 직접경비

정보보안컨설팅 수립비 투입공수

① 직접인건비 ② 제경비 = 직접인건비의 110% - 120%

③ 기술료 = (직접인건비 + 제경비)의 20% - 40% ④ 직접경비

소프트웨어 개발비 기능점수

① 개발원가 ② 이윤 = 개발원가 x 25% 이내

③ 직접경비 : 시스템사용료, 개발도구 사용료 등

요율체 유지관리비 유지관리 총점수

① 소프트웨어 개발비 재산정가 x 유지관리 난이도(%)

② 직접경비

상용소프트웨어 유지관리비 등급별 요율 ① 최초 Licence 구매 계약 금액 X 등급별 유지관리요율
보안성 지속 서비스비 서비스항목, 요율 ① 최초 제품 구매 계약 금액 X 서비스 요율(%)
투입공수방식 운영비 투입공수

① 직접인건비 ② 제경비 = 직접인건비의 110% - 120%

③ 기술료 = (직접인건비 + 제경비)의 20% - 40% ④ 직접경비

보안관제 서비스비 투입공수

① 직접인건비  ② 제경비 = 직접인건비의 110%~120% 

③ 기술료 = (직접인건비 + 제경비)의 20%~40%  ④ 직접경비

고정비/변동비 방식의

유지관리 및 운영비

기능점수, 투입공수

① 변동비 산정(재개발대가)

② 고정비 산정(투입공수방식 운영비)

③ 직접경비

SLA기반 유지관리

및 운영비 정산법

서비스 항목, 보상/체재 비율

① 서비스 측정 ② 서비스 평가

③ 보상/체재 비율에 따른 사후정산

소프트웨어 재개발비 재개발 기능점수

① 재개발원가 ② 이윤 = 재개발원가 x 25%이내

③ 직접경비 : 시스템사용료, 개발도구 사용료 등

관련규정

• 소프트웨어산업진흥법 제22조(소프트웨어사업의 대가지급)
• 소프트웨어산업진흥법 제26조(한국소프트웨어산업회의 설립)
• SW사업 대가산정 가이드(한국소프트웨어산업협회 공표)
• 예산안 작성 세부지침(기획재정부)
• 행정기관 및 공공기관 정보시스템 구축·운영 지침(행정안전부)

지원기관

한국소프트웨어산업협회 산업정책실 정책연구팀(T.02-2188-6930)

 

소프트웨어산업협회

 

기술자평균임금 - 한국소프트웨어산업협회

기술자평균임금 조사목적 SW사업체에서 근무하는 SW기술자의 실 지급 임금을 조사하여, SW기술인력의 임금동향을 파악하고 정책입안 기초자료로 활용 기존 ‘SW사업 대가의 기준’의 대체방안으로 ‘SW사업 대가산정 가이드’ 개발 조사개요 구분, 내용에 대한 내용이 있습니다. 구분 내용 조사명 SW기술자 임금실태조사 통계의 종류 일반 통계, 조사 통계 승인번호 법적근거 통계법 제15조(통계작성기관의 지정) 통계법 제18조(통계작성의 승인) 통계법 제27조(통계의

www.sw.or.kr

SW 구매가격 산정

개요

국가기관 등에서 SW구매가격 산정방법 등을 참고하여 SW기업이 SW납품 가격 산정 시 활용

주요내용

• 상용SW(DBMS, 보안SW, 시스템 SW, 범용SW 등) 구매 시 산정기준

• 구축 대상 시스템의 규모 및 사용자 수에 따라 사양을 결정하고 견적가를 기준으로 적정 비용 산정

• 조달품목은 조달단가를 적용하고, 조달품목이 아닌 경우에는 최근 도입가격 또는 유사한 거래 실례가격 등을 감안하여 산정
 * 그 외의 경우 3개 이상의 공급업체로터 직접 받은 견적가격을 기준으로 한 적정가격

관련규정

• 기획재정부 예정가격 작성기준
• 기획재정부 예산안 작성 세부지침

지원기관

정보통신산업진흥원 ICT생태계본부 SW제도혁신팀(043-931-5353)

 

통계법 제27조(통계의 공표)에 따라 『2019년 SW기술자 임금실태조사 (통계승인 제37501호)』의
SW기술자 평균임금을 공표합니다. 


【SW기술자 평균 임금】

 

                                                                                                                       (단위: 원)

구분

일평균 임금

월평균 임금

시간평균 임금

(1) IT기획자

403,081 

8,424,393 

50,385 

(2) IT컨설턴트

437,900 

9,152,103 

54,737 

(3) 정보보호컨설턴트

340,978 

7,126,439 

42,622 

(4) 업무분석가

501,090 

10,472,778 

62,636 

(5) 데이터분석가

335,799 

7,018,209 

41,975 

(6) IT PM

362,780 

7,582,109 

45,348 

(7) IT PMO

410,270 

8,574,648 

51,284 

(8) SW 아키텍트

389,104 

8,132,265 

48,638 

(9) Infrastructure아키텍트

461,684 

9,649,203 

57,711 

(10) 데이터 아키텍트

399,985 

8,359,679 

49,998 

(11) UI/UX 개발자

258,696 

5,406,750 

32,337 

(12) 응용SW 개발자

305,985 

6,395,094 

38,248 

(13) 시스템SW 개발자

247,970 

5,182,563 

30,996 

(14) 임베디드SW 개발자

271,214 

5,668,383 

33,902 

(15) 데이터베이스 운용자

274,324 

5,733,364 

34,290 

(16) NW엔지니어

327,598 

6,846,793 

40,950 

(17) IT시스템운용자

278,605 

5,822,848 

34,826 

(18) IT지원 기술자

183,743 

3,840,221 

22,968 

(19) SW제품 기획자

426,419 

8,912,158 

53,302 

(20) IT서비스 기획자

383,295 

8,010,861 

47,912 

(21) IT기술영업

376,746 

7,874,001 

47,093 

(22) IT품질관리자

402,554 

8,413,382 

50,319 

(23) IT테스터

198,611 

4,150,962 

24,826 

(24) IT감리

340,109 

7,108,276 

42,514 

(25) IT감사

398,085 

8,319,985 

49,761 

(26) 정보보호관리자

376,529 

7,869,458 

47,066 

(27) 침해사고대응전문가

278,202 

5,814,424 

34,775 

(28) IT교육강사

321,017 

6,709,263 

40,127 

<본 평균임금을 SW사업대가 활용시 유의사항>

※ 본 조사결과는 SW사업에서 반드시 활용해야 하는 강제사항은 아님

 * SW기술자 평균임금은 소프트웨어산업진흥법 제22조(소프트웨어사업의 대가지급) 4항 '소프트웨어기술자의
   노임단가'를 지칭함

 * SW기술자 평균임금은 기본급, 제수당, 상여금, 퇴직급여충당금, 법인부담금을 모두 포함한 결과임

 * 월평균임금은 일평균*근무일수(20.9일), 시간평균임금은 일평균÷8시간으로 각각 산정함

 * 월평균 근무일수는 휴일, 법정공휴일 등을 제외한 업체가 응답한 근무일의 평균이며, 이는 개인의 휴가 사용여부와는
   무관함

 * SW기술자 평균임금은 2018년 대비 7.7% 증가함

 * IT직무 중 (25) IT감사는 유효응답 표본이 적어 활용시 유의해야함
 [시행일] 2020년 1월 1일부터 2020년 12월 31일까지 적용

AND

출처:https://sangheon.com/2010/04/20/1670

요즘 개인용 컴퓨터도 멀티코어를 장착하고 나올 정도로 멀티프로세서(Multiprocessor)가 흔해졌습니다. 덕분에 멀티프로세스(Multiprocess) 프로그래밍으로 개발한 데몬과 같은 것을 실행시켜 보면 여러 프로세서에 적당히 나뉘어 실행되는 것을 쉽게 확인 할 수 있습니다.

그런데 여기에 한가지 욕심을 더 내보자면 특정한 작업을 수행하는 프로세스를 특정한 프로세서에 할당하고 싶다는 생각이 드는 경우가 있습니다. 네트워크 데이터 및 DB 처리는 0번 CPU, 데이터 처리는 1번 CPU 식으로 말입니다.

기본적으로 OS에서 프로세스를 어떤 CPU에 할당하는지는 OS가 가진 자체적인 스케쥴링에 따르도록 되어 있습니다.

 

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

 

int main(int argc, char *argv[]) {
unsigned int i = 0;
pid_t pid;

 

if ( (pid = fork()) == 0 ) {
  for ( i = 0; i < UINT_MAX; i++) {
  }
}
else {
  int status;
  waitpid(pid, &status, 0);
}

return EXIT_SUCCESS;
}

 

위 소스는 1개의 자식 프로세스를 생성하고 더하기 연산을 반복적으로 수행하여 CPU를 100% 사용하게 만드는 예제입니다.

터미널을 하나 더 열어 top을 실행시킨 후 '1'번 키를 눌러 CPU 별로 사용량을 지켜볼 수 있게 준비를 합니다. 그리고, 소스를 컴파일 해서 여러번 실행시켜 보면 사용량이 100%에 달하는 CPU가 고정적이지 않고 변하는 것을 확인 할 수 있습니다. 물론 OS의 스케쥴링 정책에 영향을 받기 때문에 특정한 CPU에 고정적으로 할당되는 것처럼 보일 수도 있으나 많은 횟수를 실행시켜보면 변한다는 것을 확인 할 수 있습니다.

 

#define _GNU_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <getopt.h>
#include <sched.h>

 

void print_help(char *cmd)

{
  printf("Usage: %s -n -c < 선호CPU>\n\n", cmd);
  printf(" CPU 개수 : CPU 코어 개수\n");
  printf(" 선호 CPU : CPU 코어 번호 (0 부터 시작)\n\n");
  printf(" 예 : 쿼드코어 CPU에서 3번째 코어를 사용하는 경우\n");
  printf(" $ %s -n 4 -c 2\n", cmd);
}

 

int main(int argc, char *argv[]) {
unsigned int i = 0;
pid_t pid;
int max_cpu = -1;
int cpu = -1;
int opt;

 

while ( (opt = getopt(argc, argv, "n:c:")) != -1 ) {
  switch ( opt ) {
    case 'c' :
      cpu = atoi(optarg);
      break;
    case 'n' :
      max_cpu = atoi(optarg);
      break;
    case '?' :
      default :
      print_help(argv[0]);
      exit(EXIT_FAILURE);
    break;
  }
}

 

if ( max_cpu < 1 || cpu < 0 || cpu >= max_cpu ) {
  print_help(argv[0]);
  exit(EXIT_FAILURE);
}

 

if ( (pid = fork()) == 0 ) {
  cpu_set_t mask;

  CPU_ZERO(&mask);
  CPU_SET(cpu, &mask);
  pid = getpid();
 

  if ( sched_setaffinity(pid, sizeof(mask), &mask) ) {
    fprintf(stderr, "%d 번 CPU를 선호하도록 설정하지 못했습니다.\n",
  cpu);
  exit(EXIT_FAILURE);
  }
  else {
    printf("%d 번 CPU를 선호하도록 설정했습니다.\n", cpu);
  }

 

  for ( i = 0; i < UINT_MAX; i++) {
  }
} else {
  int status;
  waitpid(pid, &status, 0);
}

return EXIT_SUCCESS;
}

 

위 소스 코드는 sched.h에서 제공하는 sched_setaffinity 함수를 사용하여 특정한 CPU에서 프로세스가 실행되도록 한 것입니다.

sched_setaffinity 함수는 3개의 매개변수를 받는데 첫번째는 프로세스 ID(pid)입니다. pid 대신 0을 넘기면 자동으로 현재 동작중인 프로세스로 설정됩니다. 두번째는 cpusetsize 입니다. 보통은 sizeof(cpu_set_t)로 설정하면 됩니다. 세번째는 mask 포인터입니다. mask 포인터는 아래의 매크로 함수들을 사용해서 편리하게 설정 할 수 있습니다.

 

void CPU_CLR(int cpu, cpu_set_t *set);
int CPU_ISSET(int cpu, cpu_set_t *set);
void CPU_SET(int cpu, cpu_set_t *set);
void CPU_ZERO(cpu_set_t *set);

 

cpu는 CPU의 번호로 0번부터 시작합니다. 쿼드코어 CPU 라면 0~3번 사이의 값이 됩니다. mask 값을 여러개의 CPU로 지정하는 것도 가능합니다.

sched.h가 정상적으로 동작하기 위해서는 꼭 헤더파일을 인클루드 하기 전에 #define _GNU_SOURCE를 선언 해주어야 합니다. 선언하지 않으면 CPU_XXXXX 매크로 함수를 찾을 수 없다며 컴파일 오류가 발생합니다.

멀티프로세스나 멀티쓰레드를 여러개의 CPU나 코어에 적절히 배치하여 효과적으로 사용하는 것은 매우 어려운 기술입니다. sched_setaffinity 함수를 통해 수동으로 배치했다고 해서 그것이 반드시 OS의 스케쥴링에 의한 배치보다 효율적이라는 보장은 없습니다.

다만 몇가지 특징적인 프로세스들을 적절히 배치하여 CPU 자원을 어느 정도 보장 해주는데 도움이 될 수 있다고 생각합니다.

AND