6. Logic (시스템 분석, UI - Logic - DB)

0. 소프트웨어 개발 프로세스
1. 시스템 구조 분석
: 분석 - 시스템이 어떤 구성요소로 이루어져 있고, 각 요소가 어떤 역할을 하며, 어떻게 동작하는가
더보기

이 프로그램은 크게 4개의 영역으로 나뉜다.

(1) 전역 설정 영역
- 프로그램 전체에서 “공통으로 쓰는 값”을 모아둔 영역
- 현재 코드에서는 DB_CONFIG
데이터베이스 접속 정보인 제한적 정보 사용
(2) 데이터 접근 영역(DB)
- DB와 통신하는 “중간 계층”
- 현재 코드에서는 DatabaseManager + 전역 DB 객체
(3) 메인 UI 프레임(프로그램 껍데기)
- 사이드바/페이지 영역 배치
- 페이지 전환 제어
- 현재 코드에서는 LibrarySystem(QMainWindow)
(4) 기능별 페이지(UI + 로직)
- 실제 기능(회원/도서/대여)을 수행하는 화면 단위 클래스
- 현재 코드에서는 CirculationPage, BookManagerPage, MemberManagerPage
2. 전역 설정 영역과 데이터 접근 영역(DB)
더보기


(1) 데이터 접근 영역 개요
- 데이터 접근 영역(DB Layer)은 GUI 화면과 실제 데이터베이스 사이를 연결하는 중간 계층으로,
데이터 저장·조회·수정·삭제(CRUD)와 관련된 모든 처리를 담당한다. - config(DB_CONFIG)
- DatabaseManager
(2) config(DB_CONFIG)
- DB 접속 정보는 반드시 config(DB_CONFIG)에서만 정의한다.
- 다른 모듈에서는 DB 설정 값을 직접 작성하지 않는다.
- 설정 변경 시 config 파일만 수정하도록 한다.
(3) DatabaseManager
- DB 연결 생성 및 해제 책임을 가진다.
- SQL 실행과 결과 조회를 전담한다.
- UI 계층에서 DB 접근을 직접 수행하지 않도록 차단한다.
3. 메인 UI 프레임 영역
ㄴ 3.1 전체 구조
더보기

(1) class LibrarySystem(QMainWindow):

(2) 역할:
- 전체 프로그램 창
- 사이드바 + 페이지 영역 배치
- LibrarySystem은 "배치 + 전환"만 담당
- Sidebar UI 구성
- QStackedWidget에 페이지 넣기
- 버튼 클릭 시 setCurrentIndex()
- 실제 CRUD/대 로직은 Page에만 존재
(3) QMainWindow, QWidget, QStackedWidget 역할 비교:
- QMainWindow: 앱의 대표 창(메뉴바/툴바/상태바 등 확장에 유리)
- QStackedWidget: 여러 페이지를 쌓아두고 하나만 보여주는 컨테이너
장점: 페이지를 미리 만들어 두고 빠르게 전환 가능(구조가 단순) - QWidget: 일반 화면 단위(페이지)
(4) 현재 구조는 LibrarySystem 생성 시 3페이지를 모두 생성합니다.
- 장점: 전환 즉시 화면이 뜸
- 단점: 페이지가 많아지면 초기 로딩 비용이 늘 수 있음
ㄴ 3.2 화면 전환 메커니즘
더보기


- QStackedWidget은 페이지를 여러 페이지를 겹쳐놓고 인덱스로 하나씩 보여주는 방식
삭제/재생성 하지 않고, 보여주기만 - 실제로는 “페이지를 교체”하는 것이 아님
- 따라서 페이지 내부 상태(입력칸, current_member_id 등)는 페이지가 유지되는 동안 남아 있을 수 있다.
4. 기능별 페이지(UI + 로직)
ㄴ 4.1 전체 구조
더보기


| 페이지 | 클래스역할 |
| CirculationPage | 도서 대여 / 반납 / 연장 |
| BookManagerPage | 도서 등록 / 조회 / 삭제 |
| MemberManagerPage | 회원 등록 / 조회 / 삭제 |
- 각 페이지는 독립적인 QWidget
- 하나의 책임만 담당
ㄴ 4.2 MemberManagerPage(회원 관리 페이지)
ㄴ 4.3 BookManagerPage(도서 관리 페이지)
ㄴ 4.4 CirculationPage(대여/반납/연장 페이지)
ㄴ 4.4 basepage(공통 패턴)
더보기


(1) BasePage 기준으로 각 페이지는 항상 동일한 블록을 가진 GUI 구조입니다.
- Title(Label)
- 입력 폼(form_layout)
- 검색 폼(search_layout)
- 테이블(QTableWidget)
- 하단 버튼(bottom_layout)
(2) 페이지별로 "이벤트-DB-테이블 갱신" 3단 구조로 각 기능은 거의 동일합니다.
- 이벤트(버튼 클릭)
- DB 처리(fetch/execute)
- UI 반영(fill_table / msg)
예)
- 회원 등록: 클릭 → INSERT → load_members() → 테이블 갱신
- 도서 조회: 클릭 → SELECT → fill_table()
- 반납: 클릭 → DELETE issues + UPDATE books → load_loan_list()




