Files
frontend/apps/sn/docs/작업내용/SFR-010-004~SFR-010-007-조사사업/001-fe-SFR-010-004~007-조사사업-통합구현기록.md
T

105 KiB
Raw Blame History

SFR-010-004~SFR-010-007 조사사업 통합 구현 기록

1. 문서 목적

  • 조사사업 프론트엔드 선행 구현을 단계별로 한 문서에 누적한다.
  • 프론트 전체 완료와 백엔드 통합 완료를 구분해 기록한다.

2. 공통 계약

  • 구현 순서: FE-0 → FE-1 → FE-2 → FE-3 → FE-4 → BE-0 → BE-1 → BE-2 → BE-3 → BE-4
  • 처리분구관리 식별자/라우트: TRTDST_MGMT / /oper/trtdst
  • 처리분구는 사업등록 화면에서 생성하지 않고 이 화면의 활성 후보를 선택한다.
  • 런타임 목업과 하드코딩 성공 응답은 사용하지 않는다.

3. 구현 라운드 요약

날짜 단계 결과
2026-07-22 FE-0 처리분구 조회·추가·명칭수정·삭제대기·일괄저장 UI와 타입/API 계약 구현
2026-07-22 FE-0 후속 메뉴 진입 시 발생한 Next 서버/클라이언트 import 경계 오류 수정
2026-07-22 FE-0 화면 마무리 공통 UiTable 정렬과 검색조건·버튼 배치/색상 보완
2026-07-22 FE-0 완료 2차 UI 보정 후 사용자 화면 검증 통과, FE-1 시작 대기
2026-07-22 FE-1 사업 목록·등록, 파일 검토/확정, PPL 집계·시설·단위상세 구현
2026-07-22 화면 2단계 완료 조사사업 목록과 사업등록·조사결과 업로드 WindowPopup 사용자 확인 완료
2026-07-23 FE-1 조사현황 보정 목록·상세 가로 기준 통일, 사업 행 전체 선택, 목록·상세 내부 스크롤 통일
2026-07-23 화면 3단계 완료 같은 화면의 관로·맨홀 종합집계, 합계, 내부 스크롤, 요청 순서 보호 사용자 확인 완료
2026-07-23 팝업 회귀 복구 Tailwind src 스캔 복구와 핵심 열·폭 인라인 고정 후 완료 디자인 재확인
2026-07-24 상세보기 화면 완료 관로·맨홀 WindowPopup 다단표, 조회·정렬, 고정열, 소계·합계 사용자 확인 완료
2026-07-27~29 실 API 통합 처리분구·사업·파일검토/저장·집계·전체/본단위/결함별 상세 API 연결
2026-07-30 다운로드·샘플 제거 다중 시트 XLSX 다운로드 연결 및 샘플 전환·데이터·분기 제거

3.1 현재 구현 경계

  • 처리분구관리, 조사사업 관리, 결과등록과 관로·맨홀 조사 상세현황을 실제 API로 연결했다.
  • 관로·맨홀 처리분구별 종합집계, 전체 상세, 관로 본단위구간과 구조·운영 결함별 상세를 실제 DB·JSONB 결과로 표시한다.
  • 조사 상세현황 다운로드는 종합집계 1개와 처리분구별 전체 상세 N개 시트를 서버 XLSX로 제공한다.
  • 샘플 전환 버튼과 sample=Y 분기·데이터 파일은 제거했으며 모든 조사관리 화면은 실제 API만 사용한다.
  • 지도보기는 보류 상태이며 현재 남은 프론트 기능 범위다.

4. FE-0 처리분구관리

4.1 화면

  • 기존 업무형 레이아웃 안에 /oper/trtdst 라우트를 추가했다.
  • 공통 시도·시군구 코드와 SelectBox를 사용해 조회조건을 구성했다.
  • 화면 최초 진입 시 조건 없는 활성 처리분구 목록을 자동 조회하며, 개발 모드의 Effect 재실행에도 최초 요청은 한 번만 수행한다.
  • 선택박스의 임시 행정구역과 마지막으로 실행한 조회조건을 분리해, 저장 후에는 마지막 조회조건으로 최신 목록을 다시 읽는다.
  • UiTable에 NO, 시도, 시군구, 처리분구명만 표시하고 변경상태는 저장 요청 생성에 필요한 내부 상태로만 유지한다.
  • 추가는 시도·시군구 선택 후 빈 신규 행을 즉시 만들고 처리분구명 셀에서 직접 입력한다.
  • 수정은 기존 행을 선택하고 수정을 누르면 해당 처리분구명 셀을 입력 상태로 전환하며 별도 UiModal을 사용하지 않는다.
  • 추가·수정·삭제대기 행은 행 배경색으로 구분하며 삭제대기는 취소할 수 있다.
  • API 오류와 성공 결과를 화면 안의 메시지 영역에 유지한다.

4.2 상태와 검증

  • 행 상태는 clean | added | modified | deletePending이다.
  • 추가는 시도·시군구 선택을 필수로 하며 현재 행정구역 이름을 자동 입력한 신규 행을 즉시 선택한다.
  • 빈 처리분구명과 동일 행정구역 내 공백/대소문자 정규화 중복을 차단한다.
  • 미저장 변경이 있는 상태에서 재조회하면 폐기 여부를 확인한다.
  • 신규 행 삭제는 로컬 제거, 기존 행 삭제는 참조 확인 후 삭제대기로 처리한다.
  • 일괄 저장 성공 즉시 추가·수정 행을 정상 상태로 전환하고 삭제대기 행을 화면에서 제거한 뒤 서버 재조회 결과로 동기화한다.
  • 저장 후 서버 재조회가 실패하거나 비정상적으로 빈 목록을 반환해도 반영된 로컬 목록을 유지하며, 실제 활성 행이 모두 삭제된 경우에만 빈 목록을 표시한다.

4.3 API

  • getTrtdstSettings: 활성 처리분구 조회, 배열과 Spring content 응답을 모두 수용한다.
  • getTrtdstReferences: 조사사업·시설 참조 건수를 조회한다.
  • saveTrtdstSettings: 변경 행만 items[]로 일괄 저장한다.
  • 공통 API 유틸에 인증·사이트 헤더와 공통 오류 추출을 재사용하는 putData를 추가했다.

4.4 저장 요청 구조

{
  "items": [
    {
      "changeType": "CREATE",
      "ctpvNm": "경기도",
      "sggNm": "수원시",
      "trtdstNm": "처리분구 A",
      "useYn": "Y"
    }
  ]
}

4.5 메뉴 진입 import 경계 보완

  • 최초 라우트는 @/features/exmn 배럴을 import했고, 이 배럴이 UI뿐 아니라 Hook을 사용하는 기존 app/components/lib/api/index.ts까지 서버 컴포넌트 import 그래프에 포함했다.
  • Next가 useEffect, useState를 서버 컴포넌트에서 import한 것으로 판단해 /oper/trtdst 메뉴 진입 시 빌드 오류가 발생했다.
  • 라우트가 @/features/exmn/ui/TrtdstManagementPage 클라이언트 컴포넌트를 직접 import하도록 변경해 서버/클라이언트 경계를 명시했다.
  • 기존 API 유틸과 feature 배럴의 공개 계약은 변경하지 않았다.

4.6 사용자 화면 확인 후 UI 마무리

  • NO, 시도, 시군구, 처리분구명 헤더에 공통 UiTable의 sort·onSortChange 계약을 적용했다.
  • 공통 UiTable에는 기존 출력 동작에 영향을 주지 않는 선택적 renderCell 계약을 추가하고, 처리분구관리 신규 행과 수정 버튼으로 활성화한 기존 행의 처리분구명 셀에 인라인 입력을 적용했다.
  • 기존 행의 입력값이 원래 이름과 달라지면 modified, 다시 같아지면 clean으로 즉시 환원해 변경 행만 일괄 저장한다.
  • 백엔드 정렬 파라미터가 확정되지 않은 FE-0 단계이므로 현재 조회된 활성 처리분구 전체 목록을 한글·숫자 자연순으로 클라이언트 정렬한다.
  • 정렬 뒤에도 선택 행의 localKey를 기준으로 선택 인덱스를 다시 계산해 수정·삭제 대상이 바뀌지 않게 했다.
  • 최초 보완의 col-span-12, gap-10은 신규 src/features 경로의 클래스가 생성 CSS에 포함되지 않아 사용자 화면에서 적용되지 않았다.
  • 필터 묶음에 gridColumn: 1 / -1, columnGap: 2rem을 직접 지정하고 시도·시군구 래퍼 폭을 각각 16rem, 17rem으로 고정해 Tailwind 스캔 여부와 무관하게 간격을 확보했다.
  • 조회 버튼은 사용자 캡처에서 저장 버튼보다 약 0.6rem 왼쪽인 것을 기준으로 translateX(0.6rem)을 적용해 같은 우측 기준선으로 이동했다.
  • 조회·수정·추가·삭제·저장 버튼의 배경/흰색 글자 규칙은 하나의 상수로 통일했다.
  • 사용자가 최종 화면에서 시도·시군구 간격, 조회·저장 기준선과 처리분구관리 화면 구현 완료를 확인했다.

5. 기능별 현재 상태

  • FE-0: 화면 구현·사용자 UI 검증 완료, 실 API 연동은 백엔드 구현 후 검증
  • FE-1: 목록과 사업등록·결과등록 WindowPopup 구현·개발 서버 컴파일·사용자 UI 확인 완료, PPL 집계·상세 확인 및 단계 커밋 대기
  • FE-2~FE-4: 미착수
  • 백엔드: 사용자 지시대로 프론트 전체 완료 전 미착수

6. BE 공유 사항

  • 조회 성공 데이터는 활성 처리분구 배열 또는 Spring content 형태를 FE가 수용한다.
  • 참조 응답 필드는 businessCount, facilityCount, 선택적 totalCount다.
  • 일괄 저장은 전 항목 단일 트랜잭션이어야 하며 참조 중 삭제는 409로 거부해야 한다.
  • 저장 성공 응답은 createdCount, updatedCount, deletedCount를 제공한다.

7. 남은 리스크

  • 실제 백엔드가 없어 성공·409·권한 오류의 네트워크 연동을 확인하지 못했다.
  • 메뉴 원천·권한 및 import 경계 문제는 사용자 화면 진입 확인으로 해결됐다.
  • 프로덕션 빌드와 실 API 동작은 아직 확인하지 않았으며 백엔드 구현·통합 단계에서 검증해야 한다.
  • 저장 후 활성 후보가 사업등록 화면에 즉시 반영되는지는 FE-1과 백엔드 구현 후 확인한다.

8. 흡수한 기존 문서

  • 없음

9. FE-1 사업정보·조사결과 등록

9.1 사업 목록과 등록

  • 사업차수, 사업년도, 시도, 시군구, 사업명은 입력 상태와 적용 조회조건을 분리했다.
  • 사업년도는 YearRangeSelectBox 모듈의 단일 연도 옵션을 사용하는 SelectBox로 바꿨다.
  • 시도·시군구는 I/I 분석과 같은 CtpvSggPrcsFcltSelectBox를 사용하며 양평 고정값과 하수처리시설 선택 props를 두지 않았다.
  • 검색조건과 조회·사업등록·결과등록을 한 상단 카드에 배치하고 사업명 입력은 w-52로 제한했다.
  • 상단의 임의 PPL 집계·상세 버튼은 제거했다. PPL 집계·상세 구현은 조사현황의 건수 클릭 등 정식 진입점에 연결할 수 있도록 모듈로 유지한다.
  • 목록 열은 NO, 사업차수, 사업년도, 시도, 시군구, 사업명, 처리구역·분구(개소), 정밀조사 연장(km), 보고서 순서다.
  • 목록은 0-base page, 20건, 허용 정렬 문자열을 GET /api/v1/exmnBusinesses에 전달한다.
  • 사업등록은 사업연도·사업명·차수·행정구역·정밀조사연장·총사업비와 활성 처리분구 ID 배열을 저장한다.
  • 사업 저장 후에만 처리분구별 PPL/MNHL 시트 생성과 통합 입력양식 다운로드를 활성화한다.

9.2 파일 검토와 최종 저장

  • 파일 선택 시 첨부서비스로 즉시 전송하지 않고 파일 구분별 확장자, 빈 파일, 200MB 상한을 먼저 검사한다.
  • PPL 또는 MNHL 파일 1개 이상을 imports/validate에 보내고 오류 위치를 그리드로 표시한다.
  • 정상 검토 전에는 최종 저장을 비활성화한다.
  • 최종 저장은 선택 파일 Tus 업로드, 첨부키 PUT, 동일 PPL/MNHL 파일·검토 SHA-256·첨부키 multipart commit 순서다.
  • 기존 파일 업로드 유틸에 handleError 콜백을 추가해 실패가 최종 저장 대기 상태로 남지 않고 화면 오류로 귀결되게 했다.

9.3 PPL 집계와 상세

  • 처리분구별 대상연장, 주행거리, PPL 전체/구조/운영/기타 수를 서버 페이징·정렬 그리드로 표시한다.
  • 결함 건수 클릭은 처리분구와 결함유형을 반영해 jobType=PPL 시설 목록을 조회한다.
  • 시설 목록은 처리분구, 보고서번호, GIS 관로관리번호, 상·하류 맨홀, 관종/규격, 연장, 구조·운영등급을 표시한다.
  • 시설 행을 선택하면 서버 정규화 unitSections와 선택 단위의 상태·결함 기록을 표시한다.
  • 미확정 보고서 매핑은 비활성 버튼과 안내로 유지한다.

9.4 UI 기반 보완

  • sn Tailwind 설정에 빠져 있던 ./src/**/*를 content에 추가해 src/features 신규 클래스가 생성되게 했다.
  • 기존 SearchDiv, ListDiv, UiTable, Button/Input과 공통 windowPopup 등록 패턴을 재사용했다.
  • 라우트는 FE-0에서 확인한 Next 경계 문제를 반복하지 않도록 client UI를 직접 import한다.
  • 사용자 화면 확인에서 분리돼 보이던 상단 액션과 검색조건을 같은 SearchDiv 자식 flex 영역으로 합쳤다.

9.5 영향과 롤백

  • 신규 /oper/exmn/register와 features/exmn FE-1 파일을 제거하면 화면/API 계약을 롤백할 수 있다.
  • Tus 실패 콜백과 Tailwind src 스캔은 sn 앱 전체에 적용되지만 기존 호출 계약을 깨지 않는다.
  • 백엔드, DB, 타 앱, 공통 비즈니스 컴포넌트는 변경하지 않았다.

9.6 사업등록·결과등록 WindowPopup 전환과 샘플 검증

  • 상단 사업등록, 결과등록은 인라인 UiModal 대신 openWindowPopup()을 사용한다.
  • 공통 popup key는 exmnBusinessRegister, exmnResultRegister이며 /popup/[popupKey] registry에서 각각 업무 화면을 렌더링한다.
  • 사업등록 팝업은 자체 브라우저 컨텍스트에서 시도·시군구 store를 다시 로드하고, 활성 처리분구를 localeCompare(..., "ko") 기준 가나다순으로 정렬해 체크박스 다중 선택으로 제공한다.
  • 사업 저장 완료와 결과 저장 완료는 window.opener.postMessage로 부모 목록에 전달한다. 팝업 차단 시 부모 화면에 허용 안내를 표시한다.
  • 결과등록 팝업은 조사 결과, CCTV 조사 결과(관로), CCTV 조사 결과(맨홀), 사업보고서, 조사 위치도 5개 행을 표시하며 각 행의 파일명·찾기와 조사 원본의 데이터 검토 진입을 제공한다.
  • 파일 선택 규칙은 조사 결과를 .xlsx, .xlsm으로 제한하고 CCTV 조사 결과(관로)·CCTV 조사 결과(맨홀)는 각각 .pdf만 허용한다.
  • 상단의 중복 성공 알림과 검토 해시는 노출하지 않는다. 데이터 검토를 수행한 뒤에는 하단 데이터 검토 내역에서 파일별 검토 상태와 실제 확인 항목만 간단히 안내한다.
  • 파일별 검토 상태는 선택 파일 영역에서 완료 시 연한 초록색과 검토 완료, 실패 시 연한 빨간색과 검토 실패로 표시하며 파일을 다시 선택하면 해당 상태를 초기화한다.
  • 결과등록 WindowPopup의 기본 크기는 파일 5개 행이 여유 있게 보이도록 1000×500으로 설정한다.
  • 정상 검토 전 저장 버튼은 비활성이고 실제 모드의 Tus 첨부→첨부키 연결→commit 계약은 유지한다.
  • 백엔드 데이터가 없는 사용자 화면 검증을 위해 /oper/exmn/register?sample=Y만 샘플 모드로 사용한다. 일반 URL의 API 빈 결과를 자동 샘플로 대체하지 않는다.
  • 샘플 모드는 사업목록, 가나다순 처리분구, 정상 검토 요약을 제공하되 실제 API 저장·첨부·다운로드는 수행하지 않는다.

9.7 사업등록 팝업 사용자 확인 보정

  • 사업등록 popup definition을 1180×820에서 920×620으로 축소하고 불필요한 하단 여백을 줄였다.
  • 상단 닫기, 양식 생성을 제거했다. 양식 받기는 사업 저장 후 양식 생성과 다운로드를 한 번에 수행한다.
  • 양식 받기, 조사보고서 양식은 기존 엑셀 다운로드 버튼의 전역 green 스타일과 흰색 글자를 사용한다.
  • 당시 화면 입력은 5개만 노출하고 사업차수와 총사업비를 신규 기본값 1, 0으로 전달했다. 사업차수 입력과 최종 배치는 14절의 2026-07-27 보완안으로 대체한다.
  • Radix Select의 서버·클라이언트 ID 불일치를 막기 위해 사업등록·결과등록 WindowPopup content를 client mount 이후 렌더링한다.
  • 개발 환경의 목록 헤더에 샘플 데이터 보기를 제공한다. 이 버튼은 URL에 sample=Y를 명시해 기존 격리 원칙을 유지하며, 사업목록과 처리분구 샘플을 함께 활성화한다.
  • 사용자 재확인에 따라 팝업의 샘플 화면 배지를 제거하고 처리분구 목록을 고정 높이 21rem으로 확장했다. 3열 7행으로 21개까지 한 번에 표시하고 초과 후보는 목록 내부 세로 스크롤로 확인한다.
  • 정밀조사연장은 브라우저 증감 스피너가 없는 text+inputMode=decimal 입력으로 유지한다. 일반 등록 초기값은 빈 값이며 입력 중 문자를 강제 차단하지 않고 저장 시 숫자·0 이상 여부를 검증한다. 최대 10자로 첫 줄 안에서 표시한다.
  • 결과등록 popup은 초기 980×340에서 파일별 검토 내역을 함께 표시할 수 있는 1000×500으로 최종 확장했으며 샘플 배지와 닫기 버튼은 표시하지 않는다.
  • 결과등록 상단은 사업차수 → 사업년도 → 행정구역 → 사업명 순서로 한 줄 표시한다. 짧은 항목은 좁고 사업명은 넓은 0.7fr/0.8fr/1.2fr/2.3fr 비율과 gap-8 간격을 사용한다.
  • 파일 5종 업로드 영역은 강한 셀 격자 대신 기존 화면처럼 연한 외곽선·헤더 배경·가로 행 구분선만 사용하는 4열 폼 목록으로 구성한다.
  • popup root는 h-dvh·overflow-hidden으로 브라우저 가로·세로 스크롤을 차단하고, 검토결과가 추가돼 실제 높이가 넘을 때만 본문 내부를 세로 스크롤한다.
  • 상위 popup layout의 html/body에서 남는 문서 스크롤을 제거하기 위해 결과 팝업 mount 동안 두 요소의 overflow를 잠그고 종료 시 원래 값을 복원한다.
  • 파일 헤더는 py-2.5, 각 업로드 행은 py-3으로 늘려 남는 세로 공간을 활용한다.
  • 파일 헤더와 데이터 행에 동일한 gap-3을 적용해 찾기·데이터 검토 열의 중심선을 일치시켰다.
  • 파일 선택 완료 시 파일명 영역을 파란색 굵은 글씨·연한 파란 배경·파란 테두리로 바꿔 미선택 안내와 구분한다.
  • 사용자가 사업등록과 조사결과 업로드 WindowPopup의 최종 크기·배치·스크롤·파일 선택 표시를 확인해 두 팝업 UI를 완료 판정했다.

9.8 조사현황·처리분구 집계 1차 골격

  • 원본 화면설계서 슬라이드 3·4를 렌더링해 사업 목록의 행 선택 후 같은 화면 하단에 조사 상세현황이 표시되는 구조를 확인했다.
  • 첫 구현에서 조사 상세현황을 별도 ExmnStatusPage의 목록에 배치했으나, 사용자 확인으로 PPT 3·4는 같은 화면의 선택 전·후 상태임을 재확인했다.
  • ExmnStatusDetailPanel을 분리해 현재 사용 중인 ExmnRegistrationPage 사업목록 바로 아래에 결합했다. /oper/exmn/status도 별도 화면을 만들지 않고 동일 통합 화면을 렌더링한다.
  • 행 선택 시 기본 조사유형을 PPL로 초기화하고 관로조사, 맨홀조사 탭에서 처리분구별 집계와 합계 행을 표시한다.
  • 관로 집계는 대상연장·주행거리·전체 이상·구조·운영·기타를 표시하고, 맨홀 집계는 전체 이상·구조·운영·기타를 표시한다.
  • 사용자 화면 명칭은 CCTV조사에서 관로조사로 정정하되 API·DB 조사작업 구분은 PPL|MNHL을 유지한다.
  • 선택 사업의 집계 API 진입은 /api/v1/exmnBusinesses/{exmnBizId}/sections?jobType=PPL|MNHL 계약으로 추가했다.
  • 백엔드 데이터가 없는 화면 확인은 기존 /oper/exmn/register?sample=Y 흐름에서 샘플 사업·처리분구 집계를 사용하며 일반 URL은 실제 API 계약을 유지한다.
  • 이 1차 라운드에서는 상세보기, 다운로드, 지도보기를 버튼과 미연결 안내로 제공했다. 상세보기는 이후 11절에서 구현을 완료했고 다운로드·지도보기는 후속·보류 상태다.
  • 선택 사업의 사업명·차수·연도·행정구역을 반복 표시하던 요약 띠는 사용자 요청으로 제거했다.
  • 관로조사·맨홀조사는 별도 버튼을 만들지 않고 기존 공통 UITab을 재사용한다. 사용자 후속 확인에 따라 underline 대신 분석도구의 활성 메뉴와 가까운 기본 파란 활성 탭을 컴팩트한 크기로 적용했다.
  • 합계는 일반 데이터 행에 빈 NO 셀을 두지 않고 NO+처리분구 두 열을 병합한 전용 연한 배경 행으로 표시한다.
  • 기본 Table에 외부 스크롤과 sticky thead를 결합했던 1차 보정은 이중 스크롤 컨테이너 때문에 스크롤 중 행 일부가 헤더 위로 잘려 보이는 문제가 확인됐다.
  • 종합집계표를 기존 화면에서 사용하는 공통 UiTable로 교체하고, UiTable 내부 표 래퍼 하나만 스크롤 컨테이너로 사용한다. 행 패딩과 내부 높이를 16.7rem으로 조정해 헤더·합계·처리분구 3행의 하단선까지 온전히 표시하고, 초과 행만 그리드 내부에서 스크롤한다.
  • 우측 페이지 스크롤은 집계표 높이가 아니라 공통 BaseLayout이 실제 6rem 헤더를 50px로 차감하던 최소 높이 불일치가 원인이었다. 1차 전용 선택자는 실제 DOM의 SidebarProvider 중간 래퍼를 누락해 적용되지 않았으며, SSR HTML을 기준으로 .sn-exmn-base-layout > div > .flex-1 > .flex > .flex-1로 정정해 /oper/exmn/** 경로에만 min-height: calc(100vh - 6rem)을 적용했다.
  • UiTable이 본문 colSpan을 지원하지 않는 제약 안에서 합계 첫 두 셀의 경계선을 제거하고 첫 셀의 표시 영역을 NO+처리분구 너비만큼 확장해 합계 문구를 두 열 중앙에 배치했다.
  • 상세현황 표시 시 카드가 일반 문서 흐름에서 Footer를 밀어 페이지 전체 스크롤을 만들던 구조를 보정했다. 조사사업 경로의 본문 높이를 100dvh - 6rem으로 고정하고, PageLayout·조사사업 페이지·상세 패널을 min-height: 0인 flex 구조로 연결해 남은 공간을 상세 패널에 배분한다. 상세 데이터 초과분은 종합집계 UiTable 내부에서만 스크롤한다.
  • 조사사업 선택에 공통 UiTable의 신규 rowClick 계약을 적용했으나 사용자 재확인에서 정밀조사 연장·보고서 외 셀의 클릭이 동작하지 않았다. 신규 공통 계약은 철회하고 기존에 사용 중인 cellClick을 전체 열에 적용하는 방식으로 교체했다.

9.9 조사사업 목록·상세현황 그리드 동작 통일

  • 단순히 1.2rem 값을 각각 지정하던 구조는 목록의 UiTable margin과 상세의 부모 padding이 달라 실제 표 경계가 일치하지 않았다. UiTable.noOuterMargin 옵션을 추가하고 두 표 모두 mx-[1.2rem]인 동일한 외부 스크롤 래퍼만 가로 여백을 소유하게 했다.
  • 두 스크롤 래퍼에 scrollbar-gutter: stable을 적용해 상세 표에 세로 스크롤바가 생겨도 목록과 상세의 표 가로 기준이 달라지지 않게 했다.
  • 행 선택은 검증되지 않은 rowClick 확장을 제거하고 기존 cellClick 계약을 사용한다. clickableHeadIds를 제한하지 않아 NO부터 보고서까지 모든 데이터 셀이 같은 사업 선택 함수를 호출한다.
  • 조사사업 목록의 화면 페이지네이션을 제거하고 최초 페이지의 최대 1,000건을 조회한다. 목록은 최대 높이 16.7rem 이후 내부 스크롤하고, 상세 집계는 고정 최대 높이를 제거해 페이지 전체 스크롤이 생기지 않는 범위의 남은 카드 높이를 모두 사용한 뒤 초과 데이터만 내부 스크롤한다.
  • 목록 제목의 전체 건수는 API totalElements를 그대로 표시하고, 표 내부 페이지 이동 UI만 숨긴다.
  • 현재 1,000건 상한은 프론트 선행 구현용이다. 실제 운영 데이터가 이를 넘을 가능성이 있으면 백엔드 통합 단계에서 무제한 조회 대신 무한 스크롤 또는 커서 기반 조회 계약을 확정한다.

9.10 클릭 영역·목록 높이·샘플 행 최종 보정

  • 목록 16.7rem은 공통 표의 헤더·3개 행·내부 padding 합계보다 작아 3건만 있어도 세로 스크롤과 마지막 행 하단 잘림이 발생했다. 목록 최대 높이를 18rem으로 조정해 3건은 스크롤 없이 하단선까지 표시하고 4건 이상부터 목록 내부 스크롤을 사용한다.
  • 셀별 cellClick 이후 공통 UiTable에 선택적 rowClick 계약을 추가했지만, 사용자 재확인에서 정밀조사 연장 우측 일부 영역만 선택되고 앞쪽 영역은 반응하지 않는 문제가 남았다. 해당 공통 확장도 검증 실패로 판정한다.
  • 관로조사·맨홀조사는 공통 UITab의 스타일 선택자에 의존하지 않고 보이는 크기와 실제 클릭 요소가 같은 80×32px native button 2개로 구성한다. role=tablist/tab, aria-selected를 유지한다.
  • 당시 화면 검증용 세 조사사업의 처리분구 수를 모두 10개로 맞췄다. 이후 목록 내부 스크롤 검증을 위해 9.13절에서 네 번째 사업 샘플을 추가했으며, 샘플 상세 집계는 합계 행 외에 관로·맨홀 각각 처리분구 10행을 제공한다.

9.11 조사사업 목록 클릭 영역 구조 교체

  • 공통 UiTable의 cellClick·rowClick을 반복 확장하는 방식을 철회하고, 조사사업 목록만 공통 Table 스타일을 사용하는 화면 전용 표로 교체했다. 상세 집계의 UiTable 사용은 유지한다.
  • 각 데이터 셀은 padding을 제거한 뒤 min-height: 4rem, width: 100%인 실제 <button>으로 채웠다. 따라서 텍스트 주변이 아니라 보이는 셀 면적 전체가 동일한 selectedBusinessId 선택 함수를 호출한다.
  • <tr>에도 동일한 선택 함수를 보조로 연결해 셀 경계 외의 행 영역을 선택할 수 있게 했다.
  • 정렬 헤더도 각 헤더 전체 폭의 <button>으로 구성하고 기존 오름차순·내림차순·기본 순환과 서버 재조회 계약을 유지한다.
  • 실패했던 공통 UiTable.rowClick 계약은 제거해 다른 화면에 불필요한 공통 영향을 남기지 않는다.

9.12 조사관리 상세현황 사용자 확인 완료

  • 사용자가 조사사업 목록의 전체 셀 선택, 관로조사·맨홀조사 전환, 상세 집계 10행과 목록·상세 배치를 최종 확인해 조사관리 상세현황 화면을 완료 판정했다.
  • 이번 완료 범위는 조사사업 행 선택 후 같은 화면 하단에 표시되는 관로·맨홀 종합집계까지다.
  • 당시 후속이었던 상세보기 화면은 11절에서 완료했다. 다운로드 연동과 지도보기, 실 API·백엔드·DB 연동은 별도 단계로 유지한다.

9.13 최종 소스 상태 동기화

  • 검색조건의 사업차수·사업연도·시도·시군구·사업명 간격을 조정하고 기존 연도·I/I 행정구역 선택 동작을 유지했다.
  • 조사사업 목록은 공통 Table primitive로 직접 구성한다. 각 데이터 셀 전체와 행 여백이 같은 사업 선택 함수를 호출하고 data-state=selected로 선택 행을 강조한다.
  • 헤더는 공통 디자인 정렬 표시를 사용하고 오름차순 → 내림차순 → 기본으로 순환한다. 서버에는 같은 sort 파라미터를 전달하며 서버 응답과 샘플 배열 모두 동일한 sortBusinessList 비교 함수를 거친다.
  • 샘플 사업 SAMPLE-BIZ-004를 추가했다. 목록 높이는 인라인 maxHeight: 16rem으로 제한해 3행을 온전히 표시하고 4번째부터 내부 세로 스크롤한다.
  • 목록과 상세는 각각 인라인 scrollbarGutter: "stable"로 스크롤바 공간을 예약하고 동일한 좌우 기준을 사용한다. sticky 헤더와 별도 하단 보정선으로 스크롤 중 경계선 잘림을 막는다.
  • 관로조사·맨홀조사는 각각 보이는 전체 80×32px가 실제 button이다. 탭 변경 시 jobType을 바꾸고 집계를 재조회한다.
  • 상세 조회는 증가하는 summaryRequestIdRef를 사용해 사업·탭을 빠르게 바꿨을 때 과거 응답·오류·loading 종료가 최신 상태를 덮어쓰지 못하게 한다.
  • 상세 합계 행은 실제 colSpan=2로 NO+처리분구를 병합하고 중앙 정렬한다. 합계 전 셀 배경은 #d2deef다.
  • 상세 헤더는 스크롤 상단에 고정한다. 상세 그리드도 인라인 maxHeight: 23.8rem을 적용해 다음 행 일부가 하단에 걸쳐 보이지 않고 초과 행만 내부 스크롤한다.
  • 과거 보정 과정에서 사용한 조사관리 전용 BaseLayout 래퍼·헤더 CSS는 제거했다. 공통 layout.tsx는 Git 원본의 BaseLayout → PageLayout 구조를 유지하며 Header·Footer 컴포넌트는 수정하지 않는다.
  • ExmnRegistrationPage는 자신의 시작 위치와 실제 Footer 높이를 측정해 본문 높이를 계산한다. Footer 변화는 ResizeObserver, 창 크기 변화는 resize로 반영하고 화면 이탈 시 이전 html/body overflow를 복원한다.
  • 공통 UiTable에는 선택 행 data-state와 noOuterMargin을 추가했지만, 현재 조사사업 목록과 상세현황은 실제 병합·셀 전체 클릭·sticky/스크롤 높이를 정밀 제어하기 위해 직접 구성한 테이블을 사용한다.

9.14 사업·결과 등록 팝업 디자인 회귀 복구

  • 조사사업 목록·상세의 스크롤바 공간을 맞추기 위해 전역 components.css에 추가했던 sn-exmn-grid-scroll을 제거했다.
  • 목록과 상세의 scrollbar-gutter: stable은 각 스크롤 컨테이너의 인라인 스타일로 옮겨 조사관리 그리드에만 적용한다.
  • 회귀의 직접 원인은 tailwind.config.ts에서 ./src/**/* 스캔 경로가 빠져 src/features의 grid-cols-[...], max-w-[480px] 등 임의값 클래스가 생성되지 않은 것이다.
  • ./src/**/*를 다시 추가하고, 결과등록의 사업요약·파일행 열은 인라인 gridTemplateColumns, 사업등록의 사업명 폭은 인라인 maxWidth로도 고정해 스캔 누락 시 레이아웃이 무너지지 않게 했다.
  • 사업등록 popup은 당시 확정 크기 920×620, 처리분구 영역 21rem으로 복구했다. 이후 사업차수 입력과 긴 행정구역명 표시를 위해 14절에서 가로 폭만 1000px로 보완했다. 결과등록은 980×340을 유지한다.
  • 따라서 조사사업 목록·상세의 폭 정렬은 유지하면서 WindowPopup의 기존 확정 디자인에는 전역 CSS 변경이 전파되지 않는다.

9.15 조사사업 목록 사업보고서 직접 다운로드

  • 정보검색 보고서 탭의 파란 밑줄 파일 링크와 기존 운영 화면의 첨부서비스 Blob 다운로드 패턴을 재사용했다.
  • 조사사업 목록에서 bizRptpAtchFileId가 있는 보고서 셀만 파란색·밑줄·hover 색상으로 표시한다.
  • 첨부 코드로 첨부서비스 메타데이터를 조회해 있음 대신 원본 파일명을 표시하고, 메타데이터 조회 실패 시에만 있음으로 대체한다.
  • 링크 클릭은 행 선택 이벤트의 전파를 중단하고 /attach-service/api/v1/download/{atflId}에서 원본 Blob을 받은 뒤 원본 파일명으로 내려받는다.
  • reportYn=Y여도 첨부파일 ID가 없으면 다운로드 링크로 표시하지 않는다.
  • sample=Y의 샘플 첨부 ID는 실제 파일로 위장하지 않고 다운로드 미지원 안내만 표시한다.
  • 신규 백엔드 API·DTO·DB 변경은 없으며 결과등록에서 저장한 bizRptpAtchFileId를 그대로 사용한다.

10. 2026-07-23 git status 기준 실제 수정 파일

10.1 추적 코드 변경 9개

  • app/(with-base-layout)/layout.tsx: 현재 diff는 파일 끝 줄바꿈 정규화뿐이며 공통 BaseLayout → PageLayout 원본 구조를 유지한다.
  • app/components/lib/utils/fileUploadUtil.tsx: Tus 업로드 실패를 화면 Promise reject로 전달하는 handleError 콜백을 추가했다.
  • src/app/styles/components.css: 조사사업 전용 sn-exmn-grid-scroll을 제거해 Git 기준 전역 스타일 내용으로 복구했다. git status에 줄바꿈/작업트리 표시는 남을 수 있으나 의미 있는 CSS diff는 없다.
  • src/features/exmn/index.ts: 사업 API·검증·타입·등록/현황 화면 공개 export를 추가했다.
  • src/features/windowPopup/model/popupDefinitions.ts: 사업등록은 현재 1000×620, 결과등록은 1000×500 popup 정의를 사용한다.
  • src/features/windowPopup/model/types.ts: 사업 생성·결과 확정 opener 메시지 타입을 추가했다.
  • src/features/windowPopup/registry.tsx: 조사사업 popup content 2종을 registry에 등록했다.
  • tailwind.config.ts: ./src/**/*를 content에 포함해 조사사업 popup의 grid·임의 폭 클래스 생성을 복구했다.
  • packages/common/business_components/src/ui/table/index.tsx: 외부 스크롤 래퍼가 여백을 소유할 수 있는 noOuterMargin과 선택 행 data-state 동기화를 추가했다. 조사사업 최종 표는 직접 구성하므로 이 옵션은 공통 호환 계약으로만 남는다.

10.2 신규 코드 15개

  • 라우트 2개: app/(with-base-layout)/oper/exmn/register/page.tsx, app/(with-base-layout)/oper/exmn/status/page.tsx.
  • API·검증·모델 4개: src/features/exmn/api/exmn-business-api.ts, lib/exmn-business-validation.ts, model/exmn-business-types.ts, model/exmn-sample-data.ts.
  • 조사사업 UI 7개: ExmnBusinessRegisterPopupPage.tsx, ExmnRegistrationPage.tsx, ExmnResultRegisterPopupPage.tsx, ExmnStatusDetailPanel.tsx, ExmnStatusPage.tsx, PplFacilityDetailModal.tsx, PplSummaryModal.tsx.
  • WindowPopup content 2개: ExmnBusinessRegisterPopupContent.tsx, ExmnResultRegisterPopupContent.tsx.

10.3 문서 변경 4개

  • FE 작업카드 1개, 통합 구현기록 1개, 통합 검증계획·결과 각 1개를 현재 코드와 사용자 확인 결과에 맞췄다.
  • tailwind.config.ts는 팝업 디자인 회귀 복구의 실제 변경 파일로 포함한다.

11. 2026-07-24 관로·맨홀 상세보기 WindowPopup

  • exmnSurveyDetail 팝업 키와 1500×720 definition을 추가하고 선택 사업 ID·조사유형을 필수 query로 전달한다.
  • ExmnSurveyDetailPopupContent가 query를 ExmnBusiness, PPL|MNHL, sample=Y 화면 속성으로 변환하고 ExmnSurveyDetailPopupPage를 렌더링한다.
  • exmn-detail-table.ts에 관로 24개, 맨홀 23개 이상항목 코드·명칭·구조/운영 구분을 화면 열 정의로 분리했다.
  • 맨홀 코드 중 표면손상-외부와 파손-외부는 참조 결함코드 및 JSONB 키와 동일하게 각각 Som, Bom으로 확정했다. 코드 비교는 대소문자를 구분한다.
  • 관로·맨홀 모두 보고서번호, 관로/맨홀번호, 상·하류맨홀, 배수방식, 관종, 규격, 연장, 주행거리를 공통 고정 정보 열로 사용한다.
  • 사용자 제공 엑셀 구조에 맞춰 이상항목마다 대·중·소 3열을 만들고 그룹·항목·심각도의 다단 병합 헤더를 직접 구성했다.
  • 보고서번호부터 주행거리까지는 오름차순 → 내림차순 → 기본으로 정렬한다. 보고서번호와 관로/맨홀번호는 가로 스크롤 고정 열이다.
  • 팝업 문서 overflow를 잠그고 표 영역에서만 가로·세로 스크롤한다.
  • 현재 조회 결과의 연장·주행거리 및 코드별 대·중·소를 합산해 소계·합계를 표시한다. 소계는 심각도별, 합계는 항목별 3열 병합 총합이다.
  • 소계·합계 라벨은 보고서번호부터 규격까지의 병합영역 중앙에서 시작하고, 규격이 스크롤로 사라진 뒤에도 고정열 오른쪽에 라벨과 경계선이 남도록 scrollLeft 기반 위치를 보정한다.
  • sample=Y에서 관로·맨홀 각 3행을 제공하며 일반 URL은 빈 화면과 실제 API 후속 안내를 유지한다.
  • 조사사업 목록 NO 정렬을 추가했다. NO는 서버 엔티티 필드가 아니므로 서버 sort에는 전달하지 않고 현재 기본 조회 결과를 정·역순으로 표시한다.
  • 조사 상세현황은 합계 행을 별도 렌더링해 고정하고 나머지 처리분구 행만 전 열 정렬한다.
  • 상세현황 액션을 상세보기 → 지도보기 → 다운로드로 배치하고 다운로드 버튼에 기존 초록색 스타일을 적용했다.
  • 백엔드 API·DTO·DB는 변경하지 않았다. 실 상세조회와 엑셀 다운로드 계약은 후속이다.

12. 2026-07-24 결함 분류별 상세보기와 등록 팝업 최종 보완

12.1 조사 상세현황 선택과 링크

  • ExmnStatusDetailPanel.tsx에서 처리분구 행 선택 상태를 상세보기 대상과 연결했다.
  • 구조적·운영적 결함 건수가 1개 이상인 셀은 파란색 밑줄 링크로 렌더링한다.
  • 링크 클릭 시 해당 행을 선택·강조하고 기존 exmnSurveyDetail WindowPopup을 연다.
  • 상단 상세보기는 defectType=ALL, 구조적 링크는 STRUCTURAL, 운영적 링크는 OPERATIONAL을 전달한다.
  • 건수가 0이면 일반 텍스트로 유지해 잘못된 빈 상세 팝업 진입을 막는다.

12.2 상세 팝업 필터

  • ExmnSurveyDetailPopupContent.tsx가 defectType을 파싱하고 누락되거나 잘못된 값은 ALL로 정규화한다.
  • ExmnSurveyDetailPopupPage.tsx는 선택 분류의 이상항목 열만 남기고 해당 열에 결함 건수가 있는 시설 행만 표시한다.
  • 관로·맨홀 모두 동일한 필터 규칙을 사용하며 팝업 제목과 집계표 제목에 선택 분류를 표시한다.
  • 구조적·운영적 내부결함 고정 열과 샘플 필드를 제거했다.
  • 표시된 이상항목 헤더는 명칭 (코드) 형식이며 소계·합계는 현재 표시 행과 열 기준으로 재계산한다.
  • 소계·합계 라벨 병합 범위는 보고서번호부터 규격까지, 실제 수치 합산 시작은 연장부터 유지한다.

12.3 사업등록·결과등록 WindowPopup

  • ExmnBusinessRegisterPopupPage.tsx와 ExmnResultRegisterPopupPage.tsx를 상세보기와 같은 파란 헤더·옅은 파란 본문 배경으로 통일했다.
  • 사업등록 처리분구 영역에 이름 검색, 검색결과 선택, 선택 초기화를 추가하고 선택 건수만 노출한다.
  • 조사결과 업로드의 사업차수·사업연도·행정구역·사업명은 입력 컴포넌트처럼 보이지 않는 읽기 전용 텍스트로 정리했다.
  • 팝업 크기와 본문 배치를 조정해 사업정보와 파일 업로드 표가 잘리지 않게 했다.

12.4 수정 파일과 연동 경계

  • src/features/exmn/model/{exmn-detail-table,exmn-sample-data}.ts
  • src/features/exmn/ui/{ExmnBusinessRegisterPopupPage,ExmnResultRegisterPopupPage,ExmnStatusDetailPanel,ExmnSurveyDetailPopupPage}.tsx
  • src/features/windowPopup/model/popupDefinitions.ts
  • src/features/windowPopup/ui/ExmnSurveyDetailPopupContent.tsx
  • 백엔드 코드·API·DTO·DB는 변경하지 않았다. 후속 API는 jobType, 처리분구 식별자, defectType과 JSONB 코드별 건수 계약을 사용해야 한다.

13. 2026-07-27 관로 본단위구간과 결함별 상세 팝업 구현

13.1 관로 전체 상세보기 모드

  • 관로조사 전체 상세보기에서 관로와 본단위구간을 전환하는 소형 슬라이드형 선택 UI를 추가했다.
  • 본단위구간은 관로번호, 단위구간, 단위길이, 결함위치, 결함 종류·코드·등급·발생위치·침입수가점·연속결함, 구조·운영 점수, 조사중단사유, 비고를 표시한다.
  • 관로번호와 단위구간 공통 정보는 rowSpan으로 병합해 엑셀 본단위등급표와 같은 읽기 흐름을 구성했다.
  • 관리번호가 비어 있으면 선택한 처리분구의 전체 관리번호를 표시하고, 입력 후 조회하면 부분 일치하는 관로번호만 표시한다.
  • 맨홀조사에는 관로 전용 모드 UI가 나타나지 않도록 분기했다.
  • 샘플 데이터는 3개 관로에 각 2개 단위구간, 총 33개 상세 레코드를 구성해 초기 전체 조회와 관리번호 검색을 확인할 수 있게 했다.

13.2 구조적·운영적 결함별 팝업 간소화

  • defectType=STRUCTURAL|OPERATIONAL로 진입하면 처리분구·관리번호, 모드, 조회 버튼과 상단 다운로드 영역을 숨기도록 변경했다.
  • 선택한 처리분구·조사 유형·결함 분류가 적용된 집계표를 팝업 진입 즉시 표시한다.
  • 집계표 제목 행 오른쪽으로 연장거리 합계, 주행거리 합계와 녹색 다운로드 버튼을 이동했다.
  • defectType=ALL은 기존 조회 조건과 관로 모드를 유지해 상단 상세보기 회귀를 방지했다.

13.3 엑셀 생성

  • 기존 공통 downloadExcelWithKoreanHeaders를 사용해 현재 화면의 정렬·필터 결과와 표시 열을 다운로드하도록 구현했다.
  • 관로·맨홀의 전체·구조·운영 표에는 현재 표시 열을 기준으로 소계·합계 행을 추가한다.
  • 본단위구간 표는 화면과 동일한 14개 열로 생성한다.
  • 소계·합계 고정 영역과 이상항목 대·중·소 묶음에 화면 구조에 맞는 셀 병합을 적용했다.
  • 열 수가 Z를 넘는 다단 표도 처리하도록 마지막 열 주소를 동적으로 계산한다.

13.4 수정 파일과 연동 경계

  • src/features/exmn/model/exmn-detail-table.ts
  • src/features/exmn/model/exmn-sample-data.ts
  • src/features/exmn/ui/ExmnSurveyDetailPopupPage.tsx
  • src/features/exmn/ui/ExmnPplUnitDetailTable.tsx
  • 백엔드 코드·API·DTO·DB와 공통 비즈니스 컴포넌트는 변경하지 않았다.
  • 후속 실제 연동에서는 기존 PPL_UNIT_V1, MNHL_COUNT_V1 JSONB 값을 현재 화면 모델과 코드 기준으로 매핑한다.

14. 2026-07-27 사업등록 사업차수 입력·행정구역 배치 보완

14.1 입력과 저장 계약

  • 기존 고정값 bizCycl: 1을 제거하고 사업차수 입력 상태를 추가했다.
  • 일반 등록은 1차, sample=Y는 대표 사업과 맞는 3차를 기본값으로 표시한다.
  • 사업차수는 숫자 최대 3자리만 입력할 수 있고 저장 시 1 이상의 정수인지 검증한다.
  • 저장 요청은 입력한 사업차수를 기존 ExmnBusinessSaveRequest.bizCycl에 전달한다.
  • 총사업비는 화면 입력 대상이 아니므로 기존처럼 tpco: 0을 전달한다.

14.2 최종 화면 배치

  • 첫 줄은 사업차수 → 사업년도 → 시도 → 시군구 → 정밀조사연장, 둘째 줄은 사업명 순서다.
  • 첫 줄의 항목 묶음은 왼쪽부터 20px 고정 간격으로 배치해 남는 폭이 항목 사이로 과도하게 분산되지 않게 했다.
  • 시도는 180px, 시군구는 144px로 표시해 강원특별자치도 같은 긴 명칭을 확인할 수 있게 했다.
  • 기존 행정구역 공통 컴포넌트에는 compact 옵션을 추가하되 기본값을 false로 두어 다른 화면의 크기와 간격은 변경하지 않는다.
  • 사업등록 WindowPopup 가로 폭은 한 줄 배치를 위해 920px에서 1000px로 넓혔고 높이는 620px를 유지한다.

14.3 변경 파일과 영향

  • app/components/ui/ctpvSggPrcsFcltSelectBox.tsx
  • src/features/exmn/lib/exmn-business-validation.ts
  • src/features/exmn/ui/ExmnBusinessRegisterPopupPage.tsx
  • src/features/windowPopup/model/popupDefinitions.ts
  • 백엔드 API 경로·필드명·DB 구조는 변경하지 않는다.

15. 2026-07-27 사업등록 통합 확인 보완

  • 사업등록 완료 메시지를 받은 부모 목록은 신규 사업 ID를 자동 선택하지 않고 선택 상태를 초기화한다.
  • 저장된 신규 사업은 목록 재조회 결과에 표시하되 조사 상세현황은 사용자가 행을 직접 선택하기 전까지 열지 않는다.
  • 정밀조사연장 일반 등록 초기값을 0에서 빈 값으로 변경하고 저장 시 필수·숫자·0 이상 검증을 수행한다.
  • 양식 받기는 저장된 사업 ID와 처리분구 ID 목록으로 양식 생성 API를 호출한 후 XLSX 다운로드 API를 이어서 호출한다.
  • TypeScript 검사는 기존 설치 모듈 접근 EPERM으로 실행 결과를 확보하지 못했으므로 사용자 개발 서버에서 입력·저장 후 목록 선택 상태를 최종 확인한다.

16. 2026-07-27 최초 목록 조회·기존 사업 수정·보고서 양식

16.1 최초 조회와 수정 진입

  • 조사관리 최초 진입 시 sample=Y가 아니면 빈 검색조건과 기존 목록 스크롤 크기로 조사사업 API를 한 번 자동 호출한다.
  • React 개발 모드의 effect 재실행에서도 중복 최초 조회가 발생하지 않도록 실행 여부를 별도로 관리한다.
  • 조회 버튼 옆에 수정 버튼을 추가했으며 사업 행을 선택하지 않으면 안내 메시지를 표시한다.
  • 선택 사업이 있으면 기존 exmnBusinessRegister WindowPopup에 사업 ID를 전달해 같은 화면을 수정 모드로 사용한다.

16.2 수정 팝업

  • 사업 상세 API로 기존 사업차수·연도·행정구역·사업명·정밀조사연장과 활성 처리분구를 복원한다.
  • 행정구역 공통코드와 처리분구 후보 조회가 늦게 끝나도 기존 선택 ID가 유지되도록 복원 순서를 보호한다.
  • React 개발 모드의 effect 재실행을 단순 1회 실행 플래그로 막지 않고 요청 순서 ID로 보호한다. 정리된 첫 요청은 무시하되 두 번째 정상 요청은 실행하고 로딩 상태를 반드시 해제한다.
  • 수정 저장은 기존 저장 요청 계약으로 PUT /api/v1/exmnBusinesses/{exmnBizId}를 호출한다.
  • 저장 완료 메시지를 받은 부모 화면은 현재 검색조건으로 목록을 다시 조회하고 선택 사업을 가능한 경우 유지한다.
  • 저장하지 않은 변경사항이 있으면 이전 처리분구 기준의 조사 입력양식을 받지 못하도록 저장 안내를 표시한다.
  • 저장 완료 후에는 수정된 처리분구 기준으로 양식 받기를 다시 실행할 수 있다.

16.3 조사보고서 양식

  • 기존 안내 메시지 대신 GET /api/v1/exmnBusinesses/templates/report/download를 호출한다.
  • 내려받은 원본 XLSX를 하수관로맨홀_현황조사_보고서_양식.xlsx 이름으로 저장한다.
  • 보고서 양식은 사업별 동적 생성 대상이 아니므로 신규 등록 전과 기존 사업 수정 중에도 받을 수 있다.

16.4 검증과 영향

  • 프론트 변경 파일 git diff --check는 통과했다.
  • TypeScript 검사는 기존 pnpm 모듈의 compiler 파일 접근 EPERM으로 실행 결과를 확보하지 못했다.
  • 공통 WindowPopup 크기·스타일과 조사 상세현황은 변경하지 않았다.
  • 실제 서버 재기동 후 최초 목록, 행 선택·수정값 복원, 수정 저장, 입력양식 재다운로드, 조사보고서 다운로드를 통합 확인해야 한다.

16.5 조사결과 미등록 상세현황

  • 조사 상세현황 /sections 요청의 404는 아직 상세 API가 없거나 선택 사업에 등록된 조사결과가 없는 정상 빈 상태로 정규화한다.
  • 빈 상태에서는 오류 배너를 표시하지 않고 관로·맨홀 종합집계표 본문에 조회된 결과가 없습니다.만 표시한다.
  • 500, 인증 오류, 통신 오류 등 404가 아닌 실패는 기존 오류 배너로 유지해 실제 장애가 숨겨지지 않게 한다.

17. 2026-07-28 조사사업 실제 API·양식 다운로드 연동 확인

17.1 목록·등록·수정

  • 조사관리 페이지 진입 시 별도 조회 버튼 조작 없이 조사사업 목록을 요청한다.
  • 선택한 사업을 수정 버튼으로 열면 서버 상세정보의 사업차수·연도·행정구역·사업명·정밀조사연장·처리분구 선택을 복원한다.
  • 등록·수정 완료 후 현재 검색 조건으로 목록을 다시 조회한다.
  • 신규 등록 직후 새 행을 자동 선택하지 않아 조사결과가 없는 상세현황이 임의로 열리지 않게 한다.
  • 정밀조사연장은 문자열 입력을 숫자로 정규화해 소수 입력과 저장이 가능하도록 보완했다.

17.2 양식 다운로드

  • 양식 받기는 현재 팝업의 선택 처리분구를 전달해 서버가 생성한 XLSX를 다운로드한다.
  • 사용자는 다운로드한 파일에서 처리분구별 관로·맨홀 시트, 본단위등급표 동적 관로번호, 첫 처리분구 예시 데이터, 이후 시트 검정 글꼴을 확인했다.
  • 조사보고서 양식은 공통 보고서 템플릿 다운로드 API를 호출한다.

17.3 빈 상세현황

  • 결과가 등록되지 않은 사업의 관로·맨홀 /sections 404는 정상 빈 결과로 처리한다.
  • 오류 배너의 No message available을 제거하고 집계표에 조회된 결과가 없습니다.만 표시한다.
  • 인증·통신·서버 500 오류는 기존 오류 처리 대상으로 유지한다.

17.4 영향 범위

  • 조사사업 목록, 사업등록/수정 WindowPopup, 조사 입력·보고서 양식 다운로드, 상세현황 빈 상태에 영향을 준다.
  • 조사 상세보기 표와 지도보기 보류 범위는 변경하지 않는다.

18. 2026-07-28 조사결과 Excel 검증 API 전달 보완

  • 결과등록 팝업의 첫 번째 조사 결과 파일을 multipart exmnFile로 전달한다.
  • 조사결과 검토의 필수 원본은 통합 XLSX/XLSM 한 파일로 정리했다.
  • 기존 PPL·MNHL 별도 필드 전달은 후속 PDF 검증 계약과의 호환을 위해 유지하되 이번 서버 파싱 원본으로 사용하지 않는다.
  • validate 응답의 fileHash는 commit 요청에 다시 전달해 검토 후 파일 변경을 차단한다.
  • 실제 로그인 환경에서 데이터 검토와 저장 버튼을 통한 DB 반영을 확인해야 한다.

19. 2026-07-28 결과등록 첨부서비스 연계

  • 관로·맨홀 결과 파일 유형 키를 실제 형식에 맞춰 PPL_EXMN_PDF, MNHL_EXMN_PDF로 변경했다.
  • 최종 저장 시 선택된 5종 파일을 기존 TUS 첨부서비스에 순서대로 업로드한다.
  • 첨부서비스 응답 헤더 X-File-Info에서 atflCd, atflId를 읽어 파일 유형별 첨부키 맵을 구성한다.
  • PUT /api/v1/exmnBusinesses/{exmnBizId}/attachments로 첨부키를 조사사업정보에 연결한 뒤 검토된 통합 Excel을 확정 저장한다.
  • 업로드 중인 파일명과 진행률을 팝업 하단에 표시한다.
  • 파일 바이너리는 첨부서비스가 관리하며 프론트는 조사사업 DB에 파일 자체를 직접 저장하지 않는다.
  • 관로·맨홀 PDF의 내부 번호 대조 검증은 이번 범위에 포함하지 않는다.
  • TypeScript 검사는 설치된 TypeScript와 tsconfig의 ignoreDeprecations 값 불일치로 본문 타입검사 전에 중단됐다.

20. 2026-07-29 관로 PDF 관로번호 검토 연계

  • 데이터 검토 요청에 클릭한 파일 구분을 validationType으로 전달한다.
  • 관로 PDF 검토 시 조사결과 Excel exmnFile과 관로 PDF pplFile을 함께 전송한다.
  • 서버가 반환한 관로번호 불일치 오류 메시지를 팝업 알림에 최대 5건까지 표시한다.
  • 관로 PDF 검토 성공은 조사결과 Excel 전체 검토 성공으로 간주하지 않고 두 상태를 독립적으로 표시한다.
  • 조사결과 Excel을 다시 선택하면 기존 관로 PDF 검토 상태를 폐기한다.
  • 최종 저장은 조사결과 Excel과 관로 PDF의 검토 상태가 모두 정상일 때만 활성화한다.
  • 맨홀 PDF 번호 대조는 협의 전이므로 이번 프론트 저장 조건에 추가하지 않았다.

21. 2026-07-29 관로 PDF 경량 검토 상태 분리

  • 관로 PDF 검토가 경량 관로번호 대조로 변경됨에 따라 성공 시 PPL_EXMN_PDF 상태만 정상으로 기록한다.
  • EXMN_EXCEL은 사용자가 조사결과 데이터 검토를 별도로 성공한 경우에만 정상 상태가 된다.
  • 어느 버튼을 먼저 검토하더라도 두 상태가 모두 정상이고 현재 Excel 해시가 일치해야 최종 저장할 수 있다.

22. 2026-07-29 결과등록 파일별 검토 내역 표시

  • 데이터 검토를 수행한 파일만 팝업 하단 데이터 검토 내역에 입력 순서대로 표시한다.
  • 조사결과 Excel은 처리분구별 관로·맨홀 시트와 필수값, 시설번호 중복, 관로번호와 본단위구간 연결, 결함코드·점수·등급 및 저장 가능 여부를 확인한 것으로 안내한다.
  • 관로 PDF는 관로번호 텍스트 추출과 조사결과 Excel 관로번호 포함 여부를 확인한 것으로 안내한다.
  • 맨홀 PDF는 현재 파일 형식과 조사결과 Excel 구조·저장 가능 여부까지만 안내하고, PDF 내부 맨홀번호 대조는 기준 협의 후 적용할 범위로 명시한다.
  • 성공 시 처리 건수와 검토 완료 배지를, 실패 시 첫 오류와 추가 오류 건수를 표시한다.
  • 조사결과 Excel을 다시 선택하면 이에 의존하는 관로·맨홀 PDF 검토 상태와 내역도 함께 초기화한다.
  • 최종 저장은 조사결과 Excel 검토 결과의 해시를 사용하며, 선택적으로 수행한 맨홀 PDF 검토 결과가 Excel 검토 결과를 덮어쓰지 않도록 파일별 상태를 분리했다.

23. 2026-07-29 조사사업 목록 사업보고서 원본 파일명 표시

  • 조사사업 목록 응답의 bizRptpAtchFileCd, bizRptpAtchFileId로 기존 첨부서비스 메타데이터를 조회한다.
  • 첨부서비스는 공통 응답 래퍼 없이 배열을 직접 반환할 수 있으므로 getRawJson()으로 원문을 읽고 직접 배열·data·content 형식을 모두 정규화한다.
  • 첨부 ID와 일치하는 orgnlFileNm을 목록의 보고서 링크 텍스트와 다운로드 파일명으로 사용한다.
  • 보고서가 없으면 없음, 첨부 메타데이터 조회만 실패하면 기존 첨부 여부를 보존하기 위해 있음으로 표시한다.
  • 첨부서비스 메타데이터 오류가 조사사업 목록 전체 조회를 실패시키지 않도록 행별 파일명 조회 실패를 격리했다.
  • 조사사업 API·DB 계약과 보고서 정렬 기준은 변경하지 않았다.

24. 2026-07-29 결과등록 통합 확인과 보고서 열 최종 보완

  • 사용자가 실제 조사결과 Excel과 관로·맨홀 PDF를 선택해 파일별 데이터 검토가 정상 완료되는 것을 확인했다.
  • 조사결과 Excel 검토와 관로 PDF 검토가 모두 정상일 때 저장 버튼이 활성화되고, 최종 저장 후 조사결과 최종 저장과 PPL/MNHL 집계를 완료했습니다. 응답을 확인했다.
  • 최종 저장은 선택 파일을 TUS 첨부서비스에 업로드하고 조사사업 첨부키를 연결한 뒤, 검토 해시가 일치하는 Excel을 commit하는 기존 순서를 유지한다.
  • 파일별 검토 내역은 조사결과 Excel의 시트·중복·본단위구간·결함/점수/등급 검토와 관로 PDF의 관로번호 포함 여부를 구분해 표시한다.
  • 맨홀 PDF 내부 번호 대조는 협의 전이므로 파일 형식과 Excel 저장 가능 범위까지만 안내한다.
  • 조사사업 목록의 보고서 링크는 저장된 원본 파일명을 표시하고 동일 이름으로 다운로드한다.
  • 보고서 파일명이 잘리지 않도록 목록 열 비율을 사업차수 6%, 처리구역·분구 8%, 정밀조사 연장 8%, 보고서 22%로 최종 조정했다.
  • 좁아진 두 숫자 열의 헤더는 좌우 여백과 글자 크기를 보정하고 줄바꿈을 금지해 한 줄로 표시한다.
  • 매우 긴 보고서명은 셀 오른쪽에서 말줄임하고 title로 전체 이름을 확인할 수 있다.

25. 2026-07-29 조사 상세현황 실제 집계 API 연결

  • 기존 화면이 호출하던 GET /api/v1/exmnBusinesses/{id}/sections?jobType=PPL|MNHL 백엔드 API가 구현됐다.
  • 관로조사는 처리분구별 대상연장·주행거리와 PPL 전체이상·구조·운영·기타 집계를 표시한다.
  • 맨홀조사는 처리분구별 MNHL 전체이상·구조·운영·기타 집계를 표시한다.
  • 결과 미등록 사업은 서버가 빈 배열을 반환하므로 오류 배너 없이 기존 빈 그리드 문구를 유지한다.
  • 사업·탭을 빠르게 전환했을 때 이전 응답을 무시하는 기존 요청 순서 보호는 그대로 사용한다.
  • 이번 단계에서는 프론트 소스 계약 변경이 없으며 상세보기·본단위구간·결함별 조회·다운로드는 연결하지 않았다.

26. 2026-07-29 조사 상세보기 전체 집계 API 연결

  • 처리분구 행 선택 후 여는 기존 상세보기 팝업의 관로 PIPE 모드와 맨홀 전체 표를 실제 /api/v1/exmnFacilities 응답에 연결했다.
  • 선택 사업 ID, 처리분구 ID, 조사유형과 조회 버튼으로 확정한 관리번호를 서버에 전달한다.
  • 서버의 시설 기본 컬럼과 defectCounts[code].L/M/S를 기존 다단표·소계·합계·정렬 화면 모델에 그대로 사용한다.
  • 요청 중 안내와 조회 실패 메시지를 구분하고, 빠른 조건 변경 시 이전 요청 응답을 화면에 반영하지 않는다.
  • 샘플 모드는 기존 데이터를 유지한다.
  • 본단위구간과 구조·운영 결함별 실데이터 연결은 후속 단계 안내를 유지한다.

27. 2026-07-29 맨홀 전체 상세표 표시 보정

  • 맨홀조사의 시설 식별자를 별도 맨홀번호가 아닌 관로번호로 통일했다.
  • 관로 전체표는 보고서번호부터 주행거리까지만 표시하고 구조적·운영적 등급은 본단위구간 화면에 유지한다.
  • 맨홀 전체표는 관로 공통 열 다음에 구조적 내부결함, 운영적 내부결함 등급 열을 추가하고 소계·합계에도 숫자 합산값을 표시한다.
  • 고정 열 뒤의 결함 코드 열만 PPL·MNHL 정의에 따라 다르게 표시한다.
  • 화면 다운로드도 관로는 주행거리까지, 맨홀은 구조·운영 등급까지 고정 열을 구성한 뒤 조사유형별 결함 코드 열을 추가한다.

28. 2026-07-29 상세보기 처리분구 조회 조건 연계

  • 상세보기 팝업의 처리분구 선택값을 URL로 전달받은 한 건의 고정 옵션에서 사업·조사유형별 실제 상세현황 처리분구 목록으로 변경했다.
  • 관로 상세보기는 PPL 결과가 있는 처리분구, 맨홀 상세보기는 MNHL 결과가 있는 처리분구만 기존 /sections?jobType=PPL|MNHL API로 조회한다.
  • 조사 상세현황에서 선택한 처리분구를 팝업 최초 기본값으로 유지하고, 목록에 없을 때만 해당 조사유형의 첫 처리분구로 대체한다.
  • 처리분구를 변경하면 관리번호·정렬·안내와 이전 상세 행을 초기화한 뒤 선택한 처리분구의 시설 상세를 다시 조회한다.
  • 표 제목과 화면 엑셀 다운로드 파일명도 현재 선택한 처리분구명으로 갱신한다.

29. 2026-07-29 관로 본단위구간 실데이터 연결

  • 관로 상세보기의 본단위구간 모드를 신규 PPL 단위구간 조회 API에 연결했다.
  • 관리번호가 비어 있으면 현재 처리분구의 전체 관로 단위구간을 표시하고, 입력 후 조회하면 부분 일치 결과를 표시한다.
  • 서버의 상태·결함 코드를 기존 관로 결함 코드표와 상태 코드표에 매핑해 엑셀형 14열 표에 표시한다.
  • 상세 기록이 없는 단위구간은 결함 필드를 하이픈으로 표시하되 관로번호·단위구간·단위길이는 유지한다.
  • 처리분구·모드·관리번호를 빠르게 바꿨을 때 이전 요청이 새 화면을 덮어쓰지 않도록 기존 effect 취소 흐름을 적용했다.
  • 실제 API 조회와 현재 화면 기준 엑셀 다운로드를 유지한다.

본단위구간 표 너비 보정

  • 표의 기존 1422px 최소 너비는 유지하면서 실제 너비를 스크롤 컨테이너의 100%로 확장했다.
  • 데이터 양에 따라 세로 스크롤바가 생기거나 사라져도 오른쪽에 스크롤바 폭만큼 빈 영역이 남지 않는다.

조사중단사유·비고 셀 분리

  • 조사중단사유와 비고는 단위구간 기준 병합 대상에서 제외했다.
  • 두 열은 본단위구간의 각 상세 행마다 독립된 셀과 구분선을 표시한다.

30. 2026-07-29 구조·운영 결함별 실데이터 연결

  • 조사 상세현황의 구조적·운영적 결함 건수 링크에서 전달한 defectType을 실제 시설 상세 API에 연결했다.
  • 결함별 팝업은 기존 설계대로 처리분구·관리번호·모드·조회 영역을 표시하지 않고 선택 분류 결과를 즉시 조회한다.
  • 서버가 반환한 선택 분류의 시설 행과 코드 열만 표시하고 화면 행·열 기준 소계와 합계를 다시 계산한다.
  • 후속 구현 안내 문구를 제거하고 조회 중·오류 상태를 실제 API 요청 상태로 표시한다.
  • 결함별 다운로드는 현재 표시 행·열과 코드 헤더, 소계·합계 구조를 그대로 사용한다.

31. 2026-07-30 조사 상세현황 다중 시트 다운로드 연결

  • downloadExmnSectionSummary API 함수를 추가해 현재 선택한 조사유형을 서버 다운로드 파라미터로 전달한다.
  • 조사 상세현황 다운로드 버튼은 서버가 생성한 XLSX Blob을 사업명·조사유형 기반 파일명으로 저장한다.
  • 다운로드 중에는 버튼을 비활성화하고 다운로드 중... 상태를 표시한다.
  • 조회 결과가 없으면 다운로드를 막고 기존 안내 영역에 메시지를 표시한다.
  • 조사 상세현황 다운로드는 샘플 분기 없이 실제 서버 API만 호출한다.
  • 브라우저에서 종합집계 1개 시트만 만들던 임시 공통 Excel 함수 호출은 제거했다.
  • 관로 본단위구간은 이번 통합 다운로드 대상에 포함하지 않는다.

수정 파일

  • src/features/exmn/api/exmn-business-api.ts
  • src/features/exmn/ui/ExmnStatusDetailPanel.tsx

32. 2026-07-30 샘플 데이터 보기 기능 제거

  • 조사사업 목록의 개발환경용 샘플 데이터 보기·실데이터 보기 버튼을 제거했다.
  • sample=Y URL 파라미터와 목록·사업등록/수정·결과등록·상세현황·본단위구간의 샘플 분기를 제거했다.
  • 샘플 사업, 처리분구, 검토 결과, 집계, 시설 상세와 본단위구간을 제공하던 exmn-sample-data.ts를 삭제했다.
  • 조사관리 화면과 WindowPopup은 모두 실제 API 데이터만 조회·저장하도록 단일화했다.
  • 백엔드 양식 생성기의 예시행 정리 로직은 실제 조사입력 양식 생성에 필요한 기능이므로 이번 제거 대상에 포함하지 않았다.

수정 파일

  • src/features/exmn/model/exmn-sample-data.ts 삭제
  • src/features/exmn/ui/ExmnRegistrationPage.tsx
  • src/features/exmn/ui/ExmnStatusDetailPanel.tsx
  • src/features/exmn/ui/ExmnBusinessRegisterPopupPage.tsx
  • src/features/exmn/ui/ExmnResultRegisterPopupPage.tsx
  • src/features/exmn/ui/ExmnSurveyDetailPopupPage.tsx
  • src/features/windowPopup/ui/ExmnBusinessRegisterPopupContent.tsx
  • src/features/windowPopup/ui/ExmnResultRegisterPopupContent.tsx
  • src/features/windowPopup/ui/ExmnSurveyDetailPopupContent.tsx

33. 2026-07-30 샘플 제거 변경분 코드 리뷰

  • 목록 최초 조회, 등록·수정 완료 후 목록 재조회, 결과등록 검토·저장, 상세현황·본단위구간 실제 API 호출 흐름을 다시 확인했다.
  • WindowPopup content와 화면 컴포넌트 사이에서 제거된 sampleMode·샘플 사업 props가 남아 있지 않음을 확인했다.
  • 실제 사업 요약 query, 사업 ID, 처리분구 ID, 조사유형과 결함유형 전달 계약은 유지했다.
  • 기능 범위의 sampleMode, sample=, exmn-sample-data, 샘플 식별자 런타임 참조는 0건이다.
  • 코드 추가 수정이 필요한 결함은 발견되지 않아 샘플 제거 변경분을 유지했다.
  • git diff --check는 통과했다. 로컬 TypeScript 모듈 접근은 기존 EPERM 환경 문제로 실행하지 못했고 전체 빌드는 사용자 요청에 따라 수행하지 않았다.

34. 2026-07-30 배수방식·관종 명칭 표시

  • 시설 상세 응답의 원본 코드 drainageType, pipeType과 표시 명칭 drainageTypeName, pipeTypeName을 함께 타입에 반영했다.
  • 관로·맨홀 전체 상세표의 배수방식·관종 셀은 명칭을 우선 표시하고 명칭이 없으면 기존 코드를 표시한다.
  • 고정 열 정렬도 원본 코드가 아니라 사용자에게 보이는 명칭을 기준으로 동작한다.
  • 현재 화면 기준 상세 Excel 다운로드 역시 배수방식·관종 명칭을 기록한다.
  • 기존 표 구조, 고정 열, 결함 열, 소계·합계와 조회 파라미터는 변경하지 않았다.

수정 파일

  • src/features/exmn/model/exmn-detail-table.ts
  • src/features/exmn/ui/ExmnSurveyDetailPopupPage.tsx

35. 2026-07-31 지도보기 이동과 조사결과 레이어·필터 연결

구현 내용

  • 조사 상세현황의 지도보기 버튼은 별도 안내 대신 /map으로 이동한다.
  • 이동 query에는 조사사업 ID, 사업차수, 시도·시군구, 조사유형, 선택 처리분구 ID·명칭을 포함한다.
  • 지도 진입 시 시도·시군구 명칭을 공통 행정구역 코드로 해석하고 기존 SN_INFTWT_PROC_SEARCH 이벤트를 사용해 검색조건 표시와 지도 위치를 함께 맞춘다.
  • 기존 CMS 레이어 응답 뒤에 화면 제어용 조사결과 루트와 CCTV조사, 맨홀조사 하위 노드를 추가했다.
  • 조사관리에서 진입한 조사유형은 최초 체크 상태로 표시한다.
  • 레이어 설정은 사업차수, 구조적 상태등급, 운영적 상태등급만 제공하며 값 변경 즉시 조회한다.
  • PPL과 MNHL은 독립된 EPSG:5179 GeoJSON 벡터 소스·레이어를 사용한다.
  • 시도·시군구 명칭을 공통 코드 목록으로 해석하고 시군구코드 앞 5자리 sggCd를 레이어 API에 전달해 전국 중복 관로번호를 구분한다.
  • 행정구역 코드 목록이 아직 준비되지 않았으면 전국 범위 요청을 보내지 않고 코드 상태 갱신 후 다시 조회한다.
  • 필터 변경 중 응답 순서가 뒤바뀌어도 최신 요청만 반영하도록 조사유형별 요청 순번을 관리한다.
  • 체크 해제 시 해당 조사 레이어와 벡터 소스를 제거한다.

화면·API 계약

구분 계약
지도 이동 `/map?exmnBizId=...&ctpvNm=...&sggNm=...&exmnJobType=PPL MNHL&bizCycl=...`
레이어 조회 /sewerage-service/api/v1/exmnMap/layers
필터 jobType, sggCd(앞 5자리), 행정구역명, 사업차수, 구조적 등급, 운영적 등급

2026-07-31 지도보기 초기 시군구 선택·대표 관로 확대 보완

  • 조사관리의 지도보기 진입 시 시도 코드만 먼저 적용하지 않고, 전달된 시군구명에 대응하는 시군구코드까지 준비된 뒤 공통 지도 검색바에 전달한다.
  • 공통 지도 검색바는 외부 선택 이벤트가 시군구 원천 목록 조회보다 먼저 도착해도 목록 로딩 후 현재 시도에 맞는 시군구 후보를 다시 구성한다.
  • 최초 조사결과 레이어 조회 성공 시 진입한 조사유형의 첫 시설 한 건을 기준으로 최대 줌 18까지 한 번만 확대한다.
  • 이후 사용자의 지도 이동이나 필터 재조회에서는 초기 자동 확대를 반복하지 않는다. | 필터 결합 | 구조·운영 등급 동시 입력 시 AND | | 좌표계 | GeoJSON EPSG:5179 | | 레이어 선택 | 기존 지도 선택 모듈에 PPL 선·MNHL 점 레이어 등록 |

수정 파일

  • src/features/exmn/ui/ExmnStatusDetailPanel.tsx
  • app/(map-layout)/map/page.tsx
  • app/(map-layout)/map/components/exmn/ExmnLayerSettingPanel.tsx
  • app/(map-layout)/map/components/exmn/exmnMapApi.ts
  • app/(map-layout)/map/components/exmn/exmnMapTypes.ts

남은 작업

  • 지도에서 조사 관로·맨홀을 선택했을 때 기존 시설정보와 분리된 오른쪽 조사관리 탭을 연다.
  • 조사관리 탭에 구조적·운영적 상태등급과 조사보고서 링크를 표시한다.
  • 조사보고서 링크는 백엔드의 저장된 페이지 범위 및 부분 PDF 조회 API와 연결한다.

2026-07-31 지도 우측 조사관리 탭·관로 보고서 연결

  • 조사결과 GeoJSON 피처를 선택하면 기존 일반 시설 탭이 아닌 조사관리(관로번호) 전용 탭을 생성한다.
  • 조사관리 탭은 기존 FeatureClickEventPopup과 관로·맨홀 입력정보 컴포넌트를 재사용한다.
  • 기존 입력정보 바로 아래에 조사 결과 영역을 주입해 사업명, 사업차수, 처리분구, 조사유형, 보고서번호, 구조적·운영적 결함 등급을 표시한다.
  • 조사관리 전용 탭에서는 일반 시설용 보수 및 갱신·청소 및 준설·점검 및 진단 영역을 숨긴다.
  • PPL 조사결과에는 조사보고서 보기 버튼을 표시하고 관로별 부분 PDF API를 호출한다.
  • PDF 요청 전에 새 창을 먼저 열어 브라우저 팝업 차단을 최소화하고 응답 Blob URL을 새 창에 연결한다.
  • 관로 보고서 조회 실패 시 공통 Blob 오류 문자열 대신 백엔드의 사용자 안내 메시지만 표시한다.
  • MNHL 조사보고서는 판별 기준 협의 전까지 버튼을 제공하지 않으며, 별도의 보류 안내 문구도 화면에 표시하지 않는다.

수정 파일

  • app/(map-layout)/map/page.tsx
  • app/(map-layout)/map/components/exmn/ExmnSurveyResultSection.tsx
  • app/(map-layout)/map/components/popupComponent/featureClickEventPopup.tsx
  • app/(map-layout)/map/components/popupComponent/MsSwagePpl.tsx
  • app/(map-layout)/map/components/popupComponent/smh.tsx
  • app/(map-layout)/map/components/common/index.ts
  • src/features/exmn/api/exmn-business-api.ts

2026-07-31 지도 조사결과 패널 시각 통일

  • 지도 우측 조사관리 탭의 조사 결과 제목, 여백, 표 라벨 셀, 글꼴과 글자 크기를 기존 입력정보의 VerticalTable 규칙과 동일하게 적용했다.
  • 조사보고서 버튼은 기존 입력정보 헤더의 버튼 높이와 글꼴 규칙을 따르면서 다운로드 계열의 초록색을 유지했다.
  • PPL 조사유형과 레이어의 사용자 표시 명칭을 CCTV조사에서 관로조사로 통일했다.
  • 기존 DB 레이어명이 CCTV조사인 환경도 계속 탐색할 수 있도록 이전 명칭을 호환 키로 유지하고, 화면에는 관로조사로 정규화한다.
  • 조사결과 레이어 트리의 관로 심볼은 노란색 선(#facc15)으로 표시한다.
  • 맨홀 심볼은 기존 맨홀 분류의 파랑·빨강·초록·갈색·주황·회색과 겹치지 않는 보라색을 사용하되, 기존 SWL_MANH_PS_BLUE.png의 맨홀 형태와 음영을 그대로 유지하는 색상 변형 아이콘으로 통일했다.
  • 선택 레이어 설정 카드의 조사유형 표식도 관로조사는 노란색(#facc15), 맨홀조사는 보라색(#8b5cf6)으로 표시해 레이어 범례·지도 피처와 색상 의미를 통일했다.
  • 지도 우측 상세 패널의 다중 선택 탭은 관로조사(관로번호)와 맨홀조사(관로번호) 형식으로 표시하고, 관로 탭은 노란색 계열, 맨홀 탭은 보라색 계열로 구분한다.
  • 선택 레이어 설정 카드의 사업차수·상태등급 입력 폭은 54px로 조정해 카드 안의 정보 밀도와 우측 여백을 보정했다.
  • 선택 레이어 설정의 사업차수·구조적 상태등급·운영적 상태등급을 변경할 때 설정 컴포넌트가 다시 렌더링되어도 내부 세로 스크롤 위치를 저장·복원해 사용자가 보던 설정 카드 위치를 유지한다.
  • 맨홀조사 지도 피처도 등급색 단순 원형 대신 레이어 트리와 동일한 보라색 맨홀 아이콘을 사용한다.
  • 지도 피처의 선택 영역은 조사유형 탭·범례 색상과 별개로 기존 지도 공통 선택 효과를 그대로 사용한다.
  • 레이어 ON/OFF로 설정 카드 수가 바뀌어도 선택 레이어 설정 영역은 고정 높이와 항상 확보된 세로 스크롤 공간을 유지해 인접 스크롤바의 표시·영역 크기가 흔들리지 않도록 했다.

수정 파일

  • app/(map-layout)/map/page.tsx
  • app/(map-layout)/map/components/exmn/ExmnLayerSettingPanel.tsx
  • app/(map-layout)/map/components/exmn/ExmnSurveyResultSection.tsx
  • app/(map-layout)/map/components/exmn/exmnMapTypes.ts
  • public/images/map/layericon/SN_EXMN_MANHOLE_PURPLE.png

2026-07-31 관로 조사보고서 WindowPopup 뷰어 전환

  • 지도 우측 조사관리 탭의 조사보고서 보기는 PDF Blob URL을 브라우저 원본 탭에 직접 여는 대신 공통 WindowPopup exmnPipeReport를 연다.
  • 전용 팝업은 기존 관로별 부분 PDF API를 호출하고 Blob URL을 내부 iframe에 표시한다.
  • 팝업을 닫거나 조회 대상을 변경하면 생성한 Blob URL을 해제해 브라우저 메모리가 누적되지 않도록 했다.
  • 조회 실패 시 새 탭을 닫고 alert를 띄우던 방식 대신 WindowPopup 본문에 백엔드 사용자 안내 메시지를 표시한다.
  • 백엔드 API와 DB 계약은 변경하지 않았다.

수정 파일

  • app/(map-layout)/map/components/exmn/ExmnSurveyResultSection.tsx
  • src/features/windowPopup/model/popupDefinitions.ts
  • src/features/windowPopup/registry.tsx
  • src/features/windowPopup/ui/ExmnPipeReportPopupContent.tsx

2026-07-31 결과등록 검토 오류 중복 안내 제거

  • 파일 데이터 검토 실패 사유는 해당 파일 행의 실패 상태와 하단 데이터 검토 내역에만 표시한다.
  • 같은 검토 오류를 팝업 상단 전역 빨간 알림으로 다시 표시하던 중복 안내를 제거했다.
  • 파일 미선택, 사업정보 조회, 최종 저장처럼 하단 검토 내역으로 대신할 수 없는 오류는 기존 상단 안내를 유지한다.
  • 데이터 검토 내역 헤더 우측의 보조 문구를 제거해 검토 결과에 시선이 집중되도록 정리했다.
  • 결과등록 WindowPopup 기본 높이를 500px에서 650px로 확대해 최초 진입 시 하단 검토 내역이 잘리지 않도록 보정했다.

36. 2026-07-31 최종 기능 점검과 문서 정합성

점검 결과

  • 처리분구 CRUD, 조사사업 조회·등록·수정, 조사·보고서 양식 다운로드, 결과등록, PPL/MNHL 종합집계와 상세조회, 본단위구간, 구조·운영 결함별 조회, 다중 시트 다운로드는 실제 API 기준으로 연결돼 있다.
  • 조사 상세현황 지도보기는 사업·행정구역·조사유형 정보를 /map으로 전달하고, 지도에서 관로·맨홀 레이어와 독립 필터를 사용한다.
  • 지도 우측 탭은 관로조사(번호)·맨홀조사(번호)로 구분하며 관로는 노란색 계열, 맨홀은 보라색 계열로 표시한다.
  • 관로 조사보고서는 공통 WindowPopup 내부 PDF 뷰어로 표시하고, 맨홀 보고서는 판별 기준 확정 전까지 버튼을 표시하지 않는다.
  • 지도 피처 선택 강조는 조사유형 범례 색을 덮어쓰지 않고 기존 공통 지도 선택 효과를 사용한다.

정적 점검 보완 결과

  • ExmnSurveyResultSection.tsx의 무효 Tailwind 유틸리티 !p-0r를 !p-0으로 바로잡아 조사결과 카드 내부 여백 의도가 적용되도록 했다.
  • 백엔드 맨홀 공간조회는 관로와 동일하게 시군구코드 앞 5자리를 사용하도록 보완했다.
  • ExmnMapLayerServiceTest의 맨홀 Repository 모킹을 실제 서비스 호출 메서드와 sggCd=41450 조건에 맞췄다.

검증 범위

  • 프론트·백엔드 git diff --check는 공백 오류 없이 통과했다.
  • 긴 프론트 전체 빌드와 Gradle 컴파일·테스트는 사용자 요청과 기존 장시간 실행 이력에 따라 수행하지 않았다.
  • 코드 정적 보완은 완료했으며 로그인 브라우저에서 지도 관로·맨홀 선택, 필터, 탭, 관로 부분 PDF를 한 번에 회귀 확인해야 한다.

37. 2026-07-31 관로 조사보고서 팝업 선분기

  • 기존에는 조사보고서 보기 클릭 즉시 WindowPopup을 열고 팝업 내부에서 부분 PDF API를 호출했다.
  • 지도 GeoJSON의 reportAvailable 속성을 먼저 확인하도록 변경했다.
  • 관로 조사보고서 첨부파일이 없으면 WindowPopup을 만들지 않고 등록된 관로 조사보고서가 없습니다. alert만 표시한다.
  • 첨부파일이 있으면 기존 exmnPipeReport WindowPopup을 열어 부분 PDF를 조회한다.
  • 첨부는 있지만 선택 관로의 페이지 분석·추출이 실패하는 경우에는 기존처럼 팝업 내부에 백엔드 오류를 표시한다.

38. 2026-08-05 맨홀조사 지도 상류맨홀 응답 정규화

  • 조사 전용 exmnMapApi.ts가 MNHL GeoJSON에서 manholePosition=UPSTREAM 피처만 지도에 전달하도록 보완했다.
  • 변경된 백엔드는 상류 피처만 반환하며, 프론트 필터는 구버전 응답에 하류 피처가 포함되는 배포 시차에도 동일 화면 기준을 유지한다.
  • 필터 후 features, totalFeatures, numberReturned를 상류 피처 건수로 맞춘다.
  • PPL 관로 레이어와 지도 공통 페이지, DB·API 요청 파라미터는 변경하지 않았다.

39. 2026-08-06 지도보기 처리분구 선택 필수화

  • 조사사업 행만 선택한 상태에서는 상세현황의 지도보기 버튼을 비활성화한다.
  • 관로·맨홀 종합집계표에서 실제 처리분구 행을 선택한 뒤에만 버튼을 활성화한다.
  • 지도 이동 시 선택 처리분구의 trtdstId, trtdstNm을 필수로 전달하며 합계 행은 선택 대상에서 제외한다.
  • 프론트 진입 조건만 보완했으며 백엔드와 공통 지도 조회 계약은 변경하지 않았다.

40. 2026-08-06 맨홀조사 선택 심볼 유지

  • 맨홀조사 피처를 클릭하면 공통 보라색 선택 원만 남고 기존 맨홀 아이콘이 사라지던 문제를 보완했다.
  • 공통 지도 선택기가 선택된 피처의 실제 OpenLayers 레이어 스타일 함수를 우선 사용하도록 변경했다.
  • 점 시설은 선택 원형 강조를 먼저 그리고 원래 아이콘을 위에 다시 그려, 선택 중에도 대상 맨홀을 식별할 수 있게 했다.
  • 선형 시설의 기존 선택 강조 순서는 유지했으며 API·DB·백엔드 동작은 변경하지 않았다.

41. 2026-08-12 CS 기준 조사·처리분구 화면 UI 통일

추적 근거

  • 요구사항정의서 3. (기능)요구사항정의 및 추적표의 SFR-010-004~SFR-010-007을 다시 확인했다.
  • 화면설계서의 조사관리 화면 SN_MN040101SN_MN040110(슬라이드 37, 4149)을 대조했다.
  • 이번 변경은 조회·등록·수정·상세 기능과 API 계약을 유지한 UI 설계 보완이다.

변경 내용

  • 메뉴명이 관리로 끝나는 목록 카드 제목은 관리를 제외하는 규칙을 적용했다.
    • 조사관리 → 조사 목록
    • 처리분구관리 → 처리분구 목록
  • 목록의 총 건수 문구와 열 정렬 UI·정렬 동작을 제거해 CS 목록 화면 기준에 맞췄다.
  • 검색조건은 공통 Label, Input, Select, Button으로 바꾸고 조회, 초기화 순서와 간격을 공통 규칙으로 통일했다.
  • 조사사업·처리분구 목록은 공통 StandardDataTable을 사용하며 페이지당 10건, 자연 높이, 윈도우 세로 스크롤을 적용했다. 가로 폭이 충분하지 않은 표만 내부 가로 스크롤을 표시한다.
  • 조사 상세현황의 종합집계표는 내부 세로 스크롤을 제거하고 서버 제공 순서를 유지했다.
  • 조사사업 등록·상세/수정은 공통 StandardFormSection, StandardFormField를 사용해 사업차수·사업년도·정밀조사 연장과 시도·시군구·사업명을 각각 한 행 3개 항목으로 배치했다.
  • 처리분구는 별도 등록·상세 화면이 없는 기존 계약을 유지해 목록 안의 추가·수정·삭제·저장 방식은 보존하고 표와 버튼 UI만 통일했다.
  • 백엔드 API, 요청·응답 DTO, DB 구조는 변경하지 않았다.

공통 컴포넌트와 화면 전용 처리

  • 그대로 사용: 공통 Button, Input, Label, Select, StandardDataTable.
  • 공통 래퍼 추가: 업무 비종속 StandardFormSection, StandardFormField. sn 접두어와 조사 업무 로직은 포함하지 않아 다른 앱에서도 재사용할 수 있다.
  • 화면 전용 유지: 조사 상세현황의 합계 행·결함 건수 링크, 처리분구 인라인 편집·변경 상태 표현, 조사 결과 업로드 흐름.

검증 결과

  • node node_modules/typescript/bin/tsc --noEmit --pretty false --ignoreDeprecations 5.0을 apps/sn에서 실행해 오류 없이 통과했다.
  • 로그인 브라우저에서 /oper/exmn/register와 /oper/trtdst를 직접 확인했다.
  • 조사 목록, 처리분구 목록 제목, 조회·초기화 버튼, 정렬 버튼 미표시, 표 헤더 가운데 정렬, 페이지당 10건, 내부 세로 스크롤 미표시를 확인했다.
  • 조사사업 행 선택 후 상세현황 표시, 조사사업 등록의 3열 2행 폼, 처리분구 행 선택 후 인라인 수정 입력 전환을 확인했다.
  • 사용자가 실행 중인 개발 서버를 보호하기 위해 Next 빌드는 수행하지 않았다.

42. 2026-08-12 조사 상세 그리드·WindowPopup UI 및 순번 규칙 통일

추적 근거

  • 요구사항정의서 3. (기능)요구사항정의 및 추적표의 SFR-010-004~SFR-010-007을 직접 재확인했다.
  • 화면설계서 슬라이드 37, 4149의 SN_MN040101SN_MN040110 조사사업 목록·등록·상세·결과등록 화면을 대조했다.
  • 기존 기능·API 계약을 유지하면서 사용자가 지정한 CS UI 기준을 팝업까지 확장한 설계 보완이다.

변경 내용

  • 조사 목록, 관로·맨홀 상세 집계 및 처리분구 목록의 NO 헤더를 순번으로 통일하고 전체 건수에서 시작하는 내림차순 순번을 적용했다.
  • 조사 상세현황 그리드를 CS 기본 표의 파란 헤더·흰 글씨·가운데 정렬로 바꾸고 내부의 관로조사 종합집계표, 맨홀조사 종합집계표 제목을 삭제했다.
  • 업무에 종속되지 않는 StandardPopupLayout과 공통 순번 계산 함수 getStandardRowNumber를 business_components에 추가했다.
  • 조사사업 등록·수정, 조사 결과 업로드, 조사 상세보기, 관로 조사보고서 WindowPopup을 StandardPopupLayout과 공통 Button, Input, Select, StandardFormSection, StandardFormField 기준으로 통일했다.
  • 조사 결과 업로드의 파일 표와 조사 상세보기의 복합 그리드·본단위구간 그리드도 CS 기본 표 헤더 색상과 가운데 정렬을 적용했다.
  • 기존 녹색 팝업 버튼과 화면 전용 파란 헤더를 제거했으며 정렬 UI와 정렬 동작은 추가하지 않았다.
  • 조사사업 저장·양식 다운로드, 결과 파일 선택·검토·저장, 결함 필터·다운로드, 관로 보고서 PDF 조회 기능은 보존했다.
  • 백엔드 API, 요청·응답 DTO와 DB 구조는 변경하지 않았다.

검증 결과

  • 로그인 브라우저에서 /oper/exmn/register를 조회해 목록 순번이 5부터 1까지 표시되는 것을 확인했다.
  • 첫 사업을 선택해 조사 상세현황의 두 처리분구가 2, 1로 표시되고, 두 종합집계표 제목이 없으며 표 헤더가 CS 기본 스타일로 표시되는 것을 확인했다.
  • /popup/exmnBusinessRegister, /popup/exmnResultRegister, /popup/exmnSurveyDetail, /popup/exmnPipeReport를 직접 열어 카드형 헤더·버튼·폼·표·PDF 상태 영역을 확인했다. 테스트용 임의 ID로 연 화면의 API ERROR 표시는 예상된 조회 결과이며 UI 렌더링 검증에만 사용했다.
  • TypeScript 전체 검사는 이번 변경 파일의 오류가 없음을 확인했으나, 작업 범위 밖 지도·공통 메뉴와 기존 ExmnSurveyResultSection, exmn-business-api, ObsltPplFormPage 오류 때문에 전체 명령은 실패했다.
  • 사용자가 실행 중인 개발 서버를 보호하기 위해 Next 빌드는 수행하지 않았다.

43. 2026-08-12 조사사업 등록 팝업 버튼·처리분구 영역 재정렬

  • 사용자 확인에 따라 처리분구 선택 UI의 그리드 전환은 보류하고 기존 3열 체크박스 카드와 검색·일괄선택 기능을 유지했다.
  • 조사사업 등록 상단 버튼을 준설 등록과 같은 공통 기본 규격(높이 32px, 글자 13px)으로 변경하고 취소 버튼을 추가했다.
  • 처리분구 영역은 CS 카드 헤더 규칙을 적용하고 타이틀, 검색 입력, 선택 버튼, 선택 건수와 빈 상태 안내를 공통 13px 글꼴·색상·간격으로 통일했다.
  • 동일한 이름의 시군구가 여러 시도에 존재해도 선택 시도의 코드 앞자리 안에서 일치하는 항목을 찾도록 상세값 복원 로직을 보완했다.
  • 로그인 브라우저에서 /popup/exmnBusinessRegister를 직접 열어 상단 버튼 높이·글자 크기, 처리분구 타이틀·검색 입력·선택 건수·빈 상태 안내의 계산 스타일을 확인했다. 인천광역시의 고유 시군구와 동명 시군구를 차례로 선택해 시군구 선택값 유지도 확인했다.
  • 대상 파일은 Prettier와 git diff --check를 통과했다. 앱 전체 TypeScript 검사는 이번 파일 외 지도·API·공통 메뉴 등 기존 오류가 남아 있어 실패했으며, Next 빌드는 실행 중인 개발 서버 보호를 위해 수행하지 않았다.

44. 2026-08-12 버튼 색상·문구·순서 및 팝업 카드 간격 통일

  • 주요 실행 동작인 조회·등록·저장·수정·다운로드는 파란색, 초기화·취소·닫기·상세보기·지도보기는 흰색, 삭제는 빨간색으로 통일했다.
  • 조사 목록은 사업등록 → 결과등록 → 수정, 처리분구 목록은 추가 → 수정 → 저장 → 삭제 순서로 정리했다. 처리분구의 삭제대기 상태는 동작 의미에 맞춰 흰색 삭제취소로 바뀐다.
  • 조사사업 등록·수정 팝업은 양식다운로드 → 조사보고서 양식다운로드 → 저장/수정 → 취소, 결과 업로드는 저장 → 취소, 조사 상세는 엑셀다운로드 → 닫기 순서를 적용했다.
  • Excel 데이터 내보내기는 엑셀다운로드, 입력 템플릿은 양식다운로드, 일반 첨부파일은 다운로드로 구분했다.
  • StandardPopupLayout 본문을 margin 기반 space-y 대신 flex와 gap: 1.2rem으로 변경했다. 자식 카드의 !m-0 때문에 간격이 0으로 덮이던 문제를 공통 레이아웃에서 해결했다.
  • 브라우저에서 조사사업 등록·수정의 사업 정보와 사업대상 처리분구 카드 사이 실제 간격이 모두 12px인 것을 확인했다.

45. 2026-08-28 조사 입력양식 다운로드 노출·Blob 처리 보완

  • 사업별 조사 입력양식은 저장된 exmnBizId와 확정 처리분구가 있어야 생성할 수 있으므로 신규 등록 화면에서는 양식다운로드 버튼을 숨겼다.
  • 수정 화면에는 양식다운로드를 유지하고, 저장과 무관한 공통 조사보고서 양식다운로드는 등록·수정 모두 유지한다.
  • Blob 다운로드 링크를 DOM에 연결한 뒤 클릭하고 1초 후 object URL을 해제하도록 변경해 Chrome가 파일을 수락하기 전에 URL이 사라지는 문제를 방지했다.
  • 사업·처리분구 저장, 양식 생성 API와 DB 계약은 변경하지 않았다.

46. 2026-08-28 사업등록·수정 양식 버튼 분리

  • 신규 사업등록 저장 성공 시 부모 목록에 EXMN_BUSINESS_CREATED 메시지를 전달하되 팝업은 닫지 않도록 변경했다.
  • 저장 후 기존 savedBusiness와 formLocked를 사용해 입력은 잠그고 양식다운로드를 활성화한다.
  • 저장 전 비활성 버튼은 hover 가능한 래퍼에서 사업정보와 처리분구를 먼저 저장해주세요. 안내를 제공한다.
  • 사업등록 진입에서는 양식다운로드, 조사보고서 양식다운로드, 저장, 취소 순서로 표시한다.
  • 수정 진입에서는 조사보고서 양식다운로드를 숨기고 양식다운로드, 저장, 취소만 표시한다.
  • 처리분구를 수정한 경우 기존 계약대로 먼저 저장한 뒤 최신 처리분구 기준 입력양식을 다시 생성한다.
  • 공통 조사보고서 XLSX와 등록된 사업보고서 PDF의 다운로드 경로는 변경하지 않았다.

47. 2026-09-01 조사사업 공통코드 프론트 표시 1차 적용

  • EXMNDFCGRD, EXMNRECDTYPE, EXMNDFCTYPE, EXMNDFCSEV, EXMNSTTSGRP, PPLEXMNITEM, MNHLEXMNITEM을 기존 CMS 캐시 API로 조회하고 브라우저 세션에서 그룹별 응답과 진행 중 요청을 재사용한다.
  • PPL 시설 필터의 구조·운영등급 선택지와 결함분류 표시, 조사 상세표·Excel의 결함분류·심각도·관로·맨홀 항목명에 CMS 코드명을 적용했다.
  • 본단위등급표와 PPL 시설 상세의 기록유형·결함분류·심각도·상태그룹 표시에도 같은 코드명을 적용했다.
  • 조사 코드값, 상세표 열 순서, API 파라미터와 백엔드 Excel 파서·분류 목록은 변경하지 않았다.
  • CMS 조회 실패 또는 미등록 코드에는 기존 화면 라벨과 서버 제공값을 fallback으로 유지한다.
  • 백엔드 API와 DB는 변경하지 않았다.

2026-10-01 조사 레이어 검색 독립 표출 구현 결과

  • 일반 /map에서 상단 검색/URL 지역 없이 PPL·MNHL 체크만으로 전체 활성 조사결과를 조회한다. 기존 레이어 색상·사업차수·구조/운영 AND 필터, 설정 토글 OFF의 추가 필터 해제 계약을 유지한다.
  • ExmnMapController의 sggCd를 선택값으로 변경하고 exmnBizId/trtdstId 선택 조건을 추가했다. 처리분구 단독 요청·잘못된 사업 연결·범위 밖 등급은 400으로 처리한다.
  • ExmnMapLayerService는 기존 AdministrativeDistrictRepository의 시도+시군구 기준정보로 자료별 지역을 해석하고 지역별 500건 배치를 사용한다. 같은 번호의 다른 지역은 분리하고 동일 지역의 다중 도형은 임의 선택하지 않는다.
  • missingGeometryCount와 diagnostics(regionUnresolvedCount/identifierMissingCount/geometryNotFoundCount/ambiguousGeometryCount)를 반환한다. MNHL은 기존 상류맨홀만 사용하며 GIS 원천을 임의 보정하지 않는다.
  • FE 전용 useExmnResultMap hook으로 기본 레이어·선택 강조·유형별 요청 취소/순번 무효화·0건/실패/누락 안내를 분리했다. 지도보기는 URL의 사업/분구를 별도 조회해 전체 extent로 최초 1회 이동한다. 일반 레이어를 선택 사업으로 제한하거나 첫 피처로 대신 이동하지 않는다.
  • 수정 파일: BE ExmnMapController.java, ExmnFacilityRepository.java, ExmnMapLayerService.java; FE map/page.tsx, exmnMapApi.ts, exmnMapTypes.ts, ExmnLayerSettingPanel.tsx, 신규 useExmnResultMap.ts.
  • DB DDL/DML·상단 공통 검색바·권한 설정 변경 없음. 사용자 서버를 재시작/종료하지 않았고, 신규 서버/전체 FE build는 실행하지 않았다.
  • 롤백은 FE를 기존 지역 포함 호출로 복원한 뒤 BE 변경을 복원한다. 순차 배포는 BE를 먼저 반영한다.

2026-10-01 사용자 확인 및 지도보기 강조 제거

  • 사용자 확인: 조사 레이어 ON/OFF에 따라 시설이 정상 표시됨.
  • 후속 지시로 지도보기의 별도 파란 강조 레이어를 제거했다. 선택 사업·처리분구 조회와 전체 extent 위치 이동은 유지하고 기존 조사 레이어의 색상/스타일로 표시한다.
  • 앞선 설계·구현 기록의 별도 선택 강조 생성 내용은 이 결정으로 대체한다. 백엔드·DB 추가 변경 없음.

2026-10-01 조사결과 업로드 양식 미준비 안내

  • 사용자 요청은 양식 생성 절차를 생략하는 수정이 아니라 미생성 상태에 ‘양식 받기’ 선행 안내를 제공하는 것이다.
  • 실제 다운로드 이력 대신 활성 처리분구의 pplExmnSheetNm/mnhlExmnSheetNm 존재 여부를 기존 사업 상세 API로 확인한다.
  • 팝업 진입, 데이터 검토 전, 저장 확인·첨부 업로드 전에 확인한다. 검토 후 사업 수정으로 시트 연결이 초기화됐으면 이전 검토 상태를 폐기하고 안내한다.
  • 문구: “조사 입력양식이 준비되지 않았습니다. 사업정보에서 ‘양식 받기’를 먼저 실행한 후 조사결과를 등록해 주세요. 사업정보를 수정한 경우에도 양식을 다시 받아야 합니다.”
  • FE ExmnResultRegisterPopupPage.tsx와 exmn-business-validation.ts에 안내/사전 확인을 추가하고 BE ExmnSurveyResultParser의 SHEET_NAME_NOT_ASSIGNED 메시지도 같은 행동 안내로 보완했다. 자동 양식 생성·DB 변경·기존 저장 필수조건 변경은 하지 않았다.
  • 검증: 미생성/부분생성/공백/정상/처리분구 없음 5건 통과, FE 타입 검사와 BE compileJava --offline 및 diff --check 통과. 임시 파일 생성 없음. 실제 파일 업로드/저장 및 브라우저 회귀는 미실행이다.
  • 롤백은 이번 안내·사전 확인과 parser 오류문구만 복원한다. 실제 다운로드 성공 여부를 추적하는 기능은 아니다.

2026-10-01 후속 지시: 저장 시에만 조사양식 안내

  • 앞선 초기 진입/데이터 검토 단계의 양식 준비 안내와 프론트 사전 차단을 제거했다. 저장을 누른 경우에만 공통 alert로 “조사관리에서 해당 사업 행 선택 → 수정 → 조사양식 받기 후 결과등록 재진행”을 안내한다. 검토 결과는 보존한다.
  • 검토 API는 양식 생성과 같은 명명 규칙으로 미등록 시트명만 메모리에서 보완한다. 저장된 시트명은 우선 사용하고 검토 중 시트명/DB를 저장하지 않는다. 실제 파일의 시트·필수값·중복·PDF 검증은 유지한다.
  • 저장 API는 실제 시트명 등록을 계속 요구하며 미준비면 기존 결과를 변경하기 전에 차단한다. 프론트는 첨부 업로드 전에 최신 상태를 확인하며 서버에서 같은 오류가 반환돼도 alert로 안내한다.
  • 검증: ExmnTemplateGateTest 7건 통과(Excel/PPL PDF/MNHL 검토 독립, 미준비 commit 무쓰기 차단, 기존 시트명 보존, 준비 완료 commit, 해시 불일치 차단), FE 타입 검사 통과. 테스트는 mock 기반이며 실제 파일 저장·DB 변경 및 브라우저 끝단 저장은 수행하지 않았다.
  • 임시 테스트 소스·산출물은 요약 후 정리한다. 이전 ‘검토 전 양식 확인’ 기록은 이 지시로 대체한다.

2026-10-01 조사양식 안내창 폭 조정

  • 해당 안내만 56rem 폭과 화면 여백 최대폭을 적용한 모달로 표시한다. 단어 유지와 균형 줄바꿈으로 두 줄 표기를 유도하며 문구와 저장 시점은 유지한다. 다른 공통 알림창은 변경하지 않는다.
  • git diff --check 통과. 좁은 화면에서는 잘림 방지를 위해 추가 줄바꿈을 허용한다.

2026-10-02 quick_vibe 등록 입력 필수 표시 보완

  • 사업대상 처리분구 제목에 기존 폼과 같은 붉은 별표와 접근성용 필수 문구를 추가했다. 기존 1개 이상 선택 검증은 유지한다.
  • 정밀조사연장은 숫자·소수점 하나·입력 삭제만 허용한다. 문자/한글/부호/지수/콤마/복수 소수점 입력 및 붙여넣기는 거부한다. km 소수 입력과 기존 저장 검증은 유지한다.
  • 원본: 요구사항 기능 시트76행 SFR-010-004, PPT 실제39슬라이드 SN_MN040105 사업정보 등록/처리분구 선택/정밀조사연장(km).
  • 검증: SN 전체 타입검사 exit0, 숫자/소수/삭제 및 거부 문자열 Node 검증 통과, git diff --check 통과. 실브라우저 입력 검증은 미수행.
  • 수정 소스: frontend/apps/sn/src/features/exmn/ui/exmn-business-register-popup-page.tsx. API/백엔드 코드·저장 계약 변경 없음. 기존 GIS 작업은 변경하지 않았다.
  • 롤백: 해당 소스의 이번 필수 표시/입력 제한만 복원한다.

2026-10-19 맨홀 조사보고서 GIS 번호 연결 (maintenance)

  • 목적: 별도 맨홀 식별체계 확정 전 맨홀 PDF의 맨홀번호에 조사시설 GIS 번호(테스트 188001)를 넣고 지도에서 해당 보고서를 열람한다. 지도 도형은 기존 상류맨홀 매칭을 유지한다.
  • 근거: 요구사항정의서 3. (기능)요구사항정의 및 추적표 SFR-010-006/007, 화면설계서 실제 42쪽의 식별기준 미확정 메모 및 43쪽 SN_MN040101 조사결과 등록. 이번 사용자 지시로 임시 GIS 번호 연결 기준을 확정했다.
  • BE: ExmnManholeReportService.java 신규, ExmnPipePdfValidator.java 표제별 불변 판독기, ExmnBusinessController.java의 GET /api/v1/exmnBusinesses/{exmnBizId}/manholeReports/{pipeNumber} 및 /availability, ExmnFacilityRepository.java의 조사유형별 첨부 존재 여부 분기.
  • 맨홀 첨부 mnhlExmnAtchFileId와 활성 MNHL의 gisManagementNo만 사용한다. 선택 번호가 없거나 활성 시설이 중복되면 임의 보고서를 반환하지 않는다. 매 요청 현재 PDF를 판독하므로 이전 관로 쪽 캐시를 사용하지 않는다. DB 스키마 및 업무 데이터 변경 없음.
  • FE: exmn-business-api.ts, exmn-survey-result-section.tsx, exmn-pipe-report-popup-content.tsx, exmn-result-register-popup-page.tsx. MNHL에서도 보고서 버튼을 표시하고 jobType에 따라 API·제목·번호 안내를 선택한다. PPL 기본 호출은 유지한다.
  • 업로드 검토의 PDF 내부 번호 대조는 이번 범위에 추가하지 않았다. 번호 입력 기준과 열람 시 대조한다는 안내를 결과등록 화면에 표시한다.
  • 산출물: 작업루트 output/pdf/맨홀_현황조사_보고서_188001.pdf. 사용자 원본 1쪽의 맨홀번호만 188001로 변경했으며 보고서번호·노선명 등 예시값과 사진은 원본을 유지했다. 실제 납품 조사자료가 아닌 기능 테스트용이다.
  • 검증: BE compileJava --offline 성공, SN 전체 typecheck 성공, 양 저장소 diff --check 성공. 임시 JUnit 5건 성공(실제 PDF 번호/쪽 추출, PPL 표제 분리, 다중/비연속 번호 거부·연속 쪽, MNHL 첨부 선택/DB 캐시 미사용/미첨부, 없는 번호/중복 시설). PDF 재열람·텍스트 및 렌더링 육안 검증 완료.
  • 미검증: 로컬 3002/8883 실행 포트가 없으므로 실제 서버 업로드·저장·지도 선택·브라우저 팝업은 수행하지 않았다. 188001 MNHL 조사시설 및 상류맨홀 GIS 도형의 실제 존재를 확인한 것으로 간주하지 않는다.
  • 수동 절차: 변경 BE/FE 실행 → 188001을 가진 MNHL 조사자료의 사업에서 결과등록 → CCTV 조사결과(맨홀)에 테스트 PDF 등록·저장 → 맨홀조사 레이어의 해당 상류맨홀 선택 → 조사보고서 보기 → 제목 맨홀 조사보고서/GIS 번호188001/1쪽 확인. 관로 보고서와 미첨부·없는 번호도 회귀 확인한다.
  • 롤백: 위 소스의 이번 변경과 신규 ExmnManholeReportService를 함께 복원한다. DB 롤백은 없다. 실제 첨부 등록을 수행한 경우에는 별도로 이전 첨부를 복원한다.
  • 남은 리스크: 번호는 확정 맨홀번호가 아닌 조사시설 GIS 번호의 임시 계약이며, 스캔 PDF는 판독 불가하다. 맨홀 PDF는 availability/열람 때 각각 판독하므로 대형 파일 성능은 후속 검증 대상이다. 테스트 소스·원시 결과·렌더링 임시 이미지는 요약 후 정리하고 최종 PDF는 보존한다.

2026-10-19 후속: 기존 사업 맨홀 PDF 단독 교체

  • 원인: 보고서 열람을 추가했지만 결과등록 화면은 모든 검토에 Excel을 요구하고 저장에 Excel·PPL 검토 성공을 요구했다.

  • 변경: 맨홀 PDF 하나만 선택하면 기존 활성 MNHL 조사시설의 GIS 번호로 PDF 번호를 대조한다. 기존 조사자료 없음·불일치·중복·잘못된 PDF는 차단한다. 선택 PDF의 일부 시설 포함은 허용한다.

  • 저장 직전 다시 검토한 뒤 선택한 MNHL 첨부만 기존 attachments API로 연결한다. Excel imports/commit과 양식 생성 확인은 호출하지 않아 기존 시설·집계·관로첨부를 유지한다. Excel을 선택한 신규/전체 결과 저장 흐름은 유지한다.

  • 수정: BE ExmnBusinessController(선택 mnhlFile 입력 및 Excel 없는 MNHL 검토 분기), ExmnManholeReportService(validateReplacement), FE exmn-result-register-popup-page(검토·저장 조건과 검토안내).

  • 검증: BE compileJava, SN typecheck, 임시 JUnit 4건(기존번호 정상·무쓰기, 기존결과 없음, 번호 불일치/중복, 누락/손상 PDF) 통과. 원본 요구사항·지도 기준은 앞선 절과 동일하다. DB 스키마 변경 없음.

  • 롤백: 이번 단독 교체 분기만 복원한다. 앞선 맨홀 보고서 열람 구현은 유지할 수 있다.

  • 실제 브라우저 확인: 기존 테스트 사업 6fe818cb-0a7a-4379-969c-150150155f91에서 Excel/PPL 미선택·188001 맨홀 PDF만 선택 → 검토 완료 → 저장 → 부모 사업목록 성공 안내 확인. 등록한 맨홀 PDF를 보고서 팝업에서 GIS 번호188001/1쪽으로 실제 표시했다. 지도 클릭 경로 자체는 이번 후속에서 재실행하지 않았다.

  • 검토 중 기존8883 서버의 닫힌 Spring 컨텍스트로 일반 API도500 발생. 사용자 명시 승인 후 동일 실행인수·local 프로필·포트8883·context /sewerage-service로 재시작하여 정상화했다. 교체 서버 PID24204는 사용자가 이어서 테스트하도록 유지한다. 종료명령: Stop-Process -Id 24204. 실행중 필요한 classpath 사본과 stdout/stderr는 작업루트 .codex-tmp/manhole-backend-classpath.jar 및 manhole-backend.out.log/err.log에 유지한다(테스트용 임시 서버가 아닌 승인된 사용자 서버 교체).

  • 부모 성공문구도 첨부 교체에 맞게 조사결과 저장을 완료했습니다.로 보정했다(exmn-registration-page.tsx). 실제 첨부는 변경했으며 기존 시설·집계는 Excel commit을 호출하지 않아 유지한다. 되돌릴 경우 이전 맨홀 첨부를 재등록한다.

2026-10-19 최종 정정: 실제 GIS 맨홀번호와 선택 사업 기준

  • 사용자 확정: PDF 맨홀번호는 조사자료 관로번호가 아닌 실제 GIS 맨홀번호이다. 앞선 gisManagementNo 기준 설명·구현은 이 절로 대체한다.
  • 원인: 지도보기 진입은 테스트 사업이었지만 전체 사업 레이어의 겹친 시설이 선택됐다. 실제 화면은 오류 확인 테스트_수정/조사관로188003/시설관리번호188001이었다. 사용자 선택 실수가 아닌 지도 범위와 번호 계약 불일치이다.
  • FE use-exmn-result-map.ts: 조사관리에서 사업·처리분구를 지정해 진입하면 해당 범위만 표출·선택한다. 일반 지도 진입은 기존 전체 범위를 유지한다. 기존 2026-10-01 전체표출 정책의 조사관리 진입 부분을 이 결정으로 대체한다.
  • FE exmn-survey-result-section.tsx: MNHL 보고서 키는 fclt_mng_no/fcltMngNo, PPL은 기존 gisManagementNo. 조사 결과 표에 GIS 번호를 명시한다. 결과등록 안내도 실제 GIS 맨홀번호로 정정했다.
  • BE ExmnManholeReportService: 기존 ExmnMapLayerService의 동일 지역·상류맨홀 매칭 결과 fclt_mng_no 집합으로 업로드 검토·열람 대상을 확인한다. 조사 관로번호를 맨홀번호로 대체하지 않는다. 같은 실제 맨홀에 여러 조사관로가 연결되면 번호 집합으로 처리한다. 스키마·조사시설·원천 GIS 변경 없음.
  • 검증: 실제 GIS188001/조사관로188003 분리, PDF 검토·열람 성공, 조사관로 번호 직접 요청 거부 및 GIS 미연결 거부를 묶은 JUnit1건 통과. BE 컴파일·FE 타입검사·diff --check 통과. 임시 테스트 소스와 결과 정리 완료.
  • 실브라우저: 테스트 사업→초이처리분구→지도3개 표시→실제188001 클릭→사업명 테스트/GIS 맨홀번호188001 확인→조사보고서 보기→1쪽 PDF와188001 표시 성공. 사용자도 최종 정상동작 확인했다.
  • 실행 서버: 기존 재시작 승인 범위에서 코드 반영 후8883 PID27788로 유지한다(이전PID24204 종료). classpath/실행로그는 기존 .codex-tmp/manhole-backend-* 경로 유지. 종료명령 Stop-Process -Id 27788.
  • 롤백: 위 FE3개 소스와 ExmnManholeReportService의 이번 변경을 함께 복원한다. DB 롤백 없음. 잔여 리스크는 GIS 미연결 자료 열람 불가 및 대형 사업의 지도 매칭·PDF 판독 비용이며, 임의 위치/다른 사업 fallback을 하지 않는다.