How to become a real programmer/Back-End

공공API - 국민연금사업장 목록을 활용한 국민연금사업장 조회 서비스 개발(3)

MinDDokDDok 2022. 7. 25. 15:41

공공API - 국민연금사업장 목록을 활용한 국민연금사업장 조회 서비스 개발(2)까지, postgresql의 table과 column을 생성했기에, 이제 데이터를 넣어보자.

데이터를 넣기위한 파이썬 파일 inputter.py 파일 하나를 생성했다. inputter.py 는 데이터베이스에 데이터 저장용으로만 사용하는 파일이다. pgadmin4로도 당연히 데이터를 테이블에 저장할 수 있지만, 우리가 다루는 api의 양이 544122개라는 엄청난 숫자이기에 직접 수작업으로 하는 것은 매우매우 힘들다. 그렇기에 python에서 제공하는 requests를 통해 api의 content를 불러와 json형식으로 읽어들인 후, 각 정보를 array에 저장하여 반복을 통해 데이터베이스에 저장하도록 하겠다.

우선 우리 데이터베이스인 postgresql과 연결시켜주는 psycopg2를 import시켜주어야 한다. 이후 host명, database명, user명, password를 설정하면 연결이 완료되고 연결이 제대로 완료되었다면 삽입 명령 시 에러가 나지 않고 제대로 데이터베이스 테이블에 들어가 있게 된다.

위와 같이 설정하면 connect하겠다는 의미이고, con.cursor()을 통해 해당 데이터베이스를 선택 이후 sql문 명령어 작성해 데이터베이스에 데이터 삽입이 가능하다.

 

연결을 일단 시켜놓았으면 inputter.py에서 api의 데이터가 잘 불러와지는지 확인해야한다. 데이터를 불러오기 위해서는 requests 라이브러리가 필요한데 pip install requests 후 import하면 사용가능하다. json도 마찬가지.

우선

comp = requests.get("https://api.odcloud.kr/api/15083277/v1/uddi:d7e2de87-da03-4ec4-9741-ef4208ce393c?page=1&perPage=10&serviceKey=(본인의 서비스 키)")
js = json.loads(comp.content)
를 통해서, requests.get으로 데이터를 불러오고 comp에 저장하고 해당 콘텐트를 json파일 형식으로 로드 할 수 있다.
1 번째 페이지를 print해보면 터미널창에 아래와 같이 불러온 데이터가 표시된다. 여기까지 했으면 api의 데이터가 잘 불러와진 것이다!
그렇지만 한 눈에봐도 많이 복잡해보인다. 그 이유는 한 페이지에 들어가는 10개의 기업의 내용들이 한번에 출력되었기 때문이다. 이를 하나하나 나누어 칼럼에 맞게 출력해보도록 하겠다.
 
아래와 같이, json파일의 하위내용들에 들어가 데이터를 참조하는 방식은 [하위자료명]방식으로 접근하면 된다. 그래서 아래와 같이 1페이지의 첫 번째 기업들(두번째 []부분)의 가입자수, 사업자등록번호, 사업장기업상태코드, 사업장도로명상세주소, 사업장명, 사업장업종코드명 을 불러왔다.
 
이제 각 데이터종류별로 불러올 수 도 있으니, 저장을 해보자.
우선 페이지가 현재 1페이지에 제한되어 있기에 requests.get(주소)부분의 주소에서 page부분을 {}로 고치고 .format()으로 54413페이지 까지 반복시켜주고 하위 반복문에서 각 페이지별로 10개의 기업들이 있기에 js파일의 접근하는 부분에서도 몇 가지 수정을 통해서 반복화시키도록 하겠다.
 
for num in range(1, 54413):
     comp = requests.get("https://api.odcloud.kr/api/15083277/v1/uddi:d7e2de87-da03-4ec4-9741-ef4208ce393c?page={}&perPage=10&serviceKey=(서비스키)".format(num))
     js = json.loads(comp.content)
     for num2 in range(10):
          print("가입자수 : ", js["data"][num2]['가입자수'])
          print("사업장등록번호 : ",js["data"][num2]['사업자등록번호'])
          print("사업장가입상태코드 : ",js["data"][num2]['사업장가입상태코드 1 등록 2 탈퇴'])
          print("사업장도로명상세주소 : ",js["data"][num2]['사업장도로명상세주소'])
          print("사업장명 : ",js["data"][num2]['사업장명'])
          print("사업장업종코드명 : ", js["data"][num2]['사업장업종코드명'])
그럼 위와같이 표현될 수 있다.
이렇게 불러온 데이터들을 array에 append시켜 정리하고, 넣기위해 array를 생성해준다.
member = [] # 가입자 수
number = [] # 사업자등록번호
isjoin = [] # 사업장가입상태코드
address = [] # 사업장도로명 상세주소
companyname = [] # 사업장 명
companysecotr = [] # 사업장 업종코드 명
 
그리고 각 데이터를 append 할 수 있게 코드를 수정한다.
for num in range(1, 54413):
     comp = requests.get("https://api.odcloud.kr/api/15083277/v1/uddi:d7e2de87-da03-4ec4-9741-ef4208ce393c?page={}&perPage=10&serviceKey=(서비스키)".format(num))
     js = json.loads(comp.content)
     for num2 in range(1):
          member.append(js["data"][num2]['가입자수'])
          number.append(js["data"][num2]['사업자등록번호'])
          isjoin.append(js["data"][num2]['사업장가입상태코드 1 등록 2 탈퇴'])
          address.append(js["data"][num2]['사업장도로명상세주소'])
          companyname.append(js["data"][num2]['사업장명'])
          companysector.append(js["data"][num2]['사업장업종코드명'])
이렇게 하면 각 배열에 값이 들어갈 것이다.
 
그리고 cur = con.cursor()으로 데이터베이스를 선택, 이후 데이터 갯수만큼 insert문을 써준다.
데이터베이스관리에 사용되는 sql문은 배우는데 그렇게 어렵지 않으니 웹 서핑을 통해서 봐도 될 것이다. 역시 구글링이 최고다. 필자는 이전에 adsp sqld를 획득해놔서 쓰는데 어려움은 없지만 처음보는 사람도 쉽게 알 수 있는 문법이다.(그래서 자랑을 못함)
 
이렇게 하고 실행을 시키면,,,, 시간이 아주아주 오래걸린다
그거때문에 글을 이틀 전부터 쓰기 시작했지만 현재까지 완성하지 못하고 있다.
 
그래서 requests를 불러오는 페이지를 500정도로 반복해보니 약 1분 30초 정도를 걸리는것을 보니 50000 페이지 까지 하려면,, 엄청난 시간이 소요될 것이다. 그래서 노트북 디스플레이 자동꺼짐을 꺼놓고, 계속 기다려보았다.
 
실행 시켜놓은 이후 잠에 들었는데 약 10시간 정도를 푹 잔것 같다. 그러고 나니까 데이터베이스 안에 데이터가 들어가있었다.
 
약 544100개 가량의 데이터가 데이터베이스 안에 잘 insert된 것을 확인할 수 있다.
API가 제공하는 총 데이터 수는 544122개, 즉 22개가 덜 들어갔단 뜻이다. 22개를 마저 넣어주도록 하면, 
모든 데이터가 잘 들어갔다. 만세.
 
import json
import requests
import psycopg2

con = psycopg2.connect(
    host = "localhost",
    database = "MMHDM",
    user = "postgres",
    password = "비밀번호"
    )


# member = [] # 가입자 수
# number = [] # 사업자등록번호
# isjoin = [] # 사업장가입상태코드
# address = [] # 사업장도로명 상세주소
# companyname = [] # 사업장 명
# companysecotr = [] # 사업장 업종코드 명

# 총 데이터 -- 544122 --> 페이지 당 10 --> 마지막 페이지 54413

member = [] # 가입자 수
number = [] # 사업자등록번호
isjoin = [] # 사업장가입상태코드
address = [] # 사업장도로명 상세주소
companyname = [] # 사업장 명
companysector = [] # 사업장 업종코드 명

for num in range(1, 54411):
    comp = requests.get("https://api.odcloud.kr/api/15083277/v1/uddi:d7e2de87-da03-4ec4-9741-ef4208ce393c?page={}&perPage=10&serviceKey=(서비스키)".format(num))
    js = json.loads(comp.content)
    for num2 in range(10):
        member.append(js["data"][num2]['가입자수'])
        number.append(js["data"][num2]['사업자등록번호'])
        isjoin.append(js["data"][num2]['사업장가입상태코드 1 등록 2 탈퇴'])
        address.append(js["data"][num2]['사업장도로명상세주소'])
        companyname.append(js["data"][num2]['사업장명'])
        companysector.append(js["data"][num2]['사업장업종코드명'])


cur = con.cursor()

for num3 in range(0, 544100):
    cur.execute("insert into moneytable (id, member, number, address, companyname, companysector, isjoin) values (%s, %s, %s, %s, %s, %s, %s)", (num3+544121, member[num3], number[num3], address[num3], companyname[num3], companysector[num3], isjoin[num3]))
    con.commit()   ## 입력 후 해줘야 하는 commit()

cur.close()
con.close()

코드는 위와 같다.

 

이제 데이터베이스에 데이터도 넣었으니 해야할 일은 웹 페이지를 구성하고, 검색할 수 있게 만드는 것이다.

본인은 웹 디자인에 실력이 출중하지 못하므로 우선 간단하게 만들어보도록 한다. 웹 페이지를 구성하고, 검색을 구현하는 것은 다음 단계에서 설명을 이어가도록 하겠다.