diff --git a/docs/DEVELOPMENT_HISTORY.md b/docs/DEVELOPMENT_HISTORY.md index e33fc51..e0b3c9a 100644 --- a/docs/DEVELOPMENT_HISTORY.md +++ b/docs/DEVELOPMENT_HISTORY.md @@ -228,10 +228,354 @@ - [HISTORY_ASOF_DB_PLAN.md](/home/hyunho/projects/mh-dashboard-organization/docs/HISTORY_ASOF_DB_PLAN.md) +## 12. 2026-04-01 구조 안정화, DB 가시화, 자리배치도 정리 + +### 왜 이 작업을 했는가 + +이번 작업의 목적은 새 기능을 더 붙이기 전에, 지금까지 쌓인 구조를 먼저 안정적으로 정리하는 것이었다. +겉으로 보기에는 화면이 어느 정도 동작하고 있었지만, 실제 내부는 다음과 같은 위험이 있었다. + +- 화면마다 구현 방식이 달라서 어디를 수정해야 하는지 바로 알기 어려움 +- 원본 참고 파일과 실제 서비스 파일이 섞여 있어, 작업할수록 다시 꼬일 가능성이 큼 +- DB는 이미 중요한 역할을 하고 있었지만, 비개발자 입장에서는 "정말 저장이 되고 있는가", "무엇이 들어 있는가"를 직접 확인하기 어려움 +- 구조를 건드릴 때 사업관리대장처럼 예상하지 못한 회귀가 생길 수 있었음 + +즉, 이번 작업은 "새 기능 추가"보다 "앞으로 기능을 안전하게 추가할 수 있는 바닥공사"에 가까웠다. + +### 무엇을 바꿨는가 + +이번에는 크게 다섯 가지 축으로 정리했다. + +1. 디자인과 화면 구조 기준 정리 +2. 실제 서비스 코드와 참고 원본 파일 분리 +3. 백엔드 라우트 구조 분리 +4. DB 상태를 눈으로 볼 수 있는 운영 화면 추가 +5. 자리배치도 실사용성 개선과 회귀 방지 장치 추가 + +이 작업은 단순 정리처럼 보일 수 있지만, 실제로는 "어디가 진짜 기준인지"를 다시 세우는 과정이었다. + +추가로, 사용자가 실제로 가장 자주 보는 상단 탭 경험도 함께 다시 손봤다. +이번에 정리한 상단 주요 화면은 다음과 같다. + +- 사업관리대장 +- 프로젝트별 분석 +- 팀/개인별 분석 +- 조직현황 + +이 네 화면은 이전까지는 각각 따로 발전해 온 흔적이 강했다. +즉, 같은 시스템 안에 있지만 화면마다 표정이 달랐고, 어떤 화면은 오래된 파란 톤이 남아 있었고, 어떤 화면은 새 스타일이 일부만 적용되어 있었다. +이번에는 이 네 화면을 "각자 따로 만들어진 페이지"가 아니라 "하나의 대시보드 안에 있는 연결된 기능"처럼 보이도록 맞추는 작업도 함께 진행했다. + +### 리팩토링을 왜 했는가 + +기존에는 하나의 파일이나 하나의 화면이 너무 많은 역할을 동시에 맡고 있었다. +예를 들어 백엔드 메인 파일은 인증, 멤버, 통합 데이터, 정적 파일 서빙, 자리배치도까지 한곳에 몰려 있었고, 프런트도 화면에 따라 원본 파일을 직접 쓰는 곳과 override를 덧씌우는 곳이 섞여 있었다. + +이 구조는 처음엔 빠르게 화면을 올리는 데 도움이 되지만, 일정 시점이 지나면 문제가 생긴다. + +- 작은 수정이 예상치 못한 다른 화면에 영향을 줄 수 있음 +- 회귀 원인을 찾는 데 시간이 오래 걸림 +- 새 작업자가 들어오면 전체 구조를 이해하기 어려움 +- 특정 파일이 "원본인지", "실행본인지", "참고용 복사본인지" 헷갈리게 됨 + +그래서 이번에는 "기능을 더 붙이기 전에 구조를 분리하는 것"을 우선했다. + +### 리팩토링을 어떻게 진행했는가 + +#### 1. 실제 서비스 코드와 참고 원본을 분리 + +사업관리대장, 프로젝트별 분석, 팀/개인별 분석은 처음엔 원본 파일, 참고 파일, 실제 서비스 파일이 섞여 있는 상태였다. +이 상태에서는 수정할 때마다 "지금 내가 만지는 파일이 실제 서비스에 반영되는 파일이 맞는가"를 계속 확인해야 했다. + +그래서 다음 기준으로 재정리했다. + +- `reference`: 비교와 복구를 위한 참고 원본 +- `served`: 실제 서비스가 읽는 런타임 파일 +- `frontend/apps/*`: 앞으로 수정해야 하는 앱 소스 + +특히 `ledger`, `payment`, `team` 화면은 모두 `app source -> publish -> served` 구조로 다시 맞췄다. +이 의미는 다음과 같다. + +- 작업자는 원본 참고 파일을 직접 수정하지 않는다 +- 앱 소스에서 수정한다 +- publish 스크립트로 실제 서비스 파일을 만든다 +- 백엔드는 이 실제 서비스 파일만 서빙한다 + +이렇게 하면 나중에 유지보수할 때 "수정 원본"과 "실행 결과물"이 명확히 나뉜다. + +#### 2. 디자인 기준을 공통 SSOT로 승격 + +이전에는 각 화면에 과거 파란 톤, 임시 색상, override 스타일이 섞여 있었다. +그래서 어떤 화면은 새 디자인 규칙을 따르는데, 어떤 화면은 예전 색이 다시 튀어나오는 문제가 반복됐다. + +이번에는 이를 막기 위해 다음 기준을 승격했다. + +- `design-tokens.css` +- `design-patterns.css` +- `DESIGN_SSOT.md` + +즉, 앞으로 디자인 수정은 "이 화면만 예쁘게"가 아니라 "공통 디자인 규칙 안에서 일관되게" 하는 방향으로 정리했다. +비개발자 관점에서는 "화면마다 조금씩 다른 앱"처럼 보이던 것을, "하나의 시스템처럼 보이게" 만드는 작업이었다고 볼 수 있다. + +이 과정에서 실제로 한 작업은 다음과 같다. + +- 사업관리대장, 프로젝트별 분석, 팀/개인별 분석, 조직현황의 메인 폭을 같은 기준으로 맞춤 +- 공통 카드, 버튼, KPI, 표, 팝업의 색과 대비를 비슷한 문법으로 정리 +- 과거 파란 계열이 다시 드러나는 부분을 찾아 공통 토큰 기준으로 재정리 +- 각 화면에서 "지금 당장 보기 좋게" 끝내지 않고, 앞으로도 같은 규칙을 따라갈 수 있도록 공통 패턴으로 승격 + +특히 프로젝트별 분석과 팀/개인별 분석은 원래 화면 내부에 이전 스타일 흔적이 많이 남아 있었는데, 이번에는 이 부분을 단순 덮어쓰기보다 "기준 디자인을 바라보게 만드는 방향"으로 손봤다. + +#### 2-1. 왜 네 개 탭을 먼저 다시 맞췄는가 + +이번 세션에서는 단순 리팩토링만 한 것이 아니다. +사용자가 실제로 매일 보는 네 개 주요 탭의 경험을 먼저 안정화하는 것이 중요했다. + +그 이유는 다음과 같다. + +- 화면마다 스타일이 다르면 사용자는 기능이 다른 것보다 "시스템이 불안정하다"는 인상을 먼저 받음 +- 새 기능을 추가할 때마다 이전 스타일이 다시 나타나면, 작업 결과가 누적되지 않고 계속 되돌아감 +- 세미나나 설명 자리에서도 "정리되고 있다"는 느낌을 전달하려면, 먼저 눈에 보이는 화면이 하나의 제품처럼 보여야 함 + +그래서 이번에는 단순히 코드 구조를 정리하는 것과 함께, 네 개 탭의 인상과 문법을 맞추는 작업도 같이 진행했다. + +#### 2-2. 사업관리대장은 어디까지 손봤는가 + +사업관리대장은 이번 세션에서 가장 많은 변화가 있었던 화면 중 하나다. + +- 상단 탭에서 직접 열리도록 연결 +- 기본 로우데이터 엑셀과 연동 +- 원본 화면 구조를 참고해 연도 버튼, KPI, 본문 표, 상세 팝업까지 단계적으로 복원 +- 클릭 시 프로젝트 상세 정보를 열 수 있게 연결 +- 메인 화면과 상세 팝업 디자인을 현재 디자인 큐에 맞게 정리 + +다만 중요한 점은, 이번에 맞춘 것은 "보이는 구조와 기본 기능"까지라는 것이다. +세부 숫자와 집계 기준, 어떤 값이 어떻게 계산되는지는 원본 작성자 기준 확인이 필요해 후속으로 남겨 두었다. + +즉, 이번에는 사업관리대장을 "쓸 수 있는 상태"까지 올렸고, 다음 단계에서 "정확한 상태"로 맞출 준비를 끝낸 것이다. + +#### 2-3. 프로젝트별 분석과 팀/개인별 분석은 무엇이 바뀌었는가 + +두 화면은 모두 이미 기능은 있었지만, 디자인과 유지보수 구조가 흔들리는 상태였다. + +이번에 바뀐 점은 다음과 같다. + +- 프로젝트별 분석 + - 메인 표, KPI, 필터, 패널, 상세 강조 색을 공통 디자인 기준으로 재정리 + - 실제 서비스 파일과 수정 원본의 기준을 명확히 분리 +- 팀/개인별 분석 + - 배경, 카드, 보조 정보, 캘린더 note, 상태 표현 등을 공통 디자인 기준으로 재정리 + - 과거 스타일 흔적을 줄이고, 앞으로도 같은 방식으로 고칠 수 있는 구조로 이동 + +즉, 두 화면 모두 "이번 한 번 예쁘게 고친" 것이 아니라 "앞으로도 같은 기준으로 유지될 수 있게" 손봤다는 점이 중요하다. + +#### 2-4. 조직현황은 무엇이 바뀌었는가 + +조직현황은 기존에도 중요한 화면이었지만, 스타일과 인터랙션이 다소 오래된 느낌으로 남아 있었다. + +이번에는 다음을 정리했다. + +- 상세 프로필, 수정 모달, 버튼, 카드, 탭, 통계 영역의 색과 대비 조정 +- 관리자 모드 버튼, 추가 버튼, 상세 정보 패널의 톤 정리 +- 자리배치도와 연결되는 미리보기 카드, 조직 구조 표현 가독성 개선 + +즉, 조직현황은 단순 디자인 수정이 아니라 "관리자가 실제로 쓰는 화면"으로서 읽기 편하게 정리하는 방향으로 손봤다. + +#### 3. 백엔드 메인 파일의 역할 분리 + +백엔드도 한 파일에 너무 많은 기능이 몰려 있었다. +그래서 메인 파일에서 기능별 라우트를 분리했다. + +이번에 분리한 범위는 다음과 같다. + +- 시스템/서빙 라우트 +- 인증 라우트 +- 멤버/히스토리 라우트 +- 통합 데이터 라우트 +- 자리배치도/업로드 라우트 + +이 작업을 통해 얻은 가장 큰 장점은 "문제가 났을 때 어디를 봐야 하는지가 빨라졌다"는 점이다. +예전에는 메인 파일을 전체 검색해야 했다면, الآن은 인증 문제면 인증 파일을, 자리배치도 문제면 자리배치도 라우트 파일을 먼저 보면 된다. + +### DB 작업을 왜 했는가 + +이번 세션에서 DB 작업을 한 이유는 "DB가 이상해서"가 아니라, "DB가 이미 중요한 역할을 하고 있는데 너무 안 보였다"는 점 때문이다. + +실제로는 이미 많은 데이터가 DB에 저장되고 있었다. + +- 구성원 정보 +- 자리배치도 정보 +- 통합 원본 적재 정보 +- 인증 정보 +- 이력 관련 테이블 + +하지만 비개발자 입장에서는 이것이 잘 보이지 않았다. +즉, "DB가 있다"고만 듣고 실제로 어떤 테이블이 있고 무슨 역할인지 보지 못하면, 운영 기준을 잡기 어렵다. + +그래서 이번에는 DB를 "보이지 않는 저장소"에서 "운영자가 확인할 수 있는 대상"으로 바꾸는 작업을 했다. + +### DB 작업을 어떻게 했는가 + +#### 1. DB 상태 탭 추가 + +허브 안에 `DB 상태` 탭을 만들었다. +이 화면에서는 다음을 확인할 수 있다. + +- 전체 테이블 수 +- 등록 인원/재직 인원 +- 자리배치도 도면 현황 +- 핵심 운영 테이블과 전체 테이블 목록 +- 테이블별 간단 설명 +- 테이블 클릭 시 컬럼과 샘플 데이터 미리보기 +- CSV 다운로드 + +즉, 이제는 SQL을 직접 몰라도 "어떤 데이터가 어디에 저장되는지"를 눈으로 볼 수 있다. + +#### 2. 테이블 역할 분류 + +전체 테이블을 그냥 나열만 하면 오히려 더 복잡해 보이기 때문에, 역할별로 다시 분류했다. + +- 유지 +- 주의 +- 원본/추적 +- 정리 후보 + +이 분류를 통해 "지금 DB가 너무 큰가?"라는 질문에 대해, 단순 개수 대신 역할 기준으로 판단할 수 있게 만들었다. + +#### 3. 불필요한 테이블과 과거 실험 흔적 정리 + +이번에 실제로 확인해보니, 현재 코드에서 쓰지 않는 테이블이 하나 있었고, 과거 DXF 시도본도 많이 쌓여 있었다. + +그래서 다음 정리를 진행했다. + +- 미사용 테이블 `entity_change_events` 삭제 +- 과거 DXF 시도본 정리 +- 최신 DXF 1개와 실제 운영용 고정 도면 3개만 유지 + +이 작업은 "DB를 줄였다"기보다 "운영에 필요한 것과 과거 흔적을 분리했다"는 의미에 가깝다. + +#### 4. 8080과 8081의 역할도 다시 정리 + +이번 세션에서는 개발용 `8081`에서 검증된 코드 중, 안정적으로 승격 가능한 부분만 `8080` 기준 코드로 올리는 작업도 진행했다. + +여기서 중요한 원칙은 "통째로 덮어쓰기"가 아니라 "검증된 것만 선별 승격"이었다. + +즉 다음 원칙을 지켰다. + +- `8081`은 계속 작업과 검증을 위한 공간으로 유지 +- `8080`은 공개 기준으로 유지 +- 디자인 SSOT, 앱 소스 구조, 런타임 서빙 구조처럼 안정성이 확인된 부분만 `total`로 승격 +- DB 자체는 함부로 합치지 않고, 코드와 구조만 먼저 정리 + +이렇게 해야 운영 기준을 흔들지 않으면서도, 개선된 구조를 실제 기준 코드에 반영할 수 있다. + +### 무엇이 개선되었는가 + +이번 작업으로 개선된 점은 매우 명확하다. + +#### 1. 유지보수 포인트가 분명해졌다 + +예전에는 같은 기능을 수정해도 어디를 건드려야 하는지 여러 파일을 동시에 의심해야 했다. +지금은 앱 소스, 서비스 파일, 참고 원본의 역할이 나뉘어서 수정 위치가 명확해졌다. + +#### 2. 화면 회귀를 더 빨리 잡을 수 있게 됐다 + +사업관리대장 데이터가 한 번 끊겼을 때 원인은 DB 문제가 아니라, 한글 파일명을 응답 헤더에 그대로 넣으면서 생긴 인코딩 오류였다. +이런 문제는 구조가 정리돼 있지 않으면 찾는 데 오래 걸린다. + +이번에는 원인을 빠르게 좁혀서 복구했고, 같은 문제가 다시 생기지 않도록 `8081` smoke check 스크립트도 추가했다. +즉, 이제는 구조를 바꾼 뒤 바로 핵심 화면과 API를 빠르게 점검할 수 있다. + +#### 3. DB를 설명 가능한 상태로 만들었다 + +이전에는 "DB가 있다"는 사실만 있었고, 실제로 어떤 상태인지 보기 어려웠다. +이제는 운영자가 DB 상태를 화면으로 확인하고, 테이블을 눌러 실제 샘플 데이터를 볼 수 있다. +세미나나 내부 설명 자리에서도 훨씬 설명하기 쉬운 상태가 됐다. + +#### 4. 자리배치도 기능이 실사용 방향으로 조금 더 진전됐다 + +자리배치도에서는 다음이 개선됐다. + +- 클릭한 인원의 상위 조직 트리 표시 +- 검색 카드 동작 정리 +- 인원 카드 정보 구조 정리 +- 비관리자 모드 재렌더 안정화 +- 미배치/배치 상태 시각화 기준 정리 준비 +- 팀 구역 오버레이 기능 시도와 요구사항 정리 + +즉, 단순히 "보이는 화면"이 아니라, 실제 조직과 사람을 읽기 쉬운 화면으로 한 걸음 더 나아갔다. + +#### 5. 회귀 방지 체계를 붙였다 + +이번 세션에서 중요한 개선 중 하나는 "문제가 생긴 뒤 찾는 방식"에서 "문제가 생겼는지 바로 확인하는 방식"으로 한 걸음 이동한 점이다. + +이를 위해 `8081` smoke check 스크립트를 추가했다. +이 스크립트는 다음을 한 번에 점검한다. + +- 서버 health +- DB 상태 화면 +- 사업관리대장 기본 원본 API +- 프로젝트별 분석 +- 팀/개인별 분석 +- 사업관리대장 +- 조직현황 연결 + +즉, 구조를 고친 뒤 "겉으로는 멀쩡해 보이는데 실제로는 한 기능이 깨져 있는 상태"를 빨리 잡을 수 있게 된 것이다. + +### 오늘 확인된 문제와 한계 + +이번 작업이 모든 것을 끝낸 것은 아니다. +오히려 구조를 정리하면서, 앞으로 무엇을 더 손봐야 하는지도 더 분명해졌다. + +#### 1. 사업관리대장 세부 데이터 정합성은 아직 보류 + +사업관리대장은 디자인과 기본 기능 연결은 올라왔지만, 세부 수치와 표출 규칙은 원본 작성자와 기준을 맞춰야 한다. +즉, "대충 맞아 보이는 수준"이 아니라 "원본 의도와 동일한 수준"으로 맞추려면 담당자 확인이 필요하다. + +#### 2. 자리배치도 `#7`은 아직 재작업 필요 + +팀 구역 오버레이 기능은 의도 자체는 맞게 해석했고 데이터도 들어가지만, 화면에서 반짝 나타났다가 사라지는 문제가 남아 있다. +즉, 기능 방향은 맞지만 렌더링 타이밍이나 레이어 처리에서 다시 손봐야 한다. + +#### 3. 조직현황은 아직 앱 구조로 완전히 승격되지 않음 + +`ledger`, `payment`, `team`은 앱 소스 구조로 정리했지만, 조직현황은 아직 레거시 구조를 유지하고 있다. +장기적으로는 이것도 같은 기준으로 승격하는 것이 맞다. + +### 앞으로 남은 목표 + +이번 작업 이후의 목표는 다음과 같다. + +#### 1. 사업관리대장 기준 정렬 후 정합성 보정 + +원본 작성자와 함께 세부 데이터 표출 규칙, KPI 집계 방식, 상세 팝업 기준을 확인한 뒤 정확도를 맞춘다. + +#### 2. 자리배치도 `#7`, `#8` 완성 + +- 팀 구역 오버레이를 안정적으로 보이게 수정 +- 배치/미배치 시각 규칙 정리 +- 검색과 클릭 시 정보 노출 방식 마무리 + +#### 3. 백엔드 정리 후속 + +라우트 분리는 많이 진행됐지만, 장기적으로는 도메인 로직까지 더 분리해서 유지보수성을 높일 필요가 있다. + +#### 4. DB 운영 문서와 상태 화면 고도화 + +지금은 DB를 "볼 수 있게 만든" 단계다. +앞으로는 화면별 데이터 흐름, 적재 이력, 원본 로우데이터 확인 기능까지 더 강화하면 운영 설명력이 더 올라간다. + +#### 5. 네 개 주요 탭의 공통 문법을 계속 지켜야 한다 + +이번에 디자인과 구조를 다시 맞췄다고 해서 끝난 것은 아니다. +앞으로 새 기능을 넣을 때도 각 화면이 제각각 다른 방식으로 다시 흩어지지 않게 유지해야 한다. + +즉, 이번 작업의 진짜 성과는 "한 번 예쁘게 고쳤다"가 아니라 "앞으로도 같은 방식으로 고칠 수 있는 기준을 세웠다"는 데 있다. + ## Next Focus -- `#2` 영속성 운영 검증과 문서 기준 정리 +- 사업관리대장 원본 담당자와 세부 데이터 규칙 정렬 +- 자리배치도 `#7`, `#8` 재작업 및 마무리 - 권한 제어와 mock login 정리 - `#9` as-of date 기반 history 구조 설계 및 점진적 도입 -- 자리배치도 조직 트리, 나머지 사무실 도면 등 실사용 기능 고도화 -- 프로젝트별 분석의 남은 소수점/분류 오차 정리 +- 조직현황의 장기적 앱 구조 승격 검토