Skip to content

[BE] 빵집 임포트를 검색-미리보기-확정 방식으로 개선 #323

Description

@duku0751

목적

구글 Places 키워드 임포트 시 검색 결과가 검증 없이 바로 DB에 PENDING으로 저장되어, 키워드와 무관한 빵집(예: "베이커리 별" 검색 시 "토우베이크하우스" 유입)이 섞여 들어오는 문제가 있었음. 관리자가 검색 결과를 미리 확인하고 원하는 것만 골라 저장할 수 있도록 구조를 바꾸고, 동일 문제를 겪는 카카오 로컬 임포트에도 같은 구조를 적용함.


작업 내용

  • 구글 Places / 카카오 로컬 임포트를 "검색 즉시 DB 저장" → "검색(미리보기) → 확정 저장(confirm)" 2단계로 분리
  • 검색 결과를 Redis에 searchId 기준으로 임시 캐시(TTL 설정 가능, 기본 30분), 확정 시 선택한 candidateIds만 DB에 저장
  • 두 provider가 공용으로 쓰는 캐시 DTO(BakeryImportCandidate/Cache)와 BakeryImportRedisService로 인프라 통합
  • 캐시된 검색 결과를 재조회할 수 있는 GET /admin/bakeries/import/search/{searchId} 추가
  • 구글 Places 검색에 regionCode=KR 국가 단위 편향 추가
  • 안정성 보완: Google placeId null 방어, 외부 API 실패와 "결과 없음" 구분(예외로 분리), 검색 keyword 빈값 검증(@NotBlank), candidate toMap null/중복 키 방어
  • 프랜차이즈 제외 목록에 "파리바게트"(오탈자 표기) 추가
  • GooglePlacesImportServiceTest, BakeryImportRedisServiceTest 신규 작성, KakaoLocalImportServiceTest 새 구조에 맞춰 재작성

영향 범위

  • 엔티티 변경 없음 (Bakery 스키마 그대로)
  • 엔드포인트
    • 변경: POST /admin/bakeries/importPOST /admin/bakeries/import/search (구글, 응답이 바로 저장이 아닌 미리보기로 변경)
    • 변경: POST /admin/bakeries/import/kakaoPOST /admin/bakeries/import/kakao/search
    • 신규: POST /admin/bakeries/import/confirm, POST /admin/bakeries/import/kakao/confirm
    • 신규: GET /admin/bakeries/import/search/{searchId}
  • 모듈: GooglePlacesImportService, KakaoLocalImportService, GooglePlacesClient, KakaoLocalClient, 신규 BakeryImportRedisService, BakeryImportProperties, ErrorCode
  • 설정 추가: BAKERY_IMPORT_CACHE_TTL_MINUTES(기본 30) — application.yml, .env.example
  • 에러코드 추가: E0312(검색 결과 만료/없음), E0313(선택한 candidateId 없음), E0314(외부 검색 API 실패)

완료 조건

  • 기능 정상 동작
  • Lint / 타입 체크 통과
  • API 명세 업데이트

관련 이슈 / 참고

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type

Fields

No fields configured for issues without a type.

Projects

Status
Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions