프로젝트 / (주)대하 자재관리 및 차량관리

CRUD 구현

2026.05.07 3분 읽기

2026-05-07 · Phase 1 (D1) + Phase 2A (D2~D3 일부)

한 줄 요약

D0의 디자인 토큰 위에 인증·세션·CSRF·변경이력 인프라를 박고, 프로젝트와 발주내역 1차 CRUD를 끝냈다. 중간에 엑셀 양식과 다른 컬럼 배치로 만들었다가 한 번 갈아엎음 — 양식과의 시각적 일치가 이 시스템의 본질이라는 걸 다시 확인.


0. 결정 — CI4 폐기, Vanilla PHP로

D0 계획서에는 CodeIgniter 4. 그러나 실제 워크플로우는:

CI4는 composer install로 50MB짜리 vendor 폴더를 만들어야 작동하는데, composer를 돌릴 수 있는 환경이 어디에도 없다. 매 업데이트마다 vendor를 zip으로 같이 보내는 건 부담이 너무 큼.

Vanilla PHP 8.4로 전환. 작은 mini-framework 패턴으로 CI4의 좋은 점(필터·세션·CSRF·라우팅 흉내)을 직접 구현. 외부 라이브러리는 PhpSpreadsheet vendor 한 가지만 Phase 3 시점에 zip으로 동봉.

이 결정을 메모리에 박아둠 — 앞으로도 빌드 단계가 있는 프레임워크는 부적합.


1. Phase 1 — 인증·인프라

1A 환경·DB 점검

daehatech.kr/
├── .htaccess                # 보안 헤더, 민감 파일 차단, gzip
├── config/
│   ├── .htaccess            # Require all denied
│   └── env.php              # DB·세션·앱 설정
├── lib/
│   ├── .htaccess            # Require all denied
│   ├── bootstrap.php        # 모든 페이지 첫 줄 require
│   ├── db.php               # PDO 싱글턴 + 디버그 화면
│   └── helpers.php          # e/input/redirect/fmt_*/layout_*
└── dashboard.php            # 임시 점검 화면

확인: PHP 8.4.20 / MySQL 8.0.44 / 8테이블 + 1뷰(v_purchase_orders) 모두 정상.

1B 인증

index.php(로그인)의 placeholder 인증을 실제 인증으로 교체. 이미 만든 디자인은 그대로.

1C 변경이력 + 공통 layout

index.php 로그인 성공 시 + logout.php에서 audit_log('user', id, 'login'/'logout') 자동 기록.


2. 가독성 + 모바일 대응

폰트 스케일 한 단계 위로

대시보드를 본 사용자 피드백: "폰트가 너무들 작아 나이든 사람들이 많기 때문에 폰트를 키워줘야해". 정보 밀도보다 가독성 우선.

토큰 이전 이후
--fs-base (본문)1416
사이드바 메뉴1316
KPI 값3244
페이지 제목2834
테이블1316
버튼1316

이 정책을 메모리에 박아둠 — 앞으로 새 화면 만들 때 자동 적용.

햄버거 + 오프캔버스 사이드바

760px 이하에서 사이드바가 그냥 사라져 메뉴 접근 불가였던 걸 햄버거로:

사이드바 그룹 헤더 시인성

"자재관리·차량관리·관리"가 안 보임 — text-transform: uppercase + letter-spacing: 0.1em + muted gray + 13px 조합. 한글에 자간/uppercase는 효과 없는데 일반 SaaS 디폴트를 그대로 가져온 실수. 16px + 700 + brand-navy + 그룹 사이 1px 보더로 다시.


3. Phase 2A — 자재 모듈

2A1 프로젝트 마스터 CRUD

2A2 발주내역 CRUD (1차)

이게 잘못 만든 1차.


4. 시행착오 — 양식을 안 봤던 사고

사용자 지적: "왜 이 양식에 따라서 개발하지 않는거야?"

요구사항 정의서의 16컬럼 텍스트만 보고 폼·표를 임의로 재구성한 게 잘못. 클라이언트가 매일 보는 엑셀 양식의 컬럼 순서·헤더 라벨·시각 구조 그대로가 이 시스템의 본질("엑셀 양식을 그대로 웹으로")이라는 걸 잊었다.

openpyxl로 양식 직접 분석:

시트 구조 발견
프로젝트 정보 7행 × 2열 (라벨/값) 내 폼 순서 OK
발주내역 96행 × 16열 가로 표 헤더 라벨이 "수 량"(공백 1칸), "입고(예정)일"(괄호 포함) — 양식 그대로 써야

엑셀 컬럼 순서:

순번 → 품목코드 → 품명 및 규격 → 수 량 → 구분 →
자재 청구일 → 구매담당자 → 발주일 → 입고(예정)일 → 잔여일수 →
불출일 → 수령인 → 단가 → 금액 → 업체명 → 비고

수정:

이 결정도 메모리에 박아둠 — "새 화면을 만들기 전, 양식 파일을 직접 열어서 분석한다". 헤더 라벨까지 양식 그대로.


5. 단가 옵셔널 처리

발주 등록 시 단가 미입력도 통과되도록. 양식의 일부 행처럼 단가/금액이 비어 있는 발주가 정상 케이스. 검증을 "입력했을 때만 숫자/음수 체크"로 완화하고, 화면에서 0인 경우 빈칸으로 표시 (양식과 동일한 시각).


현재 상태 (2026-05-07 종료 시점)

작동

미구현


다음 — 즉시 우선순위

  1. 발주내역 시인성 개선 — 16컬럼 표가 정보가 많고 빽빽함. 행 구분/그룹화/주요 컬럼 강조 등 디자인 개선
  2. 수정 흐름 변경 — 행 클릭 = 수정 페이지로 즉각 이동이 너무 직접적. 명시적 [수정] 버튼을 눌러야 편집 폼이 열리는 방향으로 (실수 방지 + 의도 명확)

이후 큰 그림:


메모리에 새로 박은 정책 4건

메모리 핵심
정적 미리보기 사본 금지 PHP 본체와 함께 .html 사본 만들지 말 것
닷홈 직접 배포 워크플로우 로컬 환경 X, FTP 직배포 — 빌드 단계 있는 프레임워크 금지
노년 사용자 가독성 우선 본문 16px 이상, 정보밀도보다 가독성
엑셀 양식 일치 자재/차량 화면은 양식 컬럼 순서·헤더·라벨 그대로, 양식 직접 분석 후 작업

진행하면서 가이드가 점점 명확해진다.

(주)대하 자재관리 및 차량관리 글 목록

← 프로젝트로 이동
CRUD 구현 2026.05.07 개요 2026.05.07