전산 프로그램 ERPLite
개요
전산 프로그램 개발과 실무 ERP 흐름을 연습하고자, JavaFX 기반의 데스크톱 ERP 시스템을 개발했습니다. 웹이 아닌 데스크톱 애플리케이션으로, 재고 관리, 거래 등록, 매출 조회 등 회사 업무에서 사용하는 핵심 기능을 실제처럼 구현했습니다.
기술 스택
| 구분 | 기술 |
|---|---|
| 언어 | Java 17 |
| UI | JavaFX 21 |
| DB | MySQL 8.0 |
| DB 접근 | JDBC |
| 로깅 | SLF4J + Logback |
아키텍처
UI (JavaFX) → Controller → Service → DAO → MySQL
계층형 아키텍처를 적용하여 각 레이어의 책임을 분리했습니다.
src/main/java/com/company/erp/
├── ui/ # JavaFX 화면 컴포넌트
├── controller/ # UI 요청 처리, 예외 변환
├── service/ # 비즈니스 로직, 트랜잭션 관리
├── dao/ # 데이터 접근, SQL 실행
├── dto/ # 데이터 전송 객체
├── exception/ # 예외 계층 구조
└── util/ # 공통 유틸리티
주요 기능
1. 거래 등록
매입/매출/반품 거래를 등록할 수 있는 다이얼로그입니다.
헤더 영역: 거래유형, 일자, 거래처, 창고 선택 상세 영역: 품목별 수량/단가 입력, 공급가액/부가세 자동 계산 요약 영역: 총 수량, 공급가액, 부가세, 합계 실시간 표시
매입 등록
매입 확정 시 즉시 재고 반영, 임시저장 시 확정 후 재고 반영됩니다.
매출 등록
선택한 창고 기준의 현재고를 실시간으로 표시하며, 요청 수량이 현재고를 초과하면 빨간색으로 경고합니다.
거래 프로세스
임시저장 (DRAFT) → 확정 (CONFIRMED) → 재고 반영
↓
취소 시 재고 원복
- 임시저장: 재고 반영 없이 저장만
- 저장 후 확정: 저장과 동시에 재고 반영 (매입 → 입고, 매출 → 출고)
- 거래 취소: 확정된 거래도 취소 가능하며, 재고가 자동으로 원복됨
거래 상세 보기
거래 목록에서 더블클릭하면 상세 정보를 확인할 수 있습니다.
2. 재고 관리
- 창고별 필터링: 전체 / 창고1 / 창고2 등 드롭다운으로 창고별 재고 확인
- 안전재고 알림: 안전재고 이하 품목을 한눈에 확인
- 재고 조정: 실사 결과에 따른 수량 조정 (사유 필수 입력)
재고 이력 조회
품목을 더블클릭하면 해당 품목의 입출고 이력을 확인할 수 있습니다.
- 입고(파랑) / 출고(빨강) / 조정(주황) 색상 구분
- 이전 수량 → 이후 수량 변화 추적
- 관련 거래번호 및 조정 사유 표시
3. 매출 조회
기간별 매출 현황을 다양한 기준으로 집계하여 조회합니다.
| 집계 기준 | 설명 |
|---|---|
| 일별 | 날짜별 매출/매입/이익 집계 |
| 월별 | 월별 매출/매입/이익 집계 |
| 거래처별 | 거래처별 매출/매입/이익 집계 |
| 품목별 | 품목별 매출/매입/이익 집계 |
3단계 드릴다운
매출 집계 데이터에서 개별 거래, 거래 상세까지 3단계로 상세 조회가 가능합니다.
[1단계] 매출 집계 (일별/월별/거래처별/품목별)
└─ 더블클릭 → [2단계] 개별 거래 목록 (해당 조건의 확정 거래)
└─ 더블클릭 → [3단계] 거래 상세 (품목별 수량/단가/금액)
매출 상세에서 더블 클릭 시 거래 상세까지 확인합니다.
4. 마스터 관리
| 메뉴 | 관리 항목 |
|---|---|
| 품목 관리 | 품목코드, 품목명, 단위, 원가, 판매가, 안전재고 |
| 거래처 관리 | 거래처코드, 거래처명, 유형(매입처/매출처), 연락처 |
| 창고 관리 | 창고코드, 창고명, 위치 |
예외 처리 설계
사용자에게 보여주는 메시지와 로그에 기록하는 메시지를 분리했습니다.
ErpException (최상위)
├── BusinessException → 비즈니스 로직 오류 (사용자 메시지 포함)
│ ├── InsufficientStockException → "재고가 부족합니다. (요청: 10, 가용: 3)"
│ └── ValidationException → "거래일자를 선택해주세요."
└── DataAccessException → DB 오류 (사용자에게는 일반 메시지)
사용자 화면: "재고가 부족합니다. (요청: 10, 가용: 3)" 로그 파일: "재고 부족 - 품목ID: 5, 요청: 10, 가용: 3, 창고: 1"
재고 부족처럼 사용자가 직접 대응할 수 있는 오류는 구체적인 안내를, DB 오류처럼 기술적인 문제는 일반적인 안내를 제공합니다.
DB 설계
ERD
주요 테이블:
| 테이블 | 설명 |
|---|---|
| item | 품목 마스터 |
| customer | 거래처 마스터 |
| warehouse | 창고 마스터 |
| transaction | 거래 헤더 (매입/매출/반품) |
| transaction_detail | 거래 상세 (품목별 수량/단가) |
| stock | 현재고 (품목 + 창고 단위) |
| stock_history | 재고 이력 (입고/출고/조정) |
모든 테이블에 is_deleted 플래그를 두어 논리 삭제를 적용했습니다.
실행 방법
# MySQL 컨테이너 실행
docker-compose up -d
# 애플리케이션 실행
mvn clean javafx:run
마무리
이번 프로젝트를 통해 ERP 시스템의 핵심인 재고-거래-매출 간 데이터 흐름을 직접 설계하고 구현해볼 수 있었습니다.
이후에는 출고 서비스(택배 서비스)와 같은 기능을 추가하고, 로그인 기반으로 역할을 분담하여 사용자별 접근 권한을 적용해보는 확장도 계획하고 있습니다.