배경
공개노트/개발/모듈/LMC 관리자 웹이 구조(역할·기술스택·인증·화면 목록·관리자 계정)를 다루는 데 비해, 이 페이지는 화면별로 실제 무엇이 저장되고 무엇이 안 되는지를 다룸.
근거는 raw/코드분석/LMC-2.md(커밋 73876693, 2026-09-16 기준 코드 분석)임. 결과 코드·화면 문구 원문은 공개노트/개발/모듈/LMC 결과 코드와 안내 문구.
운영팀용 대응 절차는 매뉴얼 쪽에 있음 — 기본매뉴얼/관리사무소/입주민 승인 처리는 어떻게 하나요, 기본매뉴얼/관리사무소/관리비 등록이 안 돼요, 기본매뉴얼/관리사무소/전자투표 항목이 삭제 수정이 안 돼요, 기본매뉴얼/관리사무소/공지사항에 PDF 첨부가 안 돼요.
모든 화면에 공통으로 걸리는 것
아래 7가지를 먼저 알아야 개별 화면 설명이 이해됨.
1. “시스템 오류입니다” 팝업의 정체
- 모든 컨트롤러 호출을 AOP
SQIFrameworkAspect가 감싸지만SFWException만 잡음(aop/SQIFrameworkAspect.java:81) NullPointerException·NumberFormatException· MyBatisBindingException같은 런타임 예외는 그대로 빠져나가 HTTP 500이 됨- 프론트는 HTTP 오류를 받으면
'시스템 오류입니다.</br>시스템 관리자에게 문의하십시오.'를 띄움(libs/axios.js:48-53) - 분류 기준 — “시스템 오류입니다”를 봤으면 서버 미처리 예외(= 코드 결함),
SQIxxxx문구를 봤으면 정상 예외 처리 경로임 - 로그 키워드:
[SMAH-Framework],Request URI =,SQIFrameworkException :,API[...] Excution Time :(Excution오타 그대로라 grep 시 주의)
2. 프론트 응답코드 게이트
- 프론트가 그냥 통과시키는 코드는
SQI0000/SQI1007/SQI0002/SQI0014/SQI30005개뿐임(constants/api-response-code.js:109-115) - 그 외 코드는
resMsg를 그대로 띄우는 알림창이 뜨고 프라미스가 거부됨(libs/axios.js:39-46). 거부되면 뒤에 있던 “저장 되었습니다.” 안내와 목록 재조회가 실행되지 않음 - 그래서 DB에는 반영됐는데 화면만 실패로 보이는 경우가 실제로 있음(거점관리소 직원 계정 승인이 대표 사례)
3. null은 전부 빈 문자열로 내려감
config/json/CustomObjectMapper.java:11+NullToEmptyStringSerializer.java:15로 모든null이""로 직렬화됨- 관리비 목록의 등록 여부 판정(
ym0 === '')이 여기에 의존함. Jackson 설정을 건드리면 여러 화면이 조용히 어긋남
4. 공통 검색 필터 — 건설/매입이 갈리는 지점
- 조각
Common.commonTableJoin(mapper-rdb/apicomn/Common_Mapper.xml:5-67)INNER JOIN tb_smah_sbd_d때문에 스마트홈 단지 마스터에 없는 단지는 목록에서 통째로 사라짐. “단지가 안 보인다” 문의의 1순위 원인임mntnLsTpCd='02'(매입임대) →tb_pch_ls_sbd_d→tb_sgg_m→tb_fo_mgof_m→tb_grp_m경로, 그 외(건설임대) →tb_grp_sbd_r→tb_grp_m경로- 두 분기 모두
grp_ds_cd='ARA'(지역본부) 고정임. 주택관리공단·지자체 같은 다른 그룹구분은 화면에 안 잡힘
- 조각
Common.smahAplFilter(Common_Mapper.xml:98-113) — 대시보드·보고서 전용- 매입임대는 필터 없음. 건설임대는
cmn.tb_hnsvr_m에hnet_lnkg_ss_cd NOT IN ('DC','SU') AND del_yn='N'인 홈넷서버가 있어야 집계에 들어감 - 대시보드 숫자와 목록 화면 숫자가 안 맞는 대표 원인임
- 매입임대는 필터 없음. 건설임대는
- 조각
Common.joinGrpSbd(:69-96) — 원패스·승강기 전용.grpSn != 0 and grpSn != 11하드코딩 - 건설/매입 구분은
mntnLsTpCd(01/02)임.reportYn은 건설/매입과 무관한 보고서 모드 플래그임(아래 보고서 절 참고) → 공개노트/개발/경영평가 성과지표
5. 페이징
- 서버 기본값
pageSize=15,pageNum=1(comn/dto/PaginationDto.java:12-14). 목록 화면 대부분은 10을 보냄 - 총건수는 첫 행의
count(1) over()값임. 첫 행이 없으면 총건수도 0으로 보임
6. 필수값 검사
utils/NecessaryFieldCheckUtil.java:20-44—;로 구분한 필드가 비었는지만 확인함. 누락 시SQI8000+ 누락 필드명- 필수값 상수는
comn/constants/ApiResidentsNoticeNecessaryFieldConstants.java한 파일에 전부 모여 있음(이름과 달리 공지 전용이 아님)
7. 트랜잭션
- AOP로
kr.or.lh.smah..*Service.*에 일괄 적용됨(aop/TransationAspect.java:49) - 다만
*ServiceImpl이름을 쓰는 클래스 일부는 포인트컷에 잡히지 않아 아래에서 “트랜잭션 없음”이라 적은 구간은 실제로 부분 저장이 관찰될 수 있음
아파트 관리 (/apt-mng)
입주민 공지사항
- 하는 일 — 입주민에게 보낼 공지를 등록·수정·삭제하고 알림 일시를 지정함. 첨부 1개 가능. 매입임대는 시군구 단위 또는 여러 단지 일괄 등록 가능
- 화면
/apt-mng/rsd-nc/RsdNcList·RsdNcDtl·RsdNcAdd·RsdNcUpd·RsdNcPreview - API — 목록·상세만
GET /api/v1/cert/findResidentsNoticeList·findResidentsNoticeDetailInfo(CertController.java:573,607)이고, 등록·수정·삭제·엑셀은/api/v1/apart/...(ResidentsNoticeController.java:52,84,117,150)임- 목록·상세는 인증 헤더 없는
axiosIns로 호출됨(api/cmn/cmnApi.js:107,121).api/apt-mng/rsdNcApi.js:5,16의/apart/findResidentsNoticeList는 백엔드에 없는 죽은 정의임
- 목록·상세는 인증 헤더 없는
- 핵심 규칙
- 알림 일시가 과거면 “알림 등록 일시는 현재 시간 이후여야 합니다.” 로 막음(
RsdNcAdd.vue:294) - 역할이
FO_로 시작(매입임대 거점관리소)하면 대상기기코드를"APP"로 하드코딩하고 공지 범위(sgg/sbd)에 따라sggId또는sbdIdList를 실음(RsdNcAdd.vue:317-328) - 첨부 저장 파일명은
현재시각밀리초_나노초_원본파일명임(ResidentsNoticeService.java:131).sbdIdList가 있으면 단지 수만큼 반복 저장함(:155-165) - 삭제는 요청 건수와 조회 건수가 다르면
SQI0005임(:260-267) - 수정해도 작성자명(
anncRgprNm)은 원본 유지임(:213) - 공지 유형
GNRL(일반)은 화면에서 제외됨. 주석 “시스템관리자가 시스템관리자WEB에서 입주자에게 등록”(useRsdNc.js:41-43) - 미리보기 라우트
RsdNcPreview는requiresAuth가 없고layout: full임 → 로그인 없이 URL만 알면 열림 → 공개노트/개발/공지사항 미리보기
- 알림 일시가 과거면 “알림 등록 일시는 현재 시간 이후여야 합니다.” 로 막음(
- 알림 일시 이후 수정·삭제 차단이 전부 주석 처리돼 있음 —
useRsdNc.js:30-33,49-53,74-78,RsdNcAdd.vue:298-306,RsdNcUpd.vue:277-285다섯 군데. TODO 주석 “관리소 불편 절차 재정의 필요”. 백엔드에도 같은 검증이 없어 앱에 이미 뿌려진 공지도 수정·삭제됨 - 권한 — 화면은 본인 글이 아니면 수정·삭제 버튼을 감추지만(
useRsdNc.js:19-36), 백엔드는rgprId를 전혀 검사하지 않음 → API 직접 호출로 남의 공지 수정·삭제 가능 - 푸시는 LMC가 쏘지 않음 —
ResidentsNoticeService.java:48-51에 APW 이벤트 클래스 import만 있고 호출부가 없음.RGS_NC_DTTM(알림 일시)만 저장하고 실제 발송은 다른 시스템이 함 → 공개노트/개발/push 알림 - 엑셀 다운로드는 사실상 사용 불가 — 화면에 버튼 없음,
excelYn분기 미구현으로 페이징이 걸려 15건만 나옴,findResidentsNoticeListForExcel은 매퍼 XML에 SQL이 없어 호출하면BindingException임. “홈넷단지명” 칼럼은 DTO 필드명이hnetsbdNm/hnetSbdNm로 갈려 항상 빈값임 - 테이블 —
cmn.tb_rsd_annc_fcts_l(본문, JPA),cmn.tb_ahfl_m(첨부) - 로그 키워드 —
입주민 공지사항 목록 조회중 오류 발생,입주민 공지사항 등록 중 오류 발생, SQL 주석/* ResidentsNoticeMapper.* */
관리비 등록 (엑셀 업로드)
- 화면
/apt-mng/mngexp/MngexpEdt(등록) ·MngexpList(현황) ·MngexpDtl(세대별 상세). APIMngExpController.java:55,87,119,146,175,193 - 엑셀 파싱은 100% 브라우저에서 함. 백엔드 POI 파싱 코드(
MngExpServiceImpl.java:57-99)는 엔드포인트가 없는 죽은 코드임. 파싱 규칙 상세는 공개노트/개발/관리비 등록 엑셀 파싱 - 핵심 규칙
- 확장자는
.xlsx/.xls만 허용하고endsWith()로 판정함 - 양식 업로드: 첫 시트, 열 A~AK, 2행부터. 청구년월 검증을 아예 건너뜀(
clmYm:'skip') - XpERP 업로드: 첫 시트, 열 B~BT, 0행부터. 청구년월은
rows[0][3]에서 정규식/(\d{4})년\s*(\d{2})\s*월분/으로 뽑음 - 필수값은 동·호 둘뿐임. 숫자 검증이
Number.isNaN(value)라 문자열은 그대로 통과함(사실상 무력) - 단지에 없는 동·호는 스킵 셀(파랑)로 빠짐
- 합계 행은
동합계전체합계소계합계문자열로 제외함
- 확장자는
- 응답이 항상 성공으로 나감 — 컨트롤러가 성공·실패 분기 없이 무조건
SQI0014와 “{n}건의 데이터가 업데이트 되었습니다.” 를 돌려줌(MngExpController.java:132).SQI0014는 프론트 통과 코드라 0건이어도 “저장 되었습니다.”가 뜸 - DB 저장 —
MngExp_Mapper.xml:132-238. 한 덩어리VALUES로UPDATE ... RETURNING후 남은 행만INSERT함. 추가항목은 JSONB 컬럼임- 재업로드 시
UPDR_ID가 NULL로 들어감 — 매퍼는#{updrId}를 쓰는데 화면이 보내지 않음(MngExp_Mapper.xml:224vsMngexpEdt.vue:557-561) - 행 수 제한이 없음. 프론트 axios 타임아웃도 주석 처리돼 무제한임
- 재업로드 시
- 추가항목(단지별) —
smah.TB_HSH_MNGEXP_EXT_ITM. 단지 전체 삭제 후 재삽입이고 트랜잭션이 없음(MngExpServiceImpl.java:148-166) → 삽입이 실패하면 추가항목이 전부 사라짐. 단위 옵션은['', '원', 'kWh', '㎥']하드코딩임 공용관리비차감과기타관리비차감이 같은 컬럼cmusMngexpSbamt에 매핑돼 있음(useMngexp.js:33-34). 둘 다 있으면 뒤 값이 앞 값을 덮어씀- 관리비 삭제 기능은 화면에 없음. API(
deleteMngExp)는 있으나 호출부가 없어 재업로드로 덮어쓰는 방법뿐임 - 현황·상세 — 최근 6개월 등록 여부를 6개 CTE로 뽑고, 등록 여부는 화면에서
ym0 === ''로 판정함(공통 3번에 의존). 상세는cmn.TB_HSH_M의DEL_YN='N'세대만 봄(커밋5aba72e6) - 로그 키워드 —
관리비 등록 중 오류 발생. 상세조회 오류 로그 문구가 “전자투표 목록 상세조회중 오류 발생”으로 잘못 적혀 있음(MngExpServiceImpl.java:50) → 로그 검색 시 혼선 주의
임대료 등록 (엑셀 업로드)
- 하는 일 — LH 임대료 시스템(와이즈) 엑셀을 그대로 올려 세대별 임대료·부가세·연체료·납부방법을 등록하고 미납분을 별도 테이블에 적재함
- 화면
/apt-mng/rfe/RfeEdt. APIRentalController.java:46,78,110,141 - 핵심 규칙 — 파싱
- 엑셀을 올리면 시트 목록이 나오고 그중 하나를 고름. 고른 시트를
range: 4(5행부터)로 읽음 - 열 위치를 절대 고정으로 매핑함 — A 순번, B 단지명, C 동, D 호, E 전용면적, I 조정년월, P 임대료, Q 부가세, R 연체료, AF 납부방법(
RfeEdt.vue:260-277) - 확장자 검사가
includes('xlsx')라"xlsx_백업.pdf"같은 파일명도 통과함(관리비는endsWith) - 문자 칸은
^[ㄱ-ㅎ|가-힣|a-z|A-Z|0-9|]+$만 허용 → 공백·괄호·하이픈이 들어가면 오류로 잡힘 - 연체료 셀이 표시된 행이 미납 행이고, 오류·스킵·미납 판정은 렌더링된 표의 CSS 클래스를
querySelectorAll로 훑어서 함(DOM 의존)
- 엑셀을 올리면 시트 목록이 나오고 그중 하나를 고름. 고른 시트를
- 저장
- 컨트롤러 필수값이
rgprId;rentalExcelUploadDtoList둘뿐임 —clmYm·sbdId가 빠져 있음 ON CONFLICT (clm_ym, sbd_id, hsh_id) DO UPDATE구조라 엑셀의 동·호가 세대 마스터에 없으면 조인에서 조용히 빠짐- 서비스가 결과값을 무조건 1로 세팅함(
RentalServiceImpl.java:103) → 0건이어도SQI0000성공 - 트랜잭션이 없음 → 기본 데이터는 들어가고 미납만 실패하는 반쪽 저장 가능
- 컨트롤러 필수값이
- 양식 다운로드는 없앰 — 주석 “와이즈 시스템에서 다운로드 그대로 업로드 하는 방식으로 변경”(
RfeEdt.vue:370-377)..env의VUE_APP_RFE_FORM_FILE_SEQ는 남아 있으나 쓰이지 않음. 관리비와 운영 절차가 다른 지점임 - 테이블 —
smah.TB_HSH_RFE_M,smah.TB_HSH_RFE_NPY_L(미납, 쓰기만 있고 조회·삭제 SQL이 없음 → 임대료를 지워도 미납이 남음),cmn.TB_HSH_M - 그 밖 — 미납년월 생성이
replace('-','')라 첫 하이픈만 지움. 목록은 등록률(%)을 주는데 중복 세대ID가 있으면 100%를 넘음. 삭제 SQL 주석이/* MngExpMapper.deleteRental */로 잘못 적혀 있음(Rental_Mapper.xml:255) - 로그 키워드 —
임대료 기본 데이터 등록 시작 - 건수:,임대료 등록 완료 - 성공,임대료 등록 중 오류 발생 :
전자투표
- 화면
/apt-mng/ervt/ErvtList·ErvtAdd·ErvtUpd·ErvtXpn(현황) ·ErvtRsl(결과). APIElecVoteController.java:46,75,107,142,177,214 - 핵심 규칙
checkElecVoteStatus()(ElecVoteServiceImpl.java:185-208)- 알림일시 ≤ 시작일시 ≤ 종료일시
- 시작일시가 현재보다 미래
- 위반 시
SQI0015&전자투표 - 수정·삭제·항목삭제는 DB 상태가
PRE(투표전) 일 때만 됨. 아니면SQI0013&전자투표
- 등록·수정
- 시퀀스
smah.tb_elc_vt_m_elc_vt_sn_seq로 번호를 먼저 받고 기본 1건 + 항목 N건을 저장함. 항목 번호는 1부터 다시 매김 - 상태는
'PRE'로 하드코딩해 넣음. 이 저장소 어디에도VT_SS_CD를 UPDATE 하는 SQL이 없음 →PRE → ING → CMP전이는 외부 시스템 소관임 - 수정은 기존 항목을 전부 지우고 다시 넣음. 설명(
VT_DESC)은 값이 있을 때만 UPDATE 해서 빈 값으로 지울 수 없음(ElecVote_Mapper.xml:247-249) - 투표 유형 값이
Y/N이 아니라'1'(단일 선택) /'2'(다중 선택) 임(컬럼명은VTR_MLTP_CHC_YN)
- 시퀀스
- 상세·차트 — 진행 차트는 항상 조회하고 상태가
CMP일 때만 결과 차트를 붙임. 투표중에는 결과를 볼 수 없음 - 확인된 결함 2건 — 아래 “알려진 이슈” 2·3번
- 그 밖
- 동 선택 투표의 차트가 비는 이유: 차트 SQL이
DNG_DS = #{bldId}로 동 구분값과 건물ID를 직접 비교함(ElecVote_Mapper.xml:83,104,153) - 삭제해도 진행·결과 테이블 데이터는 남음(기본·항목만 지움)
- 등록 확인 문구가 “{일시} 알림 이후 에는 수정/삭제가 불가 합니다.” 인데 실제 규칙은 “상태가 PRE가 아니면 불가 + 시작일시가 과거면 불가” 임
- 항목 개수 상·하한이 없음(0개면
SQI8000)
- 동 선택 투표의 차트가 비는 이유: 차트 SQL이
- 테이블 —
smah.TB_ELC_VT_M/_ITM_L(쓰기),_PGRS_L/_RSL_L(읽기),cmn.TB_HSH_M
DR(수요반응) 발령 현황
- 조회 전용임. LMC에 등록·수정·삭제 API가 없고 데이터는 외부 DR 시스템이 적재함
- 화면
/apt-mng/dr-goo-xpn/DrGooXpnList·DrGooXpnDtl. APIAutoDRController.java:48,78,110 - 핵심 규칙
- 목록은 발령 이력(
smah.TB_DR_GOO_L)이 기준임 → 발령·제어 이력이 없는 단지는 목록에 아예 안 나옴 - 제어 응답코드로 성공·실패를 하드코딩 분류함 —
'2000'성공 /'4004'기타오류 / 그 외 실패(AutoDR_Mapper.xml:27-30) - DR 유형
'22'국민DR /'31'LHDR /'32'지자체협력DR, 기간 단위'M'월별 /'Y'연별
- 목록은 발령 이력(
- 확인된 결함 — “DR 참여 횟수” 컬럼이 항상 빔(화면은
prtcptnNot, DTO에는ppdrPrtcptnNot/lhDrPrtcptnNot/lgcdrPrtcptnNot뿐), 상세 진입 시sbdId누락 팝업, 상세 표 페이징 불가 - 운영 — 값이 이상하면 LMC가 아니라 DR을 발령·정산하는 쪽 데이터를 봐야 함. “같은 단지가 여러 줄”은 기간별 그룹핑 때문임
- 테이블 —
smah.TB_DR_CTCTR_M·TB_DR_GOO_L·TB_ATDR_CONT_L·TB_DR_EXA_L
거점관리소 직원 계정 관리
- 하는 일 — 매입임대 거점관리소가 자기 관리소 직원(
FO_HW) 계정을 승인·잠금·삭제함. LMC에서 관리자 계정 상태를 바꾸는 유일한 화면임 - 화면
/apt-mng/fo-mgof-hw-mng/FoMgofHwMngList. APIFoMgofController.java:31,53,79 - 핵심 규칙
- 목록 쿼리가
rol_id='FO_HW'+fo_mgof_id=#{foMgofId}로 고정임(FoMgof_Mapper.xml:27-28) - 상태 변경 시 상태만 바꾸는 게 아니라 비밀번호 실패횟수를 0으로 되돌리고 만료일을 오늘+6개월로 다시 잡음(
FoMgofServiceImpl.java:61-62). 잠금(LCK) 때도 같음 - 삭제는
DELETE FROM cmn.tb_mngr_m물리 삭제이고 복구 불가임 - 표는 여러 행을 고를 수 있게 돼 있지만 2건 이상 고르면 “계정을 선택해주세요.” 가 뜸(실제로는 단건만 처리)
- “편집” 버튼은 아무 동작도 하지 않음(
FoMgofHwMngList.vue:159-161스텁) - 쿠키에
foMgofId가 없으면(건설임대·본사 관리자) 목록이 영구히 빈 화면이 되고SQI0002만 돌아옴
- 목록 쿼리가
- 권한 구멍 — 컨트롤러·서비스에 대상 계정이
FO_HW인지, 내 소속인지 확인하는 코드가 전혀 없음.mngrId만 알면 다른 역할 계정도 상태 변경·물리 삭제가 가능함 - 수정자 아이디(
updrId)에 승인한 사람이 아니라 대상 계정의 아이디를 넣음(:65) → 누가 승인했는지 추적 불가 - 확인된 결함 — 아래 “알려진 이슈” 4번
- 테이블 —
cmn.tb_mngr_m(조회·삭제, 상태 변경은 JPACertEntity경유),cmn.TB_MNGR_LGN_L
단지 관리 (/sbd-mng)
단지관리 6개 컨트롤러(Construct / HomenetServer / Household / Fns / Wallpad / Opas)가 모두 같은 베이스 경로 /api/v1/complex 를 나눠 씀 → 6개 기능의 권한이 함께 움직임(공개노트/개발/모듈/LMC 관리자 웹 인증·권한 절 참고).
건축 정보 관리
- 화면
/sbd-mng/arc-inf/ArcInfList·ArcInfDtl·ArcInfUpd. APIConstructController.java:50,78,106,137,178 - 상세 조회 시
mngrInfoJSON을 파싱해 관리자 전화번호를 ARIA 복호화함. 실패하면-로 바꿔 내려줌(ConstructServiceImpl.java:107-126) → 전부-로 보이면 ARIA 키 불일치임. 로그 키워드연락처 복호화 실패 - 수정 화면 일부 항목은
SYS_MNGR역할에게만 보임 - 엑셀은 화면에서 고른 헤더를 그대로 보내는 동적 헤더 방식이고 상한 10000건(
SQI4010)임. 다만 다운로드가responseType:'blob'이라 초과 안내가 화면에 제대로 뜨지 않음 - 이 화면에서 담당자 전화번호를 평문으로 보지만 개인정보 취급 이력은 남지 않음(아래 데이터 절 참고)
- 수정 화면에서 승강기GW설치여부 칸에 승강기 호출제어 값을 담아 보내는 복붙 결함이 있음(
ArcInfUpd.vue:509). 에너지플랫폼 연계여부 값은 아예 전송되지 않음 - 로그인 관리자 범위 강제가 없음 — 클라이언트가 보낸 단지·지역본부 값을 그대로 씀
홈넷 서버 관리
- 화면
/sbd-mng/hnsvr-mng/HnsvrList·HnsvrDtl·HnsvrAdd·HnsvrUpd. APIHomenetServerController.java:46,74,105,136,168,200,232,266 - 등록
- 스마트홈 단지인지 먼저 확인함. 아니면
SQI0018&스마트홈 단지의 홈넷서버 - 신규 등록일 때만 비밀키를 25자 랜덤 ASCII로 서버가 생성함(
HomenetServerServiceImpl.java:110). 수정 시에는 기존 값을 복원해 유실을 막음 - 홈넷서버 ID는
{단지ID}-{순번}자동 채번임. 순번 포맷이 3자리라 한 단지에 1000번 이상이면 어긋남. 동시 등록 경합을 막는 잠금도 없음
- 스마트홈 단지인지 먼저 확인함. 아니면
- 연동 상태
- “연동 시험 시작” →
LNKG_XM_ST_YMD를 오늘로,HNET_LNKG_SS_CD를'ON'으로 바꿈 - “홈넷 서버 연동 시작” →
HNET_LNKG_ST_YMD(연동 시작 일자)만 기록하고 상태 코드는 건드리지 않음 → “눌렀는데 상태가 그대로”는 정상 동작임 - LMC 어디에도 상태를
'DC'(연결해제)/'SU'(중지)로 바꾸는 코드가 없음. 읽기 필터로만 쓰임 - 상태 전이 선행조건 검증이 전혀 없음. 연동 시험 없이 바로 “연동 시작”을 눌러도 막지 않고, 되돌리는 화면도 없음(DB 처리 필요)
- 두 API 모두 목록을 반복 처리하며 마지막 건 결과만 응답에 반영됨. 트랜잭션도 없음
- “연동 시험 시작” →
- 정상/연동이상 판정 — 목록의 “최종 홈넷 서버 상태”는
smah.TB_HNSVR_BRF_L에 최근 보고가 있는지로 계산함. 구간이DATE_TRUNC('hour', now) - 1시간 ~ now라 허용 창이 60~120분 사이에서 시각에 따라 흔들림. “연동이상으로 떴다 안 떴다 한다” 문의의 원인임 → 기본매뉴얼/운영/단지 연동 점검 - TLS 인증서는 업로드가 아니라 서버가 만들어 줌 → 기본매뉴얼/운영/홈넷 서버 연동 (인증서 발급)
- 상세 화면 “TLS 인증서 다운로드” →
/apicomn/fileDownload(taskDiv=TLS). 파일명SQISOFT_TLS_인증서_{단지명}_{단지ID}.zip - 서버는 최신 인증서 만료일을 보고 오늘이 만료일 이전이 아니면 그 자리에서 재발급함(
FileService.java:298-330).openssl셸 명령 3개 +zip1개를 순차 실행하고 키 4096bit, 유효기간 365일임 - CA 파일명에 연도가 박혀 있음(
lh-smah-ca-2024-*.pem) → CA를 교체하면 코드 수정이 필요함 - 보안 주의 — CA 개인키 패스프레이즈가 프로세스 커맨드라인 인자로 들어가고 명령 문자열 전체가
log.debug로 찍힘. 홈넷서버 IP·ID가 검증 없이 셸 문자열에 삽입됨(화면에 IP 형식 검증 없음) - zip 단계 실패는 검사하지 않고, 재발급할 때마다 옛 파일을 지우지 않음
- 상세 화면 “TLS 인증서 다운로드” →
- 보수 내역 —
cmn.TB_HNSVR_RPR_L. 삭제가 일련번호 단독 조건이라 다른 단지 보수내역도 지울 수 있음(HomenetServer_Mapper.xml:166-171) - 상세 화면이 홈넷 서버 Secret과 LH 플랫폼 Secret을 평문으로 보여주고 복사 버튼까지 둠(
HnsvrDtl.vue:81-103) → 화면 캡처·공유 시 주의 → 기본매뉴얼/운영/보안 점검 - 응답코드 주의 — 연동시험·연동 시작 실패가 둘 다
SQI0007&홈넷서버 연동시험시작이라 어느 버튼인지 구분이 안 됨 - 로그 키워드 —
홈넷서버 연동시험시작 중 오류 발생,홈넷서버 등록 및 수정 중 오류 발생,1./2./3. 개인키/인증서생성요청서/인증서 파일 생성 중 오류 발생. 연동 시작 종료 로그는HOMENETSERVER_LINK_NCSS_FIELD end!로 찍힘
세대 정보 목록·상세
- LMC에서 문의가 가장 많은 화면임. 화면
/sbd-mng/hsh-inf/HshList·HshDtl·HshUpd. APIHouseholdController.java:52,81,113,145,179 - 권한 범위 강제(이 도메인에만 있음) —
applyLoginManagerScope()(HouseholdServiceImpl.java:314-341)가 클라이언트가 보낸 단지·거점관리소 값을 무시하고 로그인 ID로 다시 조회해 덮어씀SBD_MNGR/MVIN_MNGR→ 본인sbdId+ 임대유형 /FO_MNGR/FO_HW→ 본인foMgofId+02+grpSn/ARA_HDQ_MNGR→ 본인grpSn/ 그 외 전국- 이어
checkAccessibleHousehold()가 범위를 다시 확인하고 아니면SQI1001&세대정보 - 건축정보·홈넷서버·층간소음·월패드·원패스는 이 검증이 없음. 커밋
02cf416f(2026-07-09)에서 세대 기능에만 추가됨
- 상세를 열면 세대의 앱 사용자 수만큼 개인정보 취급 이력을 남김(
useHshInf.js:36-53) - 세대정보 수정 — 안전서비스 세대와 주거약자 세대를 각각 업서트하는데 결과값을 두 번 대입해 두 번째 결과만 남음 → 첫 업서트가 0행이어도 성공으로 응답함
- 화면 라벨이
N=대상 /Y=미대상으로 뒤집혀 있음(useHshInf.js:24-27). 그런데 목록 검색 체크박스는'Y'를 “안전세대”로 보냄 → 목록 필터와 상세 라벨의 의미가 상충함 - 저장 후 목록으로 돌아갈 때 검색 조건이 유실됨
- 화면 라벨이
- 세대주 판정 — 주석은 “가입일시가 가장 빠른 1명 &&
COGO_SS_CD='REQ'”인데 SQL에는COGO_SS_CD='REQ'조건이 없음 - 테이블 — 읽기
cmn.TB_HSH_M·TB_USR_M·TB_COGO_H·TB_SFT_SVC_HSH_M·TB_RDS_HSH_M·TB_MOB_CONN_L·TB_HSH_TER_M
전입 승인 (커밋 73876693으로 흐름이 바뀜)
- 흐름
- 세대 상세에서 사용자 1명 선택 → “전입” → 확인창 “{동}동 {호}호 전입 하시겠습니까?”
PUT /api/v1/complex/modifyCogoSsCd를cogoSsCd='CNF'로 호출함(필수값cogoSsCd;usrId)- 컨트롤러가
CNF를 보고 별도 경로approveMoveIn()으로 분기함(HouseholdController.java:187-195) MoveInApprovalGuard.findTarget()이 로그인 관리자 상태가USE인지 확인하고 역할별 범위로 대상 세대·사용자·푸시토큰을 다시 조회함. 없으면SQI1001&입주 승인- 내부 API 주소·키를
cmn.tb_cstt_m에서 읽음. 비어 있으면 “입주 승인 연계 설정을 확인해 주세요. 관리자에게 문의해 주세요.” - APW에
POST {내부API}/api/smh/cogo/move-in호출(응답 20초·연결 3초·재시도 없음) → 공개노트/개발/모듈/APW 연계 서버 - 결과코드가
2000이면 성공. 이어 푸시POST {내부API}/api/smh/push(5초)로 “전출입 알림 / 입주 확인이 완료되었습니다.”를 보냄 - LMC는 이 경로에서 세대 상태·이력을 DB에 저장하지 않음. 주석 그대로 “APW가 계약과 함께 확정한다”
- APW 결과코드별 화면 문구(
HouseholdServiceImpl.java:98-130)
APW result_code | 관리자에게 보이는 문구 | 승인 |
|---|---|---|
2000 | 전입 승인과 알림 발송 요청이 완료되었습니다. | 성공 |
2000(푸시토큰 없음) | 전입 승인은 완료되었습니다. 알림을 받을 기기가 등록되어 있지 않아 푸시는 발송하지 않았습니다. | 성공 |
2000(푸시 실패) | 전입 승인은 완료되었으나 알림 발송을 확인하지 못했습니다. 승인 처리를 다시 요청하지 마세요. | 성공 |
5013 | 계약정보를 확인하지 못해 승인되지 않았습니다. 계약정보와 관리소 확인 처리 결과를 확인해 주세요. | 실패 |
5998 | 계약정보 조회에 실패해 승인되지 않았습니다. 연계 상태를 확인해 주세요. | 실패 |
4011 / 4017 / 5012 | 입주 승인 연계 요청이 거부되었습니다. 관리자에게 문의해 주세요. | 실패 |
| 그 외 · 무응답 · 타임아웃 | 승인 결과를 확인하지 못했습니다. 상세 화면에서 현재 상태를 확인한 후 처리해 주세요. | 결과 불명 |
- 성공(
SQI0000)일 때는 위 상세 문구가 화면에 안 보이고 프론트 자체 문구 “전입 되었습니다.”만 뜸 → “푸시는 발송하지 않았습니다” 같은 안내가 관리자에게 전달되지 않음 - 실패(
SQI0001)일 때는 서버 문구가 그대로 알림창에 뜨고 그 뒤 상세 재조회가 실행되지 않음(공통 2번) - 외부 호출은
@Transactional(propagation = NOT_SUPPORTED)로 현재 트랜잭션을 끊고 수행함 - 치명 결함 — 아래 “알려진 이슈” 1번
- 로그 키워드 —
입주 승인 응답 확인 불가,입주 승인 후 알림 응답 확인 불가,SMAH API 호출중 오류 발생
전출 · 반려
- 흐름 — 세대 상세에서 사용자 선택 → “전출”/“반려” →
PUT /api/v1/complex/modifyCogoSsCd(TRR/RJC) → 범위 검증 → 앱 역할을VSTR(게스트)로 강제하고cmn.TB_USR_M갱신 +cmn.TB_COGO_H에 이력 1건 → 내부 API 푸시 1건 modifyCogoSsCd는 이제RJC/TRR만 받음. 다른 값이면SQI0012&전출입 상태- 클라이언트가
rolId를 보내도 서버가 무시하고"VSTR"로 덮어씀 - 푸시는
http://localhost:8084/api/smh/push하드코딩 주소를 씀(HouseholdServiceImpl.java:288-289). 제목 “전출입 알림({usrId})”, 이벤트코드ION, 화면IDUI-000-000 - 푸시 응답은 검사하지 않고 결과값을 무조건 1로 둠 → 푸시가 실패해도 전출·반려는 성공 처리됨
- 확인된 결함 2건 — 아래 “알려진 이슈” 8번, 그리고 푸시 호출이 트랜잭션 안에서 타임아웃 없이 블로킹함(
HouseholdServiceImpl.java:302) → 내부 API 무응답 시 DB 커넥션을 붙잡고, 예외가 나면 상태 변경까지 롤백됨 - 전출·반려된 사용자는 앱 역할이
VSTR로 내려가 세대 기능을 못 씀. 되돌리려면 앱에서 다시 입주확인요청을 해야 함
스마트홈 연동 확인 모달
- 세대 상세의 “스마트홈 연동 확인” 버튼으로 여는 모달임. 건설임대(
mntnLsTpCd='01') 세대에만 보임 - 세대 단말기 상태 확인 —
GET /api/v1/complex/gateways(5초). 실패 시 “세대 단말기 상태 확인 중 오류 발생” - 세대 전입 상태 확인 —
GET /api/v1/complex/devices. 주석 그대로 “세대 전입 상태를 확인하는 API가 제공되지 않아 기기 목록 조회 API로 대체 구현”임. 응답코드2000→연결,2102→미연결, 그 외 →알수없음- 게이트웨이가 없으면
SFWException("게이트웨이를 찾을 수 없습니다.")를 던지지만 바로 아래catch(Exception)이 이를 삼켜 “세대 전입 상태 확인 중 오류 발생”으로 바뀜 → 원인 문구가 유실됨
- 게이트웨이가 없으면
- 세대 전출입 요청 —
POST /api/v1/complex/lhHouseholdEvent.cogoSsCd='CNF'면H1(전입), 그 외는H2(전출). 반려(RJC)도H2로 나감 - “연결 해제” 버튼이 통째로 주석 처리돼 있음(
HshCogoChkModal.vue:60-90) - 이 조회가 실패하면 LMC가 아니라 내부 API WAS ↔ 홈넷사 구간 문제임. 여러 번 눌러도 막는 장치가 없음 → 기본매뉴얼/관리사무소/세대 단말기 조회가 안 돼요
층간소음 기기 관리
- 화면
/sbd-mng/fns-dvc-mng/FnsDvcMngList·Dtl·Add·Upd. APIFnsController.java:38,67,99,132,165 - 등록·수정 시 기기ID + MAC 조합 중복 검사를 함. 중복이면
SQI0019. 수정에서는 기기ID나 MAC이 실제로 바뀐 경우에만 검사함 - 등록 시 단지ID+동+호로 세대ID·동ID를 찾아 넣음. 세대가 없으면 세대 연결 없이 등록됨
- 수정 시 아직 전송되지 않은 설정(
FRW_DTTM IS NULL)이 있으면 그 행을 갱신하고 없으면 새로 만듦 → “설정을 바꿨는데 반영이 안 된다”면FRW_DTTM부터 확인함 - 삭제 예외 코드가
SQI0008층간 소음 기기(구분자&가 빠져 메시지 치환이 깨질 수 있음,FnsServiceImpl.java:138) - 테이블 —
cmn.tb_nsba_dvc_m·_cont_h·_brf_h·_nc_h
세대 단말기(월패드) 관리
- 화면
/sbd-mng/wallpad-mng/WallpadList. APIWallpadController.java:48,76,107 - 교체 이력은 세대당 두 번째로 등록된 단말기부터 조회함
findWallpadInfo는 하드코딩된http://localhost:8084/api/smh/getHomenetServerGateways를 호출함(API 키만 상수 테이블에서 읽음, 타임아웃 없음)- 응답을
log.debug로만 찍고 화면에 돌려주지 않음. 성공하면 무조건 “세대 단말기 정보 조회가 완료 되었습니다.”만 뜸 → 화면 값이 그대로여도 정상 동작임(반영은 내부 API WAS가 DB에 쓰는 시점) - 확인된 결함 —
useWallpad.js:13이 월패드 Vuex 모듈을 층간소음 모듈 이름('sbd-mng-fns-dvc-mng')으로 등록함 → 층간소음 화면을 거친 뒤 월패드 화면에 들어가면 목록이 비어 보일 수 있음 - 월패드 상태
HSH_TER_SS_CD:00정상 / 그 외 이상
원패스(스마트원패스) 장치 목록
- 조회 전용임. 화면
/sbd-mng/opas-dvc-mng/OpasDvcList, APIGET /api/v1/complex/findOpasDvcList(OpasController.java:38) - 장치 상태
OPAS_DVC_SS_CD는 테이블 값이 아니라 최근 7일 내 사용 이력 유무로 계산함 → “살아 있는데 미사용”은 장애 표시가 아님 - 컨트롤러에 운영현황·설치현황·운용현황 엔드포인트 3개가 통째로 주석 처리돼 있음(
OpasController.java:59-114). 같은 지표는 대시보드(/api/v1/dsbd/findOpas*)로 옮겨 감 - 화면 컬럼 구성은 공개노트/개발/관리자시스템 원패스 기기 목록
제어 관리 (/cont-mng)
컨트롤러 2개(ControlController, ScheduleController)가 같은 베이스 경로 /api/v1/control 을 나눠 씀.
| 화면 | 경로 | 핵심 규칙 |
|---|---|---|
| 기기 제어 현황 목록 | /cont-mng/dvc-cont-xpn/DvcContXpnList | 성공여부 필터는 CONT_RSP_CD='2000' 기준. 기간이 YYYYMM 월 단위 전용이고 일 단위 조회 불가. 기본값 최근 1년 |
| 기기 제어 현황 상세 | DvcContXpnDtl | 기기유형 코드로 테이블명·컬럼을 ${} 문자열 치환해 조회함. 코드가 enum에 없으면 상세는 뜨고 기기속성만 빈값임 |
| 기기 제어 분석(홈넷사별) | /cont-mng/dvc-cont-anl/DvcContAnl 탭1 | sortDt='M' 월별 / 'Y' 연별. 정렬은 총건수 내림차순 |
| 기기 제어 분석(기기유형별) | 같은 화면 탭2 | 공통코드 IOT_DVC_TP_CD로 동적 피벗 컬럼을 만듦 |
| 기기 스케줄링 현황 | /cont-mng/dvc-schdl-xpn/DvcSchdlXpnList | 입주민이 앱에 등록한 예약을 조회만 함. 기간 필터 없음. 매입임대는 동 필터가 숨겨짐 |
| 기기 스케줄링 이력 | /cont-mng/dvc-schdl-hst/DvcSchdlHstList | sortDt='D' YYYYMMDD / 'M' YYYYMM |
- API를 직접 호출해
endDate를 빼면 조건이 NULL이 돼 0건이 나옴(Control_Mapper.xml:49-51) - 제어 상세 화면이
mntnLsTpCd를 보내지 않아 매입임대 건이 건설임대 경로로 조인돼 지역본부가 비거나 행이 누락될 수 있음(DvcContXpnDtl.vue:188) - 공통코드에 기기유형을 추가해도 화면 표·시리즈가 9종 하드코딩이라 새 유형이 보이지 않음(
DvcContAnlDvc.vue:57-66,160-171) - 스케줄 이력 조건이
hasText(startDate) and hasText(startDate)로startDate를 두 번 검사함 → 종료일 없이 시작일만 오면 0건임(Schedule_Mapper.xml:106) - 스케줄 이력↔마스터 조인 키가
RQ_USR_ID + CONT_HM이라 같은 사용자가 같은 시각에 2건 등록하면 행이 곱해지고 총건수가 부풀려짐 - 기기유형 9종과 대응 테이블은 공개노트/개발/모듈/LMC 결과 코드와 안내 문구
- 최근 수정 — 커밋
50e396a2(2026-09-04) “기기제어분석 차트 중복 및 IoT 집계 쿼리 수정”
이벤트 관리 (/evn-mng)
EventController와 SmsController가 같은 베이스 경로 /api/v1/event 를 나눠 씀.
이벤트 이력
- 화면
/evn-mng/evn-hst/EvnHstList, APIEventController.java:46 EVN_CD != 'NT008'이 하드코딩돼 있어 NT008 이벤트는 목록·코드목록·분석 차트에서 영구 제외됨(Event_Mapper.xml:31,127,172)- 기간 필터는 발생일시가 아니라 등록일시(
RGS_DTTM) 기준임(화면 라벨은 “수행기간”) - 조치내역 테이블을 조인만 하고 선택하지 않아 조치가 여러 건이면 목록 행이 중복될 수 있음
- 결함 — 화면이 “월별”에
YYYYMM을 보내는데 매퍼는 항상'YYYYMMDD'로 파싱함(Event_Mapper.xml:42) →202509가 2025-09-01로 해석돼 기간이 엉뚱해짐
이벤트 조치내역 등록
- 목록의 “조치내용보기” 버튼 → 모달
components/EvnActnHstModal.vue. APIEventController.java:74(조회) /:105(저장, 필수값actnrId;evnCaus;actnDtls) - 설계는
cmn.TB_EVN_ACTN_L업서트 후evnOccSn != 0이면cmn.TB_EVN_OCC_L.EVN_SS_CD를 갱신하는 것임 - 현재 동작이 설계와 다름 — 아래 “알려진 이슈” 6번. “저장 되었습니다.”가 떠도 목록의 이벤트상태가 그대로인 것이 현재의 정상 동작임
ON CONFLICT (EVN_OCC_SN)을 쓰므로 그 컬럼에 unique 제약이 필요함. 없으면 저장할 때마다SQI0006&이벤트 조치내역이 뜸
이벤트 분석 차트 · SMS 발송 내역
- 이벤트 분석(
/evn-mng/evn-anl/EvnAnl) — 화면 옵션이 일별·월별뿐이라 매퍼의 연별 분기는 도달 불가임. “월별”을 고르면startDate={연도}01,endDate={연도}12를 보내 사실상 1년치를 조회함. 이 쿼리만TB_EVN_OCC_L/TB_EVN_M을 스키마 접두어 없이 씀 → search_path가 바뀌면 이 화면만 깨짐 - SMS 발송 내역(
/evn-mng/sms-sndg-hst/SmsSndgHstList) — 조회 전용이고 기간 필터가 없음. LMC에 SMS를 직접 발송하는 화면은 없음 → 공개노트/개발/모듈/SMS 발송- 쓰기는 SMS 인증 발송 경로(
Sms_Mapper.xml:41-70)가 하고EVN_CD='CERT',RGPR_ID='LHM'을 하드코딩함 - “첨부이미지경로명” 컬럼이 항상 빔 — 화면 컬럼 키가
hoDs로 잘못 적혀 있음(실제 필드는atchImgPthNm)
- 쓰기는 SMS 인증 발송 경로(
헬스케어 (/hc) — 건강생활정보 컨텐츠 관리
- 화면
/hc/cnts-mng/CntsMngList·Dtl·Add·Upd. APIHealthController.java:45,74,106,143 - 저장은
hltLfInfSn이0이면 등록, 아니면 수정으로 필수값 검증이 갈림. 매퍼는ON CONFLICT (HLT_LF_INF_SN) DO UPDATE업서트임 - 매입임대 일괄 등록 — 임대유형
02+foMgofId가 있으면 그 거점관리소 산하 단지를 전부 조회해 단지 수만큼 INSERT를 반복함(HealthServiceImpl.java:61-81)- 산하 단지가 0건이면
SQI9000을 던지는데 바깥 catch가 다시 잡아 최종적으로SQI0006&컨텐츠로 바뀜. 원인은 로그에서만 확인됨
- 산하 단지가 0건이면
- 컨텐츠 유형이
HLTH(건강정보)면 지역본부·거점관리소·단지 입력행 자체가 숨겨짐(단지 없이 전사 공통 등록).SBD_MNGR/FO_MNGR/FO_HW계정은HLTH옵션 자체가 안 보임 - 삭제는 물리 DELETE임(
Health_Mapper.xml:99-104).DEL_YN컬럼이 있는데도 논리삭제를 안 함 → 복구 불가 - 미리보기는
window.open(url,'_blank','width=450, height=915')임(특정 단말 기준 하드코딩) - 확인된 결함 — 아래 “알려진 이슈” 5번, 그리고 상세의 “스마트홈 단지명”이 항상 빔(화면
hnetSbdNmvs 매퍼 별칭SBD_NM_SMART), 다건 삭제 시 마지막 1건이 0건이면 전체가 실패로 보고됨 - 테이블 —
hc.TB_HLT_LF_INF_M(이 도메인만hc스키마를 씀)
대시보드 (/dashboard)
지표 정의는 공개노트/개발/대시보드 세대수와 단지 현황.
- 어느 대시보드로 들어가는지(
views/dashboard/Dashboard.vue:45-65) — 건설임대(01)는sbdId가 있으면 SbdMngr, 없으면 LhMngr / 매입임대(02)는foMgofId가 있으면 FoMngr, 없으면 LhMngr / 그 외 LhMngr - 3개 화면 모두 30분 주기로 자동 갱신함. LhMngr는 갱신 시
sbdId/foMgofId를 다시 넣지 않아 일부 필터가 초기화되는 효과가 있음 - 위젯은 모두
GET /api/v1/dsbd/...임(컨트롤러DsbdController.java:47~727, 매퍼Dsbd_Mapper.xml1428줄)
| 위젯 | API | 기준 시점 | 주요 규칙 |
|---|---|---|---|
| 운영단지 현황 | findSbdStatus | 전일 | 매입임대는 원패스 설치 동 수, 건설임대는 HNSVR_OPR_YN로 기축·신축 카운트 |
| 상태별 신축·기축 차트 | findSbdStatusBld | 전일 | 매입임대 3단 드릴다운(시군구 → 거점관리소 → 지역본부) |
| 운영단지 현황(홈넷사별) | findSbdStatusFrm | 전일 | 화면 탭이 주석 처리돼 현재 호출되지 않음 |
| 앱 이용 지표 | findUseApp | 전일 | 가입률·접속률·제어율·제어성공률, nullif로 0 나눗셈 방지 |
| 안전지원 이벤트 합계 | findEventStatus | 금일 0시~현재 | EVN_TP_CD='SFN' 또는 EVN_CD IN ('NT008','NT009') |
| 안전지원 이벤트 차트 | findEventStatusCrt | condition별 | SGG·FOMGOF는 기간조건 없음, GRP·DAY는 금일, RPT는 최근 12개월 |
| 안전지원 이벤트 테이블 | findEventStatusTbl | 금일 또는 trgYm | reportYn='Y'면 월별 보고서 모드 |
| 앱·웹 가입/접속 현황 | findUserCrt | 어제·오늘 | 필수값 condition(APP/WEB) |
| AutoDR 현황 | findDrCrt | 올해 1/1~어제 | 발령중 판정은 DR_ED_TM IS NULL 또는 현재가 발령 구간 안 |
| 제어 현황 | findCtrlStatus | 금일(시간별) | reportYn='Y'면 최근 12개월 월별 |
| 관리비·임대료 등록 현황 | findFeStatus | 전일 | 관리비 위젯과 임대료 위젯이 같은 API를 각각 호출함(동일 쿼리 2회) |
| 단지 투표 현황 | findVtStatus | 금일 | VT_SS_CD='ING'만 집계 |
| 최근 입주단지 | findNewSbdList / findNewSbdCrt | 최근 31일 | LTL_MVIN_SBD_YN='Y' |
| 전출입 세대 현황 | findSbdCngStatus | 이번 달 1일~어제 | 일자별 전입·전출 + 누적합계 |
| 원패스 동작 현황 | findOpasRunStatus | 금일(시간별) | run_ty_cd 'A' 자동 / 'M' 수동 |
| 원패스 설치 현황 | findOpasIstlStatus | 누적 | 설치대상 = 출입문 수 |
| 원패스 운영 현황 | findOpasOprStatus | 누적 | 정상운영 = 최근 7일 이내 사용 기록이 있는 장치 |
| 승강기 호출 현황 | findElvCallStatus | 금일(시간별) | alog.tb_elv_gw_api_rq_l 스키마를 이 쿼리만 사용 |
- 대시보드 숫자와 목록 화면 숫자가 안 맞는 가장 흔한 원인은
smahAplFilter임(공통 4번). 홈넷 연동상태가DC/SU인 건설임대 단지는 집계에서 빠짐 - 대부분의 위젯이 전일·금일 기준 집계 테이블을 읽음. 집계 배치가 돌지 않으면 숫자가 멈춤. LMC에는 이 집계를 만드는 배치가 없음(아래 배치 절)
findSbdCngStatus/findOpasRunStatus/findOpasIstlStatus/findOpasOprStatus네 곳은 필수값 검사가 주석 처리돼 있어sbdId없이 호출하면 전국 집계가 나감- 안전지원 이벤트 모집단이 API마다 다름 — 합계·테이블은
SFN + NT008,NT009, 차트는SFN + RSN→ 합계와 차트 총합이 어긋날 수 있음 - 단지 투표율 계산에
nullif가 없어 전체세대수가 0이면SQI9000이 남(Dsbd_Mapper.xml:1178) - 앱·웹 통계 API 하나가 거대한 CTE 쿼리 3개를 순차 실행함(매퍼 452~1031줄). 대시보드가 느리면 이 쿼리를 먼저 봄
- 단지 정보 위젯에서 단지명을 수정할 수 있고, 저장은 건축정보 API를
dsbd:'Y'플래그로 재사용함
보고서 (/rpt)
- 화면
/rpt/opr-rpt/OprRpt/LhMngrRpt(LH 관리자용) ·SbdMngrRpt(단지 관리자용). 화면 제목은 “운영 보고서”, 문서 제목은 “통합운영 플랫폼 월간 보고서” 임 → 기본매뉴얼/운영/월간보고 작성 - 기본 조회월은 전월임. 표지 문구는 “{연도}년 {월}월 전국 운영보고서”, 다운로드는
html2pdf기반임 - 구성 API는 전부
GET /api/v1/report/...—findSbdStatus·findKpiStatus·findUseApp·findCtrlStatus(reportYn='Y') ·findEventStatusCrt(condition='RPT') ·findBldStatus·findCtrlBldStatus·findEventStatusTbl(reportYn='Y')(ReportController.java:51~280) - 보고서 숫자도
smahAplFilter를 타므로 홈넷 연동상태가DC/SU인 건설임대 단지는 빠짐 - 대상 월의 단지 현황은 그 달 안에서 가장 늦은
TRG_YMD한 건을 씀(Report_Mapper.xml:36-42) - 경영평가 성과지표는 독립 메뉴가 아니라 LH 관리자용 보고서 안의 두 표(“과년도 성과지표 관리” · “월별 운영 현황”)임. 상세는 공개노트/개발/경영평가 성과지표
reportYn은 건설/매입 필터가 아니라 “보고서 화면에서 부른 호출인가”를 알리는 보고서 모드 플래그임. 같은 쿼리를 대시보드(금일·시간별)와 보고서(월별·최근 12개월)에서 나눠 쓰려고 넣은 값이고, 쓰이는 곳은Dsbd_Mapper.xml6군데뿐임. 정의는lhmngr/dsbd/dto/req/DsbdReqDto.java:79
시스템 정보 (/sys-inf)
- 자료실(
ARC) · FAQ(FAQ) · 시스템 공지사항(ANN) 세 화면이 같은 API 2개를natTpCd만 바꿔 씀 —GET /api/v1/cert/findSystemList·findSystemDetail(CertController.java:640,673) - 이름은
findSystemList지만 서비스는findPublicSystemList()를 호출함. 2026-07-07 감사원 보안 조치 커밋(688f96eb/daa48de8)에서 공개용 조회를 분리하며 이렇게 됨 - 상세는 게시물 1건 + 첨부 N건 조인 결과에서 첨부만 모아
fileList로 묶고 첫 행만 반환함 - 상세유형(
natDtlTpCd) 옵션은 공통코드 전체를 받아 코드 접두어로 프론트에서 걸러냄(ARC*/ANN*/FAQ*) → 코드 네이밍 규칙이 깨지면 옵션이 사라짐 - 작성자 검색(
condition='W')이 조용히 무시되고 “등록자” 컬럼이 항상 빔 — 해당 분기와rgprId컬럼은 호출부가 없는 죽은 쿼리 쪽에만 있음(System_Mapper.xml:61-82) - FAQ 화면은 자동완성을 위해 진입할 때마다
pageSize:9999로 전체를 끌어옴 - 첨부파일 다운로드 경로가 두 개임
- 인증 필요
POST /api/v1/apicomn/fileDownload—taskDiv값RNTC/FIL/ANN/TLS로 저장 경로가 갈림. 필수값이 없어도log.error만 찍고 그대로 진행함(FileDownloadController.java:53-61) - 비인증(공개)
POST /api/v1/cert/fileDownload—taskDiv를 서버가'ANN'으로 강제 고정하고, 최종 경로가 공지 업로드 경로 하위인지 canonical path로 검증함. 위반 시 로그[SMAH-Framework] : 잘못된 파일 경로 접근 시도+SQI4004 - 시스템 공지 상세에
<!-- TODO 다운로드 API 확인후 수정(taskDiv 값 확인 필요) -->주석이 남아 있음(SysNcDtl.vue:18). 공지(ANN) 첨부를FIL경로로 요청하면 파일을 못 찾음
- 인증 필요
- 잔재 —
SystemController.java는@RequestMapping("/api/v1/system")만 있고 엔드포인트가 하나도 없는 빈 컨트롤러임
외부 연동
LMC는 홈넷사·FCM·SMS 게이트웨이·LG ThinQ·삼성 SmartThings·에너지플랫폼·바로처리를 직접 호출하지 않음. 전부 SMAH 내부 API WAS에 위임하고 계약 관련 승인만 APW로 보냄 → 공개노트/개발/시스템 구성
| 대상 | 호출 방식 | 주소 출처 | 인증 | 타임아웃 |
|---|---|---|---|---|
| SMAH 내부 API WAS | Spring WebClient(동기 block) | 상수 SMAH_INTERNAL_API_WAS_ADR, 일부는 코드에 박힌 http://localhost:8084 | 헤더 ApiKey 에 상수 SMAH_INTERNAL_API_KEY 값을 실음 | 5초 / 20초 / 없음 혼재 |
| APW(입주 승인·푸시) | WebClient(CogoMoveInClient) | 상수 SMAH_INTERNAL_API_WAS_ADR | 헤더 ApiKey | 승인 20초 · 푸시 5초 · 연결 3초 · 재시도 없음 |
APW 이벤트(/api/lmw/event) | WebClient | 설정 lh.smah.apw.protocol·domain·port | 헤더 ApiKey | 없음 |
- 내부 API 주소와 키는 설정 파일이 아니라 DB 테이블
cmn.tb_cstt_m(상수)에서 읽음(ApiComnService.java:282-286). 값이 없으면SQI0002가 남 - 프로필별 APW 대상은 local
localhost:8084/ dev[IP]:8094(개발 서버 직접) / prodhomez-api.lh.or.kr:8094(LB) 임
호출 지점 전체
| 호출 | 경로 | 트리거 | 타임아웃 | 실패 시 |
|---|---|---|---|---|
| 입주 승인 | POST {내부API}/api/smh/cogo/move-in | 세대 상세 “전입” | 20초 / 연결 3초 | 결과코드별 안내 문구, 재시도 없음 |
| 입주 승인 푸시 | POST {내부API}/api/smh/push | 승인 성공 직후 | 5초 | 승인은 성공 유지 |
| 전출·반려 푸시 | POST http://localhost:8084/api/smh/push | ”전출”/“반려” | 없음(무한 대기 가능) | 검사하지 않음 |
| OTP SMS 발송 | POST http://localhost:8084/api/smh/sms | 가입·비밀번호 재설정 | 없음 | SQI1009 |
| 세대 게이트웨이 조회 | GET {내부API}/api/smh/gateways | 스마트홈 연동 확인 | 5초 | ”세대 단말기 상태 확인 중 오류 발생” |
| 세대 기기목록 조회 | GET {내부API}/api/smh/{세대ID}/devices | 스마트홈 연동 확인 | 5초 | ”세대 전입 상태 확인 중 오류 발생” |
| 세대 전출입 이벤트 | POST {내부API}/api/smh/lhHouseholdEvent | 연동 확인 모달 | 5초 | ”전입 및 전출(lh2hn) 중 오류 발생” |
| 홈넷서버 게이트웨이 조회 | GET http://localhost:8084/api/smh/getHomenetServerGateways | ”세대 단말기 정보 조회” | 없음 | SQI9000 |
| APW 공지 이벤트 | POST {apw}/api/lmw/event | 없음(호출부 없음) | 없음 | - |
공통 클라이언트
comn/webclient/service/SmahWebClientService.java— 응답 5초, 연결 타임아웃 미지정,proxyWithSystemProperties()사용, 매 호출마다 WebClient를 새로 만들어 커넥션 풀이 재사용되지 않음lhmngr/household/client/CogoMoveInClient.java— 타임아웃이 제대로 설정된 유일한 클라이언트임(승인 20초 / 푸시 5초 / 연결 3초,disableRetry(true))- 외부 응답코드 —
2000정상 /2102미연결 /4004DR 기타오류 /4011·4017API 키 문제 /5011세대정보 없음 /5012필수 파라미터 누락 /5013계약정보 확인 실패 /5998·5999서버 오류 - 홈넷 세대 이벤트 코드 —
H1전입(cogoSsCd='CNF') /H2전출(그 외, 반려도 여기로 감) ApwApiResCode.findCode()가 코드가 아니라 메시지를 돌려주는 결함이 있음(현재 호출부 없음)
스케줄·배치 — 해당 없음
- 백엔드 전체에
@Scheduled·@EnableScheduling· Quartz ·TaskScheduler가 하나도 없음(build.gradle에도 스케줄러 의존성 없음) - LMC는 배치를 돌리지 않는 순수 요청-응답 웹 애플리케이션임. 메뉴의 “기기 스케줄링 현황/이력”은 입주민이 앱에 등록한 예약을 조회만 하는 기능임
- 다만 화면·보고서는 다른 시스템이 채우는 집계 테이블에 크게 의존함 → 공개노트/개발/모듈/통계 배치 서버, 공개노트/개발/모듈/통계 집계 DB 함수
| 집계 테이블 | 쓰는 화면 |
|---|---|
cmn.tb_sbd_opr_dly_y · cmn.tb_bld_opr_dly_y | 운영단지 현황, 동별 현황, 최근 입주단지 |
cmn.tb_app_us_dly_y | 앱 이용지표, 보고서 가입·접속 현황 |
cmn.tb_app_jn_conn_* · cmn.tb_web_jn_conn_* · cmn.tb_fo_jn_conn_* | 앱·웹 통계 |
cmn.tb_iot_cont_dly_y / _hly_y | 제어 현황, 기기 제어 분석 |
cmn.tb_dr_dly_y | AutoDR 현황 |
cmn.tb_cogo_hsh_dly_y | 전출입 세대 현황 |
cmn.tb_mngexp_rfe_rgs_dly_y | 관리비·임대료 등록 현황 |
cmn.tb_kpi_pfm_y | 경영평가 성과지표 |
- LMC가 값을 바꾸지 않아 외부 처리에 의존하는 상태값 — 전자투표
VT_SS_CD(PRE→ING→CMP), 홈넷 연동상태의DC·SU, 전입 승인 이후의 세대 상태(APW가 확정)
데이터
스키마
| 스키마 | 용도 |
|---|---|
cmn | 공통·마스터·집계·이력(대부분) |
smah | 스마트홈 업무 데이터(제어·투표·DR·관리비·임대료) |
hc | 헬스케어 컨텐츠 |
alog | 승강기 API 요청 로그(tb_elv_gw_api_rq_l 하나만 사용) |
쓰기가 일어나는 테이블
| 테이블 | 용도 | 쓰기 시점 |
|---|---|---|
cmn.tb_mngr_m | 관리자 계정 | 가입·비밀번호·상태변경·물리 삭제 |
cmn.tb_mngr_lgn_l / tb_mngr_refsh_tkn_m | 로그인 이력 / 리프레시 토큰 | 로그인·갱신 시 |
cmn.tb_sys_conn_l | 시스템 접속 내역 | 메뉴 이동할 때마다 |
cmn.tb_inif_trt_l | 개인정보 취급 내역 | 세대 상세 조회 시 |
cmn.tb_usr_m / cmn.tb_cogo_h | 앱 사용자 / 전출입 이력 | 전출·반려 시 |
cmn.tb_hnsvr_m / _rpr_l / cmn.tb_tlscrtf_pblc_l | 홈넷서버 / 보수내역 / 인증서 발급 이력 | 등록·수정·재발급 |
cmn.tb_nsba_dvc_m / _cont_h | 층간소음 기기 / 설정 | 등록·수정·삭제 |
cmn.tb_sft_svc_hsh_m / cmn.tb_rds_hsh_m | 안전서비스 / 주거약자 세대 | 업서트 |
cmn.tb_rsd_annc_fcts_l / cmn.tb_ahfl_m | 입주민 공지 / 첨부 | 등록·수정·삭제 |
cmn.tb_evn_actn_l | 이벤트 조치 이력 | 저장 시(상태 연결은 현재 끊겨 있음) |
cmn.tb_sms_sndg_l | SMS 발송 이력 | 인증 SMS 발송 시 |
smah.tb_hsh_mngexp_m / _ext_itm | 세대 관리비 / 추가항목 | 업로드·삭제 / 전삭제 후 재삽입 |
smah.tb_hsh_rfe_m / _npy_l | 세대 임대료 / 미납 | 업로드·삭제 / 쓰기만 있고 조회·삭제 없음 |
smah.tb_elc_vt_m / _itm_l | 전자투표 기본 / 항목 | 등록·수정·삭제 |
hc.tb_hlt_lf_inf_m | 건강생활정보 컨텐츠 | 등록·수정·물리 삭제 |
읽기 전용 마스터·집계 테이블 전체 목록은 raw/코드분석/LMC-2.md 10.2에 있음.
개인정보 취급 내역(cmn.tb_inif_trt_l)
- 적재 SQL
mapper-rdb/user/User_Mapper.xml:63-81, 경로POST /api/v1/user/inputUserRecord→UserService.inputUserRecord - 유일한 호출 지점은 세대정보 상세 화면 하나뿐임. 세대 상세를 열면 그 세대의 앱 사용자 수만큼 1건씩 기록함(
useHshInf.js:36-53) - 취급자 접속 IP는 서버가 요청 헤더에서 추출해 채움
- 주의
inifTrtTpCd가'R'(조회)로 고정돼 있어 수정·출력·삭제 등 다른 유형은 기록되지 않음picId·inifOwnrId·rgprId를 클라이언트가 보낸 값 그대로 저장함(SecurityContext 로그인 ID로 덮어쓰지 않음). 컨트롤러 필수값 검사도 주석 처리돼 있음- 건축정보 상세에서 담당자 전화번호를 복호화해 보여주는 것은 기록되지 않음
- 입주민 앱 서버(MAW)도 이 테이블에 적재하지 않음(2026-09-18 확인, MAW 코드 전체 검색 0건). 이 테이블에 쓰는 시스템은 현재 LMC 하나뿐임. 입주민이 앱에서 자기 정보를 보는 것은 여기 남지 않음 → 공개노트/개발/모듈/MAW 세대·헬스케어 API
- 함께 보는 이력: 시스템 접속 내역
cmn.tb_sys_conn_l(메뉴 이동마다 1건) → 기본매뉴얼/운영/보안 점검
이번에 확인된 상태·구분 코드
공개노트/개발/모듈/LMC 결과 코드와 안내 문구의 상태·구분 코드 표에 합쳐 둠. 이 페이지에서만 쓰는 값은 아래와 같음.
| 구분 | 값 | 뜻 |
|---|---|---|
그룹 구분 GRP_DS_CD | ARA | 지역본부 — 화면에는 이 값만 노출(하드코딩) |
공급유형 SPL_TP_CD | 14 / 15 | 국민임대 / 영구임대(대시보드 단지정보 하드코딩) |
대시보드 차트 condition | SGG / FOMGOF / GRP / DAY / RPT | 시군구 / 거점관리소 / 지역본부 / 시간 / 월 |
프로그램 구분 코드 pgmDsCd
- 설정 값은
LHW이고 local·dev·prod 세 프로필 모두 같음(resources-*/application.properties:2) - 다만 이 설정을 읽는 자바 코드가 없음. 실제로는 매퍼 SQL에 문자열
'LHW'가 직접 박혀 있음(ApiComn_Mapper.xml:22,50) - 결론: 설정 파일 값을 바꿔도 동작이 달라지지 않음. SMC는 같은 자리에
SYS를 씀 → 공개노트/개발/모듈/SMC 통합운영시스템
알려진 이슈
심각도는 운영 영향 기준임. 근거는 모두 코드에서 확인한 사실이고, 확정이 아닌 것만 “추정:“으로 표시함.
지금 기능이 안 되거나 잘못 동작하는 것
| # | 심각도 | 증상 | 근거 |
|---|---|---|---|
| 1 | 치명 | 전입 승인 시 “시스템 오류입니다”가 뜰 수 있음 | HouseholdMapper.findMoveInApprovalTarget(HouseholdMapper.java:26)의 SQL이 어느 매퍼 XML에도 없음 → MyBatis BindingException → AOP 미포착 → HTTP 500. 관련 테스트 MoveInApprovalMapperSqlTest.java:57-61도 실패 상태임. 추정: 매퍼 XML이 빠진 미완성 커밋(배포본에 다른 파일이 들어갈 가능성이 있어 아래 확인 필요 ①에 올림) |
| 2 | 치명 | 전자투표 삭제 버튼을 누르면 무조건 “시스템 오류입니다” | 삭제 필수값이 elcVtSn 하나뿐인데 checkElecVoteStatus()가 Long.parseLong(vtStDttm)을 먼저 수행 → NumberFormatException. ApiResidentsNoticeNecessaryFieldConstants.java:71, useErvt.js:72, ElecVoteServiceImpl.java:189 |
| 3 | 치명 | 전자투표 수정 화면의 저장이 눌리지 않음 | ErvtUpd.vue:283이 선언되지 않은 변수 inputErvt를 참조 → ReferenceError로 저장 함수가 즉시 중단됨(등록 화면에서 복사하며 생긴 실수) |
| 4 | 치명 | 거점관리소 직원 계정 승인·잠금 시 “수정 요청 대상 데이터가 존재하지 않습니다”(SQI0004) 팝업. 새로고침하면 상태는 바뀌어 있음 | JPA 저장은 성공하지만 결과값을 채우는 줄이 주석 처리돼 있어 반환값이 항상 -1 임(FoMgofServiceImpl.java:66-67) → resFlag > 0 거짓 → SQI0004 → 프론트가 알림창을 띄우고 재조회를 건너뜀 |
| 5 | 치명 | 헬스케어 컨텐츠 수정 저장이 동작하지 않음(HLTH 외 유형) | CntsMngUpd.vue:264가 선언되지 않은 변수 selectedSbd를 참조 → 자바스크립트 오류로 API가 호출되지 않음 |
| 6 | 높음 | 이벤트 조치내역을 저장해도 이벤트 상태가 바뀌지 않고, 조치 팝업이 늘 빈 폼임 | 조회 결과 바인딩 4줄과 evnOccSn 전송이 주석 처리됨(EvnActnHstModal.vue:114-120,139-146) → 서버에서 evnOccSn=0이 되어 누를 때마다 새 조치 행이 생기고 EVN_SS_CD는 갱신되지 않음 |
| 7 | 높음 | DR 상세 화면에 들어가면 “필수 입력 파라미터 [sbdId] 값이 누락되었습니다.”가 뜨고 참여 표가 빔 | DrGooXpnDtlHshPrtcptn.vue:119-121이 initData()를 인자 없이 호출해 검색조건이 undefined가 됨 |
| 8 | 높음 | 전출·반려 이력(cmn.TB_COGO_H)의 세대ID가 항상 NULL, 동거인 수가 0 | cmn.TB_USR_M.HSH_ID를 NULL로 만든 직후에 그 값을 다시 읽어 이력에 넣는 순서 결함(Household_Mapper.xml:207-245). 매퍼 주석의 의도와 정반대로 동작함 |
| 9 | 높음 | 이벤트 이력을 “월별”로 조회하면 기간이 엉뚱해짐 | 화면은 YYYYMM을 보내는데 매퍼는 YYYYMMDD로 파싱(Event_Mapper.xml:42) |
| 10 | 중간 | 자료실·시스템공지의 작성자 검색이 무시되고 등록자 컬럼이 항상 빔 | findPublicSystemList에 condition='W' 분기와 rgprId 컬럼이 없음 |
| 11 | 중간 | DR “참여 횟수” 컬럼이 항상 빔, 상세 표 페이징 불가 | 응답 DTO에 prtcptnNot 필드가 없고 상세 쿼리가 총건수를 안 줌 |
| 12 | 중간 | SMS 발송 내역의 “첨부이미지경로명” 컬럼이 항상 빔 | 화면 컬럼 키 오타(SmsSndgHstList.vue:153) |
| 13 | 중간 | 헬스케어 상세의 “스마트홈 단지명”이 항상 빔 | 화면은 hnetSbdNm, 매퍼 별칭은 SBD_NM_SMART |
| 14 | 중간 | 월패드 목록이 비어 보일 수 있음 | Vuex 모듈을 층간소음 모듈 이름으로 등록(useWallpad.js:13) |
| 15 | 중간 | 공지사항 엑셀 다운로드가 15건만 나옴(화면 버튼은 없음) | 엑셀 전용 분기 미구현 |
| 16 | 중간 | 건축정보 엑셀 건수 초과 안내가 안 보임 | responseType:'blob' 이라 오류 본문을 해석하지 못함 |
| 17 | 낮음 | 기기 제어 분석에서 같은 달을 다시 골라 검색하면 반응이 없음 | 감시 대상 값이 바뀌지 않으면 재조회하지 않음 |
성공으로 보이지만 실제와 다를 수 있는 것
- 관리비 등록은 컨트롤러가 항상
SQI0014를 돌려줌 → 0건이어도 “저장 되었습니다.”가 뜸. 실제 건수는 응답 메시지의 숫자로만 확인됨 - 임대료 등록은 서비스가 결과값을 무조건 1로 세팅함 → 0건이어도 성공임
- 세대정보 수정은 두 업서트 중 두 번째 결과만 남김
- 홈넷서버 연동시험·연동 시작은 목록을 반복 처리하며 마지막 건 결과만 응답에 반영함
- 헬스케어 다건 삭제는 마지막 1건이 0건 삭제면 전체를 실패로 보고함
- 전출·반려 푸시는 성공 여부를 검사하지 않음
트랜잭션이 없어 부분 저장이 생길 수 있는 곳
- 임대료 등록(기본은 들어가고 미납만 실패 가능)
- 관리비 추가항목(전체 삭제 후 재삽입인데 트랜잭션 없음 → 추가항목이 전부 사라질 수 있음)
- 공지사항 삭제(DB 행 삭제 후 첨부 파일 삭제 실패 시 물리 파일만 고아로 남음)
- 홈넷서버 연동 상태 반복 처리
권한·보안 주의
- 서버측 범위 검증이 세대(Household) 기능에만 있음. 건축정보(엑셀 포함)·홈넷서버·층간소음·월패드·원패스·관리비·임대료·공지사항은 클라이언트 값을 그대로 씀
- 입주민 공지 수정·삭제 시 백엔드가 작성자를 검사하지 않음 → API 직접 호출로 남의 공지를 고칠 수 있음
- 거점관리소 직원 계정 상태 변경·삭제에 역할·소속 검증이 없음 →
mngrId만 알면 다른 역할 계정도 상태 변경·물리 삭제 가능 - 홈넷서버 보수내역 삭제가 일련번호 단독 조건임 → 다른 단지 내역도 지울 수 있음
- 홈넷서버 상세 화면이 홈넷 Secret과 LH 플랫폼 Secret을 평문으로 노출하고 복사 버튼을 둠
- TLS 인증서 재발급 시 CA 개인키 패스프레이즈가 프로세스 인자로 들어가고 명령 문자열 전체를
log.debug로 남김. 홈넷서버 IP·ID가 검증 없이 셸 명령에 삽입됨 - 개인정보 취급 내역의 취급자·대상자 ID를 클라이언트 값 그대로 저장함(필수값 검사도 주석 처리)
- 파일 다운로드(인증 경로)에서 필수값이 없어도
log.error만 찍고 그대로 진행함 - 개선 이력: 커밋
688f96eb/daa48de8(2026-07-07 감사원 조치, 공개 게시물 조회 분리 + 경로 조작 방어),4bd69924(리프레시 토큰 검증 강화),02cf416f(세대 조회·승인 범위 검증 추가)
주석 처리된 검증 (지금 동작하지 않는 규칙)
| 위치 | 주석 처리된 것 | 영향 |
|---|---|---|
useRsdNc.js, RsdNcAdd.vue, RsdNcUpd.vue 5군데 | 알림 등록 일시 이후 공지 수정·삭제 금지 | 앱에 이미 나간 공지도 수정·삭제됨 |
EvnActnHstModal.vue:114-120,139-146 | 조치내역 조회 결과 바인딩, evnOccSn 전송 | 조치 이력이 이벤트에 연결되지 않음 |
DsbdController.java:583,616,649,682 | 대시보드 4개 API의 sbdId 필수값 검사 | 단지 지정 없이 호출하면 전국 집계가 나감 |
UserController.java:259-261,294 | 개인정보·접속 이력 필수값 검사 | 검증 없이 적재됨 |
HshCogoChkModal.vue:60-90 | 월패드 “연결 해제” 버튼 | 해제 기능이 화면에 없음 |
OpasController.java:59-114 | 원패스 운영·설치·운용 현황 API 3개 | 대시보드로 이관됨 |
LhMngrAllOprSbdXpn.vue:183-191 | 대시보드 “홈넷사별” 탭 | findSbdStatusFrm 미사용 |
FoMgofServiceImpl.java:67 | 결과값 대입 | 위 4번의 원인 |
libs/axios.js:9 | 전역 타임아웃 | 프론트 타임아웃 무제한 |
하드코딩된 값 (바뀌면 코드 수정이 필요한 것)
| 값 | 위치 | 의미 |
|---|---|---|
'LHW' | ApiComn_Mapper.xml:22,50 | 프로그램 구분(설정 대신 SQL에 박힘) |
'ARA' | Common_Mapper.xml:29,48 외 | 지역본부만 노출 |
grp_sn != 11 | Dsbd_Mapper.xml:1341,1361, lhMngrStoreModule.js:54,98 | 특정 그룹 제외 |
http://localhost:8084 | HouseholdServiceImpl.java:289, WallpadServiceImpl.java:82, CertService.java:428 | 내부 API 주소(상수 테이블 미사용) |
'NT008' 제외 | Event_Mapper.xml:31,127,172 | 이벤트 목록에서 영구 제외 |
lh-smah-ca-2024-*.pem | FileService.java:357 | 연도가 박힌 CA 파일명 |
| 25자 / 4096bit / 365일 | HomenetServerServiceImpl.java:110, FileService.java:355,357 | 홈넷 비밀키 길이, 키 길이, 인증서 유효기간 |
"M","6" | CertService, FoMgofServiceImpl.java:62 | 비밀번호 만료 +6개월 |
'동 호' / A~AK / B~BT | useMngexpExcelUtils.js | 관리비 엑셀 파싱 기준 |
A/B/C/D/E/I/P/Q/R/AF, 49 | RfeEdt.vue:260-275 | 임대료 엑셀 열 매핑 |
최근 6개월, pageSize 10 | 목록 화면들 | 격자 개월 수, 페이지 크기(서버 기본 15와 불일치) |
| 30분 | 대시보드 3종 | 자동 갱신 주기 |
UI-000-000 | HouseholdServiceImpl.java:276,152 | 푸시 화면ID |
로그에서 조심할 오타·오기
| 잘못된 문구 | 실제 | 위치 |
|---|---|---|
Excution Time | Execution | SQIFrameworkAspect.java:113 |
전자투표 목록 상세조회중 오류 발생 | 관리비 상세조회 | MngExpServiceImpl.java:50 |
/* MngExpMapper.deleteRental */ | RentalMapper | Rental_Mapper.xml:255 |
HOMENETSERVER_LINK_NCSS_FIELD end! | modifyHomenetServerLink end! | HomenetServerController.java:289 |
[홈넷서버 연동시험시작] 수정중 오류 | 연동시작 실패인데 연동시험 문구 | HomenetServerServiceImpl.java:150-151 |
attachement; filename= | attachment | AbstractExcel.java:111 |
'YYYY-MM-DD HH24;MI:SS' | 콜론이어야 함 | Dsbd_Mapper.xml:248,288,352 |
죽은 코드·미연결 엔드포인트
SystemController.java— 엔드포인트 0개인 빈 컨트롤러System_Mapper.xml의findSystemList/findSystemDetail— 호출부 없음(작성자 검색과 등록자 컬럼은 여기에만 있음)ResidentsNoticeMapper.findResidentsNoticeListForExcel— SQL 없음(호출하면BindingException)MngExpServiceImpl.uploadMngExp/RentalServiceImpl.uploadRental— 서버측 POI 파싱, 엔드포인트 없음utils/excel/ExcelUploadService와 검증기 9종 — 참조 코드 없음(엑셀 검증은 전부 프론트)/api/v1/code,/api/v1/menu,/api/v1/rolenauth,/api/v1/user의 대부분 — 대응 화면이 없음views/sbd-mng/opas-dvc-mng/OpasList.vue,views/evn-mng/sms-sndg-hst/SmsRcvHstModal.vue— 라우트 미연결·미구현
최근 커밋 (2026)
| 커밋 | 날짜 | 내용 |
|---|---|---|
73876693 | 09-16 | [LMC] 관리소 전입 승인 APW 연계 및 푸시 처리 — 이 페이지의 기준 커밋. 매퍼 XML 누락(이슈 1) |
e7c44b0a | 09-14 | 로그인 후 인트로 컨텐츠 이용 가능 |
50e396a2 | 09-04 | 기기제어분석 차트 중복 및 IoT 집계 쿼리 수정 |
99a19cbd | 09-03 | 임대료 상세 조회 오류 수정 |
5aba72e6 | 07-23 | 관리비 상세조회 시 삭제 세대 제외 |
4578cb0a / 5fc69e42 | 07-22 | 대시보드 매입임대 오류 수정 / 경로명 오타 수정 |
02cf416f / 4bd69924 | 07-09 | 입주민 조회·승인 범위 검증 추가 / 관리자 ID 조작 권한상승 차단 |
688f96eb / daa48de8 / ddb8f021 | 07-07 | 감사원 보안 취약점 조치 |
03a171d6 / 800a55ef | 07-06 / 06-29 | 관리비 등록 버그 수정(엑셀 파서) |
확인 필요
확인 필요
① 전입 승인 매퍼 SQL 누락 — 즉시 확인 필요 전입 승인이 쓰는 SQL 문장(
findMoveInApprovalTarget)이 저장소 어느 매퍼 XML에도 없음. 관련 테스트도 실패 상태임. 매퍼 XML이 빠진 미완성 커밋인지, 배포본에는 다른 파일이 들어가는지 개발팀 확인 필요. 이 상태로 운영에 나가면 전입 승인이 전부 “시스템 오류입니다”로 실패함.
확인 필요
②
FO_HW외 관리자 계정의RDY→USE승인 경로 LMC에서 관리자 계정 상태를 바꾸는 화면은 거점관리소 직원 계정 관리 하나뿐이고, 대상이 매입임대 거점관리소 직원(FO_HW)으로 고정돼 있음.FO_MNGR(관리소장) ·SBD_MNGR(건설임대 단지관리자) ·MVIN_MNGR(Q+매니저) ·ARA_HDQ_MNGR의 승인은 어디서 처리하는지(시스템관리자 웹인지 DB 직접 처리인지) 운영 담당자 확인 필요. 승인 API가 대상 계정의 역할·소속을 검증하지 않으므로, 이 화면으로 다른 역할 계정을 승인해 온 사례가 있는지도 함께 확인 필요.
확인 필요
③ 홈넷 연동상태
DC/SU로 바꾸는 주체 건설임대 단지가 대시보드·보고서에서 빠지는 기준이 이 두 값인데 LMC에는 이 값으로 바꾸는 코드가 없음. 어느 시스템·배치·수동 작업이 이 값을 바꾸는지 확인 필요. “단지가 갑자기 집계에서 사라졌다” 문의의 근본 원인 추적에 필요함.
확인 필요
④ 집계 테이블 적재 주체와 수행 시각 위 배치 절의 집계 테이블은 전부 LMC 밖에서 채워짐. 어느 시스템의 어떤 작업이 몇 시에 적재하는지 확인해야 “대시보드 숫자가 어제 것에서 멈췄다”는 문의에 답할 수 있음. 특히
cmn.tb_sbd_opr_dly_y,cmn.tb_app_us_dly_y,cmn.tb_kpi_pfm_y가 중요함.
확인 필요
⑤ 전자투표 상태(
VT_SS_CD)를 바꾸는 주체PRE→ING→CMP전이 SQL이 LMC에 없음. 앱 서버인지 배치인지 확인 필요. “투표 시작 시각이 지났는데 상태가 그대로”라는 문의가 이 경로와 직결됨.
확인 필요
⑥ 시스템 공지(ANN) 첨부가 실제로 어느 경로에 저장돼 있는지 시스템 공지 상세 화면에 “다운로드 API 확인 후 수정” TODO 주석이 남아 있음. 자료실은
FIL경로를 쓰는데 공지 첨부가ANN경로에 있다면 현재 공지 첨부 다운로드가 실패함. 서버의 실제 업로드 경로 확인 필요.
확인 필요
⑦ 안전세대 여부
Y/N의 업무 정의 세대 상세·수정 화면은N을 “대상”,Y를 “미대상”으로 표시하는데 목록 검색의 “안전세대” 체크박스는Y를 보냄. 둘 중 어느 쪽이 맞는 업무 정의인지 확인 필요. 지금은 운영자가 화면마다 반대로 읽을 수 있음.
확인 필요
⑧ 개인정보 취급 기록 대상 범위 취급 내역은 세대정보 상세 조회 한 곳에서만, 유형 “조회” 고정으로 남음. 건축정보 상세에서 관리사무소 담당자 전화번호를 복호화해 보여주는 것은 기록되지 않음. 기록 대상 범위가 이대로 맞는지 업무·감사 기준 확인 필요.
확인 필요
⑨ TLS 인증서 CA 교체 계획 인증서 재발급 명령이 파일명에 연도가 박힌 CA 파일을 참조함. CA를 교체하면 코드 수정 없이는 재발급이 실패함. 현재 CA 유효기간과 교체 계획 확인 필요.
확인 필요
⑩ 홈넷서버 ID 채번 한계 홈넷서버 ID 자동 채번의 숫자 포맷이 3자리임. 단지당 홈넷서버가 1000대를 넘으면 채번이 어긋남. 현재 최대 대수와 증설 계획 확인 필요.
관련
공개노트/개발/모듈/LMC 관리자 웹 공개노트/개발/모듈/LMC 결과 코드와 안내 문구 공개노트/개발/모듈/APW 연계 서버 공개노트/개발/경영평가 성과지표 공개노트/개발/대시보드 세대수와 단지 현황 공개노트/개발/관리비 등록 엑셀 파싱 공개노트/개발/관리자시스템 원패스 기기 목록 공개노트/개발/공지사항 미리보기 공개노트/개발/시스템 구성 기본매뉴얼/관리사무소/입주민 승인 처리는 어떻게 하나요 기본매뉴얼/관리사무소/관리비 등록이 안 돼요 기본매뉴얼/관리사무소/전자투표 항목이 삭제 수정이 안 돼요 기본매뉴얼/관리사무소/공지사항에 PDF 첨부가 안 돼요 기본매뉴얼/운영/보안 점검