sn: 지도 위치 정보가 없는 경우 404>>위치 정보가 없습니다.

This commit is contained in:
2026-10-13 15:22:16 +09:00
parent fed1383ced
commit 791bc20e8e
4 changed files with 47 additions and 11 deletions
@@ -226,7 +226,12 @@ export default function FloodDngrMapPopupPage() {
const response = await getFloodDngrMapJson(
`/sewerage-service/api/v1/fldng/floodDngrMap/group/extent?${params.toString()}`,
);
const payload = response as FloodDngrMapExtent;
const payload = response as FloodDngrMapExtent | null | undefined;
// 성공 응답의 null·생략된 data는 위치 부재이다. 좌표 접근과 지도 메시지를 중단한다.
if (payload == null) {
setErrorMessage("위치 정보가 없습니다");
return;
}
const extent = [
payload?.minX,
payload?.minY,
@@ -237,7 +242,7 @@ export default function FloodDngrMapPopupPage() {
extent.length !== 4 ||
extent.some((value) => !Number.isFinite(value))
) {
throw new Error("해당 도시침수지도 피처의 위치 정보가 없습니다.");
throw new Error("도시침수지도 위치 응답의 좌표가 올바르지 않습니다.");
}
window.opener?.postMessage(
{
@@ -253,11 +258,9 @@ export default function FloodDngrMapPopupPage() {
} catch (error) {
console.error("도시침수지도 위치 이동 중 오류:", error);
const message =
error instanceof Error && error.message.includes("404")
? "해당 도시침수지도 데이터에 위치 정보가 없어 이동할 수 없습니다."
: error instanceof Error
? error.message
: "도시침수지도 위치 이동 중 오류가 발생했습니다.";
error instanceof Error
? error.message
: "도시침수지도 위치 이동 중 오류가 발생했습니다.";
setErrorMessage(message);
} finally {
setIsLoading(false);
@@ -0,0 +1,28 @@
# FE 도시침수지도 빈 결과 안내 작업카드
- 작성일: 2026-10-13 / 상태: 구현 완료 / 실서버·브라우저 검증 대기
- 근거: 사용자 요청. extent 위치 정보가 없으면 `위치 정보가 없습니다`로 안내한다.
## 변경 계획
- 목록 200·items=[]·total=0: 총 0건과 빈 표를 표시하고 이전 행·오류·로딩 상태를 정리한다.
- 단건·그룹 extent 200 응답에 위치 데이터가 없으면 `위치 정보가 없습니다`를 표시하고 지도 이동·선택 강조를 수행하지 않는다.
- 공통 응답에서 data가 null이거나 생략된 경우를 좌표 접근 전에 처리한다. 404 문자열로 위치 부재를 판단하는 기존 분기는 제거한다.
- 위치 데이터가 있으면 기존 지도 이동을 유지한다. 실제 HTTP 오류·잘못된 좌표는 기존 오류 처리로 구분한다.
## 수정 대상
- `app/(map-layout)/map/components/flood-dngr-map/flood-dngr-map-popup-page.tsx`: 목록·그룹 extent·안내 처리.
- sn 내 단건·그룹 extent 호출부(침수예측 현황·지도 포함): 검색으로 사용처를 확정하고 동일한 빈 결과 처리 적용.
- `src/shared/api/sewerage-api.ts`, `http-transport.ts`: null·data 생략 응답의 전달 방식 확인. 전역 오류 치환은 하지 않는다.
## 검증·영향
- 두 extent의 위치 없음: 200, 지정 안내 문구, 지도 이동 없음, null 접근 오류 없음.
- 위치 있음: 기존 이동 정상. 실제 404·401·403·5xx·timeout: 오류 안내 유지.
- 목록은 데이터 있음 → 0건 → 데이터 있음 재검색 시 행·건수·로딩이 일치한다.
- BE 성공 JSON의 data 생략·null 처리를 연동 확인한다. 빈 본문·비정상 응답을 임의로 위치 없음으로 처리하지 않는다.
- 영향은 sn의 extent 사용 화면. UI·DB 변경 없음. 롤백은 실제 수정한 기능 파일 복원.
- 남은 확인: 전체 extent 호출부와 실제 응답 형태·브라우저 동작.
FE 구현 및 타입 검사·클릭 처리 모의 검증 완료. 로그인 브라우저 검증은 미수행이다.
@@ -7,7 +7,7 @@ import Overlay from "ol/Overlay.js";
import GisApp from "@common/business_components/ui/map/lib/gis.core";
import { getRawJson } from "@/shared/api/sewerage-api";
import { getData } from "@/shared/api/sewerage-api";
import { WINDOW_POPUP_MESSAGE_TYPE } from "@/features/window-popup/model/types";
import { getFloodRiskGradeClassName } from "./flood-risk-grade";
@@ -251,11 +251,11 @@ export const useFloodPredictionMap = ({
removeFloodPredictionOverlay();
try {
const response = await getRawJson(
// 공통 응답의 data만 읽어 null·생략된 값을 빈 오버레이 결과로 처리한다.
const payload = await getData(
`/sewerage-service/api/v1/fldng/predc/prst/gridMap?sggCd=${encodeURIComponent(sggCd)}&analysisDateTime=${encodeURIComponent(analysisDateTime)}`,
);
if (!navigation?.isCurrent()) return;
const payload = response?.data ?? response;
const row =
payload && typeof payload === "object" && !Array.isArray(payload)
? (payload as FloodPredictionOverlayRow)
@@ -367,6 +367,11 @@ export default function FldngPredcPrstPopupContent() {
const extentData = await getData(
`/sewerage-service/api/v1/fldng/floodDngrMap/group/extent?${params.toString()}`,
);
// null·생략된 data는 정상적인 위치 부재이며 부모 지도 이동·강조를 요청하지 않는다.
if (extentData == null) {
alert("위치 정보가 없습니다");
return;
}
const extent = [
extentData?.minX,
extentData?.minY,
@@ -374,7 +379,7 @@ export default function FldngPredcPrstPopupContent() {
extentData?.maxY,
].map(Number);
if (extent.some((value) => !Number.isFinite(value))) {
throw new Error("도시침수지도 위치 정보가 없습니다.");
throw new Error("도시침수지도 위치 응답의 좌표가 올바르지 않습니다.");
}
window.opener.postMessage(
{