목적
구글 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/import → POST /admin/bakeries/import/search (구글, 응답이 바로 저장이 아닌 미리보기로 변경)
- 변경:
POST /admin/bakeries/import/kakao → POST /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 실패)
완료 조건
관련 이슈 / 참고
목적
작업 내용
searchId기준으로 임시 캐시(TTL 설정 가능, 기본 30분), 확정 시 선택한candidateIds만 DB에 저장BakeryImportCandidate/Cache)와BakeryImportRedisService로 인프라 통합GET /admin/bakeries/import/search/{searchId}추가regionCode=KR국가 단위 편향 추가@NotBlank), candidatetoMapnull/중복 키 방어GooglePlacesImportServiceTest,BakeryImportRedisServiceTest신규 작성,KakaoLocalImportServiceTest새 구조에 맞춰 재작성영향 범위
Bakery스키마 그대로)POST /admin/bakeries/import→POST /admin/bakeries/import/search(구글, 응답이 바로 저장이 아닌 미리보기로 변경)POST /admin/bakeries/import/kakao→POST /admin/bakeries/import/kakao/searchPOST /admin/bakeries/import/confirm,POST /admin/bakeries/import/kakao/confirmGET /admin/bakeries/import/search/{searchId}GooglePlacesImportService,KakaoLocalImportService,GooglePlacesClient,KakaoLocalClient, 신규BakeryImportRedisService,BakeryImportProperties,ErrorCodeBAKERY_IMPORT_CACHE_TTL_MINUTES(기본 30) —application.yml,.env.exampleE0312(검색 결과 만료/없음),E0313(선택한 candidateId 없음),E0314(외부 검색 API 실패)완료 조건
관련 이슈 / 참고