카카오 API로부터 받은 카테고리들을 처리하는 과정에서 카테고리의 유니크 제약 조건으로 인해 발생하는 오류를 경험했다.
검색어 "국수"를 검색했을때 placeData.category_name
음식점 > 한식 > 국수
음식점 > 한식 > 국수
음식점 > 한식 > 국수 > 칼국수
음식점 > 한식 > 국수
음식점 > 한식 > 국수
음식점 > 한식 > 국수 > 칼국수
음식점 > 한식 > 국수
음식점 > 한식 > 국수 > 칼국수
음식점 > 한식 > 국수 > 칼국수
음식점 > 한식 > 국수
음식점 > 한식 > 국수 > 칼국수
음식점 > 한식 > 국수 > 칼국수
음식점 > 한식 > 국수
음식점 > 한식 > 국수
음식점 > 한식 > 국수
음식점 > 한식 > 국수 생성쿼리 9번
음식점 > 한식 > 국수 > 칼국수 생성쿼리 6번
새로운 카테고리는 DB에 저장이 된다.
하지만, 처리 로직은 병렬로 진행되기 때문에 같은 카테고리 생성 쿼리가 여러 번 호출되게 되고, 이로 인해 Unique 제약 조건에 의해 오류가 나게 된다. (카테고리 데이터가 어느 정도 쌓여있다 보니 용케 들키지 않고 있었다.)
음식점 > 한식 > 국수 생성쿼리 9번
음식점 > 한식 > 국수 > 칼국수 생성쿼리 6번
이 문제를 해결하기 위해 중복된 카테고리를 제거하는 로직을 추가하며, 불필요한 DB 접근도 줄이는 일석이조의 방향으로 변경해보겠다.
문제의 핵심은 중복된 카테고리를 여러 번 처리하려는 데 있다. 이를 해결하기 위해 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 [ '음식점 > 한식 > 국수', '음식점 > 한식 > 국수 > 칼국수' ]