울면서개발하기
VERA ERP 개발일지

프로그램 요청 처리 — 빈 값 비교, 불리언 변환, 화면 여는 차례

· 커밋 16개

하루 종일 프로그램 요청을 처리했다. 요청 하나하나는 작지만, 원인을 따라가면 대부분 “넥사크로 엔진은 이렇게 하는데 Nx 는 다르게 한다”는 한 지점으로 모였다. 그런 곳은 한 번 고치면 같은 컴포넌트를 쓰는 화면 수십 곳이 함께 고쳐진다.

할 일 문서에는 요청을 건마다 적지 않기로 했다. 요청 기록은 요청 자체의 상태·답변에 남기고, 할 일에는 “수시로 확인하기” 한 줄만 둔다.

한 일

화면에서 바로 보이는 것

  • 메뉴 창 제목줄에 새로고침 단추. 저장하지 않은 변경이 있으면 묻는다
  • 펼침 달력 아래 “오늘” 단추(TO-BE 에서 더한 것)
  • 알림·확인 메시지 창과 토스트를 새 디자인으로. 배치·동작·돌려주는 값은 그대로 두고 한글 제목, 새 아이콘, 오른쪽 아래 단추, 둥근 카드로 바꿨다
  • 서버 거래가 진행되는 동안 화면 조작(마우스·키보드)을 막는다. 응답이 끝내 오지 않을 때를 대비해 60초 뒤에는 막기만 푼다
  • 파일 찾기 칸이 좁으면 이름 칸을 숨기고 단추만(원본 배치)

컴포넌트 동작을 원본에 맞춘 것

  • 빈 마스크 칸에 들어갔다 나오기만 해도 행이 “수정” 상태가 됐다. undefined·null·빈 문자열을 서로 같은 값으로 본다(문자열 마스크 86곳)
  • enable 을 데이터셋 컬럼에 묶은 곳이 늘 꺼져 있었다(11개 화면 34곳). 아래 기술 메모
  • xfdl 에 적은 콤보 index 를 목록이 처음 찼을 때 적용한다. 기준부서 “전체” 같은 기본 선택이 빠져 조건 값이 원본과 다르게 서버로 가던 콤보가 27개였다
  • 그리드 서식 바꾸기(set_formatid)를 동기로. 바로 다음 줄의 그리드 초기화가 바뀌기 전 서식에 걸려 행 번호 칸이 사라졌다
  • 그리드 칸 편집기에서 글자를 고치던 중 달력으로 날짜를 바꾸면, 칸을 떠날 때 옛 날짜가 다시 들어가던 것
  • 흰 Div 로 덮어 숨긴 그리드의 머리만 비쳐 보이던 것. 그리드 안의 z-index 를 isolation: isolate 로 가뒀다

끼운 화면의 초기화 차례

결의신청은 화면 안에 다른 화면을 끼워(동기 로드 Div) 쓴다. 원본의 차례는 “안쪽 화면 만들기 → 바깥 oninit → 안쪽 oninit·onload → 바깥 onload” 이다. TO-BE 는 안쪽 onload 를 먼저 끝내 버려서, 바깥 oninit 이 넣어 주는 결의번호를 안쪽 화면이 보지 못하고 “작성부서가 선택되지 않았습니다”를 띄우며 멈췄다. 원본 차례대로 맞추고, 같은 방식을 쓰는 22개 화면을 열어 확인했다.

새로고침이 괜히 묻지 않게

처음에는 화면의 모든 데이터셋을 보고 변경이 있으면 물었다. 그런데 콤보 목록에 “전체” 줄을 끼워 넣는 것도 변경으로 잡혀서, 아무것도 고치지 않았는데도 물었다. 화면 스크립트에는 조회 단추를 누를 때 “저장 안 한 변경이 있는지” 확인하는 공통 함수 호출이 있고, 그 첫 인자가 그 화면에서 “지켜야 할 데이터셋 목록”이다. 화면 스크립트 원문에서 이 목록을 읽어 두었다가 새로고침 때 그것만 본다. 묻는 창도 브라우저 기본 confirm 대신 ERP 확인 창이다.

DB 쪽

  • 예산신청의 “직전 자료 복사”가 없는 DB 함수 때문에 실패했다(AS-IS 도 같이 실패). 원본 정의에서 그 함수만 꺼내 운영 DB 에 넣었다
  • 전자결재 프로시저도 DB 에 없는 것을 찾아 할 일에 올렸다(정의가 저장소에도 없다)

기술 메모

넥사크로의 불리언 변환은 JavaScript 와 다르다. enable 을 컬럼에 묶으면 컬럼 값("Y", "2026", 코드 값 …)이 불리언으로 바뀌어야 한다. Nx 의 변환 함수는 true 와 "true" 만 참으로 보고 있어서 대부분 꺼졌다. 넥사크로 내부 변환 규칙은 문자열이면 "false", "NaN", 숫자로 0 인 값만 거짓이고 나머지("2026", "A0001" …)는 참이다. 이 규칙을 그대로 따르게 바꿨다. 원본을 옮길 때 “비슷하게”가 아니라 원본 함수 하나하나를 그대로 맞춰야 한다는 것을 또 확인했다.

전역 변수에 기대던 화면 버그는 원본을 고친다. 예산편성신청의 확인 단추가 반응이 없었다. 화면 스크립트가 filter(function (oRowData) { ... oRowData["nRow"] = i ... }) 처럼 선언하지 않은 i 를 읽고 있었다. 넥사크로 엔진 안에 선언 없이 쓴 for (i = ...) 가 있어 전역 i 가 늘 존재했기 때문에, AS-IS 에서는 오류 없이 엉뚱한 행 번호로 넘어갔고 TO-BE 에서는 ReferenceError 로 멈췄다.

처음에는 런타임에서 전역 i = 0 을 만들어 두는 식으로 우회했다가 바로 되돌렸다. 그렇게 하면 다른 화면의 같은 버그를 “0번 행”으로 조용히 감추게 된다. 대신 원본 화면의 콜백을 (oRowData, i) 로 바로잡아 원래 의도한 행 번호를 쓰게 하고, 원본 xfdl·AS-IS 실행본·TO-BE 변환본 세 곳에 같이 반영했다.

// 고치기 전: i 는 어디에도 선언되지 않았다
this.ds_list.saveJSON().filter(function (oRowData) { oRowData["nRow"] = i; /* ... */ });

// 고친 뒤: filter 가 넘겨주는 순번을 쓴다
this.ds_list.saveJSON().filter(function (oRowData, i) { oRowData["nRow"] = i; /* ... */ });

(위 코드는 구조만 보이려고 줄인 것이다.)

다음에

  • DB 에 없는 전자결재 프로시저 문제