Untitled

카카오 API로부터 받은 카테고리들을 처리하는 과정에서 카테고리의 유니크 제약 조건으로 인해 발생하는 오류를 경험했다.

검색어 "국수"를 검색했을때 placeData.category_name

음식점 > 한식 > 국수 
음식점 > 한식 > 국수
음식점 > 한식 > 국수 > 칼국수
음식점 > 한식 > 국수
음식점 > 한식 > 국수
음식점 > 한식 > 국수 > 칼국수
음식점 > 한식 > 국수
음식점 > 한식 > 국수 > 칼국수
음식점 > 한식 > 국수 > 칼국수
음식점 > 한식 > 국수
음식점 > 한식 > 국수 > 칼국수
음식점 > 한식 > 국수 > 칼국수
음식점 > 한식 > 국수
음식점 > 한식 > 국수
음식점 > 한식 > 국수

음식점 > 한식 > 국수 생성쿼리 9번
음식점 > 한식 > 국수 > 칼국수 생성쿼리 6번

원인

새로운 카테고리는 DB에 저장이 된다.

하지만, 처리 로직은 병렬로 진행되기 때문에 같은 카테고리 생성 쿼리가 여러 번 호출되게 되고, 이로 인해 Unique 제약 조건에 의해 오류가 나게 된다. (카테고리 데이터가 어느 정도 쌓여있다 보니 용케 들키지 않고 있었다.)

음식점 > 한식 > 국수 생성쿼리 9번
음식점 > 한식 > 국수 > 칼국수 생성쿼리 6번

이 문제를 해결하기 위해 중복된 카테고리를 제거하는 로직을 추가하며, 불필요한 DB 접근도 줄이는 일석이조의 방향으로 변경해보겠다.

Set을 활용한 효율적인 데이터 관리

문제의 핵심은 중복된 카테고리를 여러 번 처리하려는 데 있다. 이를 해결하기 위해 JavaScript의 Set 객체를 사용하여 중복을 제거하는 방법을 선택했다.

Set은 자바스크립트의 표준 내장 객체로, 중복 없이 유일한 값을 저장할 때 유용하다.

구현 단계

카테고리 추출 및 중복 제거

 const uniqueCategories = this.extractUniqueCategories(kakaoData);
private extractUniqueCategories(
  kakaoData: IKakaoSearchDocuments[],
): string[] {
  const categorySet = new Set<string>();
  kakaoData.forEach((data) => {
    return categorySet.add(data.category_name);
  });

  return Array.from(categorySet);
}
uniqueCategories [ '음식점 > 한식 > 국수', '음식점 > 한식 > 국수 > 칼국수' ]