[BE-07] 시설 생성·대량 적재 지역 매핑 — owner-create + data.go.kr import + CSV
작업 내용 (설계 의도)
변경 사항
시설 생성·적재 쓰기 경로에 시/도 표준코드 매핑을 추가한다. 미입력 시 서버가 주소 파싱으로 자동 보간, 실패 시 UNSPECIFIED 보존. FacilityOwnerDomainService·import 경로 파일만 소유해 BE-06(FacilityDomainService·조회)과 파일 충돌 없음. 근거 TDD: ../TDD.md FR-5·FR-6(BE 부분).
presentation/facility/dto/request/RegisterFacilityRequest.kt—sido: String?추가(gu 유지).application/facility/dto/RegisterMyFacilityCommand.kt—sido: String?추가,toAttributes()는 region 미해석 상태(placeholder)로 전달.UpdateFacilityRequest·UpdateMyFacilityCommand도sidooptional 추가(수정 시 재해석).domain/facility/service/FacilityOwnerDomainService.kt—RegionResolveGateway주입.registerForOwner가resolve(address, sidoHint=command.sido)로 region 해석 후Facility.create에 반영. 수정 경로도 sido 변경 시 재해석. 기존 geocoding 보강 유지.domain/facility/gateway/PublicSportsFacilityGateway.kt—PublicFacility.toAttributes는 region 미해석 placeholder(UNSPECIFIED) 반환(해석은 서비스가 수행).domain/facility/service/PublicFacilityImportService.kt—RegionResolveGateway주입, 행별resolve(address, null)후Facility.create. data.go.kr 시/도 필드 없거나 매핑 실패 시 UNSPECIFIED 저장.domain/facility/service/LegacyToFacilityMapper.kt— CSVsido컬럼을 attributes.region 힌트로 전달(map 시그니처에 sido 반영). 실제 해석은 서비스에서(매퍼는 region placeholder + sidoHint 보존) 또는 매퍼가 gateway 없이 placeholder만 세팅하고 서비스가 해석. 매퍼는 도메인 순수 object이므로 gateway 미주입 — placeholder + sido 문자열만 보존, 해석은 FacilityDomainService.bulkImport(BE-06 소유)가 수행. → 매퍼는 sido 필드 전달만 담당.
롤백
- sido 미입력 요청은 종전과 동일 동작(주소 파싱 보간). 파괴 없음, 코드 롤백만으로 안전.
의존
- BE-04, BE-02
다이어그램
처리 흐름
sequenceDiagram participant C as FacilityOwnerApiController participant U as RegisterMyFacilityUseCase participant S as FacilityOwnerDomainService participant G as RegionResolveGateway participant R as FacilityRepository C->>U: execute(command[sido?]) U->>S: registerForOwner(attributes, ownerId) S->>G: resolve(address, sidoHint) G-->>S: FacilityRegion (or UNSPECIFIED) S->>R: save(Facility.create(region 반영)) R-->>S: Facility S-->>U: Facility
클래스 의존
flowchart LR Owner[FacilityOwnerDomainService] --> Reg[RegionResolveGateway] Import[PublicFacilityImportService] --> Reg Owner --> Repo[FacilityRepository] Import --> Repo
테스트 케이스
- owner가 sido 미입력으로 등록하면 주소 파싱으로 시/도가 자동 보간된다
- owner가 sido를 명시하면 그 값이 우선 적용된다
- 주소·sido 모두 불명확하면 UNSPECIFIED로 보존되어 저장된다(스킵 없음)
- data.go.kr 대량 적재 시 부산 주소 시설이 부산 코드로 매핑된다
- data.go.kr 응답에 시/도가 없으면 UNSPECIFIED로 저장된다
- CSV sido 컬럼 값이 매퍼를 통해 지역 힌트로 전달된다