[BE-04] Facility 지역 데이터층 — 엔티티 필드·인덱스·Repository·Mongo 마이그레이션
작업 내용 (설계 의도)
변경 사항
facility의 데이터층(엔티티·저장소·인덱스)을 한 티켓에 모아 지역 필드를 확립한다. FacilityRepository·Impl은 후행 티켓(BE-06 조회, BE-10 백필)이 모두 참조하는 병목이라 신규 시그니처를 여기서 전부 정의해 Single Writer를 보장한다. 근거 TDD: ../TDD.md FR-2·“인터페이스 시그니처”.
domain/facility/entity/Facility.kt—sidoCode/sidoName/sigunguCode/sigunguName4필드 추가(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.kt—region: 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은 소프트삭제 제외 전건을 페이지로 반환한다