본문 바로가기
사이드 프로젝트/서울 신상 빵집

서울 신규 가게 조회 (서울신상) - 제과영업점 데이터 insert 완료

by 코드스니펫 2024. 4. 11.
반응형

서울 신규 가게 조회 (서울신상) - 제과영업점 데이터 insert 완료

 

pgadmin4 테이블 조회 화면

 

일주일간 여러 일정으로 인해 프로젝트 진행이 다소 더뎠습니다. 다양한 이슈도 발생했었습니다. 그 속에서 현재까지 진행한 사항에 대해 기록하였습니다.

 

 

1인 프로젝트로 변경

 

 

서울 신규 가게 조회 사이트 기획 완료

서울 신규 가게 조회 사이트 기획 완료 지인과 함께 홈페이지 제작하기 시작했습니다. 주제는 서울시 내에 새로 생긴 가게들을 지도에서 목록이 조회되게 하는 사이트 입니다. 아이디어 도출 과

lemonlog.tistory.com

 

가장 큰 이슈는 둘이서 작업하려던 프로젝트를 혼자서 하게된 점입니다. 원래 같이하려던 팀원이 개인사정으로 빠지게 되면서 혼자서 프로젝트를 진행하게 되었습니다. 처음에는 프로젝트 자체를 중단하려다가 원래 기획한 내용을 끝까지 활용하고자 계속 진행하게 되었습니다. 작업시간은 두배로 늘어나겠지만 기획한 내용대로 마무리하기 위해 도전해보려 합니다.

 

ERD 구성

서울시 데이터를 api로만 받기에는 업종당 10,000건이 넘어가기 때문에 (일일 api 호출 회수 이슈도 있고) 데이터베이스에 가게 정보를 저장하여 조회하는 방식을 채택했습니다. DB는 postgreSQL을 사용하였고, 먼저 제과영업업 api 정보를 조회하고 DB에 저장하는 로직까지 작성하였습니다.

 

DB 구조
DB 구조

 

▼ 제과영업업 api ▼

 

열린데이터광장 메인

데이터분류,데이터검색,데이터활용

data.seoul.go.kr

 

 

DB insert 완료

위 ERD처럼 우선 테이블 구성하였고, 아래 건수 (list_total_count:14329) 그대로 DB에 저장되는 것을 확인할 수 있었습니다. 

 

제과영업업 조회 건수

 

 

postgreSQL 테이블에 저장된 건수 확인
동일한 api 건수 db에 저장된 화면

 

 

저장하면서 겪은 SequelizeDatabaseError 

seoul_data 테이블에 저장하면서 SequelizeDatabaseError 에러를 만났는데 원인은 double precision 타입의 컬럼에 대해 유효하지 않은 값("", 즉 빈 문자열)을 삽입하려고 시도했기 때문이었습니다. 문제가 발생한 컬럼은 xy로 추정되었고, 이들 컬럼인 x,y를 아래처럼 수정하고 오류를 해결할 수 있었습니다.

 

// 숫자형 필드의 값을 검증하고 변환하는 함수
function toFloatOrNull(value) {
  const num = parseFloat(value);
  return isNaN(num) ? null : num;
}


const saveOrUpdateData = async (data) => {
  for (const item of data) {
    await SeoulData.upsert({
      // 기존 매핑된 컬럼들...
      apvpermynd: item.APVPERMYMD ? new Date(item.APVPERMYMD).toISOString() : null,
      // ...
      updatedt: item.UPDATEDT ? new Date(item.UPDATEDT).toISOString() : null,
      uptaenm: item.UPTAENM,
      x: toFloatOrNull(item.X),
      y: toFloatOrNull(item.Y),
      sntuptaenm: item.SNTUPTAENM,
      // 나머지 필드들도 필요에 따라 이와 같은 방식으로 추가합니다.
    }, {
      fields: ['opnsfteamcode', 'mgtno', 'apvpermynd', 'trdstategbn', 'trdstatenm', 'dtlstategbn', 'dtlstatenm', 'dcbymd', 'sitetel', 'sitepostno', 'sitewhladdr', 'rdnwhladdr', 'rdnpostno', 'bplcnm', 'lastmodts', 'updategbn', 'updatedt', 'uptaenm', 'x', 'y', 'sntuptaenm'],
      returning: false,
    });
  }
};

 


 

끝으로

테이블 만들고 저장하기 까지 부트캠프 하면서 여러번 진행했지만 다른 DB를 사용하여 하는 과정에서 기존에 접하지 못한 에러들을 만났습니다. 주요 원인은 nodeJs 에서 postgreSQL insert 하면서 발생한 문법적인 오류였고, 이를 수정한 후 정상 동작하는 것을 확인할 수 있었습니다.

 

api의 정보를 db에 저장한 과정을 확인하였으니 이제, 여러 업종에 대한 데이터를 일정 주기동안 체크(insert,upte)하는 로직을 테스트 할 수 있게 되었습니다. 이 테스트까지 마치고나서 프런트 작업과 함께 db에 저장된 서울시 신규 가게데이터를 불러오는 과정을 동시에 테스트해볼 예정입니다.

 

▼ 이전 작업한 다른 프로젝트들 ▼

 

 

로그인, 회원가입, 결제 기능 프로젝트 기획, NestJS와 TypeORM 채택

로그인, 회원가입, 결제 기능 프로젝트 기획, NestJS와 TypeORM 채택 내일배움캠프의 교육이 끝나고나서 사이드 프로젝트로 진행하는 로그인, 회원가입, 결제 기능 프로젝트입니다. 이번 프로젝트에

lemonlog.tistory.com

 

 

축구팀 관리 프로젝트 - 경기 데이터 기반 추천 포메이션 기능

축구팀 관리 프로젝트 - 경기 데이터 기반 추천 포메이션 기능 축구 경기의 승리는 수많은 변수에 의해 결정되며, 이 중에서도 '포메이션'은 경기의 결과에 큰 영향을 미칩니다. 그러나, 많은 팀

lemonlog.tistory.com