본문 바로가기
Software/Python

조달청 입찰/계약 정보 조회용 프로그램 (1/ 2) - 공공데이터포탈 API 분석 및 GUI구성

by lovey25 2021. 3. 19.
반응형

2023-04-05 update log: 공공데이터 API 업데이트 사항 반영


조달청에서 제공하는 API를 이용해서 정부 발주 입찰공고 및 계약현황을 조회하는 파이썬 프로그램을 만들어 보려 합니다. 

국가종합 전자조달 홈페이지인 나라장터에서 필요한 정보 조회가 모두 가능하지만 자주 찾아보는 검색조건 등을 저장해 두고 반복적으로 검색해 보거나 데이터를 수집할 용도로 사용할 수 있을 것 같아서 시도해 봤습니다.

파이썬을 이용해서 작성할 예정이고 GUI는 PyQt5. 그리고 수집된 정보는 DB(SQLite)를 활용해서 저장합니다.

API 사용 신청 및 포멧 분석

먼저 API에서 어떤 정보가 가용한지 알아야 하니까 바로 API 신청부터 합니다. 공공데이터포털(www.data.go.kr)로 가서 회원 가입하고 로그인합니다.

조달청 입찰, 조달청 계약 키워드로 검색을 해서 다음과 같이 오픈 API 섹션에서 "조달청_입찰공고정보", "조달청_계약정보" 2가지를 활용 신청합니다.

신청하고 나면 즉시 승인이 되고 사용 가능한 상태가 되는데요. 마이페이지에 가면 신청한 API를 확인할 수 있습니다.

API 목록을 클릭해보면 상세 정보를 확인할 수 있는데 API 호출에 사용되는 인증키, 그리고 호출 주소, 데이터 포맷 등에 대한 정보를 확인할 수 있습니다.

(2023-4-5 수정)

이제 어떤 포멧과 변수를 이용해서 데이터를 요청해야 하는지 그리고 응답 메시지는 어떤 정보가 있고 어떤 포맷으로 되어 있는지를 확인해 보겠습니다. 4가지 API모두 유사하게 동작하기 때문에 본 포스팅에는 "나라장터검색조건에 의한 입찰공고공사조회" 한 가지만 예시로 분석해 보겠습니다.

(2023-04-05수정) 위의 API 상세정보에서 워드파일로 된 참고 문서를 다운로드하여서 "나라장터검색조건에 의한 입찰공고"를 검색해서 오퍼레이션 명세를 찾습니다.

상세정보 페이지 상단의 기본정보 테이블을 첫번째 줄에 있는 "상세설명" 버튼을 눌러줍니다. 그러면 오픈API명세 페이지로 이동을 하게됩니다.

페이지 스크롤을 조금 내려보면 아래와 같이 "나라정터검색조건에 의한 입찰공고공사조회"라는 항목을 찾을 수 있습니다.

공사 입찰에 대한 요청 메시지와 응답 메시지의 명세가 표로 정리되어 있는데요. 정말 다양한 변수들을 사용 가능한데요. 그중에서 우선적으로 적용해야겠다고 생각되는 것들을 좀 추려봤습니다.

요청 변수

먼저 데이터를 요청할 때 사용하는 변수들입니다.

항목명(영문) 항목명(국문) 항목크기 항목구분 샘플데이터 항목설명
numOfRows 한 페이지 결과 수 4 1 10 한 페이지 결과 수
pageNo 페이지 번호 4 1 1 페이지 번호
ServiceKey 서비스키 400 1 인증키 받은 인증키
type 타입 4 0 json JSON으로 받고 싶을 경우 'json'
inqryDiv 조회구분 1 1 1 1:공고게시일시, 2:개찰일시
inqryBgnDt 조회시작일시 12 0 201605010000 "YYYYMMDDHHMM"
inqryEndDt 조회종료일시 12 0 201605052359 "YYYYMMDDHHMM"
bidNtceNm 입찰공고명 100 0    
ntceInsttNm 공고기관명 200 0    
dminsttNm 수요기관명 200 0    
presmptPrceBgn 추정가격시작 25 0 68773000  (원화,)

응답 메시지 포맷

다음으로 회신된 메시지 중에서 뽑아내고 싶은 정보들은 다음과 같습니다.

항목명(영문) 항목명(국문) 항목크기 항목구분 샘플데이터 항목설명
resultCode 결과코드 2 1 00 결과코드
resultMsg 결과메세지 50 1 정상 결과메세지
numOfRows 한 페이지 결과 수 4 1 10 한 페이지 결과 수
pageNo 페이지 번호 4 1 1 페이지 번호
totalCount 전체 결과 수 4 1 1 전체 결과 수
bidNtceNo 입찰공고번호 40 1 20160430911  
bidNtceDt 입찰공고일시 19 0 2016-05-02 08:40:34 YYYY-MM-DD HH:MM:SS
bidNtceNm 입찰공고명 100 1    
dminsttNm 수요기관명 200 1    
presmptPrce 추정가격 25 0    
bidNtceDtlUrl 입찰공고상세URL 512 0    
bidNtceUrl 입찰공고URL 500 0    
untyNtceNo 통합공고번호 11 0 00019991191 입찰공고를 구분하는 번호
stdNtceDocUrl 표준공고서URL 256 0    

대략적으로 어떤 검색이 가능하고 그리고 어떤 정보가 조회 가능한지 확인을 했으니 프로그램을 구상해 보겠습니다.

화면 구성

UI 구성은 이렇게 만들어 봤어요. 더 편리하고 깔끔하게 만들 수도 있겠지만 우선 공부하는 입장에서 가능성 여부를 확인하는 프로토타입 차원에서 최대한 간단하게 구상해 봤습니다.

제공되는 API의 종류에 따라서 4가지 검색 타입을 구분시켰습니다. 조달청 제공 입찰 정보는 방대하지만 제가 관심 두고 있는 부분은 공사와 용역 부분이며 각각의 입찰공고 현황과 계약 현황을 조회하려 합니다. QRadioButton을 각각 만들고 API 종류에 맞게 라벨을 붙였습니다. 

다음으로 검색조건으로는 입찰명, 소요기관, 날짜, 금액 4가지를 선정했습니다. 각 조건값을 입력할 수 있도록 QLineEdit를 배치하였습니다. 날짜는 QDateEdit를 사용해서 날짜 형식을 쉽게 입력할 수 있도록 했습니다. 그리고 단축어처럼 많이 사용할 조건을 쉽게 입력할 수 있게 몇 가지 버튼들 추가했습니다.

그리고 아직 검색한 정보를 어떤 식으로 이용해야 할지 몰라서 일단 검색을 해서 해당되는 정보들이 들어오면 파싱 해서 일단 SQLite에 저장을 하고 저장된 DB를 다시 읽어와서 화면에 뿌려주는 방식으로 만들어 보려 합니다. 그래서 검색 데이터를 요청하는 버튼(QPushButton)을 만들어서 DB다운로드라는 이름을 붙여주었고 그 옆에 저장된 DB를 초기화시켜줄 버튼도 추가했습니다.

그리고 페이지 구분은 나중에 프로그램이 완성돼서 정말 활용을 하게 되면 고민해 보려고 미봉책으로 남겨둔 부분인데요. 한 화면을 넘어가는 검색 결과가 있을 때 뒷페이지 조회를 어떤식으로 할지 몰라서 일단 전체 검색결과 숫자가 어떻게 되는지 그리고 페이지로는 몇 페이지나 나오는지만 표시하고 필요한 경우 페이지 이동을 할 수 있는 부분을 만들어 두었습니다.

마지막으로 화면 하단의 검색시간은 검색조건을 입력하고 데이터를 받아오는 데까지 걸린 시간을 표시하는 부분인데 검색 결과가 없을 때 화면에 아무런 반응이 없으면 오류가 있는 건지 없는 건지 알 수가 없어서 나중에 테스트하는 과정에서 추가했네요.

마무리

이제 본격적인 코딩만 남았습니다. 기본적인 기능 구현은 비교적 쉽게 할 수 있는데 역시 디테일에서 실력의 한계가 드러나네요. 제일 어려운 부분이 남았지만 일단 시작이 반이니까 반은 했다 치고, 여러 가지 시행착오를 거친 다음에 정리가 좀 되면 2부에서 마무리할 계획입니다. 

 

끝!

반응형

댓글