역할
MAW(Mobile App WAS)는 입주민 앱(Android/iOS)이 호출하는 모든 REST API를 제공하는 서버임. 전체 그림은 공개노트/개발/시스템 구성.
- 받는 쪽: 앱 → Apache →
homez-m.lh.or.kr:8091→ MAW. 전 API가/maw/v1/...로 시작함 - 부르는 쪽: 단지별 홈넷서버, 이음(에너지플랫폼), LG ThinQ, 삼성 SmartThings, 승강기 플랫폼, NICE 본인인증
- 푸시·SMS 발송과 홈넷서버 토큰 조회는 직접 하지 않고 APW
/api/smh/*에 위임함. 공개노트/개발/모듈/APW 연계 서버 - MAW가 APW를 부르는 곳은 네 개뿐임 — 홈넷 토큰 조회, 푸시, SMS, 이벤트. APW 홈넷 프록시(
/api/proxy-homenet/**)를 부르는 코드는 MAW 전체에 없음(MAW 1~3편 전 범위 검색 0건). 기기 제어·승강기 호출·방문 내역·입출차·방문주차·에너지 목표량은 전부 MAW가 홈넷서버를 직접 호출함. 홈넷 프록시를 쓰는 것은 가전사 앱 쪽임 → 공개노트/개발/모듈/PIW 연계 서버 - 홈넷 토큰은 캐시하지 않고 홈넷 호출마다 APW에 한 번씩 요청함. 기기 목록 조회 1건에 토큰 조회 1회가 붙으므로 APW 부하를 볼 때 이 배수를 감안할 것
- 외부에서 들어오는 콜백: LG push 웹훅(
POST /maw/v1/web/callback/lge), 파트너 OAuth 콜백(GET /maw/v1/web/callback), 삼성 스마트앱 등록 해제(DELETE /maw/v1/web/callback)
회원가입·로그인·세대 승인 동작은 공개노트/기능/로그인과 세대 승인에 있음. 기기 제어는 공개노트/기능/우리집제어.
기술 스택
| 항목 | 값 |
|---|---|
| 프레임워크 | Spring Boot 2.7.0, Java 8, Gradle, war 패키징(maw.war), SqiEnergyFramework-2022 기반 |
| 영속성 | JPA(Hibernate) + QueryDSL + MyBatis 혼용 |
| DB | PostgreSQL smahdb. 스키마 cmn(공통·회원·세대), smah(업무), hc(헬스케어·날씨), alog(API 로그) |
| 포트 | 운영 WAS 8081 |
| HTTP 클라이언트 | Spring WebFlux WebClient |
| 인증 | JWT(jjwt) HS256. Access 15일 / Refresh 30일 |
| 캐시 | Redis(Lettuce + Sentinel 3노드) + 로컬 Caffeine |
| 설정 암호화 | jasypt. ENC[...]로 감싼 값만 복호화 |
| 전화번호 암호화 | ARIA 128bit 양방향. 저장 전 - 제거 |
| 비밀번호 | SHA-512, salt는 사용자 아이디 |
| 톰캣 | /usr/local/tomcat-maw/. 기동은 startup_proxy.sh(외부 호출이 Squid 프록시를 타야 하므로 startup.sh 아님) |
| 로그 | /app/logs/was/tomcat-maw/maw.log, maw_error.log (일별 롤링, 30일 보관). 기본매뉴얼/운영/WAS 로그 확인 |
빌드·프로필 규칙은 공개노트/개발/배포와 빌드 “WAS 빌드” 참고.
프로필별로 다른 값
| 키 | 운영에서 알아둘 점 |
|---|---|
spring.security.matchers.permitall | 인증 없이 허용할 URL 목록. 개발 프로필에만 목업 서버(/maw/v1/api/homenet/**, /maw/v1/api/lg/**)가 추가됨 |
oauth.partner.lge.simulator.enabled | LG 시뮬레이터(목업) 모드. 운영 false, 개발 true. 운영에 true가 들어가면 실제 가전이 안 움직임 |
partner.sbd-key.enabled | 단지별 LG API 키(cmn.tb_ptnr_sbd_d) 사용 여부. 운영만 true |
lg.api.business / lg.api.emp / lg.api.thinq | LG API 주소. 운영은 운영망, 개발은 테스트망 |
app.serverUrl | 자기 자신 호출 주소. NICE 본인인증 결과 수신 URL을 여기로 만듦 |
spring.jpa.show-sql | 운영 false |
wise.rent-fee.* | 어느 프로필에도 없어 기본값 DISABLED로 동작함 |
공통 응답 형식과 traceId
모든 API가 같은 형식으로 응답함.
{ "resCd": "SQI0000", "resMsg": "...", "resData": { }, "traceId": "usrId:20260916103000:uuid" }resCd의SQI0000이 성공임. 값이 null인 필드는 응답에서 빠짐traceId는{사용자ID}:{yyyyMMddHHmmss}:{UUID}형식임. 인증 전 요청은 앞자리에MAW,NICE,SAMSUNG_UNREGISTER같은 접두어가 들어감- 로그 패턴에
[traceId=...]가 들어감. 앱이 받은 traceId를 그대로 검색하면 해당 요청의 서버 로그를 바로 찾을 수 있음. 문의 응대 시 스크린샷에서 traceId를 받아 둘 것
인증·인가
토큰
- JWT HS256. Access 15일, Refresh 30일
- 클레임: 사용자ID, 역할(
rolId), 단지(sbdId), 세대(hshId), 동·호, 관리사무소, 시군구, 임대유형 - Refresh 토큰은 DB 테이블
cmn.tb_refsh_tkn_m에 저장함. Redis에 저장하지 않음(레디스 키 컨벤션 문서에는maw_auth:{userId}:refresh_token이 적혀 있으나 코드는 DB를 씀) - 헤더는
Authorization: Bearer {accessToken}
필터 두 개
- JwtAuthenticationFilter — permitAll 목록은 traceId만 남기고 통과. 토큰이 없으면
SQI2000, 유효하지 않으면SQI2001을 HTTP 401 +{"error":"SQIxxxx"}로 내려줌. 다른 API의{resCd, resMsg}형식과 달라 앱 파싱에 주의 필요. 로그 문구JWT 토큰이 없습니다.,JWT 토큰이 유효하지 않습니다. - ResidentAccessControlFilter — 우리집제어·세대업무·에너지·헬스케어·가족 승인 URL에 걸림. JWT의 역할·세대 값은 발급 시점 값이라 전출·세대원 제외 후에도 남으므로, 요청마다 사용자 아이디만 믿고 DB를 다시 봄
- 통과 조건: 사용자 상태
USE+ 전출입 상태CNF+ 역할HHDR+ 세대 연결 존재 + 그 세대가 삭제되지 않음 - 실패하면
SQI3001(403) 또는SQI3000(401). 로그 키워드입주민 권한 검증 실패 - 통과하면 DB 현재값으로 역할·세대·단지·동·호를 덮어써서 이후 처리에 넘김
- 통과 조건: 사용자 상태
전출·세대 제외 직후 앱이 예전 토큰으로 우리집제어를 부르면 여기서 403이 남. 앱이
POST /maw/v1/member/rotation으로 토큰을 회전시켜야 풀림. 공개노트/기능/로그인과 세대 승인
권한 매트릭스
역할-메뉴-기능 데이터(cmn.tb_rol_mnu_r 등)를 읽어 업무ID 단위(/maw/v1/{업무ID}/**)로 HTTP 메서드 권한을 검. C=POST, R=GET, U=PUT, D=DELETE 규칙임.
이 데이터는 기동 시 1회만 읽음. 권한 데이터를 바꾸면 WAS를 재기동해야 반영됨.
실제 사용하는 역할은 VSTR(가입 직후 방문자)과 HHDR(입주민) 둘뿐임.
예외와 응답 코드
| 상황 | HTTP | resCd |
|---|---|---|
| 입력값 검증 실패 | 400 | SQI8001 (로그 Validation Failed:) |
| 없는 URL | 404 | SQI9001 |
| 업무 예외 전반 | 500 | SQI9002 |
| 파트너(LG) 인증 만료 | 401 또는 500 | SQI2010(파트너 재로그인 필요) |
| 홈넷사 오류 | 500 | SQI9002. 로그에 [홈넷사 오류] result_code: ..., description: ... |
| 관리비 입력 오류 | 400 | SQI8001 (전용 처리) |
| WISE 임대료 오류 | 409/503/504/401/502 | 전용 처리 |
업무 예외가 전부 500 +
SQI9002로 뭉개짐. 앱 화면 문구만으로는 원인을 알 수 없고 반드시 traceId로 서버 로그를 봐야 함.SQI9002가 떴으면 로그에서[홈넷사 오류],SQIFrameworkException,홈넷사 API 처리 실패순으로 찾을 것.
로깅과 마스킹
- 모든 컨트롤러 호출을 AOP가 감싸 요청·응답·실행시간을
==== API Call Summary ====블록으로 남기고alog스키마에 감사 로그를 저장함 - 목업 컨트롤러와
CommonWebController(NICE 본인인증 화면·파트너 OAuth 콜백)는 AOP 대상에서 제외됨. 이 구간은API Call Summary로그가 없음 - 요청 헤더 중
authorization,cookie,set-cookie는******로 마스킹됨 - 개인정보·Base64 이미지가 로그를 덮지 않도록 응답 마스킹 애노테이션을 씀. 마스킹은 로그 사본에만 적용되고 실제 응답은 그대로 나감
- 외부에서 들어오는 콜백(
/maw/v1/web/callback/**등)은 역직렬화에 실패해도 raw 본문을==== External API Receive Log ====블록으로 남김 - 비동기 WebClient 호출 로그에도 traceId가 따라붙음
- SQL 로그는 운영에서 전부 꺼져 있음. SQL을 보려면 로그백 설정을 바꿔야 함
Redis·캐시
Redis는 Lettuce + Sentinel 구성이고, 키 이름은 용도별로 정해져 있음.
| 키 | 용도 | TTL |
|---|---|---|
oauth:{사용자ID}:{파트너ID} | 파트너(LG·삼성) OAuth 토큰 | 파트너 정책 |
SmartThings:{installedAppId} | 삼성 인증 정보. MAW는 읽기만 하고 쓰지 않음(삼성 커넥터가 심어 줌) | - |
maw_ctf:{요청ID}:request | 비상연락처 OTP 요청 | 180초 |
maw_ctf:{번호해시}:cooldown | OTP 재발송 쿨다운 | 60초 |
maw_ctf:...:10m / :daily | OTP 발송 횟수 제한(번호 10분 5회·하루 20회, 사용자 10분 10회·하루 30회) | 600초 / 익일 자정 |
로컬 캐시(Caffeine)는 공통코드·이벤트코드 두 종류이고 최대 1000개임.
로컬 캐시에 만료 설정이 없음(2026-09-18 코드 확인). 최대 개수만 두고
expireAfterWrite·expireAfterAccess를 설정하지 않음. 소스 주석의 “공통코드 60분 / 이벤트코드 30분”은 주석일 뿐 설정에 반영돼 있지 않음. 적재는 기동 시 1회뿐이고 캐시를 비우거나 다시 읽는 API도 스케줄도 없음. 따라서cmn.tb_cd_grp_m·tb_cd_dtl_m·tb_evn_m을 바꾸면 WAS를 재기동해야 반영됨. 층간소음 등급 이름이 빈칸으로 보이는 문의가 여기서 나옴. 반대로 DB 상수(cmn.tb_cstt_m)는 캐시하지 않고 호출할 때마다 읽음 → 외부 API 주소·키를 바꾸면 재기동 없이 즉시 반영됨.
DB 접근
- 복잡한 쿼리만 MyBatis 매퍼 6개(역할·권한, 공통코드, 메뉴, 사용자, 날씨)를 쓰고 나머지는 JPA·QueryDSL임
- 날씨는 테이블을 직접 읽지 않고 PostgreSQL 함수 3개(
cmn.sf_now_wthr_for_usr,sf_frcst_wthr_for_usr,sf_now_wthr_arqlt_for_usr)를 호출함. 앱에 날씨가 안 나온다는 문의는 MAW가 아니라 이 함수와 원천 데이터를 적재하는 공개노트/개발/모듈/SCW 스케줄러 서버를 먼저 볼 것
공통 기능 API
약관
GET /maw/v1/common/getServiceClausList(비로그인 가능)로 전체 목록, getServiceClausListByUsrId로 내 동의 여부가 붙은 목록을 줌. 필수 여부·동의 여부로 거르는 조회와 동의·동의해제 API가 따로 있음. 비밀번호 만료일을 함께 내려주는 조회도 있음.
앱 버전
GET /maw/v1/common/applicationVersion이 버전 목록을 내려줌. 서버에 강제 업데이트 판단 로직이 없고 앱이 목록을 받아 스스로 판단하는 구조로 보임.
앱 버전 행을 지우는 API(
POST /maw/v1/common/deleteApplicationVersion/{...})는 운영 설정의 비인증(permitAll) 목록에 실제로 들어 있음. 즉 로그인 없이 호출 가능한 경로임(2026-09-18 코드 확인). 다만 경로 템플릿의 변수 이름과 코드 파라미터 이름이 서로 다름. 그래서 추정: 호출하면 컨트롤러에 들어가기 전에 예외가 나 항상 500 +SQI9002로 떨어지고 실제 삭제는 일어나지 않음. 확인 방법 — 운영 로그에서앱 버전 삭제 시작 - dtlsSn :을 검색함. 찍힌 적이 없으면 컨트롤러 진입 전에 막힌 것이 맞음. 주의: 경로 변수 이름만 맞추면 비인증으로 실제 삭제가 가능해짐. 고치기 전에 비인증 목록에서 먼저 뺄지, API 자체를 없앨지 정해야 함(아래 “확인 필요”).
확인 필요
강제 업데이트 판단을 앱이 하는 구조가 맞는지 앱 담당자 확인 필요. 앱 버전 삭제 API를 ① 비인증 목록에서 뺄지 ② 경로 변수명을 맞출지 ③ 없앨지도 함께 정해야 함.
매뉴얼·알림센터·접속 로그
| API | 하는 일 |
|---|---|
GET /maw/v1/common/manuals | 고정 파일명 manuals.pptx를 첨부로 내려줌 |
GET /maw/v1/common/notification | 알림센터. 내 단지·세대·사용자로 발송된 푸시 이력(cmn.tb_push_sndg_l)을 보여줌. 공개노트/개발/push 알림 |
POST /maw/v1/common/saveMobileConnectLog | 앱 접속 기록(앱 버전·OS)을 저장함 |
첨부파일·이미지
공통 이미지·주차 사진·공지 첨부를 비로그인으로 내려주는 경로가 따로 있음(공지 첨부는 인증·열람권한을 다시 보는 버전도 있음).
이미지가 안 보인다는 문의는 ① 파일 공유 경로 마운트 ② 첨부 테이블에 행이 있는지 ③ URL의 http/https를 봄. 공지 첨부 URL은 서비스에서 HTTP를 HTTPS로 강제 변환하는 임시 코드가 들어 있음(소스 주석에 “추후 아파치에서 설정하고 제거해야함”). 파일이 디스크에 없으면 Could not read file: 로그와 함께 500이 남.
파트너사 OAuth 웹
LG·삼성 로그인 페이지 진입, OAuth 콜백 수신, 삼성 스마트앱 등록 해제 수신, LG push 웹훅을 이 구간에서 처리함. 파트너 가전 동작은 공개노트/기능/우리집제어, 푸시는 공개노트/개발/push 알림.
- LG push 웹훅은 무조건 HTTP 200으로 응답함. 성공·실패는 본문 코드
6200(성공) /6400(실패)로 구분함(LG 규격) - LG OAuth 토큰의 Redis 만료는 응답값이 아니라 설정값을 씀
- 삼성은 OAuth 코드 교환을 하지 않고 SmartThings 쪽이 Redis 키를 심어 주는 방식임
단지 찾기
/maw/v1/subdivision 아래에 시도 목록, 시군구 목록, 커서 기반 무한스크롤 단지 목록이 있음.
단지가 검색되지 않는다는 문의는 ① 단지 테이블(cmn.tb_sbd_m) 등록 여부 ② 수동 입력된 도로명주소 ③ 단지명 앞뒤 공백을 봄. 로그 키워드 단지 목록 조회 - , 단지 목록 조회 완료 - 조회: . 기본매뉴얼/관리사무소/단지 검색이 안 돼요
우리집제어(IoT) API
앱의 우리집제어 화면 전체가 컨트롤러 하나(/maw/v1/iot/**)로 들어옴. 승강기 호출만 /maw/v1/household/callElevator로 경로가 다르니 API를 찾을 때 주의할 것.
기능 동작과 응대 기준은 공개노트/기능/우리집제어, 공개노트/기능/승강기 호출, 공개노트/기능/스마트원패스에 있음. 여기에는 경로·코드·모듈 구조만 둠.
/maw/v1/iot/**는 ResidentAccessControlFilter 대상이라 요청마다 DB로 입주 상태를 재확인함. 전출·세대원 제외 직후 옛 토큰으로 부르면 SQI3001(403)이 남.
파트너 분기
요청 본문의 partnerId 하나로 처리 주체가 갈림. 공통 인터페이스는 findDeviceList / findDeviceInfo / controlDevice 세 가지뿐임.
partnerId | 처리 | 나가는 곳 |
|---|---|---|
homenet 또는 비어 있음 | 홈넷 서비스(기본값) | 단지별 홈넷서버 |
lge | LG 서비스 | LG ThinQ Business API |
sse | 삼성 서비스 | 삼성 커넥터(SmartThings). 공개노트/개발/모듈/SCI 삼성 커넥터 |
표에 없는 값이 오면 SQI9002, 이름으로 서비스 빈을 못 찾으면 SQI9004임.
API 경로
아래 경로는 전부 /maw/v1/ 아래임.
| 경로 | 하는 일 |
|---|---|
GET /iot/devices | 홈넷 기기 + 등록 가전 통합 목록 |
POST /iot/devicesInfo | 기기 상세(현재 상태 + 선택 가능 옵션) |
POST /iot/devicesControl | 기기 제어 |
GET /iot/findPartnerList | 제휴사 목록과 내 연동 상태 |
GET /iot/{partnerId}/devices | 파트너 계정에 붙어 있는 기기 |
POST /iot/inputDevice, modifyDevice, deleteDevice | 가전 등록·이름 수정·삭제(소프트 삭제) |
POST /iot/deletePartner/{partnerId} | 파트너 연동 해제 |
POST /iot/controlList | 가전 제어 내역 목록(커서 무한스크롤, 기본 15건) |
GET /iot/findSpaceInfo, POST /iot/inputSpaceInfo, modifySpaceInfo, deleteSpaceInfo | 공간(방) |
POST /iot/modifySchedule, GET /iot/findScheduleByDeviceId/{deviceId}, POST /iot/deleteSchedule/{scheduleNo} | 기기 예약 저장·조회·삭제 |
POST /iot/inputOnePassDiagnosis, GET /iot/findOnePassDiagnosisList | 원패스 진단 등록·조회 |
POST /iot/inputOnePassUseLog | 원패스 사용내역 등록 |
POST /household/callElevator | 승강기 호출 |
홈넷 기기 제어 내역을 조회하는 API는 없음. /iot/controlList는 가전(에어컨·세탁기·건조기·로봇청소기) 전용이고, 홈넷 제어 이력은 smah.tb_mrg_cont_l을 DB에서 직접 봄. 원패스 사용내역도 등록만 있고 조회 API가 없음.
IoT 응답 코드
| resCd | 뜻 |
|---|---|
SQI0000 | 성공 |
SQI0001 | 내 세대 기기가 아님(예약 등록·수정) |
SQI0002 | 데이터 없음 — 세대·홈넷서버·상수·파트너 인증정보·수정 대상 없음 |
SQI0003 | 이미 등록된 가전 |
SQI0005 | 삭제 대상 없음 |
SQI0010 | 파트너 인증 정보가 불완전함 |
SQI2010 | 파트너 재로그인 필요. 앱 문구 안전한 서비스 이용을 위해 파트너사 로그인이 다시 필요합니다. |
SQI2999 | 세대 단말기 미등록 |
SQI8000 / SQI8001 | 400. 파라미터 검증 실패 |
SQI9000 | 공간(방) DB 오류 |
SQI9001 | 요청의 actions[0].type이 규격과 다름(상세는 status, 제어는 control) |
SQI9002 | 그 밖의 모든 실패. 홈넷·LG·삼성·승강기 오류가 전부 여기로 뭉개짐 |
SQI9004 | 지원하지 않는 서비스 |
SQI9005 | 지원하지 않는 기기 타입 |
SQI9006 | 파트너 응답 데이터 없음 |
외부 호출 규격
| 대상 | 응답 타임아웃 | 인증 |
|---|---|---|
| 홈넷서버 | 3초 | Authorization: Bearer (토큰은 APW에서 매번 받아옴) |
| APW 홈넷 토큰 조회 | 3초 | ApiKey 헤더 |
| LG Business API | 3초 | X-Api-Key + 상황에 따라 Authorization |
| 삼성 커넥터 | 3초 | Authorization: Bearer (Redis에 심긴 값) |
| 승강기 플랫폼 | 10초 | X-API-KEY 헤더 |
- 전부 시스템 프록시(Squid)를 거쳐 나감. 응답 버퍼는 10MB로 올려 둠(방문 사진이 커서)
- 재시도는 LG의 401 한 번뿐임. 타임아웃·5xx에는 재시도가 없음
- 홈넷 호출의 요청·응답은
alog.tb_usr_svc_api_rq_l·tb_usr_svc_api_rsp_l, LG·삼성은alog.tb_smah_hmapp_api_rq_l, 승강기는alog.tb_elv_gw_api_rq_l에 남음 - LG 호출을 추적할 때는 MAW traceId가 아니라
X-Message-Id를 씀. 두 값이 다름
세대 업무·헬스케어·에너지 API
분량이 커서 별도 페이지로 뺐음 → 공개노트/개발/모듈/MAW 세대·헬스케어 API. 아래 경로 접두가 거기 담겨 있음.
| 경로 접두 | 담당 |
|---|---|
/maw/v1/household/** | 대시보드, 단말기, 방문 내역, 공지, 관리비, 임대료(DB·WISE), 전자투표, 입출차, 전기차, 방문주차, 주차 기록, 층간소음, 에너지 목표량, 날씨 |
/maw/v1/healthCare/** | 복약, 건강생활정보, 체중·혈압(V1/V2), 비상연락처 OTP, 비상호출, 안심서비스 |
/maw/v1/energy/** | 이음(EEP) 연동 에너지 화면 |
/maw/v1/autoDr/** | AutoDR 참여·대상기기·정산 |
이 네 경로도 전부 ResidentAccessControlFilter 대상임. 기능 설명은 공개노트/기능/헬스케어, 공개노트/기능/에너지와 이음 연동, 공개노트/기능/AutoDR.
미사용 코드
base 패키지는 프레임워크에서 그대로 가져온 것이라 쓰지 않는 기능이 섞여 있음. 코드가 있다고 실제로 쓰는 기능이 아님에 주의.
| 경로 | 상태 |
|---|---|
/maw/v1/favorite 즐겨찾기 | 인수인계 문서에 “현재 미사용”으로 명시됨 |
/maw/v1/menu 메뉴 | 미사용 |
/maw/v1/user 사용자 | 회원 API와 중복, 미사용 |
/maw/v1/apicomn, /code, /rolenauth | 공통코드·권한 조회. 권한 매트릭스 기준으로만 쓰임 |
api/homenet, api/partner 목업 컨트롤러 | 개발 프로필 전용 |
알려진 이슈
- 업무 예외가 전부 500/
SQI9002로 뭉개짐. 원인 파악에 traceId 검색이 필수임 - 리프레시 토큰 만료(
SQI2012)·잘못된 토큰(SQI2013)을 401로 바꾸는 처리가 주석 상태로 남아 있음(앱 배포 시점에 적용 예정이었음) - 앱 버전 삭제 API가 비로그인 허용 목록에 있음. 경로 변수명 불일치 때문에 지금은 실제 삭제가 안 되는 것으로 보이나(추정), 이름을 맞추는 순간 비인증 삭제가 열림. 위 “앱 버전” 절 참고
- 휴대폰 번호 변경이 초기 인터페이스 정의 때문에 일반전화 컬럼(
usr_tlno)에 저장됨(코드 주석에 명시) - NICE 본인인증이 암호화 키와 IV를 URL 쿼리스트링으로 주고받음(세션 저장 코드는 주석 처리됨). 로그에 URL이 남으면 키가 노출될 수 있음
- 공통코드·이벤트코드 캐시에 만료가 없음
- 즐겨찾기 컨트롤러만 traceId를 MDC가 아니라 직접 새로 만들어 씀
- 권한 데이터 변경이 재기동 전까지 반영되지 않음
- 레디스 키 컨벤션 문서와 실제 구현이 다름(리프레시 토큰은 DB 저장)
- 환기 제어 로그가 요청 전원값을
lock키로 읽음. 환기 기기에는lock속성이 없으므로smah.tb_vn_cont_l의 요청 전원 컬럼에는 사실상 항상 null이 들어감. 가스(lock) 저장 코드를 복사하면서 생긴 오타로 보이나 주석이 없어 의도 여부는 미확인 - 삼성 연동 해제에 10초 고정 대기(
Thread.sleep)가 들어 있음. 삼성 가이드가 “알림 발송 후 약 10초 뒤 스마트앱 제거 호출”을 요구해 넣은 코드이고 주석에10초 대기 (필수)로 적혀 있음. 비동기가 아니라 요청 처리 스레드를 그대로 붙잡으므로 해제 요청이 몰리면 톰캣 스레드가 잠김. 앱에서는 10초 이상 로딩으로 보임 - 로봇청소기 배터리 값이 없을 때
80을 하드코딩해 내려 줌. “배터리가 항상 80%로 보인다”는 문의의 원인임 - 제휴사 로고 URL이 코드 상수로 하드코딩되어 있음. DB 컬럼이 아니라 조회 쿼리에 박혀 있는 예시 도메인이라 실제 이미지가 없음. “제휴사 로고가 깨져 보인다”는 문의의 원인임
- 목업 컨트롤러(홈넷·LG)가 운영 산출물
maw.war에도 빌드되어 빈으로 등록됨. 운영 프로필에서는 비로그인 허용 목록에서만 빠져 있고 경로(/maw/v1/api/homenet/**,/maw/v1/api/lg/**)는 살아 있음. 운영 장애 조사 중 이 경로 접근이 보이면 실제 홈넷·LG 연동과 혼동하지 말 것. 홈넷 목업은 AOP 제외 대상이라API Call Summary로그가 없다는 점이 구분 단서임 - 승강기 플랫폼 호출 WebClient에 wiretap이 켜져 있어 요청·응답 본문이 평문으로 로그에 남음. 개인정보는 없으나 로그량이 늘고 인증 헤더가 찍힐 여지가 있어 점검 대상임
- MAW에는 예약을 실행하는 주체가 없음. 전 소스에
@Scheduled·@EnableScheduling·cron 표현식이 0건임(1~3편 전 범위 재확인). 예약은smah.tb_cont_schdl_*에 저장만 함. 실제 실행은 공개노트/개발/모듈/SCW 스케줄러 서버가 하므로 “예약이 실행되지 않는다”는 문의는 MAW 로그만으로 추적할 수 없음. 같은 이유로 복약 알림 발송·공가세대 전출 처리도 MAW 소관이 아님 - 대시보드의 관리비 금액이 한 달 밀려 보임. 저번달 블록과 저저번달 블록이 둘 다 같은 금액 필드에 값을 넣어 최종값이 저저번달 금액이 됨. 반면 함께 내려가는 청구월 표기는 저번달이라 청구월과 금액이 어긋남. 관리비 화면(별도 API)에서는 정상이므로 대시보드에서만 나타남. 기본매뉴얼/입주민/관리비를 앱에서 볼 수 없어요
- 전자투표 상세 조회의 단지 조건이 무효임. 조건이 같은 컬럼끼리 비교하도록 작성돼 있어 단지 필터가 걸리지 않음. 투표 일련번호만 알면 다른 단지 투표 상세도 조회됨. 목록은 정상적으로 단지·동으로 걸러짐
- 소유자 검증이 빠진 API가 4개 있음. 일련번호만 알면 남의 데이터에 접근됨 — ① 복약 기록 조회 ② 복약 삭제(세 테이블에서 지움) ③ 주차 위치 기록 상세(목록·삭제에는 검증이 있음) ④ AutoDR 참여 여부 수정(참여계약 번호만으로 값을 바꿈). ①②④는 컨트롤러가 로그인 정보 자체를 받지 않음
- 방문주차·입출차에 개발용 세대 분기가 운영 코드에 남아 있음. 특정 세대 ID이면 홈넷서버 대신 로컬 목업으로 감. 주석에 “테스트 끝나면 지울 것”이라고 적혀 있음. 운영 DB에 그 세대가 있으면 그 세대만 실제 홈넷을 타지 않음
- 에너지 “지난달” 사용량이 이번 달과 같게 나올 수 있음. 이번달 패턴분석과 지난달 패턴분석이 이음에 같은 조회월을 보냄. 공개노트/기능/에너지와 이음 연동
- WISE 실시간 임대료 조회(
rfeList)가 운영에서 항상 503임. 관련 설정 키가 로컬·개발·운영 어느 프로필에도 없어 기본값DISABLED로 동작함. 기능 미오픈 상태이지 장애가 아님. DB 적재분을 보는 기존 임대료 API는 정상임
확인 필요
확인 필요
- 운영 설정 파일에 ARIA 암호화 키·jasypt 마스터 비밀번호·JWT 서명키·LG client-secret이 평문으로 들어 있음. 개발 프로필은 같은 값을
ENC[...]·환경변수로 외부화해 두었는데 운영만 빠진 것인지, 운영 서버에 올라가는 파일이 별도인지 확인 필요- 공통코드·이벤트코드 캐시에 만료를 넣을지, 갱신 API를 만들지(현재는 재기동이 유일한 방법임 — 위 “Redis·캐시” 참고)
- 앱 버전 삭제 API를 비인증 목록에서 뺄지·경로 변수명을 맞출지·없앨지
- 강제 업데이트 판단을 앱이 하는 구조가 맞는지(앱 담당자)
- Access 15일·Refresh 30일이 보안 기준상 의도된 값인지. 공개노트/개발/모듈/OAW 인증 서버의 가전사 토큰(1시간/2주)과 차이가 큼
- 소유자 검증이 빠진 API 4개(알려진 이슈 19)와 전자투표 상세 단지 조건(이슈 18)의 수정 우선순위 — 지금은 일련번호만 알면 남의 데이터가 보이거나 바뀜
- 개발용 세대 목업 분기(이슈 20) 제거 시점 — 운영 DB에 해당 세대가 있는지 먼저 확인 필요
우리집제어 관련
확인 필요
- 기기 제어는 홈넷 연동 상태 코드(
hnet_lnkg_ss_cd)를 보지 않고, 승강기 호출만ON을 요구함. 연동을OFF로 내려도 기기 제어는 계속 홈넷서버로 나감. 의도된 차이인지 확인 필요- 홈넷 규격의
2102는 “미전원일 때 제어 요청”인데 MAW는 이 코드를 미전입으로 보고 자동 전입 이벤트를 홈넷사에 보냄. 규격 문구와 구현 해석이 어긋나므로 홈넷사 확인 필요- 공간(방) 수정·삭제와 기기 예약 조회에 소유자 검증이 없음. 공간 번호나 기기 ID만 알면 남의 것을 수정·삭제하거나 볼 수 있는 구조임 — 권한 검토 필요
- 공간-기기 매핑 테이블을 MAW가 읽기만 하고 쓰는 코드가 없음. 매핑을 넣는 주체가 다른 시스템인지, 기능이 미완인지 확인 필요. 공간을 만들었는데 기기를 담을 수 없다는 문의가 여기서 나옴
- 원패스 사용내역 등록이 장치 ID가 내 세대 것인지 검증하지 않음. 임의의 장치 코드로도 저장됨
- 기기 동기화가 기기 ID만으로 전역 조회함(단말기 조건 없음). 홈넷사가 단지·세대를 가로질러 같은 기기 ID를 쓰면 다른 세대 행이 걸릴 수 있음
- 승강기 플랫폼 규격 응답 코드가 정의만 되어 있고 코드 어디에서도 쓰지 않음. 실패 사유를 앱에 전달하려면 전용 예외 핸들러 추가가 필요함 — 개선 여부 확인
- 가전 제어이력 필터를 기기 이름 대신 기기 ID로 바꿀지(앱 담당자)
- 외출 카드가 가스 상태를
power로 읽는 현상은 MAW 코드에 근거가 없음. 앱 담당자 확인 필요
관련
공개노트/개발/모듈/MAW 세대·헬스케어 API 공개노트/개발/시스템 구성 공개노트/개발/모듈/APW 연계 서버 공개노트/개발/모듈/PIW 연계 서버 공개노트/기능/헬스케어 공개노트/기능/에너지와 이음 연동 공개노트/기능/AutoDR 공개노트/개발/모듈/SCW 스케줄러 서버 공개노트/개발/모듈/OAW 인증 서버 공개노트/개발/모듈/SCI 삼성 커넥터 공개노트/기능/로그인과 세대 승인 공개노트/기능/우리집제어 공개노트/기능/승강기 호출 공개노트/기능/스마트원패스 공개노트/기능/홈넷 서버 연동 공개노트/개발/push 알림 공개노트/개발/배포와 빌드 기본매뉴얼/운영/WAS 로그 확인