프로젝트 2017. 4. 21. 01:24

제안요청서란?



프로젝트 끝나고 본사로 복귀해서  refresh 좀 하려고 하면 누가 부르죠^^

ㅇㅇ기관 제안요청서가 떴는데... 같이 제안서를 쓰자고ㅜ.ㅜ

이런 불상사를 피하기 위해서는 휴가 일정을 잘 맞춰야 되요^^


공공기간(민간기업 포함)의 프로젝트를 수주하기위해서는 제안서 제출 및 제안발표는 기본적으로 필수 프로세스입니다. 제안서 작성은 오늘 포스팅은 주제인 제안요청서에 기반하여 작성되어 집니다.


본격적으로 제안요청서에 대해 알아보기 전에 이번 포스팅은 공공기관의 전자정부 사업을 중점으로 작성된다는 것을 알려드립니다.



제안요청서(Request for Proposal)가 뭐죠?

- 시스템 구축 및 SW 서비스를 발주하기 위하여 입찰 대상자에게 발주자의 요구사항을 제시하기 위한 문서입니다.


발주의 종류와 발주 프로세스에 대해서 알고 넘어가죠.


1. 전자정부 사업의 발주 종류

 - 분리발주 : 프로젝트의 투명성 확보를 위해 시스템 구축 시 SW 서비스 업무와 HW 도입 사업을 분리하여 발주

- 분할발주 : SW의 전문성 높이기 위해 분석/설계 단계와 구현/테스트 단계를 나누어 발주 


2. 발주 프로세스(ISO-12207)

1) 발주준비 : 비즈니스, HW/SW 요구사항 정의(발주 계획서)

2) 제안요청서 : 제안 요구사항 문서화(RFP, 평가기준서)

3) 계약 : 입찰공고(나라장터 등), 제안평가, 공급자(수행사) 선정, 계약체결(평가 결과서, 계약서)

4) 공급자(수행사) 관리 : 수행계획 검토 및 승인, 계약진행(사업수행계획서)

5) 인수 및 종료 : 검사, 인수 테스트, 인수(종료 보고서)



발주기관에서 제안요청서를 제시하는 이유는 뭘까요?


 관점

설명 

 발주기관

  • 개발 및 운영 시스템의 요구사항(기능적 요구사항, 비기능적 요구사항)을 식별
  • 기술력과 경제성을 고려한 사업자 선정

 제안사

  • 프로젝트의 과업범위를 예측
  • 기능점수(Function Point)를 통한 SW 대가산정

 감사기관

  • 사업추진 타당성 및 대국민 서비스의 효용성을 고려하여 사업의 성과를 객관적으로 평가



그렇다면, 제안요청서가 갖추어야할 요건도 있겠네요!


  1. 사업의 목적 및 이해 : 사업(프로젝트)을 추진하는 이유 및 목적, 과업범위 제시
  2. 제약사항 : Legacy 시스템과 상호운영성을 위한 개발언어, Framework 지정
  3. 기능적 요구사항 : 공통, 핵심, 선택 요구사항 제시, 기능점수를 통한 대가산정
  4. 비기능적 요구사항 : 성능, 보안, UI 등 시스템의 품질요구사항
  5. 관리적 요구사항 : 수시, 정기(주말 및 월간보고), 중간, 완료보고, 인력관리
  6. 입찰조건 : 참여기업 조건 및 이력 등 공시
  7. 제안평가 기준 : 기술 및 가격평가 기준 제시 

위의 제안요청서의 요건 중 기능적 및 비기능적 요구사항에 대해 좀 더 상세하게 알아보죠!

1. 기능적 요구사항

공통 요구사항 

 핵심 요구사항

선택 요구사항 

  • 시스템에서 반복적으로 수행되는 모듈 또는 컴포넌트
  • Login/Logout, 권한관리, 메뉴
  • 연계모듈
  • SW 아키텍처의 주요기능, 기술적 검토가 필요한 새로운 기술 시도
  • 시스템의 주요 업무기능(예: 민원처리 기능 등)
  • IoT, 빅데이터 분석 등
  • 서비스 품질측면에서 수행사가 선택하여 수행가능한 요구사항
  • 제안서에 추가 제시한 제안사항이 있다면 필수 요구사항으로 변경됨


2. 비기능적 요구사항


성능

보안

UI 

  • 성능평가 대상 선정
  • Virtural User 수 선정
  • 평가도구, 결과보고서
  • 개인정보 안전성 확보조치
  • 접속로그 저장 및 관리
  • 웹 표준 준수
  • 웹 호환성을 고려한 화면 설계
  • Device(PC, Mobile 등)에 독립성을 고려한 화면 설계 


3. 비기능적 요구사항 중 성능 요구사항의 사례


 요구사항

시나리오 

목표치 

우선순위 

 Batch처리

(OLAP)

당일에 발생한 트랜잭션 데이터(거래정보 등)을 추출, 가공, 적재를 22시에 매일 수행

 30분 이내 

 Online 조회

(OLTP)

End User가 웹 브라우저를 통해 조회하는 화면을 대상으로 10 ~ 20개 ROW를 기준

3초 이내 

통계정보 조회 

기간(일별, 월별, 년도별), 부서별 민원처리 통계조회

30초 이내 

하 




제안요청서(RFP)가 뭐고, 왜 작성하는지, 무슨 내용으로 작성되는지에 대해 간단하게 적어봤습니다. 백문이 불여 일견이라고 나라장터 등에서 제안요청서를 한 번 보는게 훨씬 더 도움이 된다고 생각됩니다.

posted by 생각퍼즐
:
프로그래밍 2017. 4. 18. 08:00

페이지 이동 시 검색조건 유지


페이징 처리된 화면에서 페이지(페이지 번호) 이동 시 검색조건을 유지하기 위한 소스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function fn_movePage(pageNo){
    // 검색조건 INPUT ID
    var voArrId = ["searchDiv""searchValue"];
    
    // 검색조건 값
    var voArrValue = ["${noticeBean.searchDiv}","${noticeBean.searchValue}"];
 
    // FORM NAME
    var formNm = "frm";
 
    // URL
    var gotoUrl = "<c:url value='/notice/noticeList.do'/>";
    
    gfn_pagingSearch(pageNo,formNm,gotoUrl,voArrId,voArrValue);
}
 
/*-----------------------------------------------------------------------------------------------
 * function : gfn_pagingSearch(pageNo,formNm,gotoUrl,voId,voValue)
 * 설명    : 페이지 버튼 클릭하면 VO에 담긴 검색조건으로 검색하기 
 * param    : pageNo(페이지번호),formNm(폼이름),gotoUrl(액션url),voArrId 배열,voArrValue 배열
----------------------------------------------------------------------------------------------*/
function gfn_pagingSearch(pageNo,formNm,gotoUrl,voArrId,voArrValue) {
        
    var arr = new Array();
    var i = 0;
    for(var i in voArrId){
        var retVal  = new Object();
        retVal.arrId = voArrId[i];
        retVal.arrValue = voArrValue[i];
        arr[i] = retVal;
        ++i;    
    }
    
    $("#pageIndex").val(pageNo);
    for(var i=0;i<arr.length;i++){
        var retVal = arr[i];
        $("#"+retVal.arrId).val(retVal.arrValue);
    }
    $("#"+formNm).attr("action",gotoUrl).submit();
}
cs

 


posted by 생각퍼즐
:
프로그래밍 2017. 4. 18. 00:22

SSL(TLS) 인증 우회하는 JAVA 코드


여러 공공기관에서 많은 데이터를 개방하고 있죠~


예전에는 엑셀파일 형식으로 많이 개방했었는데, 요즘은 데이터 최신성 유지 및 활용성을 높이기 위해 OPEN API 방식으로 제공을 하고있습니다.


가끔 SSL(TLS)가 적용된 OPEN API 호출 시 인증서 오류(SSL통신)가 발생하기도 합니다. 인증서 만료 또는 인증서 없을 경우 발생하죠!


SSL의 개념에 대해 궁금하시면 여기를 참조하세요!


이러한 문제를 해결하는 방법으로 아래 소스코드처럼 인증우회(인증서 무시)하는 방법이 있습니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
        Document xml = null;      
        HttpURLConnection connection = null;
        
        try{
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            
            URL restUrl = new URL(url);
            String protocol = restUrl.getProtocol();
            
            /* 프로토콜이 HTTPS일 경우 서버쪽 인증서를 신뢰할 수 있도록 처리 */
            if(protocol.toLowerCase().equals("https")){
                TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }
                    @SuppressWarnings("unused")
                    public void checkClientTrusted(X509Certificate[] certs,String authType) {
                    }
                    @SuppressWarnings("unused")
                    public void checkServerTrusted(X509Certificate[] certs,String authType) {
                    }
                    @Override
                    public void checkClientTrusted(
                            java.security.cert.X509Certificate[] arg0,
                            String arg1) throws CertificateException {
                        // TODO Auto-generated method stub
                    }
                    @Override
                    public void checkServerTrusted(
                            java.security.cert.X509Certificate[] arg0,
                            String arg1) throws CertificateException {
                        // TODO Auto-generated method stub
                    }
                } };
 
                SSLContext sc = SSLContext.getInstance("SSL");
                sc.init(null, trustAllCerts, new java.security.SecureRandom());
                HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
            }
 
            /*connection 정보 설정*/
            connection = (HttpURLConnection) restUrl.openConnection();
            connection.setRequestProperty("Accept""text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
            connection.setRequestProperty("Accept-Language""ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3");
            connection.setRequestProperty("Connection""keep-alive");
            connection.setConnectTimeout(Configure.HTTP_CONN_TIME_OUT);
            if(timeOut > 0){
                connection.setReadTimeout(timeOut);
            }else{
                connection.setReadTimeout(Configure.HTTP_READ_TIME_OUT);
            }
            
            /* 호출한 결과를 XML문서로 저장 */
            xml = documentBuilder.parse(connection.getInputStream());
            
        }catch(MalformedURLException me){
            me.printStackTrace();
            throw new MalformedURLException("MalformedURLException");
        }catch(Exception e){
            throw new Exception(e.getMessage());
        }finally{
            /* resource */
            connection.disconnect();
        }
 
cs



posted by 생각퍼즐
: