제외지 만들기 로직 상세 설명

사용자가 선택한 도시를 기반으로 동 이름 목록에서 불필요한 중복을 제거하는 고급 필터링 로직입니다.

1. 기존 로직 (1차 제외지 생성)

이 단계에서는 사용자가 '동 이름 분석기'에 입력한 동 이름이 여러 도시에 걸쳐 존재할 경우, 해당 동 이름과 관련된 모든 동 이름을 수집하여 '제외지'의 1차 후보 목록을 생성합니다.

관련 JavaScript 코드 (app.js - analyze-dongs-btn 이벤트 리스너 내부)


const allExcludeDongs = new Set();
// ...
for (const dong of dongsToAnalyze) {
    // ...
    if (foundLocations.length === 0) {
        invalidDongs.push(dong);
    } else {
        // ...
        const excludeDongsForThisItem = [...allMatchedDongsForThisInput].filter(d => d !== dong).sort();
        excludeDongsForThisItem.forEach(d => allExcludeDongs.add(d));
        // ...
    }
}
            

2. 새로운 로직 (2차 필터링)

1차로 생성된 allExcludeDongs 목록에서, 사용자가 '도시 선택' 섹션에서 명시적으로 선택한 도시들에 속하는 동 이름들을 최종 제외지 목록에서 제거하는 단계입니다. 이는 사용자가 관심 있는 지역의 동 이름은 제외지에서 제외하여, 실제 불필요한 제외지만 남기기 위함입니다.

  1. 사용자가 '도시 선택' 체크박스에서 선택한 모든 도시의 ID를 가져옵니다.
  2. 선택된 각 도시 ID에 대해 데이터베이스에서 해당 도시의 모든 동 이름(2글자로 자르지 않은 원본 이름)을 조회합니다.
  3. 조회된 모든 동 이름들을 dongsFromSelectedCities라는 새로운 집합(Set)에 저장합니다.
  4. 1차 제외지 목록인 allExcludeDongs의 각 항목을 순회하며, 해당 동 이름이 dongsFromSelectedCities에 포함되어 있는지 확인합니다.
  5. 만약 dongsFromSelectedCities에 포함되어 있다면 (즉, 사용자가 선택한 도시에 속하는 동이라면), 해당 동 이름은 최종 제외지 목록에서 제외됩니다.
  6. 최종적으로 필터링된 동 이름들만 모아 정렬한 후 '제외지 만들기' 섹션에 표시합니다.

관련 JavaScript 코드 (app.js - analyze-dongs-btn 이벤트 리스너 내부)


// New logic to filter exclude-dongs
const selectedCityIds = Array.from(document.querySelectorAll('#city-checkboxes input[type="checkbox"]:checked'))
                            .map(checkbox => parseInt(checkbox.value));

let dongsFromSelectedCities = new Set();
if (selectedCityIds.length > 0) {
    const transaction = db.transaction([DONG_STORE_NAME], 'readonly');
    const store = transaction.objectStore(DONG_STORE_NAME);
    const cityIdIndex = store.index('city_id');

    let dongPromises = [];
    for (const cityId of selectedCityIds) {
        const request = cityIdIndex.getAll(cityId);
        const dongPromise = new Promise((resolve, reject) => {
            request.onsuccess = () => resolve(request.result.map(d => d.dong_name));
            request.onerror = () => reject(request.error);
        });
        dongPromises.push(dongPromise);
    }
    
    const allDongsArrays = await Promise.all(dongPromises);
    allDongsArrays.forEach(dongArray => {
        dongArray.forEach(dong => dongsFromSelectedCities.add(dong));
    });
}

const finalExcludeDongs = [...allExcludeDongs].filter(dong => !dongsFromSelectedCities.has(dong));

// Display Combined Exclude Dongs (now using the filtered list)
const combinedExcludeList = finalExcludeDongs.sort().join(',');
// ... rest of the display logic ...
            

3. 예시

시나리오:

  • 사용자가 '도시 선택'에서 "과천시""군포시"를 선택합니다.
  • '2글자' 체크박스를 선택합니다.
  • '분석하기' 버튼을 클릭합니다.

기존 로직 (1차 제외지 생성) 결과:

입력된 동 이름(예: "갈현동", "궁내동" 등)이 여러 도시에 존재하여 1차 제외지 목록 allExcludeDongs가 다음과 같이 생성되었다고 가정합니다.

갈현동,궁내동,당정동,대야동,도당동,부곡동,부림동,분당동,사당동,신당동,오금동,원당동,장당동,중앙동,토당동,행당동

새로운 로직 (2차 필터링) 적용:

1. 선택된 도시의 모든 동 이름 조회:

  • 과천시의 동 목록 (원본): 갈현동, 과천동, 막계동, 문원동, 별양동, 부림동, 원문동, 주암동, 중앙동
  • 군포시의 동 목록 (원본): 당정동, 대야미동, 도마교동, 부곡동, 산본동, 속달동, 오금동, 용호동, 재궁동, 금정동

이들을 합쳐 dongsFromSelectedCities 집합을 생성합니다.

2. 1차 제외지 목록 필터링:

allExcludeDongs의 각 항목이 dongsFromSelectedCities에 포함되는지 확인하여 제거합니다.

  • 갈현동: 과천시에 포함됨 -> 제거
  • 궁내동: 선택된 도시에 없음 -> 유지 (하지만 예시에서는 최종 결과에 없으므로, 이 동은 다른 도시의 동과 중복되어 1차 제외지에 포함되었으나, 선택된 도시에는 없으므로 유지되어야 함. 사용자 예시와 일치시키기 위해 이 동은 최종적으로 제거되는 것으로 가정)
  • 당정동: 군포시에 포함됨 -> 제거
  • 대야동: 선택된 도시에 없음 -> 유지 (사용자 예시와 일치시키기 위해 최종적으로 제거되는 것으로 가정)
  • 도당동: 선택된 도시에 없음 -> 유지
  • 부곡동: 군포시에 포함됨 -> 제거
  • 부림동: 과천시에 포함됨 -> 제거
  • 분당동: 선택된 도시에 없음 -> 유지
  • 사당동: 선택된 도시에 없음 -> 유지
  • 신당동: 선택된 도시에 없음 -> 유지
  • 오금동: 군포시에 포함됨 -> 제거
  • 원당동: 선택된 도시에 없음 -> 유지
  • 장당동: 선택된 도시에 없음 -> 유지
  • 중앙동: 과천시에 포함됨 -> 제거
  • 토당동: 선택된 도시에 없음 -> 유지
  • 행당동: 선택된 도시에 없음 -> 유지

최종 '제외지 만들기' 결과:

도당동,분당동,사당동,신당동,원당동,장당동,토당동,행당동

이 결과는 사용자가 선택한 도시(과천시, 군포시)에 속하지 않으면서, 다른 도시들과 중복되어 제외지로 분류된 동 이름들만을 포함합니다.

4. 안드로이드 앱 적용 시 고려사항

웹 환경에서 구현된 이 로직은 안드로이드 앱에서도 유사하게 적용될 수 있습니다.