2026-1 데이터베이스 과목을 수강하며 진행한 프로젝트입니다. HeidiSQL과 MariaDB를 이용해 JDBC로 PC방 통합 관리 시스템 프로젝트를 진행했습니다
|
|
|
|
|
| 박시현 | 이홍연 | 장은서 | 천하진 |
-
1.1 빌드 파일로 실행하기
- 빌드 파일 "ezpc_final.jar"을 다운받아주세요. (IP가 시연자 컴퓨터로 하드코딩되어있음)
- jar 파일이 다운받아진 경로로 이동 -> 우클릭 -> 터미널에서 실행 ->
java -jar ezpc_final.jar입력
-
1.2 이클립스로 실행하기
- 깃허브에서 프로젝트 소스 파일을 다운하고 이클립스로 열어주세요
- 2번 데이터베이스 설정으로 이어집니다
HeidiSQL에 접속한 후, 프로젝트 폴더의 src/sql 경로의 쿼리를 HeidiSQL에 아래 순서대로 실행합니다.
| 순서 | 파일 | 경로 |
|---|---|---|
| 1 | DB 생성 쿼리 | src/sql/DB 생성 쿼리.sql |
| 2 | 충전 프로시저 쿼리 | src/sql/충전_프로시저.sql |
| 3 | 로그인 트리거 쿼리 | src/sql/로그인_트리거.sql |
| 4 | 리뷰 트리거 쿼리 | src/sql/리뷰_트리거_3개.sql |
| 5 | 주문 트리거 쿼리 | src/sql/주문_트리거.sql |
| 6 | 권한 쿼리 | src/sql/권한_쿼리.sql |
- Python이 없는 경우 먼저 설치합니다.
- 터미널에서 다음 라이브러리들을 설치합니다 (가짜 데이터 생성 관련 라이브러리)
pip install faker pandas pymysqlsrc/sql경로의generate_dummy_data파일의 50번째 줄password부분을 본인 DB 비밀번호로 수정합니다.
DB_CONFIG = {
'host' : 'localhost',
'port' : 3306,
'user' : 'root', # ← MariaDB 계정
'password' : '', # ← 비밀번호
'database' : 'EZPC',
'charset' : 'utf8mb4',
'autocommit': False,
}- 해당 파일이 위치한 경로에서 다음 명령어를 실행합니다.
python generate_dummy_data.py- EZPC DB에 더미데이터가 생성됐는지 확인합니다
src/db/DatabaseConnector.java를 열어 URL의 IP주소를 본인 환경에 맞게 수정합니다.
private static final String URL = "jdbc:mysql://IP주소/EZPC";src/Main.java를 실행합니다.
커밋 / PR에 공통 적용되며, 작업 구분의 기본 틀입니다. 전체 소문자 작성을 원칙으로 합니다.
| name | description |
|---|---|
| feat | 새로운 기능 추가 또는 기존 기능의 의미 있는 확장 |
| fix | 버그, 오류, 잘못된 동작 수정 |
| docs | 문서만 변경 (코드 동작 변화 없음) |
| refactor | 외부 동작은 유지한 채 내부 구조 개선 |
| test | 테스트 코드 추가 또는 테스트 관련 변경 |
| chore | 기능과 무관한 작업 또는 설정·운영 정리 |
| ci | CI 관련 작업 |
| build | 빌드 및 배포 설정 |
| perf | 성능 개선 |
| 계정 | 권한 | 사용 시점 |
|---|---|---|
ezpc_auth |
pc_member SELECT만 |
로그인 화면 — 인증 전용, 즉시 해제 |
ezpc_user |
사용자 업무 테이블 + 프로시저 실행 | 로그인 성공 후 — UserController 전체 생애 |
ezpc_owner |
EZPC.* ALL |
로그인 성공 후 — OwnerController 전체 생애 |
계정 생성 쿼리:
db 권한 설정 쿼리.sql(HeidiSQL에서 root로 실행)
Main.java
└─ SwingUtilities.invokeLater()
└─ new LoginController()
├─ DatabaseConnector.getAuthConnection() → ezpc_auth 연결
└─ LoginView 표시
LoginView — 로그인 버튼 클릭
└─ LoginController.handleLogin()
├─ PC_MemberService.login(id, pw)
│ └─ PC_MemberDAOImpl.findByID()
│ └─ ezpc_auth 연결로 pc_member SELECT
│
├─ 실패
│ └─ LoginView.setStatusMessage("아이디 또는 비밀번호가 올바르지 않습니다.")
│
└─ 성공
├─ authConn.close() ← 인증 전용 연결 즉시 해제
├─ DatabaseConnector.getConnection(memberType) ← 역할별 연결 새로 생성
│
├─ memberType = "owner" → new OwnerController(ownerConn, member).start()
└─ memberType = "user" → new UserController(userConn, member).start()
LoginView — 회원가입 버튼 클릭
└─ LoginController.handleSignUp()
└─ SignUpView 표시
└─ 회원가입 버튼 클릭
├─ 비밀번호 확인 불일치 → SignUpView.setStatusMessage("비밀번호 불일치")
└─ 일치
└─ PC_MemberService.signUp(id, pw, name)
├─ 중복 ID 검사 (findByID)
└─ insertMember() → member_type = "user" 고정, grade = "bronze"
회원가입은
ezpc_auth연결을 재사용하므로 별도 DB 연결 불필요
(단,ezpc_auth에pc_member INSERT권한이 없다면 회원가입 전용 연결을 별도로 사용)
UserController(userConn, member)
└─ 모든 DAO를 userConn으로 생성
UserBranchSelectView 표시
└─ 지점 버튼 클릭
└─ PcCafeService.getAllPcCafes()
└─ PcCafeDAOImpl.findAll() → pc_cafe SELECT
UserSeatSelectView 표시
├─ CustomerService.getCustomersInPcCafe(pcCafeId) → 현재 이용 중인 좌석 목록
└─ 좌석 선택
└─ CustomerService.checkIn(customer)
├─ CustomerDAOImpl.insertCustomer() → customer INSERT
└─ LogDAOImpl.insertLog() → use_log INSERT (login_time 기록)
충전 버튼 클릭
└─ ChargeService.recordCharge(charge)
└─ ChargeDAOImpl.chargeByCustomer()
└─ CALL charge_by_customer(pc_cafe_id, seat_num, member_id, ticket_time)
├─ charge INSERT (충전 기록)
├─ customer.remain_time UPDATE (현재 손님 잔여 시간)
├─ pc_member.total_payment_amount UPDATE (누적 결제 금액, 회원만)
└─ pc_member.grade_type UPDATE (등급 재산정, 회원만)
음식주문 버튼 클릭
└─ UserFoodOrderView 표시
├─ FoodService.getAllFoods() → 음식 메뉴 조회
├─ StockService.getStock(pcCafeId) → 재고 확인
└─ OrderService.placeOrder(order)
├─ EventScheduleDAOImpl.findCurrentOrderPaymentRate() → 이벤트 할인율 조회
├─ food_order INSERT (주문 기록)
└─ StockDAOImpl.decreaseStock() (재고 차감)
리뷰 버튼 클릭 (회원만 가능)
└─ UserReviewManageView 표시
└─ ReviewService.addReview(review)
└─ ReviewDAOImpl.insert() → review INSERT
로그아웃 버튼 클릭
└─ CustomerService.checkOut(customer) ← 트랜잭션
├─ LogDAOImpl.updateLogoutTime() → use_log.logout_time UPDATE
├─ LogDAOImpl.findLatestLogoutLog() → 로그인/아웃 시간 조회
├─ 사용 시간 계산 (logout - login, 분 단위)
├─ PC_MemberDAOImpl.updateRemainTimeAfterUse() → remain_time 차감 (회원만)
└─ CustomerDAOImpl.deleteCustomer() → customer DELETE
OwnerController(ownerConn, member)
└─ 모든 DAO를 ownerConn으로 생성
└─ OwnerMainFrameView 표시 (탭 5개)
| 탭 | 서비스 | 주요 기능 |
|---|---|---|
| 좌석 모니터링 | CustomerService |
지점별 현재 이용 중인 손님 조회 |
| 매출 통계 | SalesReportService |
월별·이벤트별·피크타임별 매출 조회 |
| 음식 재고 | StockService |
지점별 재고 조회 및 수정 |
| 직원 관리 | EmployeeService |
직원 추가·수정·삭제 |
| 회원 관리 | PC_MemberService |
user 타입 회원 조회 (owner 계정 제외) |
View — 화면 표시 + 버튼 리스너 노출만 담당, 비즈니스 로직 없음
Controller — View와 Service 연결, 화면 전환, DB 연결 생성·관리
Service — 비즈니스 로직 처리
DAOImpl — SQL 실행, 외부에서 주입받은 conn만 사용
DatabaseConnector를 직접 호출하는 곳은LoginController하나뿐- 모든 DAOImpl은 생성자로 주입받은
conn만 사용 (내부에서 직접 연결 생성 금지) - 역할별
conn은 Controller 생성 시 한 번만 만들어지고 해당 Controller 생애 동안 유지
// LoginController에서만 호출
Connection authConn = DatabaseConnector.getAuthConnection(); // 로그인용
Connection roleConn = DatabaseConnector.getConnection(memberType); // 역할별
// Controller 내부에서 DAO 생성
EmployeeDAO employeeDao = new EmployeeDAOImpl(roleConn);
GradeDAO gradeDao = new GradeDAOImpl(roleConn);
TicketDAO ticketDao = new TicketDAOImpl(roleConn);
// ... 나머지 동일