본문 바로가기
개발/프로젝트-식당 웨이팅 앱 FOOD LINE

230601 실전프로젝트6 [Node.js/Nest.js 공공 data저장, 좌표주입하기]

by 코딩하는짱구 2023. 6. 1.
반응형

✅오늘학습 Keyword

1. postgreSQL-RDS 연결

2. 대용량 csv data 저장 

 

 

✅local data와 카카오맵API 연동하기 - 겪은 문제

1. 저번 포스팅에서 기록했듯 대용량 data의 좌표를 부여하는 작업에서, 쿼터 문제가 발생했었다.

https://veritas-crystal.tistory.com/60

 

230530 실전프로젝트5 [Node.js/공공 data와 카카오맵API 연동하기]

✅오늘학습 Keyword 공공 api에서 PostgreSQL에 저장한 db를 카카오맵 api와 연동하는 작업을 진행했다. ✅local data와 카카오맵API 연동하기 - 겪은 문제 1. 대용량 data 저장 문제 CSV파일의 공공data를 Postgre

veritas-crystal.tistory.com

 

문제 해결을 위해선 팀원이 각각 API KEY를 가지고 돌아가면서 좌표를 따와야했다. 따라서 공동으로 관리할 data를 위해 AWS RDS를 사용하여 PostgreSQL 데이터베이스를 연결했다. 먼저 공공 data를 팀프로젝트 postgrSQL db 에 저장하고 그 이후에 카카오맵api에서 match하는 data에 좌표를 부여하는 방식이다. 

  • PostgreSQL: RDS에서 지원하는 데이터베이스 중 하나
  • AWS RDS: Amazon Web Services (AWS)에서 제공하는 관리형 관계형 데이터베이스 서비스

AWS RDS를 연결함으로써 데이터베이스 인스턴스를 확장하고, 더 많은 트래픽과 데이터를 처리할 수 있으며 관리도 편리해진다. 또한 보안관리와 모니터링도 용이해진다는 이점이 있다!

 

 

 

 

2. csv data 저장은 말처럼 쉽지 않다..(T_T)

 

a. 데이터 전송 에러 - address null 문제
a-1. 처음에 도로명 주소를 기준으로 좌표를 부여하도록 코드를 짰는데, 좌표가 찾아지지 않는 에러 발생. 

       연구해보니 도로명 주소가 없고, 지번 주소만 있는 곳은 좌표가 찍히지 않았던 것.

 

a-b. 위 문제 해결을 위해 도로명 주소, 지번 주소를 둘 다 조회하여 좌표를 부여하게 코드를 수정했으나

         여전히 좌표가 찾아지지 않는 에러 발생. 

         팀 코드에서 계속 에러를 잡았지만 해결되지 않아서 자세히 살펴보니 카카오맵 api가 좌표를 불러오지 못하는 것이였다. 

         그 이유는 가게의 주소가 지번/도로명에 등록된 주소가 아닌 경우였다. 

        ex)경기도 용인시 기흥구 신갈로124번길 23-5, 105일부호 (신갈동) 

 

a-c. 위 모든 경우의 수를 고려하여 아래와 같이 코드를 짜놓았고 지저분한 부분은 추후 수정하여 보완하기로 했다. 

추후입력예정



b. storeId 순서대로 address가 찾아지지 않는 문제

getStoreAddressId 함수를 실행할때 kakaomapAPI가 primary key (이하 pk) 기준으로 storeAddress를 찾지 않고, 무작위로 찾은 후 좌표가 입력되는 문제가 있었다. 순서대로 좌표가 입력되지 않으면 data관리 진행이 어려워지기에 코드를 수정했다. 

 

수정 전

 //좌표를 위한 주소와 아이디
  async getStoreAddressId() {
    return await this.find({
      select: ['storeId', 'address'],
      // where: { Ma: 0, La: 0 },
    });
  }

 

수정 후/문제 해결(ASC 오름차순, DESC 내림차순)

async getStoreAddressId() {
  return await this.find({
    select: ['storeId', 'address'],
    where: { Ma: 0, La: 0 },
    order: { storeId: 'ASC' }, // storeId를 오름차순으로 정렬
  });
}

 

✅오늘 알게된 점 및 추후 학습 계획

위 문제를 해결하면서 find 함수에 대해 조금 더 알아보았다. 

 

nest.js에서 일반적으로 사용되는 find 함수는 아래와 같다. 

  1. find(): 모든 레코드를 조회합니다.
  2. findOne(): 주어진 조건에 해당하는 첫 번째 레코드를 조회합니다.
  3. findById(): 주어진 ID에 해당하는 레코드를 조회합니다.
  4. findAll(): 주어진 조건에 해당하는 모든 레코드를 조회합니다.
  5. findAndCount(): 주어진 조건에 해당하는 모든 레코드와 레코드의 총 개수를 조회합니다.
  6. findAndCountAll(): 주어진 조건에 해당하는 모든 레코드와 레코드의 총 개수를 조회합니다.
  7. findByPk(): 주어진 기본 키(primary key)에 해당하는 레코드를 조회합니다.
  8. findOrCreate(): 주어진 조건에 해당하는 레코드를 조회하고, 존재하지 않으면 새로운 레코드를 생성합니다.
  9. findInBatches(): 주어진 배치 크기로 레코드를 조회합니다. 대량의 데이터를 처리할 때 유용합니다.

위 함수에서 findById(), findByPk() 는 데이터베이스에서 레코드를 조회할 때 pk를 기준으로 사용하는 함수이므로, pk기준이 자동으로 설정되어있다. 

 

하지만 나머지 함수들은 함수에 정렬조건이 지정되어 있지 않으면 '데이터베이스 엔진의 기본 정렬순서'에 따라 결정된다.

일반적으로 데이터베이스 시스템은 레코드를 삽입한 순서에 따라 정렬되지 않고 자체적인 동작 방식과 설정에 따라 기본 정렬 순서를 결정한다고 한다. (주로 pk, index, 삽입순서_heap, cluster구조에 따르나 보장되지않음) 

 

*RDS for PostgreSQL의 기본적인 데이터 정렬

https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/PostgreSQL-Collations.html

 

RDS for PostgreSQL에서 지원되는 데이터 정렬 - Amazon Relational Database Service

RDS for PostgreSQL에서 지원되는 데이터 정렬 데이터 정렬은 데이터베이스에 저장된 문자열을 정렬하고 비교하는 방법을 결정하는 일련의 규칙입니다. 데이터 정렬은 컴퓨터 시스템에서 기본적인

docs.aws.amazon.com

PostgreSQL은 기본적으로 Unicode 기반의 정렬 규칙을 사용하고,

MySQL은 현재 설정된 로케일에 따라 정렬을 수행한다. 

 

👉즉 데이터베이스 종류에 따라 find()함수를 사용할 때 반환되는 결과의 기본 정렬 순서가 달라진다!!

     (같은 find() 함수를 사용하더라도 PostgreSQL과 MySQL에서 반환되는 결과의 정렬 순서는 다르다)

 

 

따라서 아래와 같은 방식들로 반환되는 결과의 정렬순서를 바꿀 수 있다~

  • 데이터베이스 설정 변경 ex)PostgreSQL의 경우 'LC_COLLATE', 'LC_CTYPE' 등
  • 코드에서 정렬순서 지정 ex)order, orderBy
  • 결과 정렬 후 처리 ex)Array.sort()

 

 

반응형