master
Kurt92 5 months ago
commit 8abfcba617

32
.gitignore vendored

@ -0,0 +1,32 @@
# ---> Java
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
replay_pid*
/.junie/
/logs/
/build/
/.idea/
/.gradle/
/.idea/

@ -0,0 +1,12 @@
create table qrtz_blob_triggers
(
SCHED_NAME varchar(120) not null comment '스케줄러 이름',
TRIGGER_NAME varchar(200) not null comment '트리거 이름',
TRIGGER_GROUP varchar(200) not null comment '트리거 그룹',
BLOB_DATA blob null comment '트리거와 관련된 바이너리 데이터 (직렬화된 객체 등)',
primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
constraint qrtz_blob_triggers_ibfk_1
foreign key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) references qrtz_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
)
comment 'Quartz BLOB 트리거 정보 - 바이너리 데이터를 가진 트리거';

@ -0,0 +1,9 @@
create table qrtz_calendars
(
SCHED_NAME varchar(120) not null comment '스케줄러 이름',
CALENDAR_NAME varchar(200) not null comment '캘린더 이름 (고유 식별자)',
CALENDAR blob not null comment '캘린더 데이터 (직렬화된 Calendar 객체)',
primary key (SCHED_NAME, CALENDAR_NAME)
)
comment 'Quartz 캘린더 정보 - 트리거 실행 제외 기간 정의';

@ -0,0 +1,13 @@
create table qrtz_cron_triggers
(
SCHED_NAME varchar(120) not null comment '스케줄러 이름',
TRIGGER_NAME varchar(200) not null comment '트리거 이름',
TRIGGER_GROUP varchar(200) not null comment '트리거 그룹',
CRON_EXPRESSION varchar(200) not null comment 'Cron 표현식 (예: "0 0 12 * * ?" - 매일 정오)',
TIME_ZONE_ID varchar(80) null comment '시간대 ID (예: "Asia/Seoul", NULL이면 시스템 기본 시간대)',
primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
constraint qrtz_cron_triggers_ibfk_1
foreign key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) references qrtz_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
)
comment 'Quartz Cron 트리거 정보 - Cron 표현식 기반 복잡한 스케줄링';

@ -0,0 +1,19 @@
create table qrtz_fired_triggers
(
SCHED_NAME varchar(120) not null comment '스케줄러 이름',
ENTRY_ID varchar(95) not null comment '실행 엔트리 고유 ID',
TRIGGER_NAME varchar(200) not null comment '트리거 이름',
TRIGGER_GROUP varchar(200) not null comment '트리거 그룹',
INSTANCE_NAME varchar(200) not null comment '실행 중인 스케줄러 인스턴스 이름',
FIRED_TIME bigint(13) not null comment '실제 실행 시간 (Unix timestamp)',
SCHED_TIME bigint(13) not null comment '예정된 실행 시간 (Unix timestamp)',
PRIORITY int not null comment '실행 우선순위',
STATE varchar(16) not null comment '실행 상태 (EXECUTING, COMPLETE, BLOCKED, ERROR, PAUSED_BLOCKED)',
JOB_NAME varchar(200) null comment '연결된 작업 이름',
JOB_GROUP varchar(200) null comment '연결된 작업 그룹',
IS_NONCONCURRENT varchar(1) null comment '동시 실행 방지 여부 (Y/N)',
REQUESTS_RECOVERY varchar(1) null comment '복구 요청 여부 (Y/N)',
primary key (SCHED_NAME, ENTRY_ID)
)
comment 'Quartz 실행된 트리거 정보 - 현재 실행 중이거나 실행된 트리거 상태 추적';

@ -0,0 +1,16 @@
create table qrtz_job_details
(
SCHED_NAME varchar(120) not null comment '스케줄러 이름 (여러 스케줄러 인스턴스 구분용)',
JOB_NAME varchar(200) not null comment '작업 이름 (작업의 고유 식별자)',
JOB_GROUP varchar(200) not null comment '작업 그룹 (작업들을 논리적으로 그룹화)',
DESCRIPTION varchar(250) null comment '작업에 대한 설명',
JOB_CLASS_NAME varchar(250) not null comment '실제 작업을 수행할 Java 클래스의 전체 경로',
IS_DURABLE varchar(1) not null comment '작업 영구성 여부 (Y/N) - 스케줄러 재시작 후에도 유지할지 결정',
IS_NONCONCURRENT varchar(1) not null comment '동시 실행 방지 여부 (Y/N) - 같은 작업의 중복 실행 방지',
IS_UPDATE_DATA varchar(1) not null comment '데이터 업데이트 여부 (Y/N) - 작업 실행 시 데이터 업데이트 허용',
REQUESTS_RECOVERY varchar(1) not null comment '복구 요청 여부 (Y/N) - 스케줄러 장애 시 복구 대상 여부',
JOB_DATA blob null comment '작업 실행 시 전달할 데이터 (직렬화된 객체)',
primary key (SCHED_NAME, JOB_NAME, JOB_GROUP)
)
comment 'Quartz 작업 상세 정보 저장 테이블 - 스케줄링될 작업의 메타데이터와 설정 정보';

@ -0,0 +1,8 @@
create table qrtz_locks
(
SCHED_NAME varchar(120) not null comment '스케줄러 이름',
LOCK_NAME varchar(40) not null comment '락 이름 (TRIGGER_ACCESS, JOB_ACCESS, CALENDAR_ACCESS 등)',
primary key (SCHED_NAME, LOCK_NAME)
)
comment 'Quartz 스케줄러 락 정보 - 클러스터 환경에서 동기화를 위한 락 관리';

@ -0,0 +1,8 @@
create table qrtz_paused_trigger_grps
(
SCHED_NAME varchar(120) not null comment '스케줄러 이름',
TRIGGER_GROUP varchar(200) not null comment '일시 중지된 트리거 그룹 이름',
primary key (SCHED_NAME, TRIGGER_GROUP)
)
comment 'Quartz 일시 중지된 트리거 그룹 - 일시 중지된 트리거 그룹 정보';

@ -0,0 +1,10 @@
create table qrtz_scheduler_state
(
SCHED_NAME varchar(120) not null comment '스케줄러 이름',
INSTANCE_NAME varchar(200) not null comment '스케줄러 인스턴스 고유 이름',
LAST_CHECKIN_TIME bigint(13) not null comment '마지막 체크인 시간 (Unix timestamp)',
CHECKIN_INTERVAL bigint(13) not null comment '체크인 간격 (밀리초 단위)',
primary key (SCHED_NAME, INSTANCE_NAME)
)
comment 'Quartz 스케줄러 상태 정보 - 클러스터 환경에서 인스턴스 상태 관리';

@ -0,0 +1,14 @@
create table qrtz_simple_triggers
(
SCHED_NAME varchar(120) not null comment '스케줄러 이름',
TRIGGER_NAME varchar(200) not null comment '트리거 이름',
TRIGGER_GROUP varchar(200) not null comment '트리거 그룹',
REPEAT_COUNT bigint(7) not null comment '반복 횟수 (-1: 무제한, 0: 1회만, 양수: 지정 횟수)',
REPEAT_INTERVAL bigint(12) not null comment '반복 간격 (밀리초 단위)',
TIMES_TRIGGERED bigint(10) not null comment '지금까지 실행된 횟수',
primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
constraint qrtz_simple_triggers_ibfk_1
foreign key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) references qrtz_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
)
comment 'Quartz 단순 트리거 정보 - 고정 간격으로 반복 실행하는 트리거';

@ -0,0 +1,22 @@
create table qrtz_simprop_triggers
(
SCHED_NAME varchar(120) not null comment '스케줄러 이름',
TRIGGER_NAME varchar(200) not null comment '트리거 이름',
TRIGGER_GROUP varchar(200) not null comment '트리거 그룹',
STR_PROP_1 varchar(512) null comment '문자열 속성 1',
STR_PROP_2 varchar(512) null comment '문자열 속성 2',
STR_PROP_3 varchar(512) null comment '문자열 속성 3',
INT_PROP_1 int null comment '정수 속성 1',
INT_PROP_2 int null comment '정수 속성 2',
LONG_PROP_1 bigint null comment '긴 정수 속성 1',
LONG_PROP_2 bigint null comment '긴 정수 속성 2',
DEC_PROP_1 decimal(13, 4) null comment '소수점 속성 1 (13자리, 소수점 4자리)',
DEC_PROP_2 decimal(13, 4) null comment '소수점 속성 2 (13자리, 소수점 4자리)',
BOOL_PROP_1 varchar(1) null comment '불린 속성 1 (Y/N)',
BOOL_PROP_2 varchar(1) null comment '불린 속성 2 (Y/N)',
primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
constraint qrtz_simprop_triggers_ibfk_1
foreign key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) references qrtz_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
)
comment 'Quartz 속성 기반 트리거 정보 - 다양한 데이터 타입의 속성을 가진 트리거';

@ -0,0 +1,27 @@
create table qrtz_triggers
(
SCHED_NAME varchar(120) not null comment '스케줄러 이름',
TRIGGER_NAME varchar(200) not null comment '트리거 이름 (트리거의 고유 식별자)',
TRIGGER_GROUP varchar(200) not null comment '트리거 그룹 (트리거들을 논리적으로 그룹화)',
JOB_NAME varchar(200) not null comment '연결된 작업 이름 (QRTZ_JOB_DETAILS 참조)',
JOB_GROUP varchar(200) not null comment '연결된 작업 그룹 (QRTZ_JOB_DETAILS 참조)',
DESCRIPTION varchar(250) null comment '트리거에 대한 설명',
NEXT_FIRE_TIME bigint(13) null comment '다음 실행 예정 시간 (Unix timestamp)',
PREV_FIRE_TIME bigint(13) null comment '이전 실행 시간 (Unix timestamp)',
PRIORITY int null comment '트리거 우선순위 (높을수록 우선 실행)',
TRIGGER_STATE varchar(16) not null comment '트리거 상태 (WAITING, ACQUIRED, EXECUTING, COMPLETE, PAUSED, BLOCKED, ERROR)',
TRIGGER_TYPE varchar(8) not null comment '트리거 타입 (SIMPLE, CRON, CALENDAR, BLOB, SIMPROP)',
START_TIME bigint(13) not null comment '트리거 시작 시간 (Unix timestamp)',
END_TIME bigint(13) null comment '트리거 종료 시간 (Unix timestamp, NULL이면 무제한)',
CALENDAR_NAME varchar(200) null comment '연결된 캘린더 이름 (QRTZ_CALENDARS 참조)',
MISFIRE_INSTR smallint(2) null comment '미스파이어 처리 지침 (실행 시간을 놓쳤을 때의 처리 방법)',
JOB_DATA blob null comment '트리거 실행 시 전달할 데이터 (직렬화된 객체)',
primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
constraint qrtz_triggers_ibfk_1
foreign key (SCHED_NAME, JOB_NAME, JOB_GROUP) references qrtz_job_details (SCHED_NAME, JOB_NAME, JOB_GROUP)
)
comment 'Quartz 트리거 정보 저장 테이블 - 작업 실행 조건과 스케줄 정의';
create index SCHED_NAME
on qrtz_triggers (SCHED_NAME, JOB_NAME, JOB_GROUP);

@ -0,0 +1,8 @@
CREATE SEQUENCE seq_answer_id
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9223372036854775807
CACHE 1000
CYCLE;

@ -0,0 +1,8 @@
CREATE SEQUENCE seq_batch_file_data_id
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9223372036854775807
CACHE 1000
CYCLE;

@ -0,0 +1,8 @@
CREATE SEQUENCE seq_batch_file_data_success_id
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9223372036854775807
CACHE 1000
CYCLE;

@ -0,0 +1,7 @@
-- 배치 파일 재처리 ID 시퀀스
CREATE SEQUENCE seq_batch_file_retry_id
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 99999999
CYCLE;

@ -0,0 +1,7 @@
CREATE SEQUENCE seq_batch_job_log_id
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9223372036854775807
CACHE 1000
CYCLE;

@ -0,0 +1,6 @@
CREATE SEQUENCE seq_batch_zip_file_detail_log_id
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 99999999
CYCLE;

@ -0,0 +1,6 @@
CREATE SEQUENCE seq_batch_zip_file_process_log_id
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 99999999
CYCLE;

@ -0,0 +1,8 @@
CREATE SEQUENCE seq_bbs_id
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9223372036854775807
CACHE 1000
CYCLE;

@ -0,0 +1,8 @@
CREATE SEQUENCE seq_comment_id
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9223372036854775807
CACHE 1000
CYCLE;

@ -0,0 +1,8 @@
CREATE SEQUENCE seq_excel_sample_id
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9223372036854775807
CACHE 1000
CYCLE;

@ -0,0 +1,8 @@
CREATE SEQUENCE seq_file_id
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9999999999999999
CACHE 1000
CYCLE;

@ -0,0 +1,8 @@
CREATE SEQUENCE seq_html_edit_file_id
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9223372036854775807
CACHE 1000
CYCLE;

@ -0,0 +1,7 @@
CREATE SEQUENCE seq_login_log_id
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9999999999999999
CACHE 1000
CYCLE;

@ -0,0 +1,8 @@
CREATE SEQUENCE seq_menu_id
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9999999999999999
CACHE 1000
CYCLE;

@ -0,0 +1,8 @@
CREATE SEQUENCE seq_notice_id
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9223372036854775807
CACHE 1000
CYCLE;

@ -0,0 +1,8 @@
CREATE SEQUENCE seq_notification_id
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9223372036854775807
CACHE 1000
CYCLE;

@ -0,0 +1,8 @@
CREATE SEQUENCE seq_notification_target_id
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9223372036854775807
CACHE 1000
CYCLE;

@ -0,0 +1,6 @@
CREATE SEQUENCE seq_notification_target_setting_id
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 99999999
CACHE 1;

@ -0,0 +1,8 @@
CREATE SEQUENCE seq_post_id
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9223372036854775807
CACHE 1000
CYCLE;

@ -0,0 +1,8 @@
CREATE SEQUENCE seq_schedule_id
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9223372036854775807
CACHE 1000
CYCLE;

@ -0,0 +1,8 @@
CREATE SEQUENCE seq_user_id
START WITH 1000
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9999999999999999
CACHE 1000
CYCLE;

@ -0,0 +1,30 @@
CREATE TABLE TB_BATCH_FILE_DATA
(
FILE_DATA_ID VARCHAR(20) NOT NULL COMMENT '파일데이터ID'
PRIMARY KEY,
FILE_NM VARCHAR(255) NOT NULL COMMENT '파일 명',
LINE_NUMBER INT NOT NULL COMMENT '라인 번호',
COLUMN1 VARCHAR(100) NULL COMMENT '컬럼1',
COLUMN2 VARCHAR(100) NULL COMMENT '컬럼2',
COLUMN3 VARCHAR(100) NULL COMMENT '컬럼3',
COLUMN4 VARCHAR(100) NULL COMMENT '컬럼4',
COLUMN5 VARCHAR(100) NULL COMMENT '컬럼5',
RAW_DATA TEXT NULL COMMENT '원시 데이터',
PROCESS_STATUS VARCHAR(20) DEFAULT 'SUCCESS' NULL COMMENT '처리 상태(SUCCESS/ERROR)',
ERROR_MESSAGE TEXT NULL COMMENT '에러 메시지',
PROCESS_DTTM DATETIME DEFAULT CURRENT_TIMESTAMP() NULL COMMENT '처리 일시',
REG_DTTM DATETIME DEFAULT CURRENT_TIMESTAMP() NULL COMMENT '등록 일시',
RGTR VARCHAR(20) NULL COMMENT '등록자',
MDFCN_DTTM DATETIME DEFAULT CURRENT_TIMESTAMP() NULL ON UPDATE CURRENT_TIMESTAMP() COMMENT '수정 일시',
MDFR VARCHAR(20) NULL COMMENT '수정자'
)
COMMENT '배치파일처리데이터' COLLATE = UTF8MB4_UNICODE_CI;
CREATE INDEX IDX_FILE_NM
ON TB_BATCH_FILE_DATA (FILE_NM);
CREATE INDEX IDX_PROCESS_DTTM
ON TB_BATCH_FILE_DATA (PROCESS_DTTM);
CREATE INDEX IDX_PROCESS_STATUS
ON TB_BATCH_FILE_DATA (PROCESS_STATUS);

@ -0,0 +1,29 @@
CREATE TABLE TB_BATCH_FILE_DATA_SUCCESS
(
SUCCESS_DATA_ID VARCHAR(20) NOT NULL COMMENT '성공데이터ID'
PRIMARY KEY,
FILE_NM VARCHAR(255) NOT NULL COMMENT '파일 명',
LINE_NUMBER INT NOT NULL COMMENT '라인 번호',
COLUMN1 VARCHAR(100) NULL COMMENT '컬럼1',
COLUMN2 VARCHAR(100) NULL COMMENT '컬럼2',
COLUMN3 VARCHAR(100) NULL COMMENT '컬럼3',
COLUMN4 VARCHAR(100) NULL COMMENT '컬럼4',
COLUMN5 VARCHAR(100) NULL COMMENT '컬럼5',
RAW_DATA TEXT NULL COMMENT '원시 데이터',
PROCESS_DTTM DATETIME DEFAULT CURRENT_TIMESTAMP() NULL COMMENT '처리 일시',
REG_DTTM DATETIME DEFAULT CURRENT_TIMESTAMP() NULL COMMENT '등록 일시',
RGTR VARCHAR(20) NULL COMMENT '등록자',
MDFCN_DTTM DATETIME DEFAULT CURRENT_TIMESTAMP() NULL ON UPDATE CURRENT_TIMESTAMP() COMMENT '수정 일시',
MDFR VARCHAR(20) NULL COMMENT '수정자'
)
COMMENT '배치파일처리성공데이터' COLLATE = UTF8MB4_UNICODE_CI;
CREATE INDEX IDX_COLUMN1
ON TB_BATCH_FILE_DATA_SUCCESS (COLUMN1);
CREATE INDEX IDX_FILE_NM
ON TB_BATCH_FILE_DATA_SUCCESS (FILE_NM);
CREATE INDEX IDX_PROCESS_DTTM
ON TB_BATCH_FILE_DATA_SUCCESS (PROCESS_DTTM);

@ -0,0 +1,33 @@
CREATE TABLE TB_BATCH_FILE_RETRY
(
RETRY_ID VARCHAR(20) NOT NULL COMMENT '재처리ID'
PRIMARY KEY,
ORIGINAL_FILE_NM VARCHAR(255) NOT NULL COMMENT '원본 파일명(파일명이 동일할경우 정확한 처리를위해 TIMESTAMP 추가)',
RETRY_FILE_NM VARCHAR(255) NOT NULL COMMENT '재 처리 파일명',
RETRY_CNT INT DEFAULT 1 NOT NULL COMMENT '재시도 횟수',
MAX_RETRY_CNT INT DEFAULT 3 NOT NULL COMMENT '최대 재시도 횟수',
RETRY_STATUS VARCHAR(20) DEFAULT 'PENDING' NOT NULL COMMENT '재처리 상태(PENDING/PROCESSING/SUCCESS/FAILED/EXCEEDED)',
ERROR_TYPE VARCHAR(50) NULL COMMENT '에러 유형(FORMAT_ERROR/DATA_ERROR/SYSTEM_ERROR)',
ERROR_MESSAGE TEXT NULL COMMENT '에러 메시지',
RETRY_DTTM DATETIME DEFAULT CURRENT_TIMESTAMP() NULL COMMENT '재처리 일시',
NEXT_RETRY_DTTM DATETIME NULL COMMENT '다음 재처리 예정일시',
COMPLETED_DTTM DATETIME NULL COMMENT '완료 일시',
REG_DTTM DATETIME DEFAULT CURRENT_TIMESTAMP() NULL COMMENT '등록 일시',
RGTR VARCHAR(20) NULL COMMENT '등록자',
MDFCN_DTTM DATETIME DEFAULT CURRENT_TIMESTAMP() NULL ON UPDATE CURRENT_TIMESTAMP() COMMENT '수정일시',
MDFR VARCHAR(20) NULL COMMENT '수정자'
)
COMMENT '배치파일재처리이력' COLLATE = UTF8MB4_UNICODE_CI;
CREATE INDEX IDX_NEXT_RETRY_DTTM
ON TB_BATCH_FILE_RETRY (NEXT_RETRY_DTTM);
CREATE INDEX IDX_ORIGINAL_FILE_NM
ON TB_BATCH_FILE_RETRY (ORIGINAL_FILE_NM);
CREATE INDEX IDX_RETRY_DTTM
ON TB_BATCH_FILE_RETRY (RETRY_DTTM);
CREATE INDEX IDX_RETRY_STATUS
ON TB_BATCH_FILE_RETRY (RETRY_STATUS);

@ -0,0 +1,28 @@
CREATE TABLE TB_BATCH_JOB_EXECUTION
(
EXECUTION_ID VARCHAR(36) NOT NULL COMMENT '실행 ID (UUID) - 배치 작업 실행의 고유 식별자'
PRIMARY KEY,
JOB_NM VARCHAR(200) NOT NULL COMMENT '작업 이름 - 실행된 배치 작업의 이름',
JOB_GROUP VARCHAR(200) NOT NULL COMMENT '작업 그룹 - 실행된 배치 작업의 그룹',
START_DTTM DATETIME NOT NULL COMMENT '시작 일시 - 배치 작업 실행 시작 시점',
END_DTTM DATETIME NULL COMMENT '종료 일시 - 배치 작업 실행 완료 시점 (실행 중이면 NULL)',
STATUS_CD VARCHAR(20) NOT NULL COMMENT '상태 (STARTED, COMPLETED, FAILED) - 현재 실행 상태',
EXIT_CD VARCHAR(20) NULL COMMENT '종료 코드 - 성공(COMPLETED) 또는 실패(FAILED) 구분',
EXIT_MESSAGE TEXT NULL COMMENT '종료 메시지 - 에러 발생 시 상세 메시지 또는 성공 메시지',
REG_DTTM DATETIME DEFAULT CURRENT_TIMESTAMP() NOT NULL COMMENT '등록 일시',
SERVER_INFO VARCHAR(1000) NULL COMMENT '실행서버 정보'
)
COMMENT '배치 작업 실행 결과 저장 테이블 - 배치 작업의 실행 이력과 결과 추적';
CREATE INDEX IDX_BATCH_JOB_NM
ON TB_BATCH_JOB_EXECUTION (JOB_NM)
COMMENT '작업 이름 인덱스 - 작업별 조회 성능 향상';
CREATE INDEX IDX_BATCH_JOB_START_DTTM
ON TB_BATCH_JOB_EXECUTION (START_DTTM)
COMMENT '시작 시간 인덱스 - 시간별 조회 성능 향상';
CREATE INDEX IDX_BATCH_JOB_STATUS_CD
ON TB_BATCH_JOB_EXECUTION (STATUS_CD)
COMMENT '상태 인덱스 - 상태별 조회 성능 향상';

@ -0,0 +1,22 @@
create table tb_batch_job_info
(
JOB_ID varchar(36) not null comment '작업 ID (UUID) - 배치 작업의 고유 식별자'
primary key,
JOB_NM varchar(200) not null comment '작업 이름 - 배치 작업의 이름 (사용자가 정의)',
JOB_GROUP varchar(200) not null comment '작업 그룹 - 배치 작업의 그룹 (논리적 분류)',
JOB_CLASS varchar(250) not null comment '작업 클래스 - 실제 작업을 수행할 Java 클래스의 전체 경로',
CRON_EXPRESSION varchar(200) not null comment 'Cron 표현식 - 작업 실행 스케줄 정의 (예: "0 0 2 * * ?" - 매일 새벽 2시)',
JOB_DC varchar(500) null comment '작업 설명 - 배치 작업에 대한 상세 설명',
STATUS_CD varchar(20) default 'ACTIVE' not null comment '상태 (ACTIVE, PAUSED, DELETED) - 작업의 현재 상태',
LAST_EXECUTION_ID varchar(36) null comment '마지막 실행 ID - 가장 최근에 실행된 배치 작업의 실행 ID',
REG_DTTM datetime default current_timestamp() not null comment '등록 일시',
MDFCN_DTTM datetime default current_timestamp() not null on update current_timestamp() comment '수정 일시 - 작업 정보 수정 시점 (자동 업데이트)',
constraint UK_BATCH_JOB_NM_GROUP
unique (JOB_NM, JOB_GROUP) comment '작업 이름+그룹 유니크 제약 - 동일한 이름과 그룹 조합 방지'
)
comment '배치 작업 정보 저장 테이블 - 배치 작업의 기본 정보와 스케줄링 설정 관리';
create index IDX_BATCH_JOB_INFO_STATUS_CD
on tb_batch_job_info (STATUS_CD)
comment '상태 인덱스 - 상태별 조회 성능 향상';

@ -0,0 +1,21 @@
-- 배치 작업 로그 ID 시퀀스 생성
CREATE SEQUENCE IF NOT EXISTS seq_batch_job_log_id START WITH 1 INCREMENT BY 1;
create table tb_batch_job_log
(
LOG_ID varchar(20) comment '로그 ID - 로그 레코드의 고유 식별자 (시퀀스 기반)'
primary key,
EXECUTION_ID varchar(36) not null comment '실행 ID (TB_BATCH_JOB_EXECUTION.EXECUTION_ID) - 연결된 배치 작업 실행',
LOG_DTTM datetime not null comment '로그 일시 - 로그가 발생한 정확한 시점',
LOG_LEVEL varchar(10) not null comment '로그 레벨 (INFO, WARN, ERROR) - 로그의 중요도 수준',
LOG_MESSAGE text not null comment '로그 메시지 - 실제 로그 내용 (상세 정보, 에러 메시지 등)',
REG_DTTM datetime default current_timestamp() not null comment '등록 일시 - 레코드 생성 시점',
constraint tb_batch_job_log_ibfk_1
foreign key (EXECUTION_ID) references tb_batch_job_execution (EXECUTION_ID)
)
comment '배치 작업 실행 로그 저장 테이블 - 배치 작업 실행 과정의 상세 로그 기록';
create index IDX_BATCH_LOG_EXECUTION_ID
on tb_batch_job_log (EXECUTION_ID)
comment '실행 ID 인덱스 - 특정 실행의 로그 조회 성능 향상';

@ -0,0 +1,22 @@
-- 배치 작업 파라미터 ID 시퀀스 생성
CREATE SEQUENCE IF NOT EXISTS seq_batch_job_param_id START WITH 1 INCREMENT BY 1;
create table tb_batch_job_param
(
PARAM_ID varchar(20) comment '파라미터 ID - 파라미터 레코드의 고유 식별자 (시퀀스 기반)'
primary key,
JOB_ID varchar(36) not null comment '작업 ID (TB_BATCH_JOB_INFO.JOB_ID) - 연결된 배치 작업',
PARAM_NM varchar(100) not null comment '파라미터 이름 - 파라미터의 식별자',
PARAM_VALUE varchar(500) null comment '파라미터 값 - 실제 파라미터 데이터',
PARAM_TYPE varchar(50) not null comment '파라미터 타입 (STRING, NUMBER, DATE, BOOLEAN) - 데이터 타입 정의',
REG_DTTM datetime default current_timestamp() not null comment '등록 일시 - 파라미터 등록 시점',
MDFCN_DTTM datetime default current_timestamp() not null on update current_timestamp() comment '수정 일시 - 파라미터 수정 시점 (자동 업데이트)',
constraint tb_batch_job_param_ibfk_1
foreign key (JOB_ID) references tb_batch_job_info (JOB_ID)
)
comment '배치 작업 파라미터 저장 테이블 - 배치 작업 실행 시 필요한 파라미터 정보 관리';
create index IDX_BATCH_PARAM_JOB_ID
on tb_batch_job_param (JOB_ID)
comment '작업 ID 인덱스 - 특정 작업의 파라미터 조회 성능 향상';

@ -0,0 +1,36 @@
CREATE TABLE TB_BATCH_ZIP_FILE_DETAIL_LOG
(
DETAIL_LOG_ID VARCHAR(20) NOT NULL COMMENT '상세 로그 ID'
PRIMARY KEY,
LOG_ID VARCHAR(20) NOT NULL COMMENT '로그 ID',
FILE_NM VARCHAR(255) NOT NULL COMMENT '파일 명',
FILE_PATH VARCHAR(500) NOT NULL COMMENT '파일 경로',
FILE_SIZE BIGINT DEFAULT 0 NULL COMMENT '파일 크기(BYTES)',
FILE_TYPE VARCHAR(50) NULL COMMENT '파일 타입',
IMAGE_YN CHAR DEFAULT 'N' NULL COMMENT '이미지 여부(Y/N)',
CORRUPTED_YN CHAR DEFAULT 'N' NULL COMMENT '손상 여부(Y/N)',
PROCESS_STATUS VARCHAR(20) DEFAULT 'SUCCESS' NULL COMMENT '처리 상태(SUCCESS/ERROR)',
ERROR_MESSAGE TEXT NULL COMMENT '에러 메시지',
PROCESS_DTTM DATETIME DEFAULT CURRENT_TIMESTAMP() NULL COMMENT '처리 일시',
REG_DTTM DATETIME DEFAULT CURRENT_TIMESTAMP() NULL COMMENT '등록 일시',
RGTR VARCHAR(20) NULL COMMENT '등록자',
MDFCN_DTTM DATETIME DEFAULT CURRENT_TIMESTAMP() NULL ON UPDATE CURRENT_TIMESTAMP() COMMENT '수정 일시',
MDFR VARCHAR(20) NULL COMMENT '수정자',
CONSTRAINT FK_BATCH_ZIP_DETAIL_LOG_ID
FOREIGN KEY (LOG_ID) REFERENCES TB_BATCH_ZIP_FILE_PROCESS_LOG (LOG_ID)
ON DELETE CASCADE
)
COMMENT 'ZIP파일처리상세로그' COLLATE = UTF8MB4_UNICODE_CI;
CREATE INDEX IDX_FILE_NM
ON TB_BATCH_ZIP_FILE_DETAIL_LOG (FILE_NM);
CREATE INDEX IDX_IMAGE_YN
ON TB_BATCH_ZIP_FILE_DETAIL_LOG (IMAGE_YN);
CREATE INDEX IDX_LOG_ID
ON TB_BATCH_ZIP_FILE_DETAIL_LOG (LOG_ID);
CREATE INDEX IDX_PROCESS_STATUS
ON TB_BATCH_ZIP_FILE_DETAIL_LOG (PROCESS_STATUS);

@ -0,0 +1,34 @@
CREATE TABLE TB_BATCH_ZIP_FILE_PROCESS_LOG
(
LOG_ID VARCHAR(20) NOT NULL COMMENT '로그ID'
PRIMARY KEY,
ZIP_FILE_NM VARCHAR(255) NOT NULL COMMENT 'ZIP 파일 명',
ZIP_FILE_PATH VARCHAR(500) NOT NULL COMMENT 'ZIP 파일 경로',
EXTRACT_PATH VARCHAR(500) NULL COMMENT '압축해제 경로',
ARCHIVE_PATH VARCHAR(500) NULL COMMENT '원본보관 경로',
TOTAL_FILE_CNT INT DEFAULT 0 NULL COMMENT '총 파일수',
SUCCESS_FILE_CNT INT DEFAULT 0 NULL COMMENT '성공 파일 수',
ERROR_FILE_CNT INT DEFAULT 0 NULL COMMENT '실패 파일 수',
IMAGE_FILE_CNT INT DEFAULT 0 NULL COMMENT '이미지 파일 수',
NON_IMAGE_FILE_CNT INT DEFAULT 0 NULL COMMENT '비 이미지 파일 수',
CORRUPTED_FILE_CNT INT DEFAULT 0 NULL COMMENT '손상 파일 수',
PROCESS_STATUS VARCHAR(20) DEFAULT 'PROCESSING' NULL COMMENT '처리 상태(PROCESSING/SUCCESS/ERROR)',
ERROR_MESSAGE TEXT NULL COMMENT '에러 메시지',
START_DTTM DATETIME DEFAULT CURRENT_TIMESTAMP() NULL COMMENT '시작 일시',
END_DTTM DATETIME NULL COMMENT '종료 일시',
REG_DTTM DATETIME DEFAULT CURRENT_TIMESTAMP() NULL COMMENT '등록 일시',
RGTR VARCHAR(20) NULL COMMENT '등록자',
MDFCN_DTTM DATETIME DEFAULT CURRENT_TIMESTAMP() NULL ON UPDATE CURRENT_TIMESTAMP() COMMENT '수정 일시',
MDFR VARCHAR(20) NULL COMMENT '수정자'
)
COMMENT 'ZIP파일처리로그' COLLATE = UTF8MB4_UNICODE_CI;
CREATE INDEX IDX_PROCESS_STATUS
ON TB_BATCH_ZIP_FILE_PROCESS_LOG (PROCESS_STATUS);
CREATE INDEX IDX_START_DTTM
ON TB_BATCH_ZIP_FILE_PROCESS_LOG (START_DTTM);
CREATE INDEX IDX_ZIP_FILE_NM
ON TB_BATCH_ZIP_FILE_PROCESS_LOG (ZIP_FILE_NM);

@ -0,0 +1,17 @@
create table tb_bbs_comment
(
COMMENT_ID varchar(20) not null comment '댓글 ID'
primary key,
POST_ID varchar(20) not null comment '게시물 ID',
CONTENT text not null comment '내용',
PARENT_COMMENT_ID varchar(20) null comment '부모 댓글 ID',
DEPTH int default 0 null comment '댓글 깊이 (0: 원댓글, 1: 대댓글)',
REG_DTTM datetime null comment '등록 일시',
RGTR varchar(20) null comment '등록자',
MDFCN_DTTM datetime null comment '수정 일시',
MDFR varchar(20) null comment '수정자',
constraint fk_bbs_comment_post
foreign key (POST_ID) references tb_bbs_post (POST_ID)
)
comment '댓글';

@ -0,0 +1,20 @@
create table tb_bbs_config
(
BBS_ID varchar(20) not null comment '게시판 ID'
primary key,
BBS_NM varchar(100) not null comment '게시판 이름',
BBS_TYPE_CD varchar(20) not null comment '게시판 종류 (코드 테이블 참조)',
BBS_DC varchar(200) null comment '게시판 설명',
UPLOAD_YN varchar(1) default 'N' not null comment '업로드 가능 여부',
UPLOAD_FILE_CNT int default 0 null comment '업로드 파일 개수',
COMMENT_YN varchar(1) default 'N' not null comment '댓글 기능 사용 여부',
TUI_EDITOR_YN varchar(1) default 'N' not null comment 'TUI 에디터 사용 여부',
NOTICE_YN varchar(1) default 'N' not null comment '상단 고정 사용 여부',
USE_YN varchar(1) default 'Y' not null comment '사용 여부',
REG_DTTM datetime null comment '등록 일시',
RGTR varchar(20) null comment '등록자',
MDFCN_DTTM datetime null comment '수정 일시',
MDFR varchar(20) null comment '수정자'
)
comment '게시판 설정';

@ -0,0 +1,17 @@
create table tb_bbs_file
(
FILE_ID varchar(20) not null comment '파일 ID'
primary key,
POST_ID varchar(20) not null comment '게시물 ID',
ORIGINAL_FILE_NM varchar(200) not null comment '원본 파일명',
STORED_FILE_NM varchar(200) not null comment '저장 파일명',
FILE_PATH varchar(200) not null comment '파일 경로',
FILE_SIZE bigint not null comment '파일 크기',
FILE_EXT varchar(10) not null comment '파일 확장자',
REG_DTTM datetime null comment '등록 일시',
RGTR varchar(20) null comment '등록자',
constraint fk_bbs_file_post
foreign key (POST_ID) references tb_bbs_post (POST_ID)
)
comment '게시판 파일';

@ -0,0 +1,17 @@
create table tb_bbs_notice_sample
(
NOTICE_ID varchar(20) not null comment '게시판 ID'
primary key,
TITLE varchar(200) not null comment '제목',
CONTENT text not null comment '내용',
WRITER_NM varchar(50) not null comment '작성자 이름',
VIEW_CNT int default 0 null comment '조회수',
NOTICE_YN varchar(1) default 'N' null comment '상단 고정 여부',
USE_YN varchar(1) default 'Y' not null comment '사용 여부',
REG_DTTM datetime null comment '등록 일시',
RGTR varchar(20) null comment '등록자',
MDFCN_DTTM datetime null comment '수정 일시',
MDFR varchar(20) null comment '수정자'
)
comment '게시판';

@ -0,0 +1,17 @@
create table tb_bbs_notice_sample_file
(
FILE_ID varchar(20) not null comment '파일 ID'
primary key,
NOTICE_ID varchar(20) not null comment '게시판 ID',
ORIGINAL_FILE_NM varchar(200) not null comment '원본 파일명',
STORED_FILE_NM varchar(200) not null comment '저장 파일명',
FILE_PATH varchar(200) not null comment '파일 경로',
FILE_SIZE bigint not null comment '파일 크기',
FILE_EXT varchar(10) not null comment '파일 확장자',
REG_DTTM datetime null comment '등록 일시',
RGTR varchar(20) null comment '등록자',
constraint fk_bbs_notice_file_notice
foreign key (NOTICE_ID) references tb_bbs_notice_sample (NOTICE_ID)
)
comment '게시판 파일';

@ -0,0 +1,23 @@
create table tb_bbs_post
(
POST_ID varchar(20) not null comment '게시물 ID'
primary key,
BBS_ID varchar(20) not null comment '게시판 ID',
TITLE varchar(200) not null comment '제목',
CONTENT text not null comment '내용',
WRITER_NM varchar(50) not null comment '작성자 이름',
VIEW_CNT int default 0 null comment '조회수',
NOTICE_YN varchar(1) default 'N' null comment '상단 고정 여부',
EMAIL_YN varchar(1) default 'N' null comment '이메일 발송 여부',
EMAIL varchar(100) null comment '이메일 주소',
ANSWER_STATUS_CD varchar(20) null comment '답변 상태 (WAITING: 대기중, COMPLETED: 답변완료), CODE_GROUP_ID:BBS_ANSWER_STATUS_CD',
USE_YN varchar(1) default 'Y' not null comment '사용 여부',
REG_DTTM datetime null comment '등록 일시',
RGTR varchar(20) null comment '등록자',
MDFCN_DTTM datetime null comment '수정 일시',
MDFR varchar(20) null comment '수정자',
constraint fk_bbs_post_config
foreign key (BBS_ID) references tb_bbs_config (BBS_ID)
)
comment '게시물';

@ -0,0 +1,19 @@
create table tb_bbs_post_answer
(
ANSWER_ID varchar(20) not null comment '답변 ID'
primary key,
POST_ID varchar(20) not null comment '게시물 ID',
CONTENT text not null comment '답변 내용',
ANSWER_DTTM datetime null comment '답변 일시',
REG_DTTM datetime null comment '등록 일시',
RGTR varchar(20) null comment '등록자',
MDFCN_DTTM datetime null comment '수정 일시',
MDFR varchar(20) null comment '수정자',
WRITER_NM varchar(50) not null comment '작성자 명',
constraint uk_bbs_post_answer_post_id
unique (POST_ID),
constraint fk_bbs_post_answer_post
foreign key (POST_ID) references tb_bbs_post (POST_ID)
)
comment '게시물 답변';

@ -0,0 +1,20 @@
create table tb_calendar_schedule
(
SCHEDULE_ID varchar(20) not null comment '일정 ID'
primary key,
CATEGORY_CD varchar(20) not null comment '범주 코드',
TITLE varchar(200) not null comment '제목',
PLACE varchar(200) null comment '장소',
CONTENT text null comment '내용',
START_DTTM datetime not null comment '시작 일시',
END_DTTM datetime not null comment '종료 일시',
PARTICIPANTS varchar(500) null comment '참여자',
ALL_DAY_YN varchar(1) default 'N' not null comment '종일 여부(Y/N)',
PRIVATE_YN varchar(1) default 'N' not null comment '비공개 여부(Y/N)',
REG_DTTM datetime null comment '등록 일시',
RGTR varchar(20) null comment '등록자',
MDFCN_DTTM datetime null comment '수정 일시',
MDFR varchar(20) null comment '수정자'
)
comment '일정 정보';

@ -0,0 +1,23 @@
create table tb_cd_detail
(
CD_GROUP_ID varchar(20) not null comment '코드 그룹 ID',
CD_ID varchar(20) not null comment '코드 ID',
CD_NM varchar(100) not null comment '코드 이름',
CD_DC varchar(200) null comment '코드 설명',
SORT_ORDR int default 0 null comment '정렬 순서',
USE_YN varchar(1) not null comment '사용 여부',
ATTRIBUTE1 varchar(200) null comment '속성1',
ATTRIBUTE2 varchar(200) null comment '속성2',
ATTRIBUTE3 varchar(200) null comment '속성3',
ATTRIBUTE4 varchar(200) null comment '속성4',
ATTRIBUTE5 varchar(200) null comment '속성5',
REG_DTTM datetime null comment '등록 일시',
RGTR varchar(20) null comment '등록자',
MDFCN_DTTM datetime null comment '수정 일시',
MDFR varchar(20) null comment '수정자',
primary key (CD_GROUP_ID, CD_ID),
constraint fk_cd_detail_group
foreign key (CD_GROUP_ID) references tb_cd_group (CD_GROUP_ID)
)
comment '코드 상세';

@ -0,0 +1,14 @@
create table tb_cd_group
(
CD_GROUP_ID varchar(20) not null comment '코드 그룹 ID'
primary key,
CD_GROUP_NM varchar(100) not null comment '코드 그룹 이름',
CD_GROUP_DC varchar(200) null comment '코드 그룹 설명',
USE_YN varchar(1) not null comment '사용 여부',
REG_DTTM datetime null comment '등록 일시',
RGTR varchar(20) null comment '등록자',
MDFCN_DTTM datetime null comment '수정 일시',
MDFR varchar(20) null comment '수정자'
)
comment '코드 그룹';

@ -0,0 +1,22 @@
create table tb_common_html_editor_file
(
FILE_ID varchar(20) not null comment '파일 ID'
primary key,
MODULE_ID varchar(50) null comment '모듈 ID (선택적)',
ORIGINAL_FILE_NM varchar(200) not null comment '원본 파일명',
STORED_FILE_NM varchar(200) not null comment '저장 파일명',
FILE_PATH varchar(200) not null comment '파일 경로',
FILE_SIZE bigint not null comment '파일 크기',
FILE_EXT varchar(10) not null comment '파일 확장자',
FILE_TYPE varchar(20) not null comment '파일 타입 (image, video, etc)',
USE_YN varchar(1) default 'Y' not null comment '사용 여부',
REG_DTTM datetime null comment '등록 일시',
RGTR varchar(20) null comment '등록자',
MDFCN_DTTM datetime null comment '수정 일시',
MDFR varchar(20) null comment '수정자'
)
comment 'HTML 에디터 파일';
create index IDX_HTML_EDITOR_FILE_MODULE
on tb_common_html_editor_file (MODULE_ID);

@ -0,0 +1,16 @@
create table tb_excel_sample
(
excel_sample_id varchar(20) not null
primary key,
excel_clmn1 bigint null,
excel_clmn2 datetime null,
excel_clmn3 varchar(100) null,
excel_clmn4 varchar(100) null,
excel_clmn5 varchar(100) null,
excel_clmn6 varchar(100) null,
excel_clmn7 varchar(100) null,
excel_clmn8 varchar(100) null,
excel_clmn9 varchar(100) null,
excel_clmn10 varchar(100) null
);

@ -0,0 +1,15 @@
create table tb_group
(
GROUP_ID varchar(20) not null comment '그룹 ID'
primary key,
GROUP_NM varchar(100) not null comment '그룹 이름',
GROUP_DC varchar(200) null comment '그룹 설명',
SORT_ORDR int default 0 null comment '정렬 순서',
USE_YN varchar(1) not null comment '사용 여부',
REG_DTTM datetime null comment '등록 일시',
RGTR varchar(20) null comment '등록자',
MDFCN_DTTM datetime null comment '수정 일시',
MDFR varchar(20) null comment '수정자'
)
comment '그룹';

@ -0,0 +1,14 @@
create table tb_group_role
(
GROUP_ID varchar(20) not null comment '그룹 ID',
ROLE_ID varchar(20) not null comment '역할 ID',
REG_DTTM datetime null comment '등록 일시',
RGTR varchar(20) null comment '등록자',
primary key (GROUP_ID, ROLE_ID),
constraint fk_group_role_group
foreign key (GROUP_ID) references tb_group (GROUP_ID),
constraint fk_group_role_role
foreign key (ROLE_ID) references tb_role (ROLE_ID)
)
comment '그룹-역할 매핑';

@ -0,0 +1,30 @@
-- 로그인 로그 ID 시퀀스 생성
CREATE SEQUENCE IF NOT EXISTS seq_login_log_id START WITH 1 INCREMENT BY 1;
create table tb_login_log
(
LOG_ID varchar(20) comment '로그 ID - 시퀀스 기반'
primary key,
USER_ID varchar(20) null comment '사용자 ID',
USER_ACNT varchar(20) null comment '사용자 계정',
LOGIN_DTTM datetime not null comment '로그인 시간',
IP_ADDR varchar(50) null comment 'IP 주소',
SUCCESS_YN varchar(1) not null comment '성공 여부',
FAIL_REASON varchar(100) null comment '실패 사유',
LOGIN_TYPE varchar(20) default 'WEB' null comment '로그인 유형',
SESSION_ID varchar(100) null comment '세션 ID',
USER_AGENT varchar(500) null comment '사용자 에이전트',
DEVICE_INFO varchar(100) null comment '접속 디바이스 정보',
REG_DTTM datetime default current_timestamp() null comment '등록 일시'
)
comment '로그인 로그';
create index IDX_TB_LOGIN_LOG_LOGIN_DTTM
on tb_login_log (LOGIN_DTTM);
create index IDX_TB_LOGIN_LOG_SUCCESS_YN
on tb_login_log (SUCCESS_YN);
create index IDX_TB_LOGIN_LOG_USER_ID
on tb_login_log (USER_ID);

@ -0,0 +1,23 @@
create table tb_menu
(
MENU_ID varchar(20) not null comment '메뉴 ID'
primary key,
MENU_NM varchar(100) not null comment '메뉴 이름',
MENU_DC varchar(200) null comment '메뉴 설명',
UPPER_MENU_ID varchar(20) null comment '상위 메뉴 ID',
MENU_LEVEL int not null comment '메뉴 레벨',
SORT_ORDR int not null comment '정렬 순서',
MENU_URL varchar(200) null comment '메뉴 URL',
URL_PATTERN varchar(2000) null comment 'URL 패턴',
MENU_ICON varchar(100) null comment '메뉴 아이콘',
USE_YN varchar(1) not null comment '사용 여부',
VIEW_YN varchar(1) default 'Y' not null comment '화면 표시 여부',
REG_DTTM datetime null comment '등록 일시',
RGTR varchar(20) null comment '등록자',
MDFCN_DTTM datetime null comment '수정 일시',
MDFR varchar(20) null comment '수정자',
constraint fk_menu_upper
foreign key (UPPER_MENU_ID) references tb_menu (MENU_ID)
)
comment '메뉴';

@ -0,0 +1,19 @@
create table tb_notification
(
NOTIFICATION_ID varchar(20) not null comment '알림 ID'
primary key,
NOTIFICATION_TYPE_CD varchar(20) not null comment '알림 유형 (SCHEDULE: 일정, QUESTION: 질문, ANSWER: 답변)',
TARGET_ID varchar(36) not null comment '대상 ID (일정 ID, 게시물 ID 등) 배치때문에 길게 잡음',
TITLE varchar(200) not null comment '알림 제목',
CONTENT varchar(500) null comment '알림 내용',
URL varchar(500) null comment '이동 URL',
REG_DTTM datetime null comment '등록 일시',
RGTR varchar(20) null comment '등록자',
MDFCN_DTTM datetime null comment '수정 일시',
MDFR varchar(20) null comment '수정자'
)
comment '공통 알림';
create index idx_notification_target_id
on tb_notification (TARGET_ID);

@ -0,0 +1,18 @@
create table tb_notification_target
(
NOTIFICATION_ID varchar(20) not null comment '알림 ID',
USER_ID varchar(20) not null comment '사용자 ID',
READ_YN varchar(1) default 'N' not null comment '확인 여부(Y/N)',
READ_DTTM datetime null comment '확인 일시',
REG_DTTM datetime null comment '등록 일시',
RGTR varchar(20) null comment '등록자',
MDFCN_DTTM datetime null comment '수정 일시',
MDFR varchar(20) null comment '수정자',
primary key (NOTIFICATION_ID, USER_ID),
constraint fk_notification_target_notification
foreign key (NOTIFICATION_ID) references tb_notification (NOTIFICATION_ID),
constraint fk_notification_target_user
foreign key (USER_ID) references tb_user (USER_ID)
)
comment '알림 대상자';

@ -0,0 +1,21 @@
create table tb_notification_target_setting
(
SETTING_ID varchar(20) not null comment '설정 ID'
primary key,
SETTING_TYPE varchar(50) not null comment '설정 구분 (QNA_MANAGER, BATCH_MANAGER 등)',
USER_ID varchar(20) not null comment '사용자 ID',
REG_DTTM datetime null comment '등록 일시',
RGTR varchar(20) null comment '등록자',
MDFCN_DTTM datetime null comment '수정 일시',
MDFR varchar(20) null comment '수정자',
constraint fk_notification_target_setting_user
foreign key (USER_ID) references tb_user (USER_ID)
)
comment '알림 대상자 설정';
create index idx_notification_target_setting_type
on tb_notification_target_setting (SETTING_TYPE);
create index idx_notification_target_setting_user
on tb_notification_target_setting (USER_ID);

@ -0,0 +1,15 @@
create table tb_role
(
ROLE_ID varchar(20) not null comment '역할 ID'
primary key,
ROLE_NM varchar(100) not null comment '역할 이름',
ROLE_DC varchar(200) null comment '역할 설명',
SORT_ORDR int default 0 null comment '정렬 순서',
USE_YN varchar(1) not null comment '사용 여부',
REG_DTTM datetime null comment '등록 일시',
RGTR varchar(20) null comment '등록자',
MDFCN_DTTM datetime null comment '수정 일시',
MDFR varchar(20) null comment '수정자'
)
comment '역할';

@ -0,0 +1,14 @@
create table tb_role_menu
(
ROLE_ID varchar(20) not null comment '역할 ID',
MENU_ID varchar(20) not null comment '메뉴 ID',
REG_DTTM datetime null comment '등록 일시',
RGTR varchar(20) null comment '등록자',
primary key (ROLE_ID, MENU_ID),
constraint fk_role_menu_menu
foreign key (MENU_ID) references tb_menu (MENU_ID),
constraint fk_role_menu_role
foreign key (ROLE_ID) references tb_role (ROLE_ID)
)
comment '역할-메뉴 매핑';

@ -0,0 +1,44 @@
create table tb_user
(
USER_ID varchar(20) not null comment '사용자 ID'
primary key,
USER_ACNT varchar(20) not null comment '사용자 계정',
USER_NM varchar(50) not null comment '사용자 이름',
PASSWD varchar(200) not null comment '비밀번호',
PASSWD_HINT varchar(100) null comment '비밀번호 힌트',
PASSWD_NSR varchar(100) null comment '비밀번호 힌트 답',
EMP_NO varchar(20) null comment '사원 번호',
GENDER varchar(1) null comment '성별',
ZIP varchar(6) null comment '우편번호',
ADDR varchar(150) null comment '주소',
DADDR varchar(150) null comment '상세주소',
AREA_NO varchar(10) null comment '지역 번호',
EML_ADDR varchar(50) null comment '이메일 주소',
ORG_CD varchar(20) null comment '조직 CD',
USER_GROUP_ID varchar(20) null comment '그룹 ID',
NSTT_CD varchar(8) not null comment '소속기관 코드',
POS_NM varchar(60) null comment '직위 이름',
CRTFC_DN varchar(20) null comment '인증 DN값',
USER_STATUS_CD varchar(20) not null comment '사용자 상태',
FXNO varchar(20) null comment '팩스번호',
TELNO varchar(20) null comment '전화번호',
MBL_TELNO varchar(20) null comment '휴대 전화번호',
BRDT varchar(20) null comment '생년월일',
DEPT_CD varchar(7) null comment '부서 코드',
USE_YN varchar(1) not null comment '사용 여부',
RSDNT_NO varchar(200) null comment '주민등록 번호',
PASSWD_INIT_YN varchar(1) default 'N' null comment '비밀번호 초기화 여부',
LOCK_YN varchar(1) null comment '잠김 여부',
LOCK_CNT int not null comment '잠김 횟수',
LOCK_DTTM datetime null comment '잠김 일시',
REG_DTTM datetime null comment '등록 일시',
RGTR varchar(20) null comment '등록자',
MDFCN_DTTM datetime null comment '수정 일시',
MDFR varchar(20) null comment '수정자',
constraint tb_user_unique
unique (USER_ACNT),
constraint fk_user_group
foreign key (USER_GROUP_ID) references tb_group (GROUP_ID)
)
comment '사용자';

@ -0,0 +1,19 @@
create table tb_user_session
(
SESSION_ID varchar(100) not null comment '세션 ID'
primary key,
USER_ID varchar(20) not null comment '사용자 ID',
USER_ACNT varchar(20) null comment '사용자 계정',
LOGIN_DTTM datetime default current_timestamp() not null comment '로그인 시간',
LAST_ACCESS_DTTM datetime default current_timestamp() not null comment '마지막 접속 시간',
IP_ADDR varchar(50) null comment 'IP 주소',
USER_AGENT varchar(500) null comment '사용자 에이전트'
)
comment '사용자 세션 정보';
create index IDX_TB_USER_SESSION_LOGIN_DTTM
on tb_user_session (LOGIN_DTTM);
create index IDX_TB_USER_SESSION_USER_ID
on tb_user_session (USER_ID);

@ -0,0 +1,320 @@
# 통합 데이터베이스 컬럼 단어사전
## 한글 → 영문 약어 변환표
| 한글 | 영문 약어 | 전체 영문 | 의미 |
|------|-----------|-----------|------|
| 접속 | ACCESS | ACCESS | 접속 |
| 계정 | ACNT | ACCOUNT | 계정 |
| 주소 | ADDR | ADDRESS | 주소 |
| 에이전트 | AGENT | AGENT | 에이전트 |
| 전체 | ALL | ALL | 전체, 모든 |
| 답변 | NSR | ANSWER | 답변 |
| 보관 | ARCHIVE | ARCHIVE | 보관, 아카이브 |
| 지역 | AREA | AREA | 지역 |
| 속성 | ATTRIBUTE | ATTRIBUTE | 속성 |
| 배치 | BATCH | BATCH | 배치 |
| 게시판 | BBS | BBS | 게시판 (Bulletin Board System) |
| 생년월일 | BRDT | BIRTH_DATE | 생년월일 |
| 달력 | CALENDAR | CALENDAR | 달력 |
| 범주 | CATEGORY | CATEGORY | 범주, 카테고리 |
| 코드 | CD | CODE | 코드 |
| 클래스 | CLASS | CLASS | 클래스 |
| 컬럼 | CLMN | COLUMN | 컬럼 |
| 개수 | CNT | COUNT | 개수, 수량 |
| 댓글 | COMMENT | COMMENT | 댓글 |
| 완료 | COMPLETED | COMPLETED | 완료된 |
| 설정 | CONFIG | CONFIG | 설정 |
| 내용 | CONTENT | CONTENT | 내용 |
| 손상 | CORRUPTED | CORRUPTED | 손상된 |
| 크론 | CRON | CRON | 크론 (스케줄링) |
| 인증 | CRTFC | CERTIFICATE | 인증 |
| 상세주소 | DADDR | DETAIL_ADDRESS | 상세주소 |
| 데이터 | DATA | DATA | 데이터 |
| 일 | DAY | DAY | 일 |
| 설명 | DC | DESCRIPTION | 설명 |
| 깊이 | DEPTH | DEPTH | 깊이 |
| 부서 | DEPT | DEPARTMENT | 부서 |
| 상세 | DETAIL | DETAIL | 상세 |
| 디바이스 | DEVICE | DEVICE | 디바이스 |
| 일시 | DTTM | DATE_TIME | 일시 |
| 에디터 | EDITOR | EDITOR | 에디터 |
| 이메일 | EML | EMAIL | 이메일 |
| 사원 | EMP | EMPLOYEE | 사원 |
| 종료 | END | END | 종료 |
| 에러 | ERROR | ERROR | 에러 |
| 엑셀 | EXCEL | EXCEL | 엑셀 |
| 초과 | EXCEEDED | EXCEEDED | 초과된 |
| 실행 | EXECUTION | EXECUTION | 실행 |
| 종료 | EXIT | EXIT | 종료 |
| 표현식 | EXPRESSION | EXPRESSION | 표현식 |
| 확장자 | EXT | EXTENSION | 확장자 |
| 추출 | EXTRACT | EXTRACT | 추출 |
| 실패 | FAILED | FAILED | 실패한 |
| 팩스번호 | FXNO | FAX_NUMBER | 팩스번호 |
| 파일 | FILE | FILE | 파일 |
| 성별 | GENDER | GENDER | 성별 |
| 그룹 | GROUP | GROUP | 그룹 |
| 힌트 | HINT | HINT | 힌트 |
| 아이콘 | ICON | ICON | 아이콘 |
| 식별자 | ID | ID | 식별자 |
| 이미지 | IMAGE | IMAGE | 이미지 |
| 정보 | INFO | INFORMATION | 정보 |
| 초기화 | INIT | INITIALIZE | 초기화 |
| 작업 | JOB | JOB | 작업 |
| 마지막 | LAST | LAST | 마지막 |
| 레벨 | LEVEL | LEVEL | 레벨 |
| 라인 | LINE | LINE | 라인 |
| 잠김 | LOCK | LOCK | 잠김 |
| 로그 | LOG | LOG | 로그 |
| 로그인 | LOGIN | LOGIN | 로그인 |
| 최대 | MAX | MAX | 최대 |
| 휴대 | MBL | MOBILE | 휴대 |
| 수정 | MDFCN | MODIFICATION | 수정 |
| 수정자 | MDFR | MODIFIER | 수정자 |
| 메뉴 | MENU | MENU | 메뉴 |
| 메시지 | MESSAGE | MESSAGE | 메시지 |
| 모듈 | MODULE | MODULE | 모듈 |
| 이름 | NM | NAME | 이름 |
| 다음 | NEXT | NEXT | 다음 |
| 번호 | NO | NUMBER | 번호 |
| 비 | NON | NON | 비, 아닌 |
| 공지 | NOTICE | NOTICE | 공지 |
| 소속기관 | NSTT | INSTITUTE | 소속기관 |
| 알림 | NOTIFICATION | NOTIFICATION | 알림 |
| 순서 | ORDR | ORDER | 순서 |
| 조직 | ORG | ORGANIZATION | 조직 |
| 원본 | ORIGINAL | ORIGINAL | 원본 |
| 매개변수 | PARAM | PARAMETER | 매개변수 |
| 부모 | PARENT | PARENT | 부모 |
| 참여자 | PARTICIPANTS | PARTICIPANTS | 참여자 |
| 비밀번호 | PASSWD | PASSWORD | 비밀번호 |
| 경로 | PATH | PATH | 경로 |
| 패턴 | PATTERN | PATTERN | 패턴 |
| 대기중 | PENDING | PENDING | 대기중 |
| 장소 | PLACE | PLACE | 장소 |
| 직위 | POS | POSITION | 직위 |
| 게시물 | POST | POST | 게시물 |
| 비공개 | PRIVATE | PRIVATE | 비공개 |
| 처리 | PROCESS | PROCESS | 처리 |
| 처리중 | PROCESSING | PROCESSING | 처리중 |
| 원시 | RAW | RAW | 원시 |
| 확인 | READ | READ | 확인 |
| 사유 | REASON | REASON | 사유 |
| 등록 | REG | REGISTRATION | 등록 |
| 재시도 | RETRY | RETRY | 재시도 |
| 등록자 | RGTR | REGISTRANT | 등록자 |
| 역할 | ROLE | ROLE | 역할 |
| 주민등록 | RSDNT | RESIDENT | 주민등록 |
| 샘플 | SAMPLE | SAMPLE | 샘플 |
| 일정 | SCHEDULE | SCHEDULE | 일정 |
| 시퀀스 | SEQ | SEQUENCE | 시퀀스 |
| 서버 | SERVER | SERVER | 서버 |
| 세션 | SESSION | SESSION | 세션 |
| 설정 | SETTING | SETTING | 설정 |
| 크기 | SIZE | SIZE | 크기 |
| 정렬 | SORT | SORT | 정렬 |
| 시작 | START | START | 시작 |
| 상태 | STATUS | STATUS | 상태 |
| 저장 | STORED | STORED | 저장된 |
| 성공 | SUCCESS | SUCCESS | 성공 |
| 대상 | TARGET | TARGET | 대상 |
| 전화번호 | TELNO | TELEPHONE_NUMBER | 전화번호 |
| 제목 | TITLE | TITLE | 제목 |
| 총 | TOTAL | TOTAL | 총 |
| 타입 | TYPE | TYPE | 타입 |
| 유니크키 | UK | UNIQUE_KEY | 유니크 키 |
| 업로드 | UPLOAD | UPLOAD | 업로드 |
| 상위 | UPPER | UPPER | 상위 |
| 사용 | USE | USE | 사용 |
| 사용자 | USER | USER | 사용자 |
| 값 | VALUE | VALUE | 값 |
| 화면 | VIEW | VIEW | 화면, 표시 |
| 대기중 | WAITING | WAITING | 대기중 |
| 작성자 | WRITER | WRITER | 작성자 |
| 예아니오 | YN | YES_NO | 예/아니오 |
| 우편번호 | ZIP | ZIP | 우편번호 |
## 영문 약어 사전
| 영문 약어 | 전체 영문 | 한글 의미 | 설명 |
|-----------|-----------|----------|------|
| ACCESS | ACCESS | 접속 | 접속 |
| ACNT | ACCOUNT | 계정 | 계정 |
| ADDR | ADDRESS | 주소 | 주소 |
| AGENT | AGENT | 에이전트 | 에이전트 |
| ALL | ALL | 전체 | 전체, 모든 |
| ANSWER | ANSWER | 답변 | 답변 |
| ARCHIVE | ARCHIVE | 보관 | 보관, 아카이브 |
| AREA | AREA | 지역 | 지역 |
| ATTRIBUTE | ATTRIBUTE | 속성 | 속성 |
| BATCH | BATCH | 배치 | 배치 |
| BBS | BBS | 게시판 | 게시판 (Bulletin Board System) |
| BRDT | BIRTH_DATE | 생년월일 | 생년월일 |
| CALENDAR | CALENDAR | 달력 | 달력 |
| CATEGORY | CATEGORY | 범주 | 범주, 카테고리 |
| CD | CODE | 코드 | 코드 |
| CLASS | CLASS | 클래스 | 클래스 |
| CLMN | COLUMN | 컬럼 | 컬럼 |
| CNT | COUNT | 개수 | 개수, 수량 |
| COMMENT | COMMENT | 댓글 | 댓글 |
| COMPLETED | COMPLETED | 완료 | 완료된 |
| CONFIG | CONFIG | 설정 | 설정 |
| CONTENT | CONTENT | 내용 | 내용 |
| CORRUPTED | CORRUPTED | 손상 | 손상된 |
| CRON | CRON | 크론 | 크론 (스케줄링) |
| CRTFC | CERTIFICATE | 인증 | 인증 |
| DADDR | DETAIL_ADDRESS | 상세주소 | 상세주소 |
| DATA | DATA | 데이터 | 데이터 |
| DAY | DAY | 일 | 일 |
| DC | DESCRIPTION | 설명 | 설명 |
| DEPTH | DEPTH | 깊이 | 깊이 |
| DEPT | DEPARTMENT | 부서 | 부서 |
| DETAIL | DETAIL | 상세 | 상세 |
| DEVICE | DEVICE | 디바이스 | 디바이스 |
| DN | DN | DN | DN |
| DTTM | DATE_TIME | 일시 | 일시 |
| EDITOR | EDITOR | 에디터 | 에디터 |
| EML | EMAIL | 이메일 | 이메일 |
| EMP | EMPLOYEE | 사원 | 사원 |
| END | END | 종료 | 종료 |
| ERROR | ERROR | 에러 | 에러 |
| EXCEL | EXCEL | 엑셀 | 엑셀 |
| EXCEEDED | EXCEEDED | 초과 | 초과된 |
| EXECUTION | EXECUTION | 실행 | 실행 |
| EXIT | EXIT | 종료 | 종료 |
| EXPRESSION | EXPRESSION | 표현식 | 표현식 |
| EXT | EXTENSION | 확장자 | 확장자 |
| EXTRACT | EXTRACT | 추출 | 추출 |
| FAILED | FAILED | 실패 | 실패한 |
| FILE | FILE | 파일 | 파일 |
| FXNO | FAX_NUMBER | 팩스번호 | 팩스번호 |
| GENDER | GENDER | 성별 | 성별 |
| GROUP | GROUP | 그룹 | 그룹 |
| HINT | HINT | 힌트 | 힌트 |
| ICON | ICON | 아이콘 | 아이콘 |
| ID | ID | 식별자 | 식별자 |
| IMAGE | IMAGE | 이미지 | 이미지 |
| INFO | INFORMATION | 정보 | 정보 |
| INIT | INITIALIZE | 초기화 | 초기화 |
| IP | IP | IP | IP |
| JOB | JOB | 작업 | 작업 |
| LAST | LAST | 마지막 | 마지막 |
| LEVEL | LEVEL | 레벨 | 레벨 |
| LINE | LINE | 라인 | 라인 |
| LOCK | LOCK | 잠김 | 잠김 |
| LOG | LOG | 로그 | 로그 |
| LOGIN | LOGIN | 로그인 | 로그인 |
| MAX | MAX | 최대 | 최대 |
| MBL | MOBILE | 휴대 | 휴대 |
| MDFCN | MODIFICATION | 수정 | 수정 |
| MDFR | MODIFIER | 수정자 | 수정자 |
| MENU | MENU | 메뉴 | 메뉴 |
| MESSAGE | MESSAGE | 메시지 | 메시지 |
| MODULE | MODULE | 모듈 | 모듈 |
| NEXT | NEXT | 다음 | 다음 |
| NM | NAME | 이름 | 이름 |
| NO | NUMBER | 번호 | 번호 |
| NON | NON | 비 | 비, 아닌 |
| NOTICE | NOTICE | 공지 | 공지 |
| NOTIFICATION | NOTIFICATION | 알림 | 알림 |
| NSR | ANSWER | 답 | 답 |
| NSTT | INSTITUTE | 소속기관 | 소속기관 |
| ORDR | ORDER | 순서 | 순서 |
| ORG | ORGANIZATION | 조직 | 조직 |
| ORIGINAL | ORIGINAL | 원본 | 원본 |
| PARAM | PARAMETER | 매개변수 | 매개변수 |
| PARENT | PARENT | 부모 | 부모 |
| PARTICIPANTS | PARTICIPANTS | 참여자 | 참여자 |
| PASSWD | PASSWORD | 비밀번호 | 비밀번호 |
| PATH | PATH | 경로 | 경로 |
| PATTERN | PATTERN | 패턴 | 패턴 |
| PENDING | PENDING | 대기중 | 대기중 |
| PLACE | PLACE | 장소 | 장소 |
| POS | POSITION | 직위 | 직위 |
| POST | POST | 게시물 | 게시물 |
| PRIVATE | PRIVATE | 비공개 | 비공개 |
| PROCESS | PROCESS | 처리 | 처리 |
| PROCESSING | PROCESSING | 처리중 | 처리중 |
| RAW | RAW | 원시 | 원시 |
| READ | READ | 확인 | 확인 |
| REASON | REASON | 사유 | 사유 |
| REG | REGISTRATION | 등록 | 등록 |
| RETRY | RETRY | 재시도 | 재시도 |
| RGTR | REGISTRANT | 등록자 | 등록자 |
| ROLE | ROLE | 역할 | 역할 |
| RSDNT | RESIDENT | 주민등록 | 주민등록 |
| SAMPLE | SAMPLE | 샘플 | 샘플 |
| SCHEDULE | SCHEDULE | 일정 | 일정 |
| SEQ | SEQUENCE | 시퀀스 | 시퀀스 |
| SERVER | SERVER | 서버 | 서버 |
| SESSION | SESSION | 세션 | 세션 |
| SETTING | SETTING | 설정 | 설정 |
| SIZE | SIZE | 크기 | 크기 |
| SORT | SORT | 정렬 | 정렬 |
| START | START | 시작 | 시작 |
| STATUS | STATUS | 상태 | 상태 |
| STORED | STORED | 저장 | 저장된 |
| SUCCESS | SUCCESS | 성공 | 성공 |
| TARGET | TARGET | 대상 | 대상 |
| TELNO | TELEPHONE_NUMBER | 전화번호 | 전화번호 |
| TITLE | TITLE | 제목 | 제목 |
| TOTAL | TOTAL | 총 | 총 |
| TUI | TUI | TUI | TUI (Toast UI) |
| TYPE | TYPE | 타입 | 타입 |
| UK | UNIQUE_KEY | 유니크키 | 유니크 키 |
| UPLOAD | UPLOAD | 업로드 | 업로드 |
| UPPER | UPPER | 상위 | 상위 |
| URL | URL | URL | URL |
| USE | USE | 사용 | 사용 |
| USER | USER | 사용자 | 사용자 |
| VALUE | VALUE | 값 | 값 |
| VIEW | VIEW | 화면 | 화면, 표시 |
| WAITING | WAITING | 대기중 | 대기중 |
| WRITER | WRITER | 작성자 | 작성자 |
| YN | YES_NO | 예아니오 | 예/아니오 |
| ZIP | ZIP | 우편번호 | 우편번호 |
## 일반적인 접미사 패턴
| 접미사 | 의미 | 예시 |
|--------|------|------|
| _ID | 식별자 | USER_ID, MENU_ID |
| _CD | 코드 | TYPE_CD, STATUS_CD |
| _NM | 이름 | USER_NM, FILE_NM |
| _DC | 설명 | MENU_DC, ROLE_DC |
| _DTTM | 일시 | REG_DTTM, MDFCN_DTTM |
| _YN | 예/아니오 | USE_YN, DEL_YN |
| _CNT | 개수 | LOGIN_CNT, RETRY_CNT |
| _NO | 번호 | EMP_NO, TELNO |
| _ORDR | 순서 | SORT_ORDR, MENU_ORDR |
| _ADDR | 주소 | HOME_ADDR, WORK_ADDR |
| _PATH | 경로 | FILE_PATH, MENU_PATH |
| _SIZE | 크기 | FILE_SIZE, IMAGE_SIZE |
| _TYPE | 타입 | FILE_TYPE, USER_TYPE |
| _STATUS | 상태 | PROCESS_STATUS, LOGIN_STATUS |
## 주요 컬럼 네이밍 규칙
1. **기본 구조**: `[접두사_]주요단어[_접미사]`
2. **복합어**: 언더스코어(_)로 구분
3. **일시**: 반드시 `_DTTM` 사용
4. **여부**: 반드시 `_YN` 사용
5. **등록/수정**: `REG_DTTM`, `MDFCN_DTTM`, `RGTR`, `MDFR` 패턴 사용
6. **ID**: 테이블명에서 `tb_` 제거 후 `_ID` 추가
## 테이블 참조 정보
- **tb_common_html_editor_file**: 파일 관리
- **tb_excel_sample**: 엑셀 샘플 데이터
- **tb_group**: 그룹 정보
- **tb_group_role**: 그룹-역할 매핑
- **tb_login_log**: 로그인 로그
- **tb_menu**: 메뉴 정보
- **tb_notification**: 알림 정보
- **tb_notification_target**: 알림 대상자
- **tb_notification_target_setting**: 알림 대상자 설정
- **tb_role**: 역할 정보
- **tb_role_menu**: 역할-메뉴 매핑
- **tb_user**: 사용자 정보
- **tb_user_session**: 사용자 세션 정보

@ -0,0 +1,4 @@
INSERT INTO xitframework.tb_batch_job_info (JOB_ID, JOB_NM, JOB_GROUP, JOB_CLASS, CRON_EXPRESSION, JOB_DC, STATUS_CD, LAST_EXECUTION_ID, REG_DTTM, MDFCN_DTTM) VALUES ('2542ecde-3547-4d98-b1fb-75ca32799b27', 'SampleFileReadBatchJob', 'SampleGroup', 'go.kr.project.batch.job.SampleFileReadBatchJob', '0 0 * * * ?', '', 'ACTIVE', 'a5667923-52bb-4d8d-9f01-0d3452ccccb6', '2025-07-21 09:55:22', '2025-07-23 11:59:58');
INSERT INTO xitframework.tb_batch_job_info (JOB_ID, JOB_NM, JOB_GROUP, JOB_CLASS, CRON_EXPRESSION, JOB_DC, STATUS_CD, LAST_EXECUTION_ID, REG_DTTM, MDFCN_DTTM) VALUES ('5d284aaa-cfe5-4b05-860f-e9108b80d63c', 'ZipFileProcessBatchJob', 'SampleGroup', 'go.kr.project.batch.job.ZipFileProcessBatchJob', '0 0 * * * ?', '', 'ACTIVE', '92f51b4d-80d9-4c27-9555-e998d2d6ff7b', '2025-07-21 09:55:45', '2025-07-23 11:59:58');
INSERT INTO xitframework.tb_batch_job_info (JOB_ID, JOB_NM, JOB_GROUP, JOB_CLASS, CRON_EXPRESSION, JOB_DC, STATUS_CD, LAST_EXECUTION_ID, REG_DTTM, MDFCN_DTTM) VALUES ('a27623bf-ef70-41ed-9886-736af9e3d3e0', 'SampleBatchJob3', 'SampleGroup', 'go.kr.project.batch.job.SampleBatchJob3', '0 0/1 * * * ?', '', 'DELETED', null, '2025-07-21 09:55:59', '2025-07-21 10:07:33');
INSERT INTO xitframework.tb_batch_job_info (JOB_ID, JOB_NM, JOB_GROUP, JOB_CLASS, CRON_EXPRESSION, JOB_DC, STATUS_CD, LAST_EXECUTION_ID, REG_DTTM, MDFCN_DTTM) VALUES ('d40d571f-f48a-4481-b88e-545c224aa6e2', 'SampleErrorFileRetryBatchJob', 'SampleGroup', 'go.kr.project.batch.job.SampleErrorFileRetryBatchJob', '0 0 * * * ?', '', 'ACTIVE', 'ca01ef92-32a3-4ac8-9c2a-6e5e18e82c12', '2025-07-21 09:55:32', '2025-07-23 11:59:58');

@ -0,0 +1,4 @@
INSERT INTO xitframework.tb_bbs_config (BBS_ID, BBS_NM, BBS_TYPE_CD, BBS_DC, UPLOAD_YN, UPLOAD_FILE_CNT, COMMENT_YN, TUI_EDITOR_YN, NOTICE_YN, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BBSC00000001', '공지사항', 'NOTICE', '공지사항 TEST', 'Y', 2, 'N', 'Y', 'Y', 'Y', '2025-05-27 10:37:51', 'ADMIN', '2025-07-18 09:41:29', 'ADMIN');
INSERT INTO xitframework.tb_bbs_config (BBS_ID, BBS_NM, BBS_TYPE_CD, BBS_DC, UPLOAD_YN, UPLOAD_FILE_CNT, COMMENT_YN, TUI_EDITOR_YN, NOTICE_YN, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BBSC00000040', 'FAQ', 'FAQ', 'FAQ', 'Y', 10, 'N', 'Y', 'N', 'Y', '2025-06-02 11:30:11', 'ADMIN', '2025-06-05 13:22:52', 'ADMIN');
INSERT INTO xitframework.tb_bbs_config (BBS_ID, BBS_NM, BBS_TYPE_CD, BBS_DC, UPLOAD_YN, UPLOAD_FILE_CNT, COMMENT_YN, TUI_EDITOR_YN, NOTICE_YN, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BBSC00000041', '질문과 답변', 'QNA', '질문과 답변', 'Y', 5, 'N', 'Y', 'N', 'Y', '2025-06-02 17:07:37', 'ADMIN', '2025-07-18 15:37:40', 'ADMIN');
INSERT INTO xitframework.tb_bbs_config (BBS_ID, BBS_NM, BBS_TYPE_CD, BBS_DC, UPLOAD_YN, UPLOAD_FILE_CNT, COMMENT_YN, TUI_EDITOR_YN, NOTICE_YN, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BBSC00000100', '일반 게시판', 'NORMAL', '일반 게시판-1', 'Y', 2, 'Y', 'Y', 'Y', 'Y', '2025-06-05 15:14:48', 'ADMIN', '2025-07-23 09:12:29', 'ADMIN');

@ -0,0 +1,55 @@
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BATCH_EXEC_STATUS_CD', 'COMPLETED', '완료됨', '배치 작업 실행이 성공적으로 완료된 상태', 2, 'Y', null, null, null, null, null, '2025-06-18 13:24:51', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BATCH_EXEC_STATUS_CD', 'FAILED', '실패함', '배치 작업 실행 중 오류가 발생한 상태', 3, 'Y', null, null, null, null, null, '2025-06-18 13:24:51', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BATCH_EXEC_STATUS_CD', 'PARTIALLY_COMPLETED', '부분완료', '배치 작업 실행이 일부 성공하고 일부 실패한 상태', 5, 'N', null, null, null, null, null, '2025-06-20 14:12:15', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BATCH_EXEC_STATUS_CD', 'STARTED', '시작됨', '배치 작업 실행이 시작된 상태', 1, 'Y', null, null, null, null, null, '2025-06-18 13:24:51', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BATCH_EXEC_STATUS_CD', 'VETOED', '거부됨', '배치 작업 실행이 거부된 상태', 4, 'Y', null, null, null, null, null, '2025-06-18 13:24:51', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BATCH_EXIT_CD', 'COMPLETED', '성공 종료', '배치 작업이 성공적으로 종료됨', 1, 'Y', null, null, null, null, null, '2025-06-18 13:24:51', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BATCH_EXIT_CD', 'FAILED', '실패 종료', '배치 작업이 오류로 인해 실패 종료됨', 2, 'Y', null, null, null, null, null, '2025-06-18 13:24:51', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BATCH_EXIT_CD', 'PARTIALLY_COMPLETED', '부분 완료', '배치 작업이 일부 성공하고 일부 실패하여 부분적으로 완료됨', 4, 'Y', null, null, null, null, null, '2025-06-20 14:32:25', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BATCH_EXIT_CD', 'UNKNOWN', '알 수 없음', '배치 작업의 종료 상태를 알 수 없음', 3, 'Y', null, null, null, null, null, '2025-06-18 13:24:51', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BATCH_JOB_STATUS_CD', 'ACTIVE', '활성', '배치 작업이 활성화된 상태', 1, 'Y', null, null, null, null, null, '2025-06-18 13:24:51', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BATCH_JOB_STATUS_CD', 'DELETED', '삭제됨', '배치 작업이 삭제된 상태', 3, 'Y', null, null, null, null, null, '2025-06-18 13:24:51', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BATCH_JOB_STATUS_CD', 'PAUSED', '일시 중지', '배치 작업이 일시 중지된 상태', 2, 'Y', null, null, null, null, null, '2025-06-18 13:24:51', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BBS_ANSWER_STATUS_CD', 'COMPLETED', '답변완료', '게시물 답변 상태 - 답변완료', 2, 'Y', null, null, null, null, null, '2025-06-04 12:27:54', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BBS_ANSWER_STATUS_CD', 'WAITING', '대기중', '게시물 답변 상태 - 대기중', 1, 'Y', null, null, null, null, null, '2025-06-04 12:27:54', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BBS_POST_TYPE_CD', 'A', '답변', '게시물 유형 - 답변', 2, 'Y', null, null, null, null, null, '2025-06-04 12:27:54', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BBS_POST_TYPE_CD', 'Q', '질문', '게시물 유형 - 질문', 1, 'Y', null, null, null, null, null, '2025-06-04 12:27:54', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BBS_TYPE_CD', 'FAQ', 'FAQ', 'FAQ 게시판', 4, 'Y', null, null, null, null, null, '2025-05-26 16:43:38', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BBS_TYPE_CD', 'NORMAL', '일반', '자료실 게시판', 1, 'Y', null, null, null, null, null, '2025-05-26 16:43:33', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BBS_TYPE_CD', 'NOTICE', '공지사항', '공지사항 게시판', 2, 'Y', null, null, null, null, null, '2025-05-26 16:43:35', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BBS_TYPE_CD', 'QNA', '질문과답변', '질문과답변 게시판 (답변 시 이메일 발송)', 3, 'Y', null, null, null, null, null, '2025-05-26 16:43:36', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('DEPT_CD', 'DEPT001', '경영지원부', '경영지원부', 1, 'Y', null, null, null, null, null, '2025-05-13 14:44:53', 'SYSTEM', '2025-05-13 14:44:53', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('DEPT_CD', 'DEPT002', '인사부', '인사부', 2, 'Y', null, null, null, null, null, '2025-05-13 14:44:53', 'SYSTEM', '2025-05-13 14:44:53', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('DEPT_CD', 'DEPT003', '개발부', '개발부', 3, 'Y', null, null, null, null, null, '2025-05-13 14:44:53', 'SYSTEM', '2025-05-13 14:44:53', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('DEPT_CD', 'DEPT004', '마케팅부', '마케팅부', 4, 'Y', null, null, null, null, null, '2025-05-13 14:44:53', 'SYSTEM', '2025-05-13 14:44:53', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('DEPT_CD', 'DEPT005', '영업부', '영업부', 5, 'Y', null, null, null, null, null, '2025-05-13 14:44:53', 'SYSTEM', '2025-05-13 14:44:53', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('DEPT_CD', 'DEPT006', '연구부', '연구부', 6, 'Y', null, null, null, null, null, '2025-05-13 14:44:53', 'SYSTEM', '2025-05-13 14:44:53', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('DEPT_CD', 'DEPT007', '품질관리부', '품질관리부', 7, 'Y', null, null, null, null, null, '2025-05-13 14:44:53', 'SYSTEM', '2025-05-13 14:44:53', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('NOTIFICATION_TYPE_CD', 'ANSWER', '답변', '답변 관련 알림', 3, 'Y', null, null, null, null, null, '2025-06-23 17:37:59', 'SYSTEM', '2025-06-23 17:37:59', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('NOTIFICATION_TYPE_CD', 'BATCH_FAILURE', '배치실패', '배치 실패 알림', 4, 'Y', null, null, null, null, null, '2025-07-15 13:41:19', 'ADMIN', null, null);
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('NOTIFICATION_TYPE_CD', 'QUESTION', '질문', '질문 관련 알림', 2, 'Y', null, null, null, null, null, '2025-06-23 17:37:59', 'SYSTEM', '2025-06-23 17:37:59', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('NOTIFICATION_TYPE_CD', 'SCHEDULE', '일정', '일정 관련 알림', 1, 'Y', null, null, null, null, null, '2025-06-23 17:37:59', 'SYSTEM', '2025-06-23 17:37:59', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('NSTT_CD', 'NSTT001', '본사', '본사', 1, 'Y', null, null, null, null, null, '2025-05-13 14:44:53', 'SYSTEM', '2025-05-13 14:44:53', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('NSTT_CD', 'NSTT002', '지역사무소', '지역사무소', 2, 'Y', null, null, null, null, null, '2025-05-13 14:44:53', 'SYSTEM', '2025-05-13 14:44:53', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('NSTT_CD', 'NSTT003', '연구소', '연구소', 3, 'Y', null, null, null, null, null, '2025-05-13 14:44:53', 'SYSTEM', '2025-05-13 14:44:53', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('NSTT_CD', 'NSTT004', '해외지사', '해외지사', 4, 'Y', null, null, null, null, null, '2025-05-13 14:44:53', 'SYSTEM', '2025-05-13 14:44:53', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('NSTT_CD', 'NSTT005', '협력업체', '협력업체', 5, 'Y', null, null, null, null, null, '2025-05-13 14:44:53', 'SYSTEM', '2025-05-13 14:44:53', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ORG_CD', 'ORG001', '본사 조직', '본사 조직', 1, 'Y', null, null, null, null, null, '2025-05-13 14:44:53', 'SYSTEM', '2025-05-13 14:44:53', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ORG_CD', 'ORG002', '지역 조직', '지역 조직', 2, 'Y', null, null, null, null, null, '2025-05-13 14:44:53', 'SYSTEM', '2025-05-13 14:44:53', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ORG_CD', 'ORG003', '연구 조직', '연구 조직', 3, 'Y', null, null, null, null, null, '2025-05-13 14:44:53', 'SYSTEM', '2025-05-13 14:44:53', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ORG_CD', 'ORG004', '해외 조직', '해외 조직', 4, 'Y', null, null, null, null, null, '2025-05-13 14:44:53', 'SYSTEM', '2025-05-13 14:44:53', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ORG_CD', 'ORG005', '협력 조직', '협력 조직', 5, 'Y', null, null, null, null, null, '2025-05-13 14:44:53', 'SYSTEM', '2025-05-13 14:44:53', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('SCHEDULE_CATEGORY_CD', 'BUSINESS_TRIP', '출장', '출장 관련 일정', 2, 'Y', 'rgba(111, 66, 193, 0.7)', null, null, null, null, '2025-06-13 10:36:55', 'SYSTEM', '2025-06-13 15:50:23', 'ADMIN');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('SCHEDULE_CATEGORY_CD', 'IMPORTANT', '중요', '중요 일정', 5, 'Y', 'rgba(255, 159, 67, 0.7)', null, null, null, null, '2025-06-13 10:36:55', 'SYSTEM', '2025-06-13 15:32:58', 'ADMIN');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('SCHEDULE_CATEGORY_CD', 'MEETING', '회의', '회의 관련 일정', 4, 'Y', 'rgba(46, 139, 87, 0.7)', null, null, null, null, '2025-06-13 10:36:55', 'SYSTEM', '2025-06-13 16:10:03', 'ADMIN');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('SCHEDULE_CATEGORY_CD', 'VACATION', '휴가', '휴가 관련 일정', 3, 'Y', 'rgba(23, 162, 184, 0.7)', null, null, null, null, '2025-06-13 10:36:55', 'SYSTEM', '2025-06-13 15:50:23', 'ADMIN');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('SCHEDULE_CATEGORY_CD', 'WORK', '업무', '업무 관련 일정', 1, 'Y', 'rgba(55, 136, 216, 0.7)', null, null, null, null, '2025-06-13 10:36:55', 'SYSTEM', '2025-06-13 15:32:25', 'ADMIN');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('TEST_CD', 'TTT_TEST_CD1_1_1', '테스트 코드1', '1', 1, 'Y', null, null, null, null, null, '2025-07-09 13:56:19', 'ADMIN', '2025-07-21 10:33:44', 'ADMIN');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('TEST_CD', 'TTT_TEST_CD2_1_1', '테스트 코드2', '2', 2, 'Y', null, null, null, null, null, '2025-07-09 13:56:19', 'ADMIN', '2025-07-21 10:33:44', 'ADMIN');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('TEST_CD', 'TTT_TEST_CD3_1_1', '테스트 코드3', '3', 3, 'Y', null, null, null, null, null, '2025-07-09 13:56:19', 'ADMIN', '2025-07-21 10:33:49', 'ADMIN');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('TEST_CD2', 'TTT_TEST_CD1_1_1', '테스트 코드1', '1', 1, 'Y', null, null, null, null, null, '2025-07-11 16:21:46', 'ADMIN', '2025-07-18 09:39:27', 'ADMIN');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('TEST_CD2', 'TTT_TEST_CD2_1_1', '테스트 코드2', '2', 2, 'Y', null, null, null, null, null, '2025-07-11 16:21:46', 'ADMIN', '2025-07-21 13:35:00', 'ADMIN');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('TEST_CD2', 'TTT_TEST_CD3_1_1', '테스트 코드3', '3', 3, 'Y', null, null, null, null, null, '2025-07-11 16:21:46', 'ADMIN', '2025-07-21 13:35:00', 'ADMIN');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('USER_STATUS_CD', 'ACTIVE', '활성', '활성 상태의 사용자', 1, 'Y', null, null, null, null, null, '2025-05-13 14:24:50', 'SYSTEM', '2025-05-13 14:24:50', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('USER_STATUS_CD', 'DELETED', '삭제', '삭제된 상태의 사용자', 4, 'Y', null, null, null, null, null, '2025-05-13 14:24:50', 'SYSTEM', '2025-05-13 14:24:50', 'SYSTEM');
INSERT INTO xitframework.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('USER_STATUS_CD', 'INACTIVE', '비활성', '비활성 상태의 사용자', 2, 'Y', null, null, null, null, null, '2025-05-13 14:24:50', 'SYSTEM', '2025-05-13 14:24:50', 'SYSTEM');

@ -0,0 +1,14 @@
INSERT INTO xitframework.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BATCH_EXEC_STATUS_CD', '배치 작업 실행 상태', '배치 작업 실행의 상태 코드', 'Y', '2025-06-18 13:24:51', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BATCH_EXIT_CD', '배치 작업 실행 종료 코드', '배치 작업 실행의 종료 코드', 'Y', '2025-06-18 13:24:51', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BATCH_JOB_STATUS_CD', '배치 작업 정보 상태', '배치 작업 정보의 상태 코드', 'Y', '2025-06-18 13:24:51', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BBS_ANSWER_STATUS_CD', '게시물 답변 상태', '답변 상태 (WAITING: 대기중, COMPLETED: 답변완료)', 'Y', '2025-06-04 12:27:54', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BBS_POST_TYPE_CD', '게시물 유형', '게시물 유형 (Q: 질문, A: 답변)', 'Y', '2025-06-04 12:27:54', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('BBS_TYPE_CD', '게시판 종류', '게시판 종류를 관리하는 코드 그룹', 'Y', '2025-05-26 16:43:32', 'SYSTEM', null, null);
INSERT INTO xitframework.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('DEPT_CD', '부서 코드', '부서를 나타내는 코드', 'Y', '2025-05-13 14:44:53', 'SYSTEM', '2025-07-21 13:38:37', 'SYSTEM');
INSERT INTO xitframework.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('NOTIFICATION_TYPE_CD', '알림 유형', '공통 알림 시스템의 알림 유형 코드', 'Y', '2025-06-23 17:37:59', 'SYSTEM', '2025-06-23 17:37:59', 'SYSTEM');
INSERT INTO xitframework.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('NSTT_CD', '소속기관 코드', '소속기관을 나타내는 코드', 'Y', '2025-05-13 14:44:53', 'SYSTEM', '2025-05-13 14:44:53', 'SYSTEM');
INSERT INTO xitframework.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ORG_CD', '조직 코드', '조직을 나타내는 코드', 'Y', '2025-05-13 14:44:53', 'SYSTEM', '2025-05-13 14:44:53', 'SYSTEM');
INSERT INTO xitframework.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('SCHEDULE_CATEGORY_CD', '일정 범주', '일정 관리 시스템의 일정 범주 코드', 'Y', '2025-06-13 10:36:55', 'SYSTEM', '2025-06-13 10:36:55', 'SYSTEM');
INSERT INTO xitframework.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('TEST_CD', '테스트 코드', '', 'N', '2025-07-09 13:55:39', 'ADMIN', '2025-07-21 14:33:41', 'ADMIN');
INSERT INTO xitframework.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('TEST_CD2', '테스트 코드', '', 'Y', '2025-07-11 16:21:03', 'ADMIN', '2025-07-21 13:39:29', 'ADMIN');
INSERT INTO xitframework.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('USER_STATUS_CD', '사용자 상태', '사용자의 상태 코드', 'Y', '2025-05-13 14:24:50', 'SYSTEM', '2025-05-13 14:24:50', 'SYSTEM');

@ -0,0 +1,6 @@
INSERT INTO xitframework.tb_group (GROUP_ID, GROUP_NM, GROUP_DC, SORT_ORDR, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('GROUP_ADMIN', '관리자 그룹', '시스템 관리 권한을 가진 사용자 그룹', 5, 'Y', '2025-05-15 10:09:55', 'SYSTEM', '2025-05-15 10:09:55', 'SYSTEM');
INSERT INTO xitframework.tb_group (GROUP_ID, GROUP_NM, GROUP_DC, SORT_ORDR, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('GROUP_APPROVER', '업무 승인 담당자 그룹', '업무 승인 권한을 가진 사용자 그룹', 4, 'Y', '2025-05-16 12:44:14', 'SYSTEM', '2025-05-16 12:44:14', 'SYSTEM');
INSERT INTO xitframework.tb_group (GROUP_ID, GROUP_NM, GROUP_DC, SORT_ORDR, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('GROUP_SYSTEM', '시스템 관리자 그룹-XIT', '모든 시스템 권한을 가진 사용자 그룹(XIT)', 999, 'Y', '2025-05-15 10:09:55', 'SYSTEM', '2025-07-21 13:40:13', 'SYSTEM');
INSERT INTO xitframework.tb_group (GROUP_ID, GROUP_NM, GROUP_DC, SORT_ORDR, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('GROUP_USER', '일반 사용자 그룹', '일반 사용자 권한을 가진 사용자 그룹', 2, 'Y', '2025-05-15 10:09:55', 'SYSTEM', '2025-06-04 16:34:22', 'SYSTEM');
INSERT INTO xitframework.tb_group (GROUP_ID, GROUP_NM, GROUP_DC, SORT_ORDR, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('GROUP_VISITOR', '방문자 그룹', '방문자 권한을 가진 사용자 그룹', 1, 'Y', '2025-05-15 10:09:55', 'SYSTEM', '2025-05-15 10:09:55', 'SYSTEM');
INSERT INTO xitframework.tb_group (GROUP_ID, GROUP_NM, GROUP_DC, SORT_ORDR, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('GROUP_WORKER', '업무 담당자 그룹', '업무 처리 권한을 가진 사용자 그룹', 3, 'Y', '2025-05-16 12:44:12', 'SYSTEM', '2025-07-18 15:37:11', 'SYSTEM');

@ -0,0 +1,8 @@
INSERT INTO xitframework.tb_group_role (GROUP_ID, ROLE_ID, REG_DTTM, RGTR) VALUES ('GROUP_ADMIN', 'ROLE_ADMIN', '2025-05-16 12:41:59', 'SYSTEM');
INSERT INTO xitframework.tb_group_role (GROUP_ID, ROLE_ID, REG_DTTM, RGTR) VALUES ('GROUP_APPROVER', 'ROLE_APPROVER', '2025-05-30 14:45:09', 'ADMIN');
INSERT INTO xitframework.tb_group_role (GROUP_ID, ROLE_ID, REG_DTTM, RGTR) VALUES ('GROUP_APPROVER', 'ROLE_USER', '2025-07-21 13:40:34', 'ADMIN');
INSERT INTO xitframework.tb_group_role (GROUP_ID, ROLE_ID, REG_DTTM, RGTR) VALUES ('GROUP_APPROVER', 'ROLE_WORKER', '2025-07-09 14:04:57', 'ADMIN');
INSERT INTO xitframework.tb_group_role (GROUP_ID, ROLE_ID, REG_DTTM, RGTR) VALUES ('GROUP_SYSTEM', 'ROLE_SYSTEM', '2025-05-16 12:42:00', 'SYSTEM');
INSERT INTO xitframework.tb_group_role (GROUP_ID, ROLE_ID, REG_DTTM, RGTR) VALUES ('GROUP_USER', 'ROLE_USER', '2025-05-16 12:41:56', 'SYSTEM');
INSERT INTO xitframework.tb_group_role (GROUP_ID, ROLE_ID, REG_DTTM, RGTR) VALUES ('GROUP_USER', 'ROLE_WORKER', '2025-07-18 15:36:42', 'ADMIN');
INSERT INTO xitframework.tb_group_role (GROUP_ID, ROLE_ID, REG_DTTM, RGTR) VALUES ('GROUP_WORKER', 'ROLE_WORKER', '2025-05-16 12:44:20', 'SYSTEM');

@ -0,0 +1,30 @@
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000001', '', '시스템 홈 메뉴', 'ROOT', 1, 1, '/main.do', '/main.do', 'home', 'Y', 'Y', '2025-05-16 12:49:48', 'SYSTEM', '2025-05-30 14:40:46', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000002', '게시판 관리', '공통 관리 메뉴', 'ROOT', 1, 500, '', '', 'edit-3', 'Y', 'Y', '2025-05-16 12:49:48', 'SYSTEM', '2025-06-04 14:01:04', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000003', '시스템 관리', '시스템 관리 메뉴', 'ROOT', 1, 900, '', '', 'settings', 'Y', 'Y', '2025-05-16 12:49:48', 'SYSTEM', '2025-05-30 14:41:20', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000005', '코드 통합 관리', '코드 마스터와 코드 상세를 한 화면에서 관리', 'MENU00000003', 2, 1, '/system/code/integrated/manage.do', '/system/code/**/*.do,/system/code/**/*.ajax', null, 'Y', 'Y', '2025-05-16 12:49:48', 'SYSTEM', '2025-05-20 15:07:54', 'SYSTEM');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000006', '사용자 관리', '사용자 관리 메뉴', 'MENU00000003', 2, 2, '/system/user/list.do', '/system/user/**/*.do,/system/user/**/*.ajax', null, 'Y', 'Y', '2025-05-16 12:49:48', 'SYSTEM', '2025-05-16 12:49:48', 'SYSTEM');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000007', '그룹 관리', '그룹 관리 메뉴', 'MENU00000003', 2, 3, '/system/group/list.do', '/system/group/**/*.do,/system/group/**/*.ajax', null, 'Y', 'Y', '2025-05-16 12:49:48', 'SYSTEM', '2025-05-16 12:49:48', 'SYSTEM');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000008', '역할 관리', '역할 관리 메뉴', 'MENU00000003', 2, 4, '/system/role/list.do', '/system/role/**/*.do,/system/role/**/*.ajax', null, 'Y', 'Y', '2025-05-16 12:49:48', 'SYSTEM', '2025-05-16 12:49:48', 'SYSTEM');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000009', '메뉴 관리', '메뉴 관리 메뉴', 'MENU00000003', 2, 5, '/system/menu/list.do', '/system/menu/**/*.do,/system/menu/**/*.ajax', null, 'Y', 'Y', '2025-05-16 12:49:48', 'SYSTEM', '2025-05-16 12:49:48', 'SYSTEM');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000010', '권한 관리', '권한 관리 메뉴', 'MENU00000003', 2, 6, '/system/auth/main.do', '/system/auth/**/*.do,/system/auth/**.ajax,/system/auth/**/*.ajax', null, 'Y', 'Y', '2025-05-16 12:49:48', 'SYSTEM', '2025-05-16 12:49:48', 'SYSTEM');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000011', '공통', '공통', 'ROOT', 1, 100, '', '/common/**/*.do,/common/**/*.ajax', 'package', 'Y', 'N', '2025-05-15 14:03:38', 'SYSTEM', '2025-05-30 14:42:10', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000052', '마이페이지', '마이페이지', 'ROOT', 1, 90, '/mypage.do', '/mypage.do,/mypage/**/*.do,/mypage/**/*.ajax', 'shield', 'Y', 'N', '2025-05-21 09:33:38', 'SYSTEM', '2025-07-08 10:05:50', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000053', '로그인 로그', '', 'MENU00000003', 2, 6, '/system/loginLog/list.do', '/system/loginLog/**/*.do,/system/loginLog/**/*.ajax', '', 'Y', 'Y', '2025-05-22 15:06:30', 'ADMIN', '2025-07-08 14:12:03', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000054', '게시판 설정', '게시판 설정, 게시판 타입별 생성 수정 삭제', 'MENU00000002', 2, 1, '/bbs/manage/config/list.do', '/bbs/manage/config/**/*.do,/bbs/manage/config/**/*.ajax', '', 'Y', 'Y', '2025-05-26 15:04:09', 'ADMIN', '2025-06-05 11:58:22', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000092', 'CRUD 예제', '등록, 수정, 삭제, 조회 예제', 'ROOT', 1, 110, '', '', 'list', 'Y', 'Y', '2025-05-30 18:27:36', 'ADMIN', '2025-06-05 12:00:09', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000093', '공지사항 예제', '공지사항 - 별도 소스 개발', 'MENU00000092', 2, 1, '/template/noticeSample/list.do', '/template/noticeSample/**.do,/template/noticeSample/**/*.ajax', '', 'Y', 'Y', '2025-05-30 18:28:18', 'ADMIN', '2025-06-04 13:42:44', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000094', '공지사항 관리', '게시판 설정의 공지사항 관리', 'MENU00000002', 2, 2, '/bbs/manage/post/BBSC00000001/list.do', '/bbs/manage/post/BBSC00000001/**/*.do,/bbs/manage/post/BBSC00000001/**/*.ajax', '', 'Y', 'Y', '2025-06-02 10:57:48', 'ADMIN', '2025-06-05 12:25:16', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000096', '공지사항', '공지사', 'ROOT', 1, 2, '/bbs/user/post/BBSC00000001/list.do', '/bbs/user/post/BBSC00000001/**/*.do,/bbs/user/post/BBSC00000001/**/*.ajax', 'edit', 'Y', 'Y', '2025-06-02 14:21:23', 'ADMIN', '2025-06-05 12:26:35', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000097', 'FAQ 관리', 'FAQ 관리', 'MENU00000002', 2, 4, '/bbs/manage/post/BBSC00000040/list.do', '/bbs/manage/post/BBSC00000040/**/*.do,/bbs/manage/post/BBSC00000040/**/*.ajax', '', 'Y', 'Y', '2025-06-02 15:51:09', 'ADMIN', '2025-06-05 15:15:56', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000098', 'FAQ', '', 'ROOT', 1, 3, '/bbs/user/post/BBSC00000040/listFaqData.do', '/bbs/user/post/BBSC00000040/**/*.do,/bbs/user/post/BBSC00000040/**/*.ajax', 'info', 'Y', 'Y', '2025-06-02 15:58:24', 'ADMIN', '2025-06-05 12:27:01', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000099', '질문과 답변', '질문과 답변 QNA', 'MENU00000002', 2, 5, '/bbs/manage/qna/BBSC00000041/list.do', '/bbs/manage/qna/BBSC00000041/**/*.do,/bbs/manage/qna/BBSC00000041/**/*.ajax', '', 'Y', 'Y', '2025-06-02 17:08:43', 'ADMIN', '2025-06-05 15:16:00', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000100', '질문과 답변', '질문과 답변', 'ROOT', 1, 5, '/bbs/user/qna/BBSC00000041/list.do', '/bbs/user/qna/BBSC00000041/**/*.do,/bbs/user/qna/BBSC00000041/**/*.ajax', 'help-circle', 'Y', 'Y', '2025-06-02 17:09:22', 'ADMIN', '2025-06-05 12:27:26', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000107', '일반 게시판 관리', '일반 게시판', 'MENU00000002', 2, 3, '/bbs/manage/post/BBSC00000100/list.do', '/bbs/manage/post/BBSC00000100/**/*.do,/bbs/manage/post/BBSC00000100/**/*.ajax', '', 'Y', 'Y', '2025-06-05 15:15:34', 'ADMIN', '2025-07-11 16:18:42', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000108', '일반 게시판', '', 'ROOT', 1, 6, '/bbs/user/post/BBSC00000100/list.do', '/bbs/user/post/BBSC00000100/**/*.do,/bbs/user/post/BBSC00000100/**/*.ajax', 'book', 'Y', 'Y', '2025-06-05 15:16:44', 'ADMIN', '2025-06-05 15:18:28', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000109', 'dataTable 테스트', '1111111111111111111', 'ROOT', 1, 1, '/bbs/user/post/BBSC00000100/dataTableList.do', '/bbs/user/post/BBSC00000100/**/*.do,/bbs/user/post/BBSC00000100/**/*.ajax', 'clipboard', 'Y', 'Y', '2025-06-05 17:18:03', 'USER00000051', '2025-07-21 15:41:53', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000110', '이미지 편집', '이미지 편집 테스트 진행', 'MENU00000092', 2, 2, '/template/imageModifySample/imageModify.do', '/template/imageModifySample/**/*.do,/template/imageModifySample/**/*.ajax', '', 'Y', 'Y', '2025-06-09 15:33:07', 'ADMIN', '2025-06-09 15:33:07', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000111', '일정관리 예제', '', 'MENU00000092', 2, 3, '/template/calendarSample/calendarSample.do', '/template/calendarSample/**/*.do,/template/calendarSample/**/*.ajax', '', 'Y', 'Y', '2025-06-12 09:10:51', 'ADMIN', '2025-07-08 14:11:59', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000112', '배치 관리', '배치관리 프로그램', 'MENU00000003', 2, 10, '/batch/list.do', '/batch/**/*.do,/batch/**/*.ajax', '', 'Y', 'Y', '2025-06-18 10:00:31', 'ADMIN', '2025-06-18 10:00:31', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000113', '쿼리 실행기', '쿼리 실행기', 'MENU00000003', 2, 99, '/db/exec/query.do', '/db/exec/**/*.do,/db/exec/**/*.ajax', '', 'Y', 'Y', '2025-07-07 17:14:18', 'ADMIN', '2025-07-07 17:14:18', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('MENU00000114', '엑셀 예제', '엑셀 다운로드, 업로드', 'MENU00000092', 2, 4, '/template/excelSample/list.do', '/template/excelSample/**/*.do,/template/excelSample/**/*.ajax', '', 'Y', 'Y', '2025-07-10 09:47:22', 'ADMIN', '2025-07-10 09:47:22', 'ADMIN');
INSERT INTO xitframework.tb_menu (MENU_ID, MENU_NM, MENU_DC, UPPER_MENU_ID, MENU_LEVEL, SORT_ORDR, MENU_URL, URL_PATTERN, MENU_ICON, USE_YN, VIEW_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ROOT', 'ROOT', '최상위 메뉴', null, 0, 0, null, null, null, 'Y', 'N', '2025-05-16 12:49:48', 'SYSTEM', '2025-05-16 12:49:48', 'SYSTEM');

@ -0,0 +1,6 @@
INSERT INTO xitframework.tb_role (ROLE_ID, ROLE_NM, ROLE_DC, SORT_ORDR, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ROLE_ADMIN', '관리자', '시스템 관리 권한을 가진 관리자 역할', 5, 'Y', '2025-05-15 10:09:55', 'SYSTEM', '2025-05-15 10:09:55', 'SYSTEM');
INSERT INTO xitframework.tb_role (ROLE_ID, ROLE_NM, ROLE_DC, SORT_ORDR, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ROLE_APPROVER', '업무 승인 담당자', '업무 승인 권한을 가진 담당자 역할', 4, 'Y', '2025-05-16 12:43:54', 'SYSTEM', '2025-05-16 12:43:54', 'SYSTEM');
INSERT INTO xitframework.tb_role (ROLE_ID, ROLE_NM, ROLE_DC, SORT_ORDR, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ROLE_SYSTEM', '시스템 관리자-XIT', '모든 시스템 권한을 가진 시스템 관리자 역할(XIT)', 6, 'Y', '2025-05-15 10:09:55', 'SYSTEM', '2025-07-21 13:40:23', 'SYSTEM');
INSERT INTO xitframework.tb_role (ROLE_ID, ROLE_NM, ROLE_DC, SORT_ORDR, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ROLE_USER', '일반 유저', '기본적인 시스템 사용 권한을 가진 일반 사용자 역할1', 2, 'Y', '2025-05-15 10:09:55', 'SYSTEM', '2025-05-21 16:15:28', 'SYSTEM');
INSERT INTO xitframework.tb_role (ROLE_ID, ROLE_NM, ROLE_DC, SORT_ORDR, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ROLE_VISITOR', '방문자', '시스템에 접근 가능한 기본 권한을 가진 방문자 역할', 1, 'Y', '2025-05-15 10:09:55', 'SYSTEM', '2025-07-18 15:37:21', 'SYSTEM');
INSERT INTO xitframework.tb_role (ROLE_ID, ROLE_NM, ROLE_DC, SORT_ORDR, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ROLE_WORKER', '업무 담당자', '업무 처리 권한을 가진 담당자 역할', 3, 'Y', '2025-05-16 12:43:53', 'SYSTEM', '2025-05-16 12:43:53', 'SYSTEM');

@ -0,0 +1,102 @@
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000001', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000002', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000003', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000005', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000006', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000011', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000052', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000053', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000054', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000092', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000093', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000094', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000096', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000097', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000098', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000099', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000100', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000107', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000108', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000109', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000110', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000111', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'MENU00000114', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_ADMIN', 'ROOT', '2025-07-21 15:50:33', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_APPROVER', 'MENU00000001', '2025-07-21 15:50:26', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_APPROVER', 'MENU00000002', '2025-07-21 15:50:26', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_APPROVER', 'MENU00000003', '2025-07-21 15:50:26', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_APPROVER', 'MENU00000011', '2025-07-21 15:50:26', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_APPROVER', 'MENU00000052', '2025-07-21 15:50:26', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_APPROVER', 'MENU00000053', '2025-07-21 15:50:26', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_APPROVER', 'MENU00000054', '2025-07-21 15:50:26', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_APPROVER', 'MENU00000092', '2025-07-21 15:50:26', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_APPROVER', 'MENU00000093', '2025-07-21 15:50:26', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_APPROVER', 'MENU00000094', '2025-07-21 15:50:26', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_APPROVER', 'MENU00000096', '2025-07-21 15:50:26', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_APPROVER', 'MENU00000097', '2025-07-21 15:50:26', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_APPROVER', 'MENU00000098', '2025-07-21 15:50:26', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_APPROVER', 'MENU00000099', '2025-07-21 15:50:26', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_APPROVER', 'MENU00000100', '2025-07-21 15:50:26', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_APPROVER', 'MENU00000107', '2025-07-21 15:50:26', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_APPROVER', 'MENU00000108', '2025-07-21 15:50:26', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_APPROVER', 'MENU00000110', '2025-07-21 15:50:26', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_APPROVER', 'MENU00000111', '2025-07-21 15:50:26', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_APPROVER', 'MENU00000114', '2025-07-21 15:50:26', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_APPROVER', 'ROOT', '2025-07-21 15:50:26', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000001', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000002', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000003', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000005', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000006', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000007', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000008', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000009', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000010', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000011', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000052', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000053', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000054', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000092', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000093', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000094', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000096', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000097', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000098', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000099', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000100', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000107', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000108', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000109', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000110', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000111', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000112', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000113', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'MENU00000114', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_SYSTEM', 'ROOT', '2025-07-21 15:50:45', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_USER', 'MENU00000001', '2025-07-21 15:50:14', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_USER', 'MENU00000011', '2025-07-21 15:50:14', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_USER', 'MENU00000052', '2025-07-21 15:50:14', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_USER', 'MENU00000092', '2025-07-21 15:50:14', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_USER', 'MENU00000093', '2025-07-21 15:50:14', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_USER', 'MENU00000096', '2025-07-21 15:50:14', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_USER', 'MENU00000098', '2025-07-21 15:50:14', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_USER', 'MENU00000100', '2025-07-21 15:50:14', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_USER', 'MENU00000108', '2025-07-21 15:50:14', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_USER', 'MENU00000109', '2025-07-21 15:50:14', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_USER', 'MENU00000110', '2025-07-21 15:50:14', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_USER', 'MENU00000111', '2025-07-21 15:50:14', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_USER', 'MENU00000114', '2025-07-21 15:50:14', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_USER', 'ROOT', '2025-07-21 15:50:14', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_WORKER', 'MENU00000001', '2025-07-21 15:50:19', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_WORKER', 'MENU00000011', '2025-07-21 15:50:19', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_WORKER', 'MENU00000052', '2025-07-21 15:50:19', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_WORKER', 'MENU00000092', '2025-07-21 15:50:19', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_WORKER', 'MENU00000093', '2025-07-21 15:50:19', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_WORKER', 'MENU00000096', '2025-07-21 15:50:19', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_WORKER', 'MENU00000098', '2025-07-21 15:50:19', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_WORKER', 'MENU00000100', '2025-07-21 15:50:19', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_WORKER', 'MENU00000108', '2025-07-21 15:50:19', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_WORKER', 'MENU00000110', '2025-07-21 15:50:19', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_WORKER', 'MENU00000111', '2025-07-21 15:50:19', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_WORKER', 'MENU00000114', '2025-07-21 15:50:19', 'ADMIN');
INSERT INTO xitframework.tb_role_menu (ROLE_ID, MENU_ID, REG_DTTM, RGTR) VALUES ('ROLE_WORKER', 'ROOT', '2025-07-21 15:50:19', 'ADMIN');

@ -0,0 +1,5 @@
INSERT INTO xitframework.tb_user (USER_ID, USER_ACNT, USER_NM, PASSWD, PASSWD_HINT, PASSWD_NSR, EMP_NO, GENDER, ZIP, ADDR, DADDR, AREA_NO, EML_ADDR, ORG_CD, USER_GROUP_ID, NSTT_CD, POS_NM, CRTFC_DN, USER_STATUS_CD, FXNO, TELNO, MBL_TELNO, BRDT, DEPT_CD, USE_YN, RSDNT_NO, PASSWD_INIT_YN, LOCK_YN, LOCK_CNT, LOCK_DTTM, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('ADMIN', 'admin', '시스템 관리자', 'Z6XYLOi+w3ukRN5nn08WSYg04spdJAvpCU4EOOd925g=', '관리자 계정', '관리자', '43534534', '', '14507', '경기도 부천시 원미구 계남로 81', '', null, 'admin@example.com', 'ORG001', 'GROUP_SYSTEM', 'NSTT001', '시스템 관리자', null, 'ACTIVE', null, '02-1234-5678', '010-1234-5678', '19800101', 'DEPT001', 'Y', null, 'N', 'N', 0, null, '2025-05-15 10:09:55', 'SYSTEM', '2025-07-23 12:05:08', 'ADMIN');
INSERT INTO xitframework.tb_user (USER_ID, USER_ACNT, USER_NM, PASSWD, PASSWD_HINT, PASSWD_NSR, EMP_NO, GENDER, ZIP, ADDR, DADDR, AREA_NO, EML_ADDR, ORG_CD, USER_GROUP_ID, NSTT_CD, POS_NM, CRTFC_DN, USER_STATUS_CD, FXNO, TELNO, MBL_TELNO, BRDT, DEPT_CD, USE_YN, RSDNT_NO, PASSWD_INIT_YN, LOCK_YN, LOCK_CNT, LOCK_DTTM, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('USER00000004', 'user', '일반유저', 'w44uAXy4U9aSi0Pye94jU55pwg/YMVjU/rqqYqePGbo=', '', '', '1234', null, '', '', '', null, '', '', 'GROUP_USER', 'NSTT002', '', null, 'ACTIVE', null, '', '', null, '', 'Y', null, 'N', 'N', 0, null, '2025-05-15 17:38:25', '', '2025-07-22 14:49:40', 'USER00000004');
INSERT INTO xitframework.tb_user (USER_ID, USER_ACNT, USER_NM, PASSWD, PASSWD_HINT, PASSWD_NSR, EMP_NO, GENDER, ZIP, ADDR, DADDR, AREA_NO, EML_ADDR, ORG_CD, USER_GROUP_ID, NSTT_CD, POS_NM, CRTFC_DN, USER_STATUS_CD, FXNO, TELNO, MBL_TELNO, BRDT, DEPT_CD, USE_YN, RSDNT_NO, PASSWD_INIT_YN, LOCK_YN, LOCK_CNT, LOCK_DTTM, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('USER00000005', 'worker', '업무담당자', 'Z6XYLOi+w3ukRN5nn08WSYg04spdJAvpCU4EOOd925g=', '', '', '', null, '14507', '경기도 부천시 원미구 계남로 81', '111', null, '', 'ORG002', 'GROUP_SYSTEM', 'NSTT001', '', null, 'INACTIVE', null, '', '010-4179-2158', null, '', 'Y', null, 'N', 'N', 0, null, '2025-05-19 13:59:31', 'SYSTEM', '2025-07-23 10:23:14', 'ADMIN');
INSERT INTO xitframework.tb_user (USER_ID, USER_ACNT, USER_NM, PASSWD, PASSWD_HINT, PASSWD_NSR, EMP_NO, GENDER, ZIP, ADDR, DADDR, AREA_NO, EML_ADDR, ORG_CD, USER_GROUP_ID, NSTT_CD, POS_NM, CRTFC_DN, USER_STATUS_CD, FXNO, TELNO, MBL_TELNO, BRDT, DEPT_CD, USE_YN, RSDNT_NO, PASSWD_INIT_YN, LOCK_YN, LOCK_CNT, LOCK_DTTM, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('USER00000006', 'system', '시스템 관리자', '7nB/w2O5OvlSbFgYgAA6MRLI1GEeFFSNXXMwCcu2jl8=', null, null, '23r23r32', null, '14507', '경기도 부천시 원미구 계남로 81', '34t34t', null, '', 'ORG001', 'GROUP_APPROVER', 'NSTT001', '', null, 'ACTIVE', null, '', '', null, 'DEPT002', 'Y', null, 'Y', 'N', 0, '2025-07-08 14:07:23', '2025-05-21 12:49:17', 'SYSTEM', '2025-07-17 14:40:23', 'ADMIN');
INSERT INTO xitframework.tb_user (USER_ID, USER_ACNT, USER_NM, PASSWD, PASSWD_HINT, PASSWD_NSR, EMP_NO, GENDER, ZIP, ADDR, DADDR, AREA_NO, EML_ADDR, ORG_CD, USER_GROUP_ID, NSTT_CD, POS_NM, CRTFC_DN, USER_STATUS_CD, FXNO, TELNO, MBL_TELNO, BRDT, DEPT_CD, USE_YN, RSDNT_NO, PASSWD_INIT_YN, LOCK_YN, LOCK_CNT, LOCK_DTTM, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('USER00000051', 'admin1', '관리자', 'Z6XYLOi+w3ukRN5nn08WSYg04spdJAvpCU4EOOd925g=', null, null, '', null, '14507', '경기도 부천시 원미구 계남로 81', 'ㄷㄹㅈㄷㄹㅈㄹㅈㄹㅈㄷㄹㅈㄷ', null, '', '', 'GROUP_ADMIN', 'NSTT001', '', null, 'ACTIVE', null, '', '', null, '', 'Y', null, 'N', 'N', 0, null, '2025-05-28 10:31:16', 'ADMIN', '2025-07-21 13:25:58', 'ADMIN');

File diff suppressed because it is too large Load Diff

@ -0,0 +1,205 @@
# XIT 배치 시스템 구조 및 가이드 (2025 최신)
## 1. 전체 아키텍처
```
┌──────────────────────────────────────────────┐
│ REST API (Controller) │
│ └─ BatchJobController │
├──────────────────────────────────────────────┤
│ Service Layer (비즈니스 로직) │
│ ├─ BatchJobService (Interface) │
│ └─ BatchJobServiceImpl (구현) │
├──────────────────────────────────────────────┤
│ Data Access Layer │
│ └─ BatchJobMapper (MyBatis Mapper) │
│ └─ BatchJobMapper_maria.xml (SQL) │
├──────────────────────────────────────────────┤
│ Model Layer │
│ ├─ BatchJobInfoVO (작업 정보) │
│ ├─ BatchJobExecutionVO (실행 결과) │
│ ├─ BatchJobLogVO (실행 로그) │
│ └─ BatchJobResult (실행 결과 Enum/VO) │
├──────────────────────────────────────────────┤
│ Job Layer (실제 배치 작업) │
│ └─ SampleBatchJob 등 (Quartz Job) │
├──────────────────────────────────────────────┤
│ Listener/Util Layer │
│ ├─ QuartzJobListener (실행 추적) │
│ └─ BatchJobLogUtil (로그 기록) │
├──────────────────────────────────────────────┤
│ Configuration Layer │
│ ├─ BatchJobInitializer (초기화) │
│ ├─ QuartzConfig, QuartzListenerConfig │
└──────────────────────────────────────────────┘
```
---
## 2. 주요 디렉토리/파일 구조
- **src/main/java/go/kr/project/batch/**
- **controller/**: `BatchJobController.java` (화면)
- **service/**: `BatchJobService.java` (interface), `impl/BatchJobServiceImpl.java` (구현)
- **mapper/**: `BatchJobMapper.java` (MyBatis interface)
- **model/**: `BatchJobInfoVO.java`, `BatchJobExecutionVO.java`, `BatchJobLogVO.java`, `BatchJobResult.java`
- **job/**: `SampleBatchJob.java` 등 (Quartz Job 구현)
- **config/**: `BatchJobInitializer.java`, `QuartzConfig.java`, `QuartzListenerConfig.java`
- **util/**: `BatchJobLogUtil.java`, `ServerInfoUtil.java`
- **src/main/resources/mybatis/mapper/batch/**
- `BatchJobMapper_maria.xml` (MyBatis SQL)
- **src/main/resources/**
- `application-local.yml`, `application-dev.yml`, `application-prd.yml` (환경별 설정)
- **src/main/webapp/WEB-INF/views/batch/**
- `list.jsp`, `execution.jsp`, `log.jsp`, `batchJobForm_layerPop.jsp` (화면 JSP)
---
## 3. 데이터 모델
### BatchJobInfoVO (배치 작업 정보)
- jobId (UUID)
- jobName, jobGroup, jobClass
- cronExpression, description
- status (ACTIVE, PAUSED, DELETED)
- lastExecutionId
- regDt, mdfcnDt
### BatchJobExecutionVO (실행 결과)
- executionId (UUID)
- jobName, jobGroup
- startTime, endTime
- status (STARTED, COMPLETED, FAILED, VETOED)
- exitCode (COMPLETED, FAILED, UNKNOWN)
- exitMessage
- regDt
### BatchJobLogVO (실행 로그)
- logId
- executionId
- logTime
- logLevel (INFO, WARN, ERROR)
- logMessage
- regDt
---
## 4. 주요 테이블
- **TB_BATCH_JOB_INFO**: 배치 작업 메타데이터 (cron, 상태, 설명 등)
- **TB_BATCH_JOB_EXECUTION**: 각 배치 작업의 실행 결과 (시작/종료, 상태, 메시지 등)
- **TB_BATCH_JOB_LOG**: 실행 로그 (레벨, 메시지 등)
---
## 5. 주요 컴포넌트 및 역할
### Controller
- **BatchJobController**: 배치 작업/실행/로그 관리 REST API 및 화면 제공
### Service
- **BatchJobService**: 배치 작업 등록/수정/삭제/실행/일시중지/재개/목록/실행결과/로그 등 비즈니스 로직
- **BatchJobServiceImpl**: Quartz Scheduler, Mapper 연동, 트랜잭션 처리
### Mapper
- **BatchJobMapper**: 작업/실행/로그 CRUD, 상태/마지막 실행ID 관리 (MyBatis)
- **BatchJobMapper_maria.xml**: 실제 SQL 정의
### Listener/Util
- **QuartzJobListener**: Job 실행 전후 DB 기록, 상태 갱신, 로그 기록
- **BatchJobLogUtil**: Job 실행 중 로그 기록 (INFO/WARN/ERROR)
### Job
- **SampleBatchJob 등**: 실제 배치 로직 구현, 동시 실행 방지(@DisallowConcurrentExecution)
### Config
- **BatchJobInitializer**: 애플리케이션 시작 시 DB에서 작업 목록을 읽어 Quartz에 등록
- **QuartzConfig, QuartzListenerConfig**: Quartz 및 리스너 설정
---
## 6. 주요 API (BatchJobController)
- `GET /batch/list.do` : 배치 작업 목록 화면
- `POST /batch/list.ajax` : 배치 작업 목록 데이터
- `POST /batch/register.ajax` : 배치 작업 등록
- `POST /batch/trigger.ajax` : 작업 즉시 실행
- `POST /batch/pause.ajax` : 작업 일시 중지
- `POST /batch/resume.ajax` : 작업 재개
- `POST /batch/delete.ajax` : 작업 삭제
- `GET /batch/execution.do` : 실행 결과 화면
- `POST /batch/execution.ajax` : 실행 결과 목록
- `GET /batch/log.do` : 실행 로그 화면
- `POST /batch/log.ajax` : 실행 로그 목록
---
## 7. 배치 작업 등록/실행/관리 흐름
### 배치 작업 등록
1. Controller → Service.scheduleJob()
2. Service → Quartz Scheduler.scheduleJob()
3. Service → Mapper.insertBatchJobInfo()
4. (Quartz) → Job.execute() (스케줄에 따라 실행)
### 배치 작업 실행
1. Quartz Scheduler → Job.execute()
2. Job → 비즈니스 로직 수행
3. Listener/Util → Mapper.insertBatchJobExecution() (시작)
4. Listener/Util → Mapper.updateBatchJobExecution() (완료)
5. Listener/Util → Mapper.insertBatchJobLog() (로그)
### 배치 작업 상태/삭제/일시중지/재개
- Service에서 Quartz Scheduler와 DB 상태를 동기화하며 처리
---
## 8. 설정 예시 (application-*.yml)
```yaml
spring:
quartz:
job-store-type: jdbc
jdbc:
initialize-schema: never
properties:
org.quartz.scheduler.instanceName: XitClusteredScheduler
org.quartz.scheduler.instanceId: AUTO
org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.isClustered: true
org.quartz.jobStore.tablePrefix: QRTZ_
org.quartz.threadPool.threadCount: 10
mybatis:
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/**/*_${Globals.DbType}.xml
```
- DB, 로그, 파일업로드 등 환경별로 `application-local.yml`, `application-dev.yml`, `application-prd.yml`에서 관리
---
## 9. 화면(JSP) 구성
- **list.jsp**: 배치 작업 목록 및 관리
- **execution.jsp**: 작업 실행 결과 조회
- **log.jsp**: 실행 로그 상세 조회
- **batchJobForm_layerPop.jsp**: 작업 등록/수정 팝업
---
## 10. 확장/운영 팁
- 신규 배치 작업은 `job/` 패키지에 Job 구현체 추가 후 등록
- Cron 표현식, 상태 등은 DB/화면에서 동적으로 관리
- 실행 결과/로그는 화면 및 API로 실시간 모니터링 가능
- 클러스터 환경 지원(Quartz + JDBC JobStore)
- 동시 실행 방지, 예외처리, 실행 로그 추적 등 안정성 확보
---
본 시스템은 Spring Boot + Quartz + MyBatis 기반의 표준적이면서도 확장성/안정성이 뛰어난 배치 관리 시스템입니다.
각 계층별 상세 코드/쿼리/설정은 소스 내 각 파일을 참고하세요.
---
필요시, 각 계층별 상세 예시/코드/쿼리/설정 추가 가능합니다.
추가 요청 시 구체적으로 말씀해 주세요!

@ -0,0 +1,135 @@
# ZIP 파일 처리 배치 작업 구현
## 개요
특정 디렉토리에 *.zip 파일이 들어오면 압축을 풀어서 특정 디렉토리로 이동시키고, 원본 *.zip 파일은 원본 디렉토리로 이동시키는 배치 작업을 구현했습니다. 이미지 파일 검증 기능과 정상/실패에 대한 로그를 테이블에 정확히 남기는 기능이 포함되어 있습니다.
## 구현된 기능
### 1. 데이터베이스 테이블
- **tb_batch_zip_file_process_log**: ZIP 파일 처리 메인 로그 테이블
- **tb_batch_zip_file_detail_log**: ZIP 파일 내 개별 파일 처리 상세 로그 테이블
- **seq_batch_zip_file_process_log_id**: 메인 로그 ID 시퀀스
- **seq_batch_zip_file_detail_log_id**: 상세 로그 ID 시퀀스
### 2. 주요 클래스
#### 모델 클래스
- `ZipFileProcessLogVO`: ZIP 파일 처리 로그 VO
- `ZipFileDetailLogVO`: ZIP 파일 처리 상세 로그 VO
#### 매퍼 클래스
- `ZipFileProcessLogMapper`: ZIP 파일 처리 로그 매퍼
- `ZipFileDetailLogMapper`: ZIP 파일 처리 상세 로그 매퍼
#### 서비스 클래스
- `ZipFileProcessLogService`: ZIP 파일 처리 로그 서비스
- `ZipFileDetailLogService`: ZIP 파일 처리 상세 로그 서비스
#### 유틸리티 클래스
- `ImageValidationUtil`: 이미지 파일 검증 유틸리티
#### 배치 작업 클래스
- `ZipFileProcessBatchJob`: ZIP 파일 처리 배치 작업 메인 클래스
## 주요 기능
### 1. ZIP 파일 처리 흐름
1. 소스 디렉토리에서 *.zip 파일 검색
2. ZIP 파일 압축 해제
3. 개별 파일 처리 및 검증
4. 이미지 파일 손상 여부 확인
5. 처리 결과 로그 저장
6. ZIP 파일을 아카이브 디렉토리로 이동
### 2. 이미지 파일 검증
- 확장자 기반 이미지 파일 판별
- MIME 타입 기반 이미지 파일 검증
- ImageIO를 이용한 이미지 손상 여부 확인
- 지원 이미지 형식: jpg, jpeg, png, gif, bmp, tiff, tif, webp
### 3. 로그 기능
- ZIP 파일별 처리 로그 (처리 상태, 파일 수, 성공/실패 통계)
- 개별 파일별 상세 로그 (파일 정보, 이미지 여부, 손상 여부)
- 배치 작업 실행 로그 (BatchJobLogUtil 활용)
## 설정
### application.yml 설정
```yaml
batch:
zip:
source:
directory: ${user.home}/batch/zip/source # ZIP 파일 소스 디렉토리
extract:
directory: ${user.home}/batch/zip/extract # ZIP 파일 압축 해제 디렉토리
archive:
directory: ${user.home}/batch/zip/archive # ZIP 파일 아카이브 디렉토리
```
## 디렉토리 구조
```
${user.home}/batch/zip/
├── source/ # ZIP 파일이 들어오는 디렉토리
├── extract/ # ZIP 파일 압축 해제 디렉토리
└── archive/ # 처리 완료된 ZIP 파일 보관 디렉토리
```
## 사용 방법
### 1. 데이터베이스 테이블 생성
```sql
-- 시퀀스 생성
source DB-DDL/maria/ddl/xitframework/seq_batch_zip_file_process_log_id.sql
source DB-DDL/maria/ddl/xitframework/seq_batch_zip_file_detail_log_id.sql
-- 테이블 생성
source DB-DDL/maria/ddl/xitframework/tb_batch_zip_file_process_log.sql
source DB-DDL/maria/ddl/xitframework/tb_batch_zip_file_detail_log.sql
```
### 2. 배치 작업 등록
Quartz 스케줄러를 통해 `ZipFileProcessBatchJob` 클래스를 등록하여 주기적으로 실행
### 3. ZIP 파일 처리
1. `${user.home}/batch/zip/source/` 디렉토리에 ZIP 파일 업로드
2. 배치 작업이 실행되면 자동으로 처리
3. 처리 결과는 데이터베이스 로그 테이블에서 확인
## 로그 확인
### 메인 처리 로그 조회
```sql
SELECT * FROM tb_batch_zip_file_process_log
ORDER BY start_time DESC;
```
### 상세 처리 로그 조회
```sql
SELECT * FROM tb_batch_zip_file_detail_log
WHERE log_id = 'ZPFL00000001'
ORDER BY process_time ASC;
```
### 이미지 파일 처리 결과 조회
```sql
SELECT
file_name,
is_image,
is_corrupted,
process_status,
error_message
FROM tb_batch_zip_file_detail_log
WHERE log_id = 'ZPFL00000001'
AND is_image = 'Y';
```
## 에러 처리
- ZIP 파일 처리 중 오류 발생 시 로그 테이블에 오류 정보 저장
- 개별 파일 처리 실패 시에도 다른 파일 처리 계속 진행
- 손상된 이미지 파일 발견 시 ERROR 상태로 로그 저장
## 주의사항
1. 디렉토리 권한 확인 필요
2. 대용량 ZIP 파일 처리 시 메모리 사용량 모니터링 필요
3. 동일한 파일명의 ZIP 파일 처리 시 타임스탬프 추가하여 중복 방지
4. 배치 작업은 `@DisallowConcurrentExecution` 어노테이션으로 동시 실행 방지

@ -0,0 +1,186 @@
/**
* XIT Framework Gradle
*
* :
* - Spring Boot: 2.7.18 ( )
* - Java: 1.8 ( )
* - : 4.3.0
*/
plugins {
// -
id 'org.springframework.boot' version '2.7.18'
// -
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
// -
id 'java'
// WAR -
id 'war'
}
//
group = 'go.kr.project'
version = '0.0.1-SNAPSHOT'
// ( )
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
// Java
//tasks.withType(JavaCompile) {
// options.encoding = 'UTF-8'
// options.compilerArgs += [
// '-Xlint:deprecation',
// '-Xlint:unchecked'
// ]
//}
//
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
//
repositories {
mavenCentral() //
maven { url 'https://maven.egovframe.go.kr/maven/' } //
}
//
ext {
//
tomcatVersion = '9.0.78' // 9 (Servlet 3.1 )
//
tilesVersion = '3.0.8' //
mybatisVersion = '2.3.1' //
commonsTextVersion = '1.10.0' //
egovFrameVersion = '4.3.0' //
}
dependencies {
// ===== =====
// - MVC, REST,
implementation 'org.springframework.boot:spring-boot-starter-web'
// - Bean Validation API
implementation 'org.springframework.boot:spring-boot-starter-validation'
// AOP -
implementation 'org.springframework.boot:spring-boot-starter-aop'
// JDBC - JDBC (HikariCP)
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
//implementation 'org.springframework.boot:spring-boot-starter-data-jpa' /* 실제 사용 X, intellij plugin 사용을 위해 설정 */
// ===== =====
// -
implementation("org.egovframe.rte:org.egovframe.rte.fdl.cmmn:${egovFrameVersion}") {
exclude group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl' /* 보안이슈 대응 후 쿼리로그 문제 발생, SLF4J 충돌 발생 */
}
// MVC - MVC
implementation("org.egovframe.rte:org.egovframe.rte.ptl.mvc:${egovFrameVersion}") {
exclude group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl' /* 보안이슈 대응 후 쿼리로그 문제 발생, SLF4J 충돌 발생 */
}
// ===== =====
// Logback -
implementation 'ch.qos.logback:logback-classic'
implementation 'ch.qos.logback:logback-core'
// SLF4J -
implementation 'org.slf4j:slf4j-api'
// ===== 릿 & JSP =====
// JSTL - JSP
implementation 'javax.servlet:jstl'
// ===== =====
// 9 (Servlet 3.1 )
implementation "org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}"
implementation "org.apache.tomcat.embed:tomcat-embed-el:${tomcatVersion}"
implementation "org.apache.tomcat.embed:tomcat-embed-jasper:${tomcatVersion}"
// ===== =====
// - 릿 (JSP )
implementation "org.apache.tiles:tiles-jsp:${tilesVersion}"
implementation "org.apache.tiles:tiles-core:${tilesVersion}"
implementation "org.apache.tiles:tiles-api:${tilesVersion}"
implementation "org.apache.tiles:tiles-servlet:${tilesVersion}"
implementation "org.apache.tiles:tiles-el:${tilesVersion}"
// ===== =====
// MyBatis - SQL
implementation "org.mybatis.spring.boot:mybatis-spring-boot-starter:${mybatisVersion}"
// MariaDB JDBC - MariaDB
implementation 'org.mariadb.jdbc:mariadb-java-client'
// HikariCP - JDBC (spring-boot-starter-jdbc )
// ===== =====
// Apache Commons Text -
implementation "org.apache.commons:commons-text:${commonsTextVersion}"
// ===== EXCEL =====
implementation 'org.apache.poi:poi:5.3.0'
implementation 'org.apache.poi:poi-ooxml:5.3.0'
// ===== Swagger UI =====
implementation 'org.springdoc:springdoc-openapi-ui:1.7.0'
implementation 'org.springdoc:springdoc-openapi-webmvc-core:1.7.0'
// ===== Quartz Scheduler =====
implementation 'org.springframework.boot:spring-boot-starter-quartz'
// ===== sqlPaser =====
implementation 'com.github.jsqlparser:jsqlparser:4.5'
// ===== Mail =====
implementation 'org.springframework.boot:spring-boot-starter-mail'
// ===== =====
// Lombok - (Getter, Setter, Builder )
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
// - ,
developmentOnly 'org.springframework.boot:spring-boot-devtools'
// ===== =====
// - JUnit, Mockito
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// ===== =====
// 릿 API -
providedCompile "org.apache.tomcat:tomcat-servlet-api:${tomcatVersion}"
// -
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}
// ===== =====
// JUnit (JUnit 5 )
tasks.named('test') {
useJUnitPlatform()
}
// ===== WAR =====
// WAR
war {
archiveFileName = 'xit-framework.war'
}
// ===== bootWar =====
// bootWar
bootWar {
archiveFileName = 'xit-framework-boot.war'
}
// war ,
// ./build/exploded/xit-framework/
tasks.register('exploded', Copy) {
dependsOn 'war'
from zipTree(tasks.war.archiveFile)
into layout.buildDirectory.dir("exploded/${project.name}")
doFirst {
layout.buildDirectory.dir("exploded/${project.name}").get().asFile.deleteDir()
}
}

@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

251
gradlew vendored

@ -0,0 +1,251 @@
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
#
##############################################################################
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
warn () {
echo "$*"
} >&2
die () {
echo
echo "$*"
echo
exit 1
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

94
gradlew.bat vendored

@ -0,0 +1,94 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

@ -0,0 +1,31 @@
#-------------------------------------------------------------------------------#
# Qodana analysis is configured by qodana.yaml file #
# https://www.jetbrains.com/help/qodana/qodana-yaml.html #
#-------------------------------------------------------------------------------#
version: "1.0"
#Specify inspection profile for code analysis
profile:
name: qodana.starter
#Enable inspections
#include:
# - name: <SomeEnabledInspectionId>
#Disable inspections
#exclude:
# - name: <SomeDisabledInspectionId>
# paths:
# - <path/where/not/run/inspection>
projectJDK: "8" #(Applied in CI/CD pipeline)
#Execute shell command before Qodana execution (Applied in CI/CD pipeline)
#bootstrap: sh ./prepare-qodana.sh
#Install IDE plugins before Qodana execution (Applied in CI/CD pipeline)
#plugins:
# - id: <plugin.id> #(plugin id can be found at https://plugins.jetbrains.com)
#Specify Qodana linter for analysis (Applied in CI/CD pipeline)
linter: jetbrains/qodana-jvm:2025.1

@ -0,0 +1 @@
rootProject.name = 'xit-framework'

@ -0,0 +1,66 @@
package egovframework.config;
import egovframework.exception.EgovAopExceptionTransfer;
import egovframework.exception.EgovDefaultExcepHndlr;
import egovframework.exception.EgovDefaultOthersExcepHndlr;
import org.egovframe.rte.fdl.cmmn.aspect.ExceptionTransfer;
import org.egovframe.rte.fdl.cmmn.exception.handler.ExceptionHandler;
import org.egovframe.rte.fdl.cmmn.exception.manager.DefaultExceptionHandleManager;
import org.egovframe.rte.fdl.cmmn.exception.manager.ExceptionHandlerService;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.util.AntPathMatcher;
@Configuration
@EnableAspectJAutoProxy
public class EgovConfigAspect {
@Bean
public EgovDefaultExcepHndlr egovHandler() {
return new EgovDefaultExcepHndlr();
}
@Bean
public EgovDefaultOthersExcepHndlr otherHandler() {
return new EgovDefaultOthersExcepHndlr();
}
@Bean
public DefaultExceptionHandleManager defaultExceptionHandleManager(AntPathMatcher antPathMatcher, EgovDefaultExcepHndlr egovHandler) {
DefaultExceptionHandleManager defaultExceptionHandleManager = new DefaultExceptionHandleManager();
defaultExceptionHandleManager.setReqExpMatcher(antPathMatcher);
defaultExceptionHandleManager.setPatterns(new String[]{"**service.impl.*"});
defaultExceptionHandleManager.setHandlers(new ExceptionHandler[]{egovHandler});
return defaultExceptionHandleManager;
}
@Bean
public DefaultExceptionHandleManager otherExceptionHandleManager(AntPathMatcher antPathMatcher, EgovDefaultOthersExcepHndlr othersExcepHndlr) {
DefaultExceptionHandleManager defaultExceptionHandleManager = new DefaultExceptionHandleManager();
defaultExceptionHandleManager.setReqExpMatcher(antPathMatcher);
defaultExceptionHandleManager.setPatterns(new String[]{"**service.impl.*"});
defaultExceptionHandleManager.setHandlers(new ExceptionHandler[]{othersExcepHndlr});
return defaultExceptionHandleManager;
}
@Bean
public ExceptionTransfer exceptionTransfer(
@Qualifier("defaultExceptionHandleManager") DefaultExceptionHandleManager defaultExceptionHandleManager,
@Qualifier("otherExceptionHandleManager") DefaultExceptionHandleManager otherExceptionHandleManager) {
ExceptionTransfer exceptionTransfer = new ExceptionTransfer();
exceptionTransfer.setExceptionHandlerService(new ExceptionHandlerService[] {
defaultExceptionHandleManager, otherExceptionHandleManager
});
return exceptionTransfer;
}
@Bean
public EgovAopExceptionTransfer aopExceptionTransfer(ExceptionTransfer exceptionTransfer) {
EgovAopExceptionTransfer egovAopExceptionTransfer = new EgovAopExceptionTransfer();
egovAopExceptionTransfer.setExceptionTransfer(exceptionTransfer);
return egovAopExceptionTransfer;
}
}

@ -0,0 +1,60 @@
package egovframework.config;
import org.egovframe.rte.fdl.cmmn.trace.LeaveaTrace;
import org.egovframe.rte.fdl.cmmn.trace.handler.DefaultTraceHandler;
import org.egovframe.rte.fdl.cmmn.trace.handler.TraceHandler;
import org.egovframe.rte.fdl.cmmn.trace.manager.DefaultTraceHandleManager;
import org.egovframe.rte.fdl.cmmn.trace.manager.TraceHandlerService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.MessageSourceAccessor;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.util.AntPathMatcher;
@Configuration
public class EgovConfigCommon {
@Bean
public AntPathMatcher antPathMatcher() {
return new AntPathMatcher();
}
@Bean
public DefaultTraceHandler defaultTraceHandler() {
return new DefaultTraceHandler();
}
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource = new ReloadableResourceBundleMessageSource();
reloadableResourceBundleMessageSource.setBasenames(
"classpath:/egovframework/message/message-common",
"classpath:/org/egovframe/rte/fdl/idgnr/messages/idgnr",
"classpath:/org/egovframe/rte/fdl/property/messages/properties");
reloadableResourceBundleMessageSource.setDefaultEncoding("UTF-8");
reloadableResourceBundleMessageSource.setCacheSeconds(60);
return reloadableResourceBundleMessageSource;
}
@Bean
public MessageSourceAccessor messageSourceAccessor() {
return new MessageSourceAccessor(this.messageSource());
}
@Bean
public DefaultTraceHandleManager traceHandlerService() {
DefaultTraceHandleManager defaultTraceHandleManager = new DefaultTraceHandleManager();
defaultTraceHandleManager.setReqExpMatcher(antPathMatcher());
defaultTraceHandleManager.setPatterns(new String[]{"*"});
defaultTraceHandleManager.setHandlers(new TraceHandler[]{defaultTraceHandler()});
return defaultTraceHandleManager;
}
@Bean
public LeaveaTrace leaveaTrace() {
LeaveaTrace leaveaTrace = new LeaveaTrace();
leaveaTrace.setTraceHandlerServices(new TraceHandlerService[]{traceHandlerService()});
return leaveaTrace;
}
}

@ -0,0 +1,42 @@
package egovframework.config;
import egovframework.configProperties.InterceptorProperties;
import egovframework.interceptor.AuthInterceptor;
import go.kr.project.login.service.LoginService;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
*
*/
@Configuration
@RequiredArgsConstructor
public class EgovConfigInterceptor implements WebMvcConfigurer {
private final LoginService loginService;
private final InterceptorProperties interceptorProperties;
/**
*
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor())
.addPathPatterns("/**") // 모든 경로에 적용
.excludePathPatterns(interceptorProperties.getInterceptorExclude()); // 접근 제어 예외 URL 패턴 제외
}
/**
*
* @return AuthInterceptor
*/
@Bean
public AuthInterceptor authInterceptor() {
return new AuthInterceptor(loginService);
}
}

@ -0,0 +1,61 @@
package egovframework.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import java.util.Properties;
/**
*
* JavaMailSender .
*/
@Configuration
public class EgovConfigMail {
@Value("${spring.mail.host}")
private String host;
@Value("${spring.mail.port}")
private int port;
@Value("${spring.mail.username}")
private String username;
@Value("${spring.mail.password}")
private String password;
@Value("${spring.mail.properties.mail.smtp.auth}")
private boolean smtpAuth;
@Value("${spring.mail.properties.mail.smtp.starttls.enable}")
private boolean starttlsEnable;
@Value("${spring.mail.properties.mail.debug}")
private boolean debug;
/**
* JavaMailSender
* application-local.yml .
* @return JavaMailSender
*/
@Bean
public JavaMailSender javaMailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost(host);
mailSender.setPort(port);
mailSender.setUsername(username);
mailSender.setPassword(password);
Properties props = mailSender.getJavaMailProperties();
props.put("mail.smtp.auth", smtpAuth);
props.put("mail.smtp.starttls.enable", starttlsEnable);
props.put("mail.debug", debug);
return mailSender;
}
}

@ -0,0 +1,95 @@
package egovframework.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.Advisor;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.interceptor.*;
import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.util.Collections;
import java.util.HashMap;
/**
* @ClassName : EgovConfigAppTransaction.java
* @Description : Transaction
*
* @author :
* @since : 2021. 7. 20
* @version : 1.0
*
* <pre>
* << (Modification Information) >>
*
*
* ------------- ------------ ---------------------
* 2021. 7. 20
* </pre>
*
*/
@Slf4j
@Configuration
public class EgovConfigTransaction {
@Autowired
DataSource dataSource;
@PostConstruct
public void init() {
log.info("Datasource type: {}", dataSource.getClass().getName());
}
@Bean
public DataSourceTransactionManager txManager() {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
// -------------------------------------------------------------
// TransactionAdvice 설정
// -------------------------------------------------------------
@Bean
public TransactionInterceptor txAdvice(DataSourceTransactionManager txManager) {
TransactionInterceptor txAdvice = new TransactionInterceptor();
txAdvice.setTransactionManager(txManager);
txAdvice.setTransactionAttributeSource(getNameMatchTransactionAttributeSource());
return txAdvice;
}
private NameMatchTransactionAttributeSource getNameMatchTransactionAttributeSource() {
NameMatchTransactionAttributeSource txAttributeSource = new NameMatchTransactionAttributeSource();
txAttributeSource.setNameMap(getRuleBasedTxAttributeMap());
return txAttributeSource;
}
private HashMap<String, TransactionAttribute> getRuleBasedTxAttributeMap() {
HashMap<String, TransactionAttribute> txMethods = new HashMap<String, TransactionAttribute>();
RuleBasedTransactionAttribute txAttribute = new RuleBasedTransactionAttribute();
txAttribute.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
txAttribute.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
txMethods.put("*", txAttribute);
return txMethods;
}
// -------------------------------------------------------------
// TransactionAdvisor 설정
// -------------------------------------------------------------
@Bean
public Advisor txAdvisor(DataSourceTransactionManager txManager) {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression(
"execution(* go.kr.project..impl.*Impl.*(..)) or execution(* egovframework.com..*Impl.*(..))");
return new DefaultPointcutAdvisor(pointcut, txAdvice(txManager));
}
}

@ -0,0 +1,20 @@
package egovframework.config;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.Validator;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
@Configuration
public class EgovConfigValidation {
@Bean
public Validator getValidator(@Qualifier("messageSource") MessageSource messageSource) {
LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
localValidatorFactoryBean.setValidationMessageSource(messageSource);
return localValidatorFactoryBean;
}
}

@ -0,0 +1,98 @@
package egovframework.config;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.http.CacheControl;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.UrlBasedViewResolver;
import org.springframework.web.servlet.view.tiles3.TilesConfigurer;
import org.springframework.web.servlet.view.tiles3.TilesView;
import java.util.List;
@Setter
@Configuration
@RequiredArgsConstructor
@Import({
EgovConfigAspect.class,
EgovConfigCommon.class,
EgovConfigTransaction.class,
EgovConfigValidation.class,
EgovConfigInterceptor.class,
EgovErrorConfig.class
})
public class EgovConfigWeb implements WebMvcConfigurer, ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/plugins/**")
.addResourceLocations("/resources/plugins/")
.setCacheControl(CacheControl.noCache().mustRevalidate());
registry.addResourceHandler("/css/**")
.addResourceLocations("/resources/css/")
.setCacheControl(CacheControl.noCache().mustRevalidate());
registry.addResourceHandler("/img/**")
.addResourceLocations("/resources/img/")
.setCacheControl(CacheControl.noCache().mustRevalidate());
registry.addResourceHandler("/js/**")
.addResourceLocations("/resources/js/")
.setCacheControl(CacheControl.noCache().mustRevalidate());
registry.addResourceHandler("/xit/**")
.addResourceLocations("/resources/xit/")
.setCacheControl(CacheControl.noCache().mustRevalidate());
registry.addResourceHandler("/font/**")
.addResourceLocations("/resources/font/")
.setCacheControl(CacheControl.noCache().mustRevalidate());
}
/**
* Exception handling is now done using @ControllerAdvice in EgovExceptionAdvice class.
* The SimpleMappingExceptionResolver approach has been replaced with a more modern approach.
*
* @see egovframework.exception.EgovExceptionAdvice
*/
@Override
public void configureHandlerExceptionResolvers(@Nullable List< HandlerExceptionResolver> resolvers) {
// Exception handling is now done using @ControllerAdvice
}
@Bean
public UrlBasedViewResolver viewResolver() {
UrlBasedViewResolver tilesViewResolver = new UrlBasedViewResolver();
tilesViewResolver.setViewClass(TilesView.class);
tilesViewResolver.setOrder(1);
return tilesViewResolver;
}
@Bean
public TilesConfigurer tilesConfigurer() {
TilesConfigurer tilesConfigurer = new TilesConfigurer();
tilesConfigurer.setDefinitions(
"/WEB-INF/tiles/tiles.xml"
);
tilesConfigurer.setCheckRefresh(true);
return tilesConfigurer;
}
@Bean
public InternalResourceViewResolver internalResourceViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setOrder(2);
return resolver;
}
}

@ -0,0 +1,46 @@
package egovframework.config;
import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.ErrorPageRegistrar;
import org.springframework.boot.web.server.ErrorPageRegistry;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
/**
*
* 404, 500 HTTP .
*/
@Configuration
public class EgovErrorConfig {
/**
* ErrorPageRegistrar .
*
* @return ErrorPageRegistrar
*/
@Bean
public ErrorPageRegistrar errorPageRegistrar() {
return new ErrorPageRegistrar() {
@Override
public void registerErrorPages(ErrorPageRegistry registry) {
// 404 에러 페이지 설정
ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/error/404");
// 500 에러 페이지 설정
ErrorPage error500Page = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error/500");
// 기타 서버 에러 페이지 설정
ErrorPage error502Page = new ErrorPage(HttpStatus.BAD_GATEWAY, "/error/500");
ErrorPage error503Page = new ErrorPage(HttpStatus.SERVICE_UNAVAILABLE, "/error/500");
ErrorPage error504Page = new ErrorPage(HttpStatus.GATEWAY_TIMEOUT, "/error/500");
// 예외 처리를 위한 에러 페이지 설정
ErrorPage runtimeExceptionPage = new ErrorPage(RuntimeException.class, "/error/500");
// 에러 페이지 등록
registry.addErrorPages(error404Page, error500Page, error502Page, error503Page, error504Page, runtimeExceptionPage);
}
};
}
}

@ -0,0 +1,34 @@
package egovframework.config;
import com.fasterxml.jackson.core.SerializableString;
import com.fasterxml.jackson.core.io.CharacterEscapes;
import com.fasterxml.jackson.core.io.SerializedString;
import org.apache.commons.text.StringEscapeUtils;
public class HtmlCharacterEscapes extends CharacterEscapes {
private static final long serialVersionUID = -6353236148390563705L;
private final int[] asciiEscapes;
public HtmlCharacterEscapes() {
this.asciiEscapes = CharacterEscapes.standardAsciiEscapesForJSON();
this.asciiEscapes['<'] = CharacterEscapes.ESCAPE_CUSTOM;
this.asciiEscapes['>'] = CharacterEscapes.ESCAPE_CUSTOM;
this.asciiEscapes['\"'] = CharacterEscapes.ESCAPE_CUSTOM;
this.asciiEscapes['('] = CharacterEscapes.ESCAPE_CUSTOM;
this.asciiEscapes[')'] = CharacterEscapes.ESCAPE_CUSTOM;
this.asciiEscapes['#'] = CharacterEscapes.ESCAPE_CUSTOM;
this.asciiEscapes['\''] = CharacterEscapes.ESCAPE_CUSTOM;
}
@Override
public int[] getEscapeCodesForAscii() {
return asciiEscapes;
}
@Override
public SerializableString getEscapeSequence(int ch) {
return new SerializedString(StringEscapeUtils.escapeHtml4(Character.toString((char) ch)));
}
}

@ -0,0 +1,27 @@
package egovframework.config;
import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
/**
* MyBatis Configuration
*
* This class configures MyBatis by adding custom interceptors.
*/
@Configuration
@Profile({"local", "dev"}) // local과 dev 프로파일에서만 활성화
public class MyBatisConfig {
/**
* Customizes the MyBatis configuration by adding the query interceptor.
*
* @param interceptor The MyBatis query interceptor
* @return A ConfigurationCustomizer that adds the interceptor to MyBatis
*/
@Bean
public ConfigurationCustomizer mybatisConfigurationCustomizer(MyBatisQueryInterceptor interceptor) {
return configuration -> configuration.addInterceptor(interceptor);
}
}

@ -0,0 +1,449 @@
package egovframework.config;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.delete.Delete;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.select.Join;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.SelectItem;
import net.sf.jsqlparser.statement.update.Update;
import net.sf.jsqlparser.statement.update.UpdateSet;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* MyBatis Query Interceptor
*
* This interceptor logs detailed information about SQL queries executed by MyBatis,
* including the original SQL, actual SQL with parameters, and parameter values.
*/
@Component
@Profile({"local", "dev"}) // local과 dev 프로파일에서만 활성화
@Intercepts({
@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
})
@Slf4j
public class MyBatisQueryInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
MappedStatement ms = (MappedStatement) invocation.getArgs()[0];
Object parameter = invocation.getArgs()[1];
BoundSql boundSql = ms.getBoundSql(parameter);
String sql = boundSql.getSql();
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
// 실제 실행될 쿼리 추출 (MyBatis 내부에서 처리된 결과)
String actualSql = getActualSql(boundSql, parameter);
// 파라미터 정보 추출
Map<String, Object> paramMap = extractDetailedParameters(parameter, parameterMappings);
logDetailedQueryInfo(ms.getId(), sql, actualSql, paramMap);
// 원래 쿼리 실행
long startTime = System.currentTimeMillis();
Object result = invocation.proceed();
long endTime = System.currentTimeMillis();
// 쿼리 실행 시간 로깅
log.debug("Query execution time: {} ms", (endTime - startTime));
return result;
}
private String getActualSql(BoundSql boundSql, Object parameter) {
String sql = boundSql.getSql();
if (parameter == null) {
return sql;
}
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
if (parameterMappings.isEmpty()) {
return sql;
}
// SQL 복사본 생성
String actualSql = sql;
try {
// 파라미터 값 추출
for (ParameterMapping parameterMapping : parameterMappings) {
String propertyName = parameterMapping.getProperty();
Object value = null;
if (boundSql.hasAdditionalParameter(propertyName)) {
value = boundSql.getAdditionalParameter(propertyName);
} else if (parameter instanceof Map) {
value = ((Map<?, ?>) parameter).get(propertyName);
} else if (parameter instanceof String) {
// String 타입 파라미터 처리
value = parameter;
} else if (parameter instanceof Number) {
// Number 타입 파라미터 처리 (Integer, Long, Double 등)
value = parameter;
} else if (parameter instanceof Boolean) {
// Boolean 타입 파라미터 처리
value = parameter;
} else {
value = getParameterValue(parameter, propertyName);
}
String valueStr = value != null ? value.toString() : "null";
// SQL 인젝션 방지를 위한 문자열 이스케이프 처리
valueStr = valueStr.replace("'", "''");
// 다양한 데이터 타입에 대한 처리
if (value instanceof String) {
// 문자열 타입은 따옴표로 감싸기
actualSql = actualSql.replaceFirst("\\?", "'" + valueStr + "'");
} else if (value instanceof Number) {
// 숫자 타입 (Integer, Long, Double 등)은 그대로 사용
actualSql = actualSql.replaceFirst("\\?", valueStr);
} else if (value instanceof Boolean) {
// Boolean 타입은 그대로 사용
actualSql = actualSql.replaceFirst("\\?", valueStr);
} else if (value instanceof java.util.Date) {
// 표준 타임스탬프 포맷 사용
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
actualSql = actualSql.replaceFirst("\\?", "'" + sdf.format(value) + "'");
} else if (value instanceof java.time.LocalDateTime) {
// Java 8 LocalDateTime 처리
actualSql = actualSql.replaceFirst("\\?", "'" + value.toString().replace('T', ' ') + "'");
} else {
// 기타 타입은 null이 아닌 경우 따옴표로 감싸기
actualSql = actualSql.replaceFirst("\\?", value != null ? "'" + valueStr + "'" : valueStr);
}
}
} catch (Exception e) {
log.warn("Failed to get actual SQL with parameters", e);
return sql;
}
return actualSql;
}
private Object getParameterValue(Object parameter, String propertyName) {
try {
// 현재 클래스부터 상위 클래스까지 순회하면서 필드 찾기
Class<?> currentClass = parameter.getClass();
while (currentClass != null) {
try {
Field field = currentClass.getDeclaredField(propertyName);
field.setAccessible(true);
return field.get(parameter);
} catch (NoSuchFieldException e) {
// 현재 클래스에서 필드를 찾지 못하면 상위 클래스로 이동
currentClass = currentClass.getSuperclass();
}
}
throw new NoSuchFieldException(propertyName);
} catch (Exception e) {
log.warn("필드 값 추출 실패: {} ({})", propertyName, e.getMessage());
return null;
}
}
private Map<String, Object> extractDetailedParameters(Object parameter, List<ParameterMapping> parameterMappings) {
Map<String, Object> paramMap = new HashMap<>();
if (parameter == null) {
return paramMap;
}
if (parameter instanceof Map) {
paramMap.putAll((Map<String, Object>) parameter);
} else {
// 객체의 필드 정보도 추출
paramMap.put("param", parameter);
extractObjectFields(parameter, paramMap);
}
return paramMap;
}
private void extractObjectFields(Object obj, Map<String, Object> paramMap) {
try {
Class<?> currentClass = obj.getClass();
while (currentClass != null) {
Field[] fields = currentClass.getDeclaredFields();
for (Field field : fields) {
try {
// String 타입의 객체는 건너뛰기
if (obj instanceof String) {
continue;
}
// 시스템 클래스의 필드는 건너뛰기
if (field.getDeclaringClass().getName().startsWith("java.")) {
continue;
}
field.setAccessible(true);
Object value = field.get(obj);
paramMap.put(field.getName(), value);
} catch (IllegalAccessException | SecurityException e) {
// 개별 필드 접근 실패는 무시하고 계속 진행
log.debug("필드 접근 실패: {} ({})", field.getName(), e.getMessage());
}
}
currentClass = currentClass.getSuperclass();
}
} catch (Exception e) {
log.warn("객체 필드 추출 실패", e);
}
}
private void logDetailedQueryInfo(String mapperMethod, String originalSql, String actualSql, Map<String, Object> paramMap) {
StringBuilder logMessage = new StringBuilder();
logMessage.append("\n");
logMessage.append("┌─────────────── MyBatis Query Details ───────────────\n");
logMessage.append("│ Mapper Method: ").append(mapperMethod).append("\n");
logMessage.append("│ Parameters: ").append(paramMap).append("\n");
// 원본 SQL 포맷팅, prd, 운영
//logMessage.append("│ Original SQL:\n");
//formatSqlInLog(logMessage, originalSql);
// 실제 실행 SQL 포맷팅, local, dev 로컬 개발
logMessage.append("│ Actual SQL:\n");
formatSqlInLog(logMessage, actualSql);
logMessage.append("└──────────────────────────────────────────────────────");
log.info(logMessage.toString());
}
private void formatSqlInLog(StringBuilder logMessage, String sql) {
// SQL 키워드 하이라이트 및 들여쓰기
String formattedSql = formatSql(sql);
String[] lines = formattedSql.split("\n");
for (String line : lines) {
//logMessage.append("│ ").append(line).append("\n");
logMessage.append(line).append("\n");
}
}
private String formatSql(String sql) {
try {
// SQL 파서를 사용한 포맷팅
Statement statement = CCJSqlParserUtil.parse(sql);
return formatStatement(statement, 0);
} catch (JSQLParserException e) {
log.debug("SQL 파싱 실패. 기본 포맷팅으로 대체합니다.", e);
log.info("SQL 파싱 실패. 기본 포맷팅으로 대체합니다.");
// 파싱 실패 시 기본 포맷팅 사용
return sql.replaceAll("\\s+", " ").trim();
}
}
private String formatStatement(Statement statement, int indent) {
StringBuilder result = new StringBuilder();
String indentation = String.join("", java.util.Collections.nCopies(indent, " "));
if (statement instanceof Select) {
formatSelect((Select) statement, result, indent);
} else if (statement instanceof Insert) {
formatInsert((Insert) statement, result, indent);
} else if (statement instanceof Update) {
formatUpdate((Update) statement, result, indent);
} else if (statement instanceof Delete) {
formatDelete((Delete) statement, result, indent);
}
return result.toString();
}
private void formatSelect(Select select, StringBuilder result, int indent) {
String indentation = String.join("", Collections.nCopies(indent, " "));
PlainSelect plainSelect = (PlainSelect) select.getSelectBody();
// SELECT 절
result.append(indentation).append("SELECT\n");
formatSelectItems(plainSelect.getSelectItems(), result, indent + 2);
// FROM 절
if (plainSelect.getFromItem() != null) {
result.append(indentation).append("FROM\n");
result.append(indentation).append(" ").append(plainSelect.getFromItem()).append("\n");
}
// JOIN 절
if (plainSelect.getJoins() != null) {
for (Join join : plainSelect.getJoins()) {
result.append(indentation).append(join.isLeft() ? "LEFT JOIN " : "JOIN ")
.append(join.getRightItem()).append("\n");
if (join.getOnExpression() != null) {
result.append(indentation).append(" ON ").append(join.getOnExpression()).append("\n");
}
}
}
// WHERE 절
if (plainSelect.getWhere() != null) {
result.append(indentation).append("WHERE\n");
result.append(indentation).append(" ").append(plainSelect.getWhere()).append("\n");
}
// GROUP BY 절
if (plainSelect.getGroupBy() != null) {
result.append(indentation).append("GROUP BY\n");
result.append(indentation).append(" ")
.append(plainSelect.getGroupBy().getGroupByExpressions().stream()
.map(Object::toString)
.collect(Collectors.joining(", ")))
.append("\n");
}
// HAVING 절
if (plainSelect.getHaving() != null) {
result.append(indentation).append("HAVING\n");
result.append(indentation).append(" ").append(plainSelect.getHaving()).append("\n");
}
// ORDER BY 절
if (plainSelect.getOrderByElements() != null) {
result.append(indentation).append("ORDER BY\n");
result.append(indentation).append(" ")
.append(plainSelect.getOrderByElements().stream()
.map(Object::toString)
.collect(Collectors.joining(", ")))
.append("\n");
}
}
private void formatSelectItems(List<SelectItem> items, StringBuilder result, int indent) {
String indentation = String.join("", Collections.nCopies(indent, " "));
for (int i = 0; i < items.size(); i++) {
result.append(indentation).append(items.get(i));
if (i < items.size() - 1) {
result.append(",");
}
result.append("\n");
}
}
private void formatInsert(Insert insert, StringBuilder result, int indent) {
String indentation = String.join("", Collections.nCopies(indent, " "));
result.append(indentation).append("INSERT INTO ").append(insert.getTable()).append("\n");
// 컬럼 목록
if (insert.getColumns() != null) {
result.append(indentation).append("(")
.append(insert.getColumns().stream()
.map(Column::getColumnName)
.collect(Collectors.joining(", ")))
.append(")\n");
}
result.append(indentation).append("VALUES\n");
// VALUES 절 포맷팅
if (insert.getItemsList() != null) {
result.append(indentation).append(" ").append(insert.getItemsList()).append("\n");
}
}
private void formatUpdate(Update update, StringBuilder result, int indent) {
String indentation = String.join("", Collections.nCopies(indent, " "));
// UPDATE 절
result.append(indentation).append("UPDATE\n");
result.append(indentation).append(" ").append(update.getTable()).append("\n");
// SET 절
result.append(indentation).append("SET\n");
List<UpdateSet> updateSets = update.getUpdateSets();
for (int i = 0; i < updateSets.size(); i++) {
UpdateSet updateSet = updateSets.get(i);
result.append(indentation).append(" ")
.append(updateSet.getColumns().get(0))
.append(" = ")
.append(updateSet.getExpressions().get(0));
if (i < updateSets.size() - 1) {
result.append(",");
}
result.append("\n");
}
// WHERE 절
if (update.getWhere() != null) {
result.append(indentation).append("WHERE\n");
result.append(indentation).append(" ").append(update.getWhere()).append("\n");
}
// ORDER BY 절 (일부 데이터베이스에서 지원)
if (update.getOrderByElements() != null) {
result.append(indentation).append("ORDER BY\n");
result.append(indentation).append(" ")
.append(update.getOrderByElements().stream()
.map(Object::toString)
.collect(Collectors.joining(", ")))
.append("\n");
}
// LIMIT 절 (일부 데이터베이스에서 지원)
if (update.getLimit() != null) {
result.append(indentation).append("LIMIT ")
.append(update.getLimit()).append("\n");
}
}
private void formatDelete(Delete delete, StringBuilder result, int indent) {
String indentation = String.join("", Collections.nCopies(indent, " "));
// DELETE 절
result.append(indentation).append("DELETE FROM\n");
result.append(indentation).append(" ").append(delete.getTable()).append("\n");
// WHERE 절
if (delete.getWhere() != null) {
result.append(indentation).append("WHERE\n");
result.append(indentation).append(" ").append(delete.getWhere()).append("\n");
}
// ORDER BY 절 (일부 데이터베이스에서 지원)
if (delete.getOrderByElements() != null) {
result.append(indentation).append("ORDER BY\n");
result.append(indentation).append(" ")
.append(delete.getOrderByElements().stream()
.map(Object::toString)
.collect(Collectors.joining(", ")))
.append("\n");
}
// LIMIT 절 (일부 데이터베이스에서 지원)
if (delete.getLimit() != null) {
result.append(indentation).append("LIMIT ")
.append(delete.getLimit()).append("\n");
}
}
}

@ -0,0 +1,73 @@
package egovframework.config;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import org.springdoc.core.GroupedOpenApi;
import org.springdoc.core.SpringDocUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* Swagger UI
* OpenAPI 3.0 API .
* .
* @Controller .
*/
@Configuration
public class SwaggerConfig {
static {
// @Controller 어노테이션이 있는 클래스도 스캔하도록 설정
SpringDocUtils.getConfig().addAnnotationsToIgnore(RequestMapping.class);
}
/**
* API GroupedOpenApi .
*
* @return GroupedOpenApi
*/
@Bean
public GroupedOpenApi allApi() {
return GroupedOpenApi.builder()
.group("All")
.packagesToScan("go.kr.project")
.pathsToMatch("/**")
.build();
}
/**
* API GroupedOpenApi .
*
* @return GroupedOpenApi
*/
@Bean
public GroupedOpenApi loginApi() {
return GroupedOpenApi.builder()
.group("Login")
.packagesToScan("go.kr.project.login")
.pathsToMatch("/login/**")
.build();
}
/**
* OpenAPI .
* API (, , ) .
*
* @return OpenAPI
*/
@Bean
public OpenAPI openAPI() {
Info info = new Info()
.title("XIT Framework API")
.description("XIT Framework API 문서 - 세션 기반 인증 사용")
.version("v1.0.0")
.license(new License().name("Apache 2.0").url("http://springdoc.org"));
return new OpenAPI()
.components(new Components())
.info(info);
}
}

@ -0,0 +1,47 @@
package egovframework.configProperties;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.Map;
/**
* packageName : egovframework.config
* fileName : FileUploadProperties
* author :
* date : 25. 5. 23.
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 25. 5. 23.
*/
@Setter
@Getter
@Configuration
@ConfigurationProperties(prefix = "file.upload")
public class FileUploadProperties {
/** 파일 저장 기본 경로 */
private String path;
/** 최대 파일 크기 (단일 파일) - 기본값 10MB */
private long maxSize;
/** 최대 총 파일 크기 - 기본값 50MB */
private long maxTotalSize;
/** 허용된 파일 확장자 */
private String allowedExtensions;
/** 최대 파일 개수 - 기본값 10개 */
private int maxFiles;
/** 실제 파일 삭제 여부 - 기본값 true */
private boolean realFileDelete;
/** 하위 디렉토리 설정 */
private Map<String, String> subDirs;
}

@ -0,0 +1,31 @@
package egovframework.configProperties;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.List;
/**
* packageName : egovframework.config
* fileName : InterceptorProperties
* author :
* date : 25. 5. 19.
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 25. 5. 19.
*/
@Setter
@Getter
@Configuration
@ConfigurationProperties(prefix = "interceptor")
public class InterceptorProperties {
private List<String> interceptorExclude;
private List<String> refererExclude;
}

@ -0,0 +1,35 @@
package egovframework.configProperties;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* packageName : egovframework.config
* fileName : LoginProperties
* author :
* date : 25. 5. 19.
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 25. 5. 19.
* 25. 5. 22.
*/
@Setter
@Getter
@Configuration
@ConfigurationProperties(prefix = "login")
public class LoginProperties {
private String url; // 로그인 페이지 URL
private Lock lock; // 로그인 잠금 설정
private boolean allowMultipleLogin = true; // 동시 접속 가능 여부 (기본값: true)
@Setter
@Getter
public static class Lock {
private int count; // 비밀번호 잠김 최종 카운트
}
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save