포트폴리오

전산 프로그램 ERPLite

2026년 01월 25일
86

Github

개요

전산 프로그램 개발과 실무 ERP 흐름을 연습하고자, JavaFX 기반의 데스크톱 ERP 시스템을 개발했습니다. 웹이 아닌 데스크톱 애플리케이션으로, 재고 관리, 거래 등록, 매출 조회 등 회사 업무에서 사용하는 핵심 기능을 실제처럼 구현했습니다.

메인


기술 스택

구분기술
언어Java 17
UIJavaFX 21
DBMySQL 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. 거래 등록

거래

매입/매출/반품 거래를 등록할 수 있는 다이얼로그입니다.

헤더 영역: 거래유형, 일자, 거래처, 창고 선택 상세 영역: 품목별 수량/단가 입력, 공급가액/부가세 자동 계산 요약 영역: 총 수량, 공급가액, 부가세, 합계 실시간 표시

매입 등록

매입 확정 시 즉시 재고 반영, 임시저장 시 확정 후 재고 반영됩니다.

매입

매출 등록

선택한 창고 기준의 현재고를 실시간으로 표시하며, 요청 수량이 현재고를 초과하면 빨간색으로 경고합니다.

매출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

ERD

주요 테이블:

테이블설명
item품목 마스터
customer거래처 마스터
warehouse창고 마스터
transaction거래 헤더 (매입/매출/반품)
transaction_detail거래 상세 (품목별 수량/단가)
stock현재고 (품목 + 창고 단위)
stock_history재고 이력 (입고/출고/조정)

모든 테이블에 is_deleted 플래그를 두어 논리 삭제를 적용했습니다.


실행 방법

# MySQL 컨테이너 실행
docker-compose up -d

# 애플리케이션 실행
mvn clean javafx:run

마무리

이번 프로젝트를 통해 ERP 시스템의 핵심인 재고-거래-매출 간 데이터 흐름을 직접 설계하고 구현해볼 수 있었습니다.

이후에는 출고 서비스(택배 서비스)와 같은 기능을 추가하고, 로그인 기반으로 역할을 분담하여 사용자별 접근 권한을 적용해보는 확장도 계획하고 있습니다.


댓글을 불러오는 중...