- 발행일
트리에서 뺀 신청 상태 표시를 일주일 뒤 되살렸다 — 지운 커밋 해시를 커밋 메시지에 적었다
트리에서 뺀 신청 상태 표시를 일주일 뒤 되살렸다
이 글은 2026년 9월에 당시 커밋 이력을 다시 보며 정리한 것입니다. 날짜는 작업한 날 기준입니다.
OID 트리의 노드 이름 뒤에 상태를 붙여 보여 주고 있었습니다. 센서 데이터 [신청중] 같은 식으로요. 12월 12일에 넣었고, 22일에 지웠고, 29일에 되살렸습니다.
ef060adb 12-12 11:53 트리 구조에 state가 아닌 current_state 로 추가 변경 하기
4f0d9d71 12-22 19:30 신청 상태를 표시 하던 내용을 삭제 ...
a8e61584 12-29 14:46 (임시) 목표 : state를 통해 트리 구조에 등록 상태 표시 상황 : 깃 참고 (4f0d9d71...)
378f1c6d 12-29 15:21 - state를 통해 트리 구조에 등록 상태 표시 #2 리팩토링 ...
지울 때는 76줄, 이유는 한 줄
12월 12일판은 워크플로의 현재 단계를 썼습니다. OID에 연결된 신청서가 있으면 그 신청서의 current_state 이름을 트리 응답에 실어 보내고, 화면이 그걸 이름 뒤에 붙였어요. 15일에는 한 발 더 나가서, 진행 중인 노드는 상위 OID로 고를 수 없게 막았습니다.
22일 저녁에 이걸 다 지웠습니다. 파일 넷, 76줄.
- // workflow current_state를 우선 사용, 없으면 state 사용
- const state = v.current_state_display || v.state_display || v.state || "";
...
- const hideStateLabel = stateKey === "등록" || stateKey === "배포단계";
- if (!hideStateLabel) {
- if (v.current_state_display) {
- text += ` [${state}]`;
매니저에서 신청서를 한 번에 조회해 붙이던 코드, 시리얼라이저의 current_state_display 필드, 상위 OID 선택 모달의 차단 로직까지 같이 나갔어요. 커밋 메시지는 지운 항목을 세 개 나열하고 셋째에 "불필요한 파이썬 함수"라고 적었습니다. 왜 불필요해졌는지는 없습니다. 이 글을 쓰면서도 그날 무슨 이야기가 있었는지 찾지 못했어요.
되살릴 때는 지운 커밋을 가리켰다
일주일 뒤 되살린 커밋의 제목이 이렇습니다.
(임시) 목표 : state를 통해 트리 구조에 등록 상태 표시
상황 : 깃 참고 (4f0d9d7165fe354f69fcefb4aefd525263e0b352)
해결 방법 : text += ` [${state}]`;
지운 커밋의 해시를 "상황"에 적어 두고, 해결은 지운 줄 하나를 다시 쓰는 거였어요. 다만 되살린 것은 같은 것이 아닙니다.
| 12월 12일판 | 12월 29일판 | |
|---|---|---|
| 상태의 출처 | 워크플로 신청서의 current_state | OID 모델의 state 필드 |
| 누구에게 | 모두 | 관리자에게만(checkAccessLevel()) |
| 숨기는 값 | "등록"·"배포단계" 라벨 | ACT 코드 |
| 서버 변경 | 매니저·시리얼라이저 | 없음 — 응답에 이미 있던 state 사용 |
워크플로를 다시 붙이지 않고, 응답에 원래 실려 오던 모델 필드를 라벨로 바꿔 붙였습니다. 서버는 안 건드렸어요. "되살렸다"기보다 더 작은 것으로 갈아 끼운 겁니다.
35분 뒤, 공용 파서에서 화면 전용으로
되살린 자리는 commonClassTreeUtils.js의 parseTreeData였습니다. 분류체계·메타클래스·OID 트리가 같이 쓰는 공용 파서예요. 35분 뒤 여기서 빼서 OID 화면 파일의 후처리 함수로 옮겼습니다.
// 트리 노드 배열에 state 정보를 추가하는 후처리 함수 (관리자 전용)
function addStateToTreeNodes(nodes) {
if (!checkAccessLevel()) return nodes;
const processNode = (node) => {
if (node.data && node.data.state && node.data.state !== "ACT") {
const stateLabel = getStateLabel(node.data.state);
node.text = `${node.data.name} [${stateLabel}]`;
}
같은 커밋에 남긴 주석이 이유입니다. "다른 파일들 처럼 공통 파일에서 챙길 시 html 구조 충돌 문제 발생." 공용 파서에 OID 전용 라벨 맵을 두면 다른 트리에도 딸려 들어가니까요.
옮기면서 파서의 버그 하나가 같이 드러났습니다.
this.text = text;
if (includeDescription) {
this.description = v.description;
}
- return;
+ return v;
JSON.parse의 reviver는 undefined를 돌려주면 그 키를 지웁니다. data 키를 만나 text를 만들어 붙인 뒤 return;으로 끝내고 있었으니, 파싱이 끝난 노드에는 data가 없었어요. 파서 안에서 라벨을 붙일 때는 상관없었지만, 파서 밖에서 node.data.state를 읽으려니 그제야 걸렸습니다.
검증
- 관리자로 트리를 열어
ACT가 아닌 노드에만[신청중]같은 꼬리가 붙는지, 일반 사용자로 열면 안 붙는지 눈으로 확인했습니다. - 노드를 새로 만들거나 이름을 고친 직후의 꼬리는
buildNodeTextWithState가 따로 붙입니다. 이걸 그날 눈으로 확인했는지는 기록이 없습니다. - 회귀 테스트는 없었습니다. 그때 e2e는 아직 이 화면에 없었어요.
남은 것 · 한계
- 왜 지웠는지 모릅니다. 지운 커밋에 이유가 없고, 되살린 커밋은 "(임시)"로 시작합니다. 임시라고 적은 코드가 그 뒤로 정식이 됐어요.
- 워크플로 상태와 모델
state는 다른 것입니다. 12월판이 보여 주던 "심사 단계"는 이제 안 보이고, 모델의 여섯 값만 보여요. 그 차이를 사용자에게 설명한 적은 없습니다. - 라벨 맵이 두 곳에 있습니다.
STATE_OPTIONS와getStateLabel이 OID 화면에, 같은 값 여섯 개가 서버의TYPE_STATES에. 서버가 값을 더하면 화면은 코드 그대로 보여 줍니다. - 이 트리는 아홉 달 뒤 jsTree에서 조직도로 바뀌었고, 그때는 하루 안의 되돌림을 시각 단위로 적었습니다2026-09-04OID 트리를 낮에 고정하고 밤에 되돌렸다 — 일곱 시간짜리 결정과 서버가 정하게 된 버킷OID 조직도의 드릴다운을 오후 2시에 걷어냈고 밤 9시 45분에 되살렸습니다. 잎을 트리 밖 카드 목록으로 내보낸 뒤 계층이 한 화면에 다 들어오니 드릴다운이 필요 없어 보였는데, 운영 데이터의 표준 가지 아래로 내려갈 길이 통째로 사라졌어요. 되돌리면서 "어느 노드가 카드 버킷인가"를 화면의 추론에서 서버 플래그로 옮겼습니다.. 이 글의 되돌림은 일주일 간격인데 이유가 없고, 그 글의 되돌림은 일곱 시간 간격인데 이유가 있어요. 그 사이에 바뀐 건 기록하는 습관입니다.
관련 글: 4단계 Creation Wizard UX 구현 회고2026-01-054단계 Creation Wizard UX 구현 회고 — 상태·모드 분리와 완전 종료 문제다단계 입력이 필요한 등록 폼에 Creation Wizard 모드와 일반 편집 모드를 분리해서 구현한 과정을 정리합니다. 상태 관리, 트리 연동, "완전 종료" 버그까지. · jsTree 기본 사용법2025-04-23jsTree 기본 사용법 — 플러그인·API 정리와 실무에서 걸린 지점jQuery 기반 트리 플러그인 jsTree의 플러그인·API·이벤트를 표로 정리한 레퍼런스입니다. 실무 트리 화면에 붙이면서 걸린 지점들을 뒤에 덧붙였습니다 — check_callback의 진짜 의미, 루트 노드 id가 #이라는 함정, 기본 contextmenu를 버리고 모달로 간 이유까지. · OID 트리를 낮에 고정하고 밤에 되돌렸다2026-09-04OID 트리를 낮에 고정하고 밤에 되돌렸다 — 일곱 시간짜리 결정과 서버가 정하게 된 버킷OID 조직도의 드릴다운을 오후 2시에 걷어냈고 밤 9시 45분에 되살렸습니다. 잎을 트리 밖 카드 목록으로 내보낸 뒤 계층이 한 화면에 다 들어오니 드릴다운이 필요 없어 보였는데, 운영 데이터의 표준 가지 아래로 내려갈 길이 통째로 사라졌어요. 되돌리면서 "어느 노드가 카드 버킷인가"를 화면의 추론에서 서버 플래그로 옮겼습니다. · 중복 쿼리라고 뺀 열을 닷새 뒤 되돌렸다2025-09-24중복 쿼리라고 뺀 열을 닷새 뒤 되돌렸다 — 측정 없이 뺐고, 측정 없이 되돌렸다카탈로그 관리 폼의 표준데이터 표에서 분류체계 열을 뺐다가 닷새 뒤 "운영에서 이상 없어서" 되돌렸습니다. 뺄 때는 동료의 진단을 따랐고, 되돌릴 때도 쿼리를 세지 않았어요. 그런데 되돌린 열은 그 사이에 뒷받침하던 프로퍼티가 지워져서 두 달 동안 빈 칸이었습니다. 입사 다섯 달째, ORM을 배우면서 화면을 고치던 때의 기록입니다. · 저장 뒤 돌아올 자리를 주소에 남겼다2025-06-25저장 뒤 돌아올 자리를 주소에 남겼다 — ?selected_node=의 첫 판속성을 편집하고 저장하면 트리 화면이 늘 첫 노드로 돌아갔습니다. 성공 주소에 ?selected_node=를 붙여 편집하던 클래스로 돌아오게 했어요. 이틀 뒤 저녁에 setTimeout과 no-cache 헤더를 넣었다가 두 시간 뒤 전부 지우고 페이지 새로고침으로 바꿨습니다. 그때 만든 파라미터 이름이 1년 뒤에도 그대로 쓰입니다.