[BE-04] Facility 지역 데이터층 — 엔티티 필드·인덱스·Repository·Mongo 마이그레이션

작업 내용 (설계 의도)

변경 사항

facility의 데이터층(엔티티·저장소·인덱스)을 한 티켓에 모아 지역 필드를 확립한다. FacilityRepository·Impl은 후행 티켓(BE-06 조회, BE-10 백필)이 모두 참조하는 병목이라 신규 시그니처를 여기서 전부 정의해 Single Writer를 보장한다. 근거 TDD: ../TDD.md FR-2·“인터페이스 시그니처”.

  • domain/facility/entity/Facility.ktsidoCode/sidoName/sigunguCode/sigunguName 4필드 추가(private var region 표현), gu 유지. @CompoundIndex idx_sido_sigungu_type={'sido_code':1,'sigungu_code':1,'type':1} 추가(idx_gu_type 유지 = expand). create(attributes)가 region 반영, assignRegion(region: FacilityRegion) 추가, updateMeta 복제에 region 포함. 생성자 기본값 금지.
  • domain/facility/vo/FacilityAttributes.ktregion: FacilityRegion(해석 결과, 기본 UNSPECIFIED) + sidoHint: String?(입력 힌트) 추가(gu 유지). 도메인 서비스가 resolve(address, sidoHint)로 region을 채운 뒤 create에 반영하는 흐름을 지원.
  • domain/facility/dto/RegionTypeCount.kt(신규) — sidoCode/sidoName/sigunguCode/sigunguName/type/count.
  • domain/facility/repository/FacilityRepository.kt — 시그니처 추가: findAll(sidoCode, sigunguCode, gu, type, pageable), aggregateRegionType(), findAllForBackfill(pageable). 기존 시그니처 유지.
  • infrastructure/facility/mongo/FacilityRepositoryImpl.kt — 신규 findAll 분기(region 필터), aggregateRegionType(sido_code/sigungu_code/type 그룹), findAllForBackfill, upsertByCode에 region 4필드 set 추가. null region 문서는 매핑 시 UNSPECIFIED로 보정(하위호환).
  • infrastructure/facility/mongo/FacilityMongoRepository.kt — 필요한 파생 쿼리 추가.
  • src/main/resources/mongo/migration/V202607041817__add_facility_region_index.js(신규 디렉토리) — createIndex(idx_sido_sigungu_type, {background:true}) 멱등. _migrations 기록. 상단 주석에 롤백(dropIndex) 명시.

롤백

  • Mongo 인덱스: db.facilities.dropIndex("idx_sido_sigungu_type"). 엔티티 필드는 무시되어도 gu 경로 정상(코드 롤백만으로 안전).

의존

  • BE-01

다이어그램

클래스 의존

flowchart LR
    Fac[Facility entity] --> Region[FacilityRegion]
    Attr[FacilityAttributes] --> Region
    Repo[FacilityRepository iface] --> RTC[RegionTypeCount]
    Impl[FacilityRepositoryImpl] -.->|impl| Repo
    Impl --> Fac

테스트 케이스

  • create는 attributes.region의 4필드를 시설에 반영하고 gu도 함께 보존한다
  • assignRegion 호출 시 region 4필드가 갱신된다(백필용 상태전이)
  • region 없는(legacy) 문서 조회 시 UNSPECIFIED로 보정되어 반환된다
  • findAll(sidoCode=부산)은 부산 시설만, 다른 시/도 동명 자치구는 제외한다
  • aggregateRegionType은 sido·sigungu·type별 count를 집계한다
  • findAllForBackfill은 소프트삭제 제외 전건을 페이지로 반환한다