[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.ktsido: String? 추가(gu 유지). application/facility/dto/RegisterMyFacilityCommand.ktsido: String? 추가, toAttributes()는 region 미해석 상태(placeholder)로 전달. UpdateFacilityRequest·UpdateMyFacilityCommandsido optional 추가(수정 시 재해석).
  • domain/facility/service/FacilityOwnerDomainService.ktRegionResolveGateway 주입. registerForOwnerresolve(address, sidoHint=command.sido)로 region 해석 후 Facility.create에 반영. 수정 경로도 sido 변경 시 재해석. 기존 geocoding 보강 유지.
  • domain/facility/gateway/PublicSportsFacilityGateway.ktPublicFacility.toAttributes는 region 미해석 placeholder(UNSPECIFIED) 반환(해석은 서비스가 수행). domain/facility/service/PublicFacilityImportService.ktRegionResolveGateway 주입, 행별 resolve(address, null)Facility.create. data.go.kr 시/도 필드 없거나 매핑 실패 시 UNSPECIFIED 저장.
  • domain/facility/service/LegacyToFacilityMapper.kt — CSV sido 컬럼을 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 컬럼 값이 매퍼를 통해 지역 힌트로 전달된다