docs: record 2026-04-01 refactor and db work

This commit is contained in:
hyunho
2026-04-01 18:10:13 +09:00
parent d0e055973e
commit 40ff4f01ac

View File

@@ -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 구조 설계 및 점진적 도입
- 자리배치도 조직 트리, 나머지 사무실 도면 등 실사용 기능 고도화
- 프로젝트별 분석의 남은 소수점/분류 오차 정리
- 조직현황의 장기적 앱 구조 승격 검토