Programming/Project Log

[가계부 만들기] 테이블 설계

minarae7 2023. 2. 28. 19:46
728x90
반응형

엑셀로 가계부를 쓰기 시작했는데 이걸 일일이 쓰려니 상당히 귀찮다. 일일이 손으로 입력하는 것도 귀찮고 생각보다 엑셀이 스마트하지 않고 그래프나 이런 부분이 매번 손으로 입력하는 것이 꽤 귀찮아서 내가 만든 양식을 범용으로 사용할 수 있도록 가계부 프로그램을 만들어볼까 한다.

우선 Backend 쪽 프롣그램을 먼저 개발을 하고 프론트를 붙이는 방향으로 개발을 진행할 예정이다.

개발 언어는 현재 회사에서 사용하고 있는 python의 fastapi를 사용할 것이고 frontend는 React를 사용하며 개인적으로 디자인에 많이 쓰는 bootstrap을 활용할 계획이다.

개발하는 내용들을 여기에 기록을 남기면서 개발을 진행할 것이다.

엑셀에서 작성한 내용은 다음 그림과 같이 정리하였다.

현재 작성중인 가계부 예시

위의 내용을 프로그램으로 구현하기 위해서 먼저 테이블 설계를 했다.

다음은 테이블을 생성한 쿼리이다.

CREATE TABLE `tb_members` (
  `member_no` smallint unsigned NOT NULL AUTO_INCREMENT COMMENT '멤버번호',
  `member_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '사용자 아이디',
  `member_pw` char(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '사용자 패스워드',
  `member_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '사용자 이름',
  `member_email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '이메일 주소',
  `reg_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
  `upd_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  `is_deleted` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'F' COMMENT '삭제여부(T|F)',
  `del_dt` datetime DEFAULT NULL COMMENT '삭제일시',
  PRIMARY KEY (`member_no`),
  UNIQUE KEY `members__member_id` (`member_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

CREATE TABLE `tb_category` (
  `category_no` int unsigned NOT NULL AUTO_INCREMENT COMMENT '카테고리 번호',
  `member_no` smallint unsigned DEFAULT NULL COMMENT '카테고리 생성자 번호(기본 카테고리일 경우 null)',
  `category_name` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT '카테고리 이름',
  `is_children` char(1) COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'F' COMMENT '자식을 가지고 있는지 여부(T|F)',
  `parent_no` int unsigned DEFAULT NULL COMMENT '부모 카테고리 번호',
  `class_name` varchar(30) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '아이콘 카테고리',
  `is_system` char(1) COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'T' COMMENT '시스템 기본 카테고리',
  `reg_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
  `upd_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  `is_deleted` char(1) COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'F' COMMENT '삭제여부(T|F)',
  `del_dt` datetime DEFAULT NULL COMMENT '삭제일시',
  PRIMARY KEY (`category_no`),
  KEY `ixn_category__member_no` (`member_no`),
  CONSTRAINT `fk_category__member_no` FOREIGN KEY (`member_no`) REFERENCES `tb_members` (`member_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

CREATE TABLE `tb_account_log` (
  `account_log_no` int unsigned NOT NULL AUTO_INCREMENT COMMENT '내역번호',
  `member_no` smallint unsigned NOT NULL COMMENT '사용자번호',
  `std_date` date NOT NULL COMMENT '날짜',
  `opponent_name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '메인거래처',
  `reg_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
  `upd_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  `is_deleted` char(1) COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'F' COMMENT '삭제여부(T|F)',
  `del_dt` datetime DEFAULT NULL COMMENT '삭제일시',
  PRIMARY KEY (`account_log_no`),
  KEY `ixn_account_log__member_no` (`member_no`),
  CONSTRAINT `fk_account_log__member_no` FOREIGN KEY (`member_no`) REFERENCES `tb_members` (`member_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

CREATE TABLE `tb_log_detail` (
  `log_detail_no` int unsigned NOT NULL AUTO_INCREMENT COMMENT '사용내역 상세 번호',
  `account_log_no` int unsigned NOT NULL COMMENT '내역번호',
  `detail_contents` varchar(300) COLLATE utf8mb4_general_ci NOT NULL COMMENT '상세내역정보',
  `amounts` int unsigned NOT NULL COMMENT '금액',
  `io_type` char(1) COLLATE utf8mb4_general_ci NOT NULL COMMENT '수입/지출 구분(I: 수입, O: 지출)',
  `category_no` int unsigned DEFAULT NULL COMMENT '카테고리 번호',
  `importance` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '중요도(지출일 경우만)',
  `is_fixed_cost` char(1) COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'F' COMMENT '고정비여부(지출일 경우만, T|F)',
  `reg_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
  `upd_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
  `is_deleted` char(1) COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'F' COMMENT '삭제여부(T|F)',
  `del_dt` datetime DEFAULT NULL COMMENT '삭제일시',
  PRIMARY KEY (`log_detail_no`),
  KEY `ixn_log_detail__account_log_no` (`account_log_no`),
  KEY `ixn_log_detail__category_no` (`category_no`),
  CONSTRAINT `fk_log_detail__account_log_no` FOREIGN KEY (`account_log_no`) REFERENCES `tb_account_log` (`account_log_no`),
  CONSTRAINT `fk_log_detail__category_no` FOREIGN KEY (`category_no`) REFERENCES `tb_category` (`category_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

이렇게 구현하면 일단 범용적으로 다수의 사용자가 이용이 가능하다. 각 기록은 사용자에게 할당되기 때문에 다른 사용자의 내용을 확인할 수 없다.

각 테이블간의 관계는 다음 이미지의 ERD에서 확인할 수 있다.

테이블 ERD

일단 개발을 시작하는 단계이기 때문에 이렇게 테이블을 설계하고 코드를 만들어나갈 계획이다. 코드를 만들어가는 과정에서 필요한 부분이 있다면 테이블을 수정하거나 다른 관계를 갖는 테이블을 추가할 것이다.

이제 테이블을 만들었으니 본격적으로 Backend 코드를 개발하기 시작할 것이다. 본격적인 개발은 다음 포스트에서 진행하도록 한다.

728x90
반응형