티스토리 뷰
근태 시스템 구축: 테이블 생성과 더미 데이터 입력
많은 회사들이 아직도 근태나 휴가 관리를 엑셀로 하고 있다.
회사마다 형식은 조금씩 다르겠지만, 대체로 아래와 같은 양식을 사용하고 있을 것이다.
(아래 양식은 실제로 내가 예전에 다녔던 작은 회사에서 사용하던 방식이다.)
이 양식은 월별로 어떤 직원이 언제 휴가를 썼는지 한눈에 보기 쉬운 구조이다.
이번에 우리가 만들어볼 첫 번째 화면도 이와 비슷한 휴가 현황 화면이다.
화면 구조 분석
이 화면을 살펴보면,
가로에는 날짜가 나열되어 있고,
세로에는 직원 목록이 출력되며 각 날짜에 해당 직원의 휴가 사용 일수가 표시된다.
(예: 반차는 0.5일, 반반차는 0.25일)
하지만 이와 같은 구조를 그대로 테이블로 설계할 수는 없다.
저런 화면 구조는 데이터를 조회하고 나서 출력할 때 처리할 부분이지,
DB에 저장할 때는 다른 방식으로 접근해야 한다.
핵심 데이터는 다음과 같다.
- 누구(emp_id)가
- 언제(leave_ymd)
- 어떤 유형의 휴가(leave_type)를
- 얼마나(leave_days) 사용했는가
일단은 이 정보만으로도 충분하다.
(우리는 정말 간단한 기능에서 부터 시작할 것이기 때문에.)
기본 테이블 구성
따라서, 휴가 사용 내역을 저장할 테이블은 아래와 같은 컬럼으로 구성하면 된다.
emp_id -- 사번
leave_ymd -- 휴가 날짜
leave_type -- 휴가 타입 (연차, 병가, 반차 등)
leave_days -- 사용한 휴가 일수
조직 정보와 사원 정보
근태 시스템을 만든다는 건 기본적으로 조직과 사원에 대한 정보를 가지고 있다는 것을 전제로 하고 있다.
따라서 먼저 부서 테이블과 사원 테이블을 만들어야 한다.
부서 정보 테이블
CREATE TABLE departments (
org_id VARCHAR(10) NOT NULL,
org_nm VARCHAR(100) NOT NULL,
parent_org_id VARCHAR(10),
created_emp_id VARCHAR(10) NOT NULL,
created_ymd TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
modified_emp_id VARCHAR(10) NOT NULL,
modified_ymd TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (org_id),
FOREIGN KEY (parent_org_id) REFERENCES departments(org_id)
);
COMMENT ON COLUMN public.departments.org_id IS '부서ID';
COMMENT ON COLUMN public.departments.org_nm IS '부서명';
COMMENT ON COLUMN public.departments.parent_org_id IS '부모 부서ID';
COMMENT ON COLUMN public.departments.created_ymd IS '생성일';
COMMENT ON COLUMN public.departments.created_emp_id IS '생성자';
COMMENT ON COLUMN public.departments.modified_emp_id IS '수정자';
COMMENT ON COLUMN public.departments.modified_ymd IS '수정일';
사원 정보 테이블
CREATE TABLE public.employees (
emp_id VARCHAR(10) NOT NULL,
emp_nm VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
org_id VARCHAR(10),
hired_ymd DATE NOT NULL,
resigned_ymd DATE,
created_emp_id VARCHAR(10) NOT NULL,
created_ymd TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
modified_emp_id VARCHAR(10) NOT NULL,
modified_ymd TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
PRIMARY KEY (emp_id),
FOREIGN KEY (org_id) REFERENCES departments(org_id)
);
COMMENT ON COLUMN public.employees.emp_id IS '사번';
COMMENT ON COLUMN public.employees.emp_nm IS '성명';
COMMENT ON COLUMN public.employees.email IS '이메일';
COMMENT ON COLUMN public.employees.org_id IS '부서ID';
COMMENT ON COLUMN public.employees.resigned_ymd IS '퇴사일';
COMMENT ON COLUMN public.employees.created_ymd IS '생성일';
COMMENT ON COLUMN public.employees.created_emp_id IS '생성자';
COMMENT ON COLUMN public.employees.modified_emp_id IS '수정자';
COMMENT ON COLUMN public.employees.modified_ymd IS '수정일';
두 테이블을 생성하면 아래처럼 테이블 구조를 확인할 수 있다.
더미 데이터 입력
부서와 사원테이블에서 사용할 더미 데이터도 생성하자
부서 데이터
INSERT INTO public.departments VALUES ('1', '경영지원팀', NULL, '1001', now(), '1001', now());
INSERT INTO public.departments VALUES ('2', '개발팀', '1', '1001', now(), '1001', now());
INSERT INTO public.departments VALUES ('3', '디자인팀', '1', '1001', now(), '1001', now());
사원 데이터
INSERT INTO public.employees VALUES ('1001', '최대팔', 'choid8@example.com', '1', '2019-11-10', NULL, '1001', now(), '1001', now());
INSERT INTO public.employees VALUES ('1002', '이영희', 'leeyh@example.com', '2', '2022-03-01', NULL, '1001', now(), '1001', now());
INSERT INTO public.employees VALUES ('1003', '박철수', 'parkcs@example.com', '3', '2021-06-20', '2024-01-05', '1001', now(), '1001', now());
INSERT INTO public.employees VALUES ('1004', '김민수', 'kimms@example.com', '2', '2023-01-15', NULL, '1001', now(), '1001', now());
휴가 사용 내역 테이블
부서 정보를 모두 만들었으니 휴가내역을 관리할 테이블도 생성을 하자.
CREATE TABLE public.leaves (
emp_id VARCHAR(10) NOT NULL,
leave_ymd DATE NOT NULL,
leave_type VARCHAR(10) NOT NULL,
leave_days NUMERIC(5, 3) NOT NULL,
remark VARCHAR(1000),
created_emp_id VARCHAR(10) NOT NULL,
created_ymd TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
modified_emp_id VARCHAR(10) NOT NULL,
modified_ymd TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
CONSTRAINT leaveymd_pkey PRIMARY KEY (emp_id, leave_ymd, leave_type)
);
COMMENT ON COLUMN public.leaves.emp_id IS '사번';
COMMENT ON COLUMN public.leaves.leave_ymd IS '휴가일';
COMMENT ON COLUMN public.leaves.leave_type IS '휴가유형';
COMMENT ON COLUMN public.leaves.leave_days IS '사용 일수';
COMMENT ON COLUMN public.leaves.remark IS '비고';
COMMENT ON COLUMN public.leaves.created_emp_id IS '생성자';
COMMENT ON COLUMN public.leaves.created_ymd IS '생성일';
COMMENT ON COLUMN public.leaves.modified_emp_id IS '수정자';
COMMENT ON COLUMN public.leaves.modified_ymd IS '수정일';
휴가 더미 데이터
휴가현황을 만들어 가는 과정에서 데이터를 제대로 읽어 오는지, 확인하기 위하여 휴가현황도 몇 개의 더미 데이터를 만들어 둔다.
INSERT INTO public.leaves VALUES ('1001', '2024-01-15', '연차', 1.0, '연초 연차 사용', '1001', now(), '1001', now());
INSERT INTO public.leaves VALUES ('1002', '2024-02-05', '병가', 0.5, '감기 몸살', '1002', now(), '1002', now());
INSERT INTO public.leaves VALUES ('1003', '2024-03-10', '반차', 0.5, '오전 반차', '1003', now(), '1003', now());
INSERT INTO public.leaves VALUES ('1001', '2024-04-02', '연차', 1.0, '개인 사유', '1001', now(), '1001', now());
INSERT INTO public.leaves VALUES ('1004', '2024-04-20', '병가', 1.0, '치과 진료', '1004', now(), '1004', now());
테이블과 데이터가 모두 준비되면 아래와 같이 확인할 수 있다.
다음 단계
다음 포스팅에서는 이 테이블에서 휴가 내역을 읽어오는 백엔드 프로그램을 작성한다.
REST API를 통해 데이터를 조회하고, 화면에 출력하는 흐름까지 이어가 보도록 한다.
'사이드 프로젝트 서브노트 > 근태 관리 프로젝트 서브노트' 카테고리의 다른 글
근태 시스템 만들기 - 프로젝트 생성하기 (1) | 2025.04.30 |
---|---|
근태 시스템 만들기 - DB 설치 (0) | 2025.04.29 |
근태 시스템 만들기 서브노트 (0) | 2025.04.29 |
- Total
- Today
- Yesterday
- 스프링
- 아침 글쓰기 챌린지
- Did you know
- bootstrap
- 리눅스
- spring board
- 티스토리챌린지
- 안드로이드 스튜디오
- 게시판
- MAC OS STS Spring
- java
- Spring 게시판
- Javascript
- android studio
- 도서
- Linux
- openjdk
- 개발팁
- Tip of the day
- 글쓰기
- spring
- 회고
- 한빛미디어
- 아침 글쓰기
- 오블완
- php mvc
- 아침글쓰기
- 라즈베리파이3
- Raspberry pi3
- IntelliJ
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |