Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
325 commits
Select commit Hold shift + click to select a range
9eba6e5
docs(map): gate public sessions on verified ingress limits
hwistlezz Sep 30, 2026
34d7050
test(restaurant): 선행 관리자 의존성 격리 (#242)
hwistlezz Sep 30, 2026
cb286c2
docs(map): 컬렉션 지도 검증 근거 기록 (#242)
hwistlezz Sep 30, 2026
b613fd3
fix(map): keep daily quota and billing failures terminal
hwistlezz Sep 30, 2026
32b9c0a
Merge #227 final pagination candidate into #231
hwistlezz Sep 30, 2026
caf853e
Merge #222 final Google adapter into #224
hwistlezz Sep 30, 2026
0a78f1f
Merge #224 final Google classification into #228
hwistlezz Sep 30, 2026
1f4248b
Merge #228 final Google classification into #231
hwistlezz Sep 30, 2026
ce50491
Merge #231 latest integration candidate into #242
hwistlezz Sep 30, 2026
c94c2fb
docs(map): 최신 선행 결합 기준 기록 (#242)
hwistlezz Sep 30, 2026
4aa44c4
fix(restaurant): 선행 후보 중복 Port 선언 제거 (#242)
hwistlezz Sep 30, 2026
a692c74
Merge #242 collection map candidate into #231
hwistlezz Sep 30, 2026
cd7033c
test(map): verify saved collection through HTTP map flow (#231)
hwistlezz Sep 30, 2026
bad36b4
fix(restaurant): 지오코딩 실패 진단 및 v4 오류 분류 수정 (#222)
hwistlezz Oct 2, 2026
718d33a
fix(restaurant): 위치 출처를 ADMIN으로 통일 (#220)
hwistlezz Oct 2, 2026
e65ce73
fix(restaurant): 지도 검색과 오류 처리 일관성 보완 (#223)
hwistlezz Oct 2, 2026
2b2af07
merge(restaurant): ADMIN 위치 모델을 지도 조회에 반영 (#223)
hwistlezz Oct 2, 2026
83fa3d3
fix(restaurant): 위치 작업 선행 리뷰 수정 전파 (#224)
hwistlezz Oct 2, 2026
8c4efab
fix(restaurant): 위치 유지보수 출처 정정 전파 (#228)
hwistlezz Oct 2, 2026
d10858f
fix(restaurant): 저장명 내부 공백을 검색에 보존 (#223)
hwistlezz Oct 2, 2026
0eb3d7b
fix(restaurant): 지도 페이지에 리뷰 수정 전파 (#227)
hwistlezz Oct 2, 2026
57e8028
fix(restaurant): 지도 리뷰 수정 사항을 컬렉션 조회에 반영 (#242)
hwistlezz Oct 2, 2026
d857547
fix(restaurant): 지도 리뷰 수정 후보를 서버 통합 흐름에 반영 (#231)
hwistlezz Oct 2, 2026
5ca37a0
fix(restaurant): 위치 작업 진단과 삭제 식당 상태 보존 (#224)
hwistlezz Oct 2, 2026
e45ea9d
fix(restaurant): 위치 작업 진단과 삭제 식당 상태 보존 (#224)
hwistlezz Oct 2, 2026
aa04c0d
fix(restaurant): 지도 세션 공개 활성화를 기본 비활성화 (#227)
hwistlezz Oct 2, 2026
c56dafe
fix(restaurant): 위치 관리 감사와 상시 정리 경계 보완 (#228)
hwistlezz Oct 2, 2026
47c3bbb
fix(user): 컬렉션 지도 실패 진단 로그 추가 (#242)
hwistlezz Oct 2, 2026
b8a7339
fix(restaurant): 지도 활성화와 위치 관리 수정 후보 통합 (#242)
hwistlezz Oct 2, 2026
d0320f5
fix(restaurant): 추가 지도 리뷰 수정 후보를 서버 통합에 반영 (#231)
hwistlezz Oct 2, 2026
cce282f
fix(admin): 위치 재시도 검증 메시지와 연결 문서 보완 (#224)
hwistlezz Oct 2, 2026
bf88d1f
fix(admin): 위치 재시도 검증 메시지와 연결 문서 보완 (#224)
hwistlezz Oct 2, 2026
7c49ec3
fix(admin): 위치 재시도 검증 메시지 변경 전파 (#242)
hwistlezz Oct 2, 2026
9572db9
fix(admin): 위치 재시도 검증 메시지 변경 전파 (#231)
hwistlezz Oct 2, 2026
1ea8ad7
Merge remote-tracking branch 'origin/develop' into feat/#220/restaura…
hwistlezz Oct 5, 2026
9b7de40
fix(restaurant): 위치 갱신 중 유효한 기존 좌표 보존 (#220)
hwistlezz Oct 5, 2026
a14ec93
docs(restaurant): 지도 갱신과 조회 세션 구현 기준 정리 (#220)
hwistlezz Oct 5, 2026
5349e41
chore(restaurant): 좌표 갱신 보존 정책 병합 (#224)
hwistlezz Oct 6, 2026
1165626
fix(restaurant): 위치 작업 재시도와 호출 중단 처리 보완 (#224)
hwistlezz Oct 6, 2026
7ad6357
docs(restaurant): 좌표 보존과 재시도 변경 내용 정리 (#224)
hwistlezz Oct 6, 2026
700a68c
fix(restaurant): 호출 중단 중에도 소진 작업 종료 (#224)
hwistlezz Oct 6, 2026
f5c32c2
merge(restaurant): 좌표 갱신 모델을 지도 조회에 반영 (#223)
hwistlezz Oct 6, 2026
bdd0a1c
fix(restaurant): 갱신 중 유효 좌표를 지도 조회에 유지 (#223)
hwistlezz Oct 6, 2026
f9552d1
Merge commit 'bdd0a1c' into feat/#227/restaurant-map-pagination
hwistlezz Oct 7, 2026
a006868
merge: 최신 위치 작업 변경 반영
hwistlezz Oct 7, 2026
6ed508e
Merge commit 'bdd0a1c' into feat/#242/collection-map-integration
hwistlezz Oct 7, 2026
d6b87df
fix(restaurant): 좌표 갱신과 만료 작업의 상태 보존 (#228)
hwistlezz Oct 7, 2026
5988c00
test(user): 컬렉션 좌표 갱신과 만료 검증 추가 (#242)
hwistlezz Oct 7, 2026
612a07d
Merge commit 'd6b87df2081ef7bf33851dbb6988b3689512c01c' into feat/#24…
hwistlezz Oct 7, 2026
092a487
feat(restaurant): 지도 조회 수명과 용량 제한 개선 (#227)
hwistlezz Oct 7, 2026
51639a4
Merge commit '092a487a9ba17185a4bbf6f08ae29e5da8520742' into feat/#24…
hwistlezz Oct 7, 2026
d807c78
test: 지도 전체 조회와 로컬 부하 검증 보완 (#231)
hwistlezz Oct 7, 2026
042e612
Merge commit '612a07db4780a12c0c7040f6c1997b46b0012991' into feat/#23…
hwistlezz Oct 7, 2026
1c3f1c5
Merge commit '092a487a' into feat/#231/map-integration-verification
hwistlezz Oct 7, 2026
7f76b0d
fix(restaurant): 설정 변경 시 지도 용량 예약 수명 보존 (#227)
hwistlezz Oct 7, 2026
df1bc51
test(restaurant): 갱신과 만료 흐름 기대값 수정 (#242)
hwistlezz Oct 7, 2026
d22cf52
Merge commit '7f76b0d7e358a5f8cab68b0f67a68e730198a9cd' into feat/#24…
hwistlezz Oct 7, 2026
09ad888
fix(restaurant): 지도 세션 수명을 Redis 시각으로 통일 (#227)
hwistlezz Oct 7, 2026
57e29f6
Merge commit '09ad888551c50e2f2629c46dc8ee80d2cc1dc214' into feat/#24…
hwistlezz Oct 7, 2026
4dcd590
test: 만료 fixture와 부하 실패 간격 보정 (#231)
hwistlezz Oct 7, 2026
4964c0a
Merge commit '57e29f6fc87dc75c39e85d5a58ff43b55fe1230a' into feat/#23…
hwistlezz Oct 7, 2026
0896298
test: 로컬 지도 부하 결과와 실행 범위 기록 (#231)
hwistlezz Oct 7, 2026
3b9fc0b
test: 지도 부하 응답 오류를 실패로 기록 (#231)
hwistlezz Oct 7, 2026
d472cd0
Merge remote-tracking branch 'origin/develop' into feat/#220/restaura…
hwistlezz Oct 7, 2026
c4cdb4a
fix(restaurant): 미적용 지도 migration 번호 정리 (#220)
hwistlezz Oct 7, 2026
ed72710
Merge remote-tracking branch 'origin/develop' into feat/#222/google-g…
hwistlezz Oct 7, 2026
216671c
Merge branch 'feat/#220/restaurant-map-location' into feat/#224/resta…
hwistlezz Oct 7, 2026
978810f
Merge branch 'feat/#222/google-geocoding-adapter' into feat/#224/rest…
hwistlezz Oct 7, 2026
1040ac5
fix(restaurant): 위치 작업 migration을 V33으로 정리 (#224)
hwistlezz Oct 7, 2026
00306cd
Merge branch 'feat/#220/restaurant-map-location' into feat/#223/map-r…
hwistlezz Oct 7, 2026
2743a97
Merge branch 'feat/#224/restaurant-location-job' into feat/#228/resta…
hwistlezz Oct 7, 2026
24727fc
Merge branch 'feat/#223/map-restaurant-query' into feat/#227/restaura…
hwistlezz Oct 7, 2026
5aded19
fix(restaurant): 위치 유지보수 migration을 V34로 정리 (#228)
hwistlezz Oct 7, 2026
e5e42a8
Merge branch 'feat/#228/restaurant-location-maintenance' into feat/#2…
hwistlezz Oct 7, 2026
15778e5
Merge branch 'feat/#227/restaurant-map-pagination' into feat/#242/col…
hwistlezz Oct 7, 2026
bff85f6
fix(user): 컬렉션 변경번호 migration을 V35로 정리 (#242)
hwistlezz Oct 7, 2026
16f189d
Merge branch 'feat/#242/collection-map-integration' into feat/#231/ma…
hwistlezz Oct 7, 2026
26bf578
docs(restaurant): 지도 migration 적용 순서 갱신 (#231)
hwistlezz Oct 7, 2026
99d2f84
docs(user): 컬렉션 선행 migration 설명 정리 (#242)
hwistlezz Oct 7, 2026
70b7a5b
Merge branch 'feat/#242/collection-map-integration' into feat/#231/ma…
hwistlezz Oct 7, 2026
2422f0c
docs(restaurant): 지도 업그레이드 검증 기준 명시 (#231)
hwistlezz Oct 7, 2026
c0912ba
docs(restaurant): Google 연동 계획의 migration 번호 정리 (#222)
hwistlezz Oct 7, 2026
d59d282
test(restaurant): 실제 지도 호출과 격리 부하 검증 확장 (#231)
hwistlezz Oct 7, 2026
175d3da
test(restaurant): 실호출 주소 검증의 안전한 진단 추가 (#231)
hwistlezz Oct 7, 2026
29cbf84
fix(restaurant): 숫자 premise의 번지 검증 지원 (#224)
hwistlezz Oct 7, 2026
fed8d3c
fix(restaurant): premise의 혼합 주소 역할 거부 (#224)
hwistlezz Oct 7, 2026
6a5bad2
Merge branch 'feat/#224/restaurant-location-job' into feat/#228/resta…
hwistlezz Oct 7, 2026
fc8aaff
Merge branch 'feat/#228/restaurant-location-maintenance' into feat/#2…
hwistlezz Oct 7, 2026
2ae7313
Merge branch 'feat/#242/collection-map-integration' into feat/#231/ma…
hwistlezz Oct 7, 2026
6989af7
docs(restaurant): 실제 Google 지도 흐름 검증 결과 기록 (#231)
hwistlezz Oct 7, 2026
a5792a6
fix(restaurant): map migration을 V38로 재번호 (#220)
hwistlezz Oct 8, 2026
69f98e2
docs(restaurant): map migration 순서를 V38 이후로 갱신 (#222)
hwistlezz Oct 8, 2026
9666d69
Merge remote-tracking branch 'origin/develop' into feat/#220/restaura…
hwistlezz Oct 8, 2026
77c8a00
Merge remote-tracking branch 'origin/develop' into feat/#222/google-g…
hwistlezz Oct 8, 2026
e2b2bd7
fix(restaurant): location job migration을 V39로 재번호 (#224)
hwistlezz Oct 8, 2026
682bdf6
fix(restaurant): maintenance migration을 V40으로 재번호 (#228)
hwistlezz Oct 8, 2026
4183146
fix(user): collection version migration을 V41로 재번호 (#242)
hwistlezz Oct 8, 2026
66f73aa
Merge branch 'feat/#220/restaurant-map-location' into feat/#223/map-r…
hwistlezz Oct 8, 2026
b7dad6e
Merge branch 'feat/#223/map-restaurant-query' into feat/#227/restaura…
hwistlezz Oct 8, 2026
8348da1
Merge branch 'feat/#220/restaurant-map-location' into feat/#224/resta…
hwistlezz Oct 8, 2026
1ef4b62
Merge branch 'feat/#222/google-geocoding-adapter' into feat/#224/rest…
hwistlezz Oct 8, 2026
3071160
Merge branch 'feat/#224/restaurant-location-job' into feat/#228/resta…
hwistlezz Oct 8, 2026
09383e8
Merge branch 'feat/#227/restaurant-map-pagination' into feat/#242/col…
hwistlezz Oct 8, 2026
1979c19
Merge branch 'feat/#228/restaurant-location-maintenance' into feat/#2…
hwistlezz Oct 8, 2026
5810fdc
Merge branch 'feat/#242/collection-map-integration' into feat/#231/ma…
hwistlezz Oct 8, 2026
006094b
test(restaurant): 지도 MVC 보안 의존성 반영 (#223)
hwistlezz Oct 8, 2026
3392e8f
test(admin): 위치 API 보안 의존성 반영 (#224)
hwistlezz Oct 8, 2026
44d2e32
test(restaurant): 지도 페이지 보안 의존성 반영 (#227)
hwistlezz Oct 8, 2026
31b0fe9
test(collection): 최신 회원 및 보안 의존성 반영 (#242)
hwistlezz Oct 8, 2026
13cafaa
Merge branch 'feat/#223/map-restaurant-query' into feat/#227/restaura…
hwistlezz Oct 8, 2026
2e8d269
Merge branch 'feat/#224/restaurant-location-job' into feat/#228/resta…
hwistlezz Oct 8, 2026
c9460b0
Merge branch 'feat/#227/restaurant-map-pagination' into feat/#242/col…
hwistlezz Oct 8, 2026
0d06bf6
Merge branch 'feat/#228/restaurant-location-maintenance' into feat/#2…
hwistlezz Oct 8, 2026
52fece0
Merge branch 'feat/#242/collection-map-integration' into feat/#231/ma…
hwistlezz Oct 8, 2026
a471641
docs(map): collection migration 순서 정정 (#242)
hwistlezz Oct 8, 2026
4e3f238
Merge branch 'feat/#242/collection-map-integration' into feat/#231/ma…
hwistlezz Oct 8, 2026
ac76310
test(restaurant): 지도 부하의 호출자와 제한 원인 계측 (#252)
hwistlezz Oct 8, 2026
95b9c38
test(restaurant): 정상 지도 부하를 운영 한도 안으로 분리 (#252)
hwistlezz Oct 8, 2026
84dedd4
test(collection): 최신 인증과 회원 fixture 반영 (#242)
hwistlezz Oct 8, 2026
0ecce60
test(restaurant): 지도 흐름에 실제 회원 fixture 추가 (#231)
hwistlezz Oct 8, 2026
d900a69
Merge branch 'feat/#242/collection-map-integration' into feat/#231/ma…
hwistlezz Oct 8, 2026
9147d75
test(restaurant): 지도 부하 산출물의 실행 경계를 고정 (#252)
hwistlezz Oct 8, 2026
ae298aa
feat: add explicit restaurant geocoding address
hwistlezz Oct 8, 2026
673e505
feat: add explicit restaurant geocoding address
hwistlezz Oct 8, 2026
d0e5bd0
feat: add explicit restaurant geocoding address
hwistlezz Oct 8, 2026
2e4f910
feat: add explicit restaurant geocoding address
hwistlezz Oct 8, 2026
454cf12
test(restaurant): 지도 세션 예산 비교를 제한적으로 허용 (#252)
hwistlezz Oct 8, 2026
ba3682e
test(restaurant): 실제 Google 좌표 갱신 흐름 검증 (#231)
hwistlezz Oct 8, 2026
f372ce2
test: use explicit address in live refresh flow
hwistlezz Oct 8, 2026
026d3ca
fix: normalize Unicode geocoding whitespace
hwistlezz Oct 8, 2026
6ac288a
fix: normalize Unicode geocoding whitespace
hwistlezz Oct 8, 2026
be1dede
fix: normalize Unicode geocoding whitespace
hwistlezz Oct 8, 2026
1f34dd1
fix: normalize Unicode geocoding whitespace
hwistlezz Oct 8, 2026
32e8c8f
ci: report failed test identifiers
hwistlezz Oct 8, 2026
c4dc262
ci: sanitize executor failure details
hwistlezz Oct 8, 2026
2e83e98
test: bound full-suite context retention
hwistlezz Oct 8, 2026
8a6d29a
fix: include country in structured geocoding request
hwistlezz Oct 8, 2026
28908cc
fix(restaurant): 지도 세션 용량 사용과 진단 개선 (#227)
hwistlezz Oct 8, 2026
9f96d13
fix(restaurant): 손상된 지도 후보 tuple 거절 (#227)
hwistlezz Oct 8, 2026
2d28957
fix: geocode production addresses in English
hwistlezz Oct 8, 2026
c510720
fix: automate verified Tokyo address adoption
hwistlezz Oct 8, 2026
47ce3ad
Merge branch 'feat/#222/google-geocoding-adapter' into feat/#224/rest…
hwistlezz Oct 8, 2026
7520977
fix(restaurant): 지도 세션 용량 사용과 진단 개선 (#227)
hwistlezz Oct 8, 2026
1e6b522
fix(restaurant): 손상된 지도 후보 tuple 거절 (#227)
hwistlezz Oct 8, 2026
fa06155
test(restaurant): 지도 용량 거절 원인 계측 (#252)
hwistlezz Oct 8, 2026
3369666
test(restaurant): 지도 동시성 비교 계측 보강 (#252)
hwistlezz Oct 8, 2026
eab8362
test(restaurant): 표시 주소 수정 시 위치 유지 검증 (#231)
hwistlezz Oct 8, 2026
ca48e99
docs(map): 통합 검증 근거 최신화 (#231)
hwistlezz Oct 8, 2026
0a3078a
fix: reject conflicting input address numbers
hwistlezz Oct 8, 2026
c07a07e
fix: include country in structured geocoding request
hwistlezz Oct 8, 2026
bd46a3c
fix: include country in structured geocoding request
hwistlezz Oct 8, 2026
f628673
fix: geocode production addresses in English
hwistlezz Oct 8, 2026
a6ad78b
fix: geocode production addresses in English
hwistlezz Oct 8, 2026
ff0cf8c
fix: automate verified Tokyo address adoption
hwistlezz Oct 8, 2026
7f031bd
fix: reject conflicting input address numbers
hwistlezz Oct 8, 2026
76ff445
fix: automate verified Tokyo address adoption
hwistlezz Oct 8, 2026
ec1e2db
fix: reject conflicting input address numbers
hwistlezz Oct 8, 2026
97749c1
docs(map): 위치 검증 최종 집계 반영 (#231)
hwistlezz Oct 8, 2026
01a80fe
docs: explain legacy location backfill input
hwistlezz Oct 8, 2026
c6ad98e
fix: include country in structured geocoding request
hwistlezz Oct 8, 2026
7d573aa
fix: geocode production addresses in English
hwistlezz Oct 8, 2026
2ff89af
fix: automate verified Tokyo address adoption
hwistlezz Oct 8, 2026
c877364
fix: reject conflicting input address numbers
hwistlezz Oct 8, 2026
04b8378
docs: explain legacy location backfill input
hwistlezz Oct 8, 2026
e5370b1
fix(restaurant): 지도 세션 용량 사용과 진단 개선 (#227)
hwistlezz Oct 8, 2026
feaedfe
fix(restaurant): 손상된 지도 후보 tuple 거절 (#227)
hwistlezz Oct 8, 2026
9e4b66c
docs: explain legacy location backfill input
hwistlezz Oct 8, 2026
39266dd
docs(map): 주소 재생 결과 범위 명확화 (#231)
hwistlezz Oct 8, 2026
90a8599
docs(restaurant): 실제 Google 등록과 갱신 확인 결과 반영 (#231)
hwistlezz Oct 8, 2026
86b508a
fix: keep address component number roles consistent
hwistlezz Oct 8, 2026
bbd1bc3
fix: keep address component number roles consistent
hwistlezz Oct 8, 2026
d1b5d1e
fix: keep address component number roles consistent
hwistlezz Oct 8, 2026
418d9a7
fix: keep address component number roles consistent
hwistlezz Oct 8, 2026
2f4a957
docs: qualify production address replay result
hwistlezz Oct 8, 2026
6b2818e
ci: preserve full-suite failure diagnostics
hwistlezz Oct 8, 2026
ff34602
fix(restaurant): 지도 조회 수용량 안내 정정 (#227)
hwistlezz Oct 8, 2026
0eb80b9
feat(restaurant): 지도 키워드 검색 계약 반영 (#223)
hwistlezz Oct 8, 2026
e7c37b2
docs(restaurant): 지도 검색어 계약 명시 (#227)
hwistlezz Oct 8, 2026
0836397
perf(restaurant): 지도 조회 단계 시간 계측 (#227)
hwistlezz Oct 8, 2026
b8acb4b
docs(admin): 식당 위치 계약 문서화 (#224)
hwistlezz Oct 8, 2026
9d05b5d
test(restaurant): 지도 OR 검색 회귀 범위 분리 (#223)
hwistlezz Oct 8, 2026
c55fca1
feat(restaurant): 지도 검색 결과 범위 집계 (#223)
hwistlezz Oct 8, 2026
43100ea
Merge commit 'c55fca1cc84be5b193801c3cc564ccc2b4591bb9' into feat/#22…
hwistlezz Oct 8, 2026
7722e2b
docs(restaurant): 공개 지도 API 문서화 (#223)
hwistlezz Oct 8, 2026
ab7b369
docs(user): 컬렉션 지도 계약 문서화 (#242)
hwistlezz Oct 8, 2026
597e777
Merge commit '7722e2b34805a2c4fbd1d2d715cca7c097566e86' into feat/#22…
hwistlezz Oct 8, 2026
f71fcfc
fix(restaurant): 지도 결과 경계 만료 상한 포함 (#223)
hwistlezz Oct 8, 2026
9ee58e7
Merge commit 'f71fcfc7a8418113e7b53d7e02b1d95039c66cf4' into feat/#22…
hwistlezz Oct 8, 2026
72a494b
docs(restaurant): 지도 migration 재번호 범위 명확화 (#220)
hwistlezz Oct 8, 2026
a8aaa9b
feat(restaurant): 지도 검색 결과 요약 유지 (#227)
hwistlezz Oct 8, 2026
94e0f2f
docs(restaurant): 지도 migration 재번호 범위 명확화 (#220)
hwistlezz Oct 8, 2026
191ad60
docs(restaurant): 위치 API 문서 반영 (#228)
hwistlezz Oct 8, 2026
2f581d1
docs(restaurant): 지도 검색 결과 계약 갱신 (#223)
hwistlezz Oct 8, 2026
2947519
docs(user): 관리자 위치 계약 반영 (#242)
hwistlezz Oct 8, 2026
f61b6b2
Merge commit '2f581d187bad2cbfb81d5fce4d0dc5058b63c1d0' into feat/#22…
hwistlezz Oct 8, 2026
afeb49d
docs(map): 기획 대조와 부하 측정 항목 정리 (#231)
hwistlezz Oct 8, 2026
f968c3f
docs(map): 주소와 컬렉션 연동 문서 반영 (#231)
hwistlezz Oct 8, 2026
ef68e12
feat(map): 검색 계약과 페이지 요약 연결 (#231)
hwistlezz Oct 8, 2026
5ed70e9
docs(map): 지도 검색 정렬 유지 명시 (#231)
hwistlezz Oct 8, 2026
241665a
docs(map): 시설 내부 매장 확인 범위 정리 (#231)
hwistlezz Oct 8, 2026
1593035
feat(admin): 식당 위치 검토 목록 조회 추가 (#224)
hwistlezz Oct 8, 2026
bc897ff
docs(map): 관리자 위치 목록 연결 방법 보완 (#231)
hwistlezz Oct 8, 2026
b629208
fix(restaurant): 지도 검색 집계를 반복 읽기로 고정 (#223)
hwistlezz Oct 8, 2026
c42df24
Merge commit 'b62920856d4331ad6be9ea76f4804b592bde6a51' into feat/#22…
hwistlezz Oct 8, 2026
09955bf
fix(restaurant): 지도 세션 문서와 계측 보정 (#227)
hwistlezz Oct 8, 2026
c38601d
chore(map): 검색 스냅샷과 계측 보완 반영 (#231)
hwistlezz Oct 8, 2026
348c0a6
fix(admin): 위치 목록 UTC 시각 변환 보정 (#224)
hwistlezz Oct 8, 2026
fd8c94d
Merge commit '348c0a613f8674bcb27d6d78cae7f45e770d41d1' into feat/#22…
hwistlezz Oct 8, 2026
acbb52b
feat(map): include Places in location maintenance scans (#228)
hwistlezz Oct 8, 2026
7114c8c
feat(map): Google Places provider 어댑터 추가 (#224)
hwistlezz Oct 8, 2026
19716a1
docs: 지도 마이그레이션 보존 검증 기준 정리 (#220)
hwistlezz Oct 8, 2026
5d46eb2
feat: 지도와 컬렉션 핀의 장소 출처 전달 (#242)
hwistlezz Oct 8, 2026
0b49929
test: Places 선택 갱신과 기존 데이터 보존 검증 추가 (#231)
hwistlezz Oct 8, 2026
2155279
feat(restaurant): Places 위치 검토 흐름 추가 (#224)
hwistlezz Oct 8, 2026
205adaf
docs: 지도 마이그레이션 보존 검증 기준 정리 (#220)
hwistlezz Oct 8, 2026
aa86a2f
Merge commit '21552797d6ef87d16a279568240d72139e57a420' into feat/#22…
hwistlezz Oct 8, 2026
3cb01e5
Merge commit '205adaf02a72954f4a5afce928df0a4ba7651bad' into feat/#22…
hwistlezz Oct 8, 2026
b0d2d6b
fix: 손상된 장소 출처를 지도 조회 실패로 처리 (#242)
hwistlezz Oct 8, 2026
1a81775
feat(map): retain Places location lifecycle policy (#228)
hwistlezz Oct 8, 2026
97492d2
merge: Places 갱신과 만료 처리를 컬렉션 지도에 연결 (#242)
hwistlezz Oct 8, 2026
c608d49
merge: Places 선택 갱신과 출처를 지도 검증에 연결 (#231)
hwistlezz Oct 8, 2026
4be9b0b
merge: 최신 지도 검색과 세션 계약을 컬렉션에 반영 (#242)
hwistlezz Oct 8, 2026
52c64ff
fix: Places 조회 경계와 호출 예산 검증 보완 (#224)
hwistlezz Oct 8, 2026
ce558b8
merge: Places 리뷰 수정과 API 오류 계약 반영 (#228)
hwistlezz Oct 8, 2026
15c5825
merge: Places 실제 Port 검증과 입력 계약 반영 (#242)
hwistlezz Oct 8, 2026
11e942e
merge: 위치 유지보수 최종 리뷰 수정 연결 (#242)
hwistlezz Oct 8, 2026
8267f9a
merge: Places 최종 리뷰 수정과 컬렉션 출처 연결 (#231)
hwistlezz Oct 8, 2026
97567f2
[Test] Places 실호출 검증과 테스트 입력 정리 (#231)
hwistlezz Oct 8, 2026
74ee4df
[Docs] Places 비교 실험과 전체 흐름 검증 구분 (#231)
hwistlezz Oct 8, 2026
173a261
[Test] Places migration까지 기존 데이터 보존 검증 (#224)
hwistlezz Oct 8, 2026
e7f1363
Merge commit '173a261df4a8d8d29f8bd6a83e357edc79966b36' into feat/#22…
hwistlezz Oct 8, 2026
e8f9812
Merge branch 'feat/#228/restaurant-location-maintenance' into feat/#2…
hwistlezz Oct 8, 2026
1553436
Merge branch 'feat/#242/collection-map-integration' into feat/#231/ma…
hwistlezz Oct 8, 2026
f4bc13d
[Docs] Places migration 순서와 위치 실패 예시 정리 (#224)
hwistlezz Oct 8, 2026
8760dc7
[Docs] 관리자 위치 목록의 페이지 계약 안내 (#231)
hwistlezz Oct 8, 2026
8f4a3fa
fix(admin): use offset pagination for location reviews
hwistlezz Oct 8, 2026
6ab5572
Merge commit '8f4a3faca49ad8d87f0060b7eb2f522612eac30a' into feat/#22…
hwistlezz Oct 8, 2026
6d8c66e
Merge branch 'feat/#228/restaurant-location-maintenance' into feat/#2…
hwistlezz Oct 8, 2026
a9388d0
Merge branch 'feat/#242/collection-map-integration' into feat/#231/ma…
hwistlezz Oct 8, 2026
b1008cf
docs(admin): clarify Places selection revision fields
hwistlezz Oct 8, 2026
825624b
docs(map): clarify sorting and capacity retry guidance
hwistlezz Oct 8, 2026
084f766
Merge branch 'feat/#224/restaurant-location-job' into feat/#228/resta…
hwistlezz Oct 8, 2026
a8a0e6e
Merge branch 'feat/#228/restaurant-location-maintenance' into feat/#2…
hwistlezz Oct 8, 2026
6941731
Merge branch 'feat/#242/collection-map-integration' into feat/#231/ma…
hwistlezz Oct 8, 2026
0f6181c
Merge branch 'feat/#227/restaurant-map-pagination' into feat/#231/map…
hwistlezz Oct 8, 2026
4693691
feat(restaurant): 지도 조회 Redis 연결 분리 (#227)
hwistlezz Oct 10, 2026
198b4bf
merge: 지도 Redis 연결 분리 반영 (#231)
hwistlezz Oct 10, 2026
2ed7793
test(map): 지도 전용 Redis 통합 검증 배선 (#231)
hwistlezz Oct 10, 2026
2b6db58
fix(restaurant): 지도 Redis 설정 오류 격리 (#227)
hwistlezz Oct 10, 2026
e56bc39
merge: 지도 Redis 설정 오류 격리 반영 (#231)
hwistlezz Oct 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions .env.dev.example
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,19 @@ REDIS_PORT=6379

JWT_SECRET=

# 키 준비와 공개 활성화는 별개다. ingress·정상 트래픽 용량·후보 규모/byte 예산 검증 전 비활성화한다 (#252).
HASHI_RESTAURANT_MAP_SESSION_ENABLED=false
HASHI_RESTAURANT_MAP_SESSION_SIGNINGKEY=
# 지도 전용 Redis. 기존 REDIS_HOST/PORT(인증용)와 별도 인스턴스여야 한다.
# 로컬 격리 검증용 컨테이너: docker/docker-compose.map-redis.local.yml
HASHI_RESTAURANT_MAP_REDIS_HOST=
HASHI_RESTAURANT_MAP_REDIS_PORT=6379
HASHI_RESTAURANT_MAP_REDIS_SSL=false
HASHI_RESTAURANT_MAP_REDIS_USERNAME=
HASHI_RESTAURANT_MAP_REDIS_PASSWORD=
HASHI_RESTAURANT_MAP_REDIS_CONNECTTIMEOUT=2s
HASHI_RESTAURANT_MAP_REDIS_TIMEOUT=3s

KAKAO_CLIENT_ID=
KAKAO_CLIENT_SECRET=
KAKAO_REDIRECT_URI=
Expand All @@ -30,5 +43,12 @@ CLOUDFRONT_DOMAIN=
CORS_ALLOWED_ORIGINS=http://localhost:5173
CORS_ALLOWED_ORIGIN_PATTERNS=

# Google Places 관리자 위치 검토는 기본 비활성화다. 실제 비밀값은 이 예시 파일에 기록하지 않는다.
HASHI_MAP_GOOGLE_PLACES_ENABLED=false
HASHI_MAP_GOOGLE_PLACES_API_KEY=
HASHI_MAP_PLACES_SELECTION_ENABLED=false
HASHI_MAP_PLACES_SELECTION_SIGNING_KEY=
HASHI_MAP_PLACES_SELECTION_TOKEN_TTL=10m

GRAFANA_ADMIN_USER=admin
GRAFANA_ADMIN_PASSWORD=''
50 changes: 50 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -134,14 +134,52 @@ jobs:
run: ./gradlew clean build --no-daemon

- name: Verify test execution
if: ${{ always() }}
run: |
python3 - <<'PY'
from pathlib import Path
import re
import xml.etree.ElementTree as ET

report_root = Path("build/test-results/test")
reports = sorted(report_root.glob("TEST-*.xml"))
assert reports, "Test reports are missing"

java_identifier = r"[A-Za-z_$][A-Za-z0-9_$]*"
qualified_identifier = rf"{java_identifier}(?:\.{java_identifier})+"
exception_pattern = re.compile(
rf"^(?:Caused by:\s+)?({qualified_identifier})(?::|$)"
)
failed_tests = set()
failure_types = []
for report in reports:
suite = ET.parse(report).getroot()
for testcase in suite.findall("testcase"):
outcome = testcase.find("failure")
if outcome is None:
outcome = testcase.find("error")
if outcome is None:
continue

class_name = testcase.attrib.get("classname", "<unknown-class>")
stack = outcome.text or ""
frame = re.search(
rf"\bat\s+{re.escape(class_name)}\.([^\s.(]+)\(",
stack,
)
method_name = frame.group(1) if frame else "<unknown-method>"
failed_tests.add(f"{class_name}#{method_name}")
for line in stack.splitlines():
sanitized = line.strip()
exception = exception_pattern.match(sanitized)
if exception and exception.group(1) not in failure_types:
failure_types.append(exception.group(1))

for failed_test in sorted(failed_tests):
print(f"Failed test: {failed_test}")
for failure_type in failure_types[:8]:
print(f"Failure type: {failure_type}")

assert (report_root / "TEST-org.sopt.hashi.ModularityTests.xml").is_file(), \
"Module verification did not produce a test report"

Expand All @@ -156,3 +194,15 @@ jobs:

print(f"Test suites: {len(reports)}, tests: {total}, failures/errors/skips: 0")
PY

- name: Upload test diagnostics
if: ${{ failure() }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: test-diagnostics-${{ github.run_id }}-${{ github.run_attempt }}
path: |
build/test-results/test
build/reports/tests/test
build/reports/problems
if-no-files-found: warn
retention-days: 7
51 changes: 50 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ ext {
dependencies {
// web / docs
implementation 'org.springframework.boot:spring-boot-starter-web'
// Geocoding: RestClient transport with explicit retry/redirect disabling (Boot-managed version).
implementation 'org.apache.httpcomponents.client5:httpclient5'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
runtimeOnly 'io.micrometer:micrometer-registry-prometheus'
// 로그 JSON 인코딩(Loki 수집용) — logback-spring.xml에서 사용
Expand Down Expand Up @@ -94,14 +96,23 @@ dependencyManagement {

tasks.named('bootJar') {
archiveFileName = 'app.jar'
mainClass = 'org.sopt.hashi.HashiApplication'
}

tasks.named('jar') {
enabled = false
}

tasks.named('test') {
useJUnitPlatform()
// The maintenance smoke test launches the same artifact shipped by the existing build.
dependsOn tasks.named('bootJar')
systemProperty 'location.maintenance.jar', tasks.named('bootJar').get().archiveFile.get().asFile.absolutePath
useJUnitPlatform {
excludeTags 'map-load', 'map-live'
}
// Limit retained Spring contexts during the full suite.
maxParallelForks = 1
systemProperty 'spring.test.context.cache.maxSize', '8'
testLogging {
exceptionFormat = 'full'
}
Expand All @@ -116,8 +127,46 @@ tasks.named('test') {
).withPropertyName('mediaBackfillInfrastructure')
}

// Explicit local capacity experiment; ordinary CI remains deterministic and does not require k6.
tasks.register('mapLoadTest', Test) {
description = 'Runs the isolated MySQL/Redis HTTP map workload using a local k6 binary.'
group = 'verification'
testClassesDirs = sourceSets.test.output.classesDirs
classpath = sourceSets.test.runtimeClasspath
useJUnitPlatform { includeTags 'map-load' }
systemProperty 'map.k6.executable', providers.gradleProperty('k6Executable').getOrElse('k6')
systemProperty 'map.k6.script', file('scripts/load/map-query.js').absolutePath
systemProperty 'map.k6.output', layout.buildDirectory.dir('reports/map-load').get().asFile.absolutePath
systemProperty 'map.k6.profile', providers.gradleProperty('mapLoadProfile').getOrElse('smoke')
systemProperty 'map.k6.traffic', providers.gradleProperty('mapLoadTraffic').getOrElse('shared')
systemProperty 'map.k6.restaurants', providers.gradleProperty('mapLoadRestaurants').getOrElse('620')
systemProperty 'map.k6.budget-mib', providers.gradleProperty('mapLoadBudgetMiB').getOrElse('16')
systemProperty 'hashi.restaurant.map.session.limits.concurrent-requests',
providers.gradleProperty('mapLoadConcurrentRequests').getOrElse('4')
outputs.upToDateWhen { false }
maxParallelForks = 1
testLogging { exceptionFormat = 'full' }
}

tasks.named('processResources') {
from('media-specs') {
into 'media-specs'
}
}

// Real Google is excluded from ordinary CI and requires explicit opt-in plus an environment-only key.
tasks.register('mapLiveTest', Test) {
group = 'verification'
testClassesDirs = sourceSets.test.output.classesDirs
classpath = sourceSets.test.runtimeClasspath
useJUnitPlatform { includeTags 'map-live' }
systemProperty 'map.live.enabled', providers.gradleProperty('mapLive').getOrElse('false')
outputs.upToDateWhen { false }
maxParallelForks = 1
doFirst {
if (providers.gradleProperty('mapLive').getOrElse('false') != 'true'
|| !System.getenv('HASHI_MAP_GOOGLEGEOCODING_APIKEY')) {
throw new GradleException('mapLiveTest requires -PmapLive=true and an environment API key')
}
}
}
17 changes: 17 additions & 0 deletions docker/docker-compose.dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,17 @@ services:

JWT_SECRET: ${JWT_SECRET}

HASHI_RESTAURANT_MAP_SESSION_ENABLED: ${HASHI_RESTAURANT_MAP_SESSION_ENABLED:-false}
HASHI_RESTAURANT_MAP_SESSION_SIGNINGKEY: ${HASHI_RESTAURANT_MAP_SESSION_SIGNINGKEY:-}
# 인증용 REDIS_HOST로 대체하지 않는다. 전용 Redis 준비 전에는 지도 세션을 비활성화한다.
HASHI_RESTAURANT_MAP_REDIS_HOST: ${HASHI_RESTAURANT_MAP_REDIS_HOST:-}
HASHI_RESTAURANT_MAP_REDIS_PORT: ${HASHI_RESTAURANT_MAP_REDIS_PORT:-6379}
HASHI_RESTAURANT_MAP_REDIS_SSL: ${HASHI_RESTAURANT_MAP_REDIS_SSL:-false}
HASHI_RESTAURANT_MAP_REDIS_USERNAME: ${HASHI_RESTAURANT_MAP_REDIS_USERNAME:-}
HASHI_RESTAURANT_MAP_REDIS_PASSWORD: ${HASHI_RESTAURANT_MAP_REDIS_PASSWORD:-}
HASHI_RESTAURANT_MAP_REDIS_CONNECTTIMEOUT: ${HASHI_RESTAURANT_MAP_REDIS_CONNECTTIMEOUT:-2s}
HASHI_RESTAURANT_MAP_REDIS_TIMEOUT: ${HASHI_RESTAURANT_MAP_REDIS_TIMEOUT:-3s}

KAKAO_CLIENT_ID: ${KAKAO_CLIENT_ID}
KAKAO_CLIENT_SECRET: ${KAKAO_CLIENT_SECRET}
KAKAO_REDIRECT_URI: ${KAKAO_REDIRECT_URI}
Expand All @@ -47,6 +58,12 @@ services:
CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS}
CORS_ALLOWED_ORIGIN_PATTERNS: ${CORS_ALLOWED_ORIGIN_PATTERNS:-}

HASHI_MAP_GOOGLE_PLACES_ENABLED: ${HASHI_MAP_GOOGLE_PLACES_ENABLED:-false}
HASHI_MAP_GOOGLE_PLACES_API_KEY: ${HASHI_MAP_GOOGLE_PLACES_API_KEY:-}
HASHI_MAP_PLACES_SELECTION_ENABLED: ${HASHI_MAP_PLACES_SELECTION_ENABLED:-false}
HASHI_MAP_PLACES_SELECTION_SIGNING_KEY: ${HASHI_MAP_PLACES_SELECTION_SIGNING_KEY:-}
HASHI_MAP_PLACES_SELECTION_TOKEN_TTL: ${HASHI_MAP_PLACES_SELECTION_TOKEN_TTL:-10m}

prometheus:
image: prom/prometheus:v2.53.1
container_name: hashi-dev-prometheus
Expand Down
20 changes: 20 additions & 0 deletions docker/docker-compose.map-redis.local.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# 로컬 연결 검증 전용. dev/prod compose에 자동으로 추가하지 않는다.
services:
map-redis:
image: redis@sha256:858f009f9709ce576febc734aa78b8f6d624b82571f9ddb6bda4377c833b3499
command: [redis-server, --maxmemory, 64mb, --maxmemory-policy, noeviction, --appendonly, "no", --save, ""]
ports:
- "127.0.0.1:16379:6379"
mem_limit: 128m
memswap_limit: 128m
cpus: 0.5
healthcheck:
test: [CMD, redis-cli, ping]
interval: 5s
timeout: 2s
retries: 3
logging:
driver: json-file
options:
max-size: "5m"
max-file: "2"
17 changes: 17 additions & 0 deletions docker/docker-compose.prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,17 @@ services:

JWT_SECRET: ${JWT_SECRET}

HASHI_RESTAURANT_MAP_SESSION_ENABLED: ${HASHI_RESTAURANT_MAP_SESSION_ENABLED:-false}
HASHI_RESTAURANT_MAP_SESSION_SIGNINGKEY: ${HASHI_RESTAURANT_MAP_SESSION_SIGNINGKEY:-}
# 인증용 REDIS_HOST로 대체하지 않는다. 전용 Redis 준비 전에는 지도 세션을 비활성화한다.
HASHI_RESTAURANT_MAP_REDIS_HOST: ${HASHI_RESTAURANT_MAP_REDIS_HOST:-}
HASHI_RESTAURANT_MAP_REDIS_PORT: ${HASHI_RESTAURANT_MAP_REDIS_PORT:-6379}
HASHI_RESTAURANT_MAP_REDIS_SSL: ${HASHI_RESTAURANT_MAP_REDIS_SSL:-false}
HASHI_RESTAURANT_MAP_REDIS_USERNAME: ${HASHI_RESTAURANT_MAP_REDIS_USERNAME:-}
HASHI_RESTAURANT_MAP_REDIS_PASSWORD: ${HASHI_RESTAURANT_MAP_REDIS_PASSWORD:-}
HASHI_RESTAURANT_MAP_REDIS_CONNECTTIMEOUT: ${HASHI_RESTAURANT_MAP_REDIS_CONNECTTIMEOUT:-2s}
HASHI_RESTAURANT_MAP_REDIS_TIMEOUT: ${HASHI_RESTAURANT_MAP_REDIS_TIMEOUT:-3s}

KAKAO_CLIENT_ID: ${KAKAO_CLIENT_ID}
KAKAO_CLIENT_SECRET: ${KAKAO_CLIENT_SECRET}
KAKAO_REDIRECT_URI: ${KAKAO_REDIRECT_URI}
Expand All @@ -50,6 +61,12 @@ services:
CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS}
CORS_ALLOWED_ORIGIN_PATTERNS: ${CORS_ALLOWED_ORIGIN_PATTERNS:-}

HASHI_MAP_GOOGLE_PLACES_ENABLED: ${HASHI_MAP_GOOGLE_PLACES_ENABLED:-false}
HASHI_MAP_GOOGLE_PLACES_API_KEY: ${HASHI_MAP_GOOGLE_PLACES_API_KEY:-}
HASHI_MAP_PLACES_SELECTION_ENABLED: ${HASHI_MAP_PLACES_SELECTION_ENABLED:-false}
HASHI_MAP_PLACES_SELECTION_SIGNING_KEY: ${HASHI_MAP_PLACES_SELECTION_SIGNING_KEY:-}
HASHI_MAP_PLACES_SELECTION_TOKEN_TTL: ${HASHI_MAP_PLACES_SELECTION_TOKEN_TTL:-10m}

# 운영은 API 문서를 노출하지 않는다 (springdoc.api-docs.enabled / springdoc.swagger-ui.enabled)
SPRINGDOC_API_DOCS_ENABLED: "false"
SPRINGDOC_SWAGGER_UI_ENABLED: "false"
Expand Down
16 changes: 15 additions & 1 deletion docs/adr/0002-restaurant-map-query-and-location.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

- 상태: #219에서 채택한 후속 구현 기준. 이 문서의 병합은 기능 구현·운영 활성화를 뜻하지 않는다.
- 결정일: 2026-09-26
- 갱신: 2026-10-06, #225에서 좌표 유지와 조회 세션 수명 정책 보완
- 관련 이슈: [#219](https://github.com/TEAM-HASHI/HASHI-SERVER/issues/219), [#216](https://github.com/TEAM-HASHI/HASHI-SERVER/issues/216)
- 외부 계약: [Map Contract v1](../map/map-contract-v1.md)
- 구현·인수 계획: [Implementation Plan](../map/implementation-plan.md)
Expand Down Expand Up @@ -65,15 +66,28 @@ M1에서는 새 공개 이벤트를 도입하지 않는다. 같은 모듈 안의

- MySQL: 식당·위치·관광 지역·변환 작업·저장 관계의 원본, BBOX·필터 후보 검색.
- Redis: 조회 조건, 후보 ID, 추천 순서, 별점·리뷰 수 기준값의 일시적인 조회 세션.
생성 후 절대 TTL 15분을 초기 설정으로 채택한다. 읽기·정렬 변경으로 연장하지 않는다.
조회 ID별 키 하나와 TTL부터 검증한다. 유휴 5분·최대 수명 30분을 초기값으로 두고,
정상적인 다음 페이지 조회·재정렬 때 `min(현재 시각 + 유휴 시간, 최초 생성 + 최대 수명)`으로 갱신한다.
유휴 시간은 사용 간격·만료 비율·메모리 측정으로 우선 5~10분 안에서 조정한다. 최적값으로 단정하지 않는다.
- 세션에 식당 사진·Google 좌표/원본 응답·개인 저장 여부를 복제하지 않는다.
- 현재 DB의 삭제·위치 수명·필터를 매 페이지 다시 확인한다. 신규 후보·최신 순위는 새 조회부터 반영한다.
작은 묶음으로 유효한 10개와 다음 1개를 확보하면 멈추며, 확인한 11번째는 다음 페이지에 남긴다.
- 유실·만료는 전용 410, Redis 접근 장애는 503으로 구분한다. 새 순서를 기존 cursor에 연결하지 않는다.
- 세션을 전부 저장할 수 없으면 명시적으로 실패한다. 일부 후보만 성공처럼 저장하지 않는다.

현재 Redis 설정이 있다는 사실은 지도 용량 확보의 증거가 아니다. 인증 토큰과 같은 인스턴스를
쓴다면 memory·eviction 영향을 확인하고 세션별/전체 admission 한도를 측정한다.
키 prefix는 메모리 격리 수단이 아니다. 이 결정은 성능 향상이 검증됐다는 뜻이 아니다.
여러 키로 후보를 나누거나 정렬별 자료구조를 중복 보관하는 최적화는 측정상 필요할 때 검토한다.
갱신 실패·동시 요청·만료 직후 요청의 규칙과 용량 인수 기준은 [구현 계획](../map/implementation-plan.md)에 둔다.

### 2.4 좌표와 갱신 작업 상태

같은 주소의 갱신은 현재 작업 상태만 바꾸고 기존 검증 좌표·출처·취득/만료 시각을 유지한다.
유효한 기존 좌표는 갱신 대기·재시도·실패 중에도 사용할 수 있다. 주소 변경 시에는 바로 제거하며,
새 결과가 검증을 통과했을 때만 교체한다. 만료 시각을 넘겨 사용하거나 실패만으로 수명을 연장하지 않는다.
정리 작업은 갱신 상태와 관계없이 보관 기한을 지키되 진행 중 작업을 취소하지 않아야 한다.
이 모델 전이는 #225에서 구현하며, 조회 SQL·worker·수명 정리의 연결은 후속 PR의 공개 전 조건이다.

## 3. 대안과 영향

Expand Down
Loading
Loading