ads367 / AJIN-ERP star
mycoms 2024-03-08
240308 김하영 커밋
@8150e7044cfdfec44c65585fce240f0825f59872
 
.gitignore (added)
+++ .gitignore
@@ -0,0 +1,3 @@
+client/build/
+server/logs/
+node_modules/(파일 끝에 줄바꿈 문자 없음)
 
.idea/.gitignore (deleted)
--- .idea/.gitignore
@@ -1,8 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
-# Datasource local storage ignored files
-/dataSources/
-/dataSources.local.xml
-# Editor-based HTTP Client requests
-/httpRequests/
 
.idea/AJIN-ERP.iml (deleted)
--- .idea/AJIN-ERP.iml
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$" />
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-  </component>
-</module>(파일 끝에 줄바꿈 문자 없음)
 
.idea/misc.xml (deleted)
--- .idea/misc.xml
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ExternalStorageConfigurationManager" enabled="true" />
-  <component name="FrameworkDetectionExcludesConfiguration">
-    <file type="web" url="file://$PROJECT_DIR$" />
-  </component>
-  <component name="JavaScriptSettings">
-    <option name="languageLevel" value="ES6" />
-  </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_14" default="false" project-jdk-name="17" project-jdk-type="JavaSDK">
-    <output url="file://$PROJECT_DIR$/out" />
-  </component>
-</project>(파일 끝에 줄바꿈 문자 없음)
 
.idea/vcs.xml (deleted)
--- .idea/vcs.xml
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="VcsDirectoryMappings">
-    <mapping directory="" vcs="Git" />
-  </component>
-</project>(파일 끝에 줄바꿈 문자 없음)
 
Global.js (added)
+++ Global.js
@@ -0,0 +1,17 @@
+const PROJECT_NAME = 'NodeJS Web Server Framework(Vue)';
+const PROJECT_VERSION = '1.0';
+const BASE_DIR = __dirname;
+const LOG_BASE_DIR = `${__dirname}/server/logs`;
+const SERVICE_STATUS = process.env.NODE_ENV;//development, production
+const PORT = 80;
+const API_SERVER_HOST = 'localhost:8080';
+
+module.exports = {
+    PROJECT_NAME,
+    PROJECT_VERSION,
+    BASE_DIR,
+    LOG_BASE_DIR,
+    SERVICE_STATUS,
+    PORT,
+    API_SERVER_HOST
+}(파일 끝에 줄바꿈 문자 없음)
 
README.md (deleted)
--- README.md
@@ -1,1 +0,0 @@
-Frist
 
SQL (added)
+++ SQL
@@ -0,0 +1,33 @@
+-- create test SCHEMA(mariaDB)
+CREATE SCHEMA test DEFAULT CHARACTER SET utf8mb4;
+
+-- use test SCHEMA(mariaDB)
+use test;
+
+-- create product table(mariaDB)
+CREATE TABLE product
+(
+	product_index INT PRIMARY KEY AUTO_INCREMENT,
+	product_name VARCHAR(50),
+	product_category VARCHAR(50),
+	product_price INT,
+	product_explan TEXT,
+	product_writer VARCHAR(50),
+	product_date DATE
+) DEFAULT CHARACTER SET utf8mb4;
+
+-- create product_order table(mariaDB)
+CREATE TABLE product_order
+(
+	order_index INT,
+    order_product_number INT,
+    order_product_name VARCHAR(50),
+    order_product_category VARCHAR(50),
+    order_product_temperature VARCHAR(50),
+    order_amount INT,
+    order_price INT,
+    order_user VARCHAR(50),
+    order_date DATE,
+    order_state VARCHAR(50),
+    PRIMARY KEY(order_index, order_product_number)
+) DEFAULT CHARACTER SET utf8mb4;(파일 끝에 줄바꿈 문자 없음)
 
build.gradle (deleted)
--- build.gradle
@@ -1,55 +0,0 @@
-plugins {
-	id 'java'
-	id 'org.springframework.boot' version '3.2.3'
-	id 'io.spring.dependency-management' version '1.1.4'
-}
-
-group = 'com.ajin'
-version = '0.0.1-SNAPSHOT'
-
-java {
-	sourceCompatibility = '17'
-}
-
-repositories {
-	mavenCentral()
-}
-
-dependencies {
-	// postgresql jdbc
-	implementation group: 'org.postgresql', name: 'postgresql', version: '42.6.0'
-	// 오라클 jdbc
-	implementation group: 'com.oracle.database.jdbc', name: 'ojdbc11', version: '21.8.0.0'
-	// 마리아 jdbc
-	implementation group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version: '3.3.2'
-	// mysql jdbc
-	implementation group: 'com.mysql', name: 'mysql-connector-j', version: '8.0.33'
-	// mssql jdbc
-	implementation group: 'com.microsoft.sqlserver', name: 'mssql-jdbc', version: '12.4.2.jre11'
-
-	// mybatis
-	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'
-
-	//lombok 라이브러리
-	compileOnly 'org.projectlombok:lombok'
-	annotationProcessor 'org.projectlombok:lombok'
-	testCompileOnly 'org.projectlombok:lombok'
-	testAnnotationProcessor 'org.projectlombok:lombok'
-
-	// https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple
-	implementation group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1'
-	// https://mvnrepository.com/artifact/org.json/json
-	implementation group: 'org.json', name: 'json', version: '20231013'
-
-	//compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
-	implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'
-	// https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310
-	implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
-
-	implementation 'org.springframework.boot:spring-boot-starter-web'
-	testImplementation 'org.springframework.boot:spring-boot-starter-test'
-}
-
-tasks.named('test') {
-	useJUnitPlatform()
-}
 
client/resources/css/component.css (added)
+++ client/resources/css/component.css
@@ -0,0 +1,965 @@
+@charset "utf-8";
+
+/* box */
+
+/* 메인 */
+
+header {
+    background-color: #fff;
+    /* padding: 15px 30px; */
+    grid-area: header;
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    z-index: 1;
+}
+/* .app-wrap{
+    border: 1px solid red;
+    min-width: 1280px;
+} */
+.wrapper {
+    width: 100%;
+    height: 100%;
+    position: absolute;
+    top: 0px;
+    left: 0px;
+    flex-wrap: nowrap;
+    padding-top: 64.5px;
+    font-family: 'Pretendard';
+    background-color: var(--white);
+}
+/* 
+.main-nav {
+    position: absolute;
+    top: 70px;
+    left: 0;
+    width: 100%;
+    z-index: 2;
+} */
+
+.main-nav {
+    position: absolute;
+    /* top: 70px; */
+    left: 0;
+    width: 100%;
+    z-index: 2;
+    flex-wrap: nowrap;
+    padding: 0 10px;
+    background-color: var(--navbarblue);
+}
+
+.row {
+    padding-top: 5px;
+    padding-bottom: 5px;
+}
+
+.box {
+    background-color: var(--white);
+    height: 100%;
+    padding: 15px;
+    border-radius: 10px;
+    box-shadow: 0 0 5px var(--light);
+}
+
+.box-title {
+    font-size: 1.8rem;
+    font-weight: bold;
+    padding-bottom: 10px;
+    margin-bottom: 10px;
+    border-bottom: 1px solid var(--dark);
+}
+
+.box-inner-title {
+    font-size: 1.6rem;
+    font-weight: bold;
+}
+
+.chart-title {
+    font-size: 1.4rem;
+    font-weight: bold;
+}
+
+.content-box {
+    height: calc(100% - 48px);
+    /* background-color: aliceblue; */
+}
+
+
+
+
+/* btn */
+.small-btn {
+    width: 120px;
+    padding: 5px 10px;
+    border-radius: 5px;
+    font-size: 1.3rem;
+}
+
+.large-btn {
+    width: 100%;
+    padding: 5px 15px;
+    border-radius: 5px;
+}
+
+.icon-btn {
+    padding: 5px;
+    border-radius: 50%;
+}
+
+.close-btn {
+    font-size: 1.6rem;
+    font-weight: 900;
+}
+
+
+.logout-btn::before {
+    content: "";
+    width: 1px;
+    height: 10px;
+    position: absolute;
+    top: 50%;
+    left: 0;
+    transform: translateY(-50%);
+    background-color: #aaa;
+}
+
+.close-btn {
+    color: #d6def6;
+}
+
+.blue-btn,
+.blue-border-btn:hover {
+    background-color: var(--blue);
+    color: var(--white);
+    transition: all 0.3s ease-in-out;
+}
+
+.red-btn,
+.red-border-btn:hover {
+    background-color: var(--red);
+    color: var(--white);
+    transition: all 0.3s ease-in-out;
+}
+
+.green-btn,
+.green-border-btn:hover {
+    background-color: var(--green);
+    color: var(--white);
+    transition: all 0.3s ease-in-out;
+}
+
+.orange-btn,
+.orange-border-btn:hover {
+    background-color: var(--orange);
+    color: var(--white);
+    transition: all 0.3s ease-in-out;
+}
+
+.darkg-btn,
+.darkg-border-btn:hover {
+    background-color: var(--darkG);
+    color: var(--white);
+    transition: all 0.3s ease-in-out;
+}
+
+.gray-btn,
+.gray-border-btn:hover {
+    background-color: #eee;
+    color: #333;
+    transition: all 0.3s ease-in-out;
+}
+
+
+.blue-border-btn {
+    border: 1px solid var(--blue);
+    color: var(--blue);
+    background-color: var(--white);
+}
+
+.red-border-btn {
+    border: 1px solid var(--red);
+    color: var(--red);
+    background-color: var(--white);
+}
+
+.green-border-btn {
+    border: 1px solid var(--green);
+    color: var(--green);
+    background-color: var(--white);
+}
+
+.orange-border-btn {
+    border: 1px solid var(--orange);
+    ;
+    color: var(--orange);
+    background-color: var(--white);
+}
+
+.darkg-border-btn {
+    border: 1px solid #434343;
+    color: #434343;
+    background-color: var(--white);
+}
+
+.gray-border-btn {
+    border: 1px solid #aaa;
+    color: #aaa;
+    background-color: var(--white);
+}
+
+.white-border-btn {
+    border: 1px solid var(--white);
+    color: var(--white);
+    background-color: transparent;
+}
+
+.tp-btn {
+    background-color: transparent;
+    width: 15px;
+    height: 15px;
+    margin-left: 10px;
+}
+
+button:disabled {
+    background-color: #eee;
+    color: #333;
+}
+
+.del-icon-btn {
+    width: 25px;
+    height: 25px;
+    padding: 5px;
+    background-color: var(--red);
+    color: var(--white);
+    border-radius: 50%;
+}
+
+.set-icon-btn {
+    width: 25px;
+    height: 25px;
+    padding: 5px;
+    background-color: var(--darkG);
+    color: var(--white);
+    border-radius: 50%;
+}
+
+
+
+
+/* 박스 컴포넌트 스타일 */
+.component-wrap {
+    width: 100%;
+    height: 100%;
+    padding: 8px;
+    border-radius: 5px;
+    background-color: #f8f8f8;
+}
+
+.data-title {
+    font-size: 1.4rem;
+    font-weight: 500;
+}
+
+
+.data-number,
+.data-caption {
+    font-size: 1.6rem;
+    font-weight: bold;
+}
+
+.data-unit {
+    font-size: 1.4rem;
+    font-weight: 200;
+}
+
+.data-icon {
+    min-width: 30px;
+    min-height: 30px;
+    width: 40px;
+    height: 40px;
+    max-width: 100%;
+    max-height: 100%;
+}
+
+
+.data-icon p {
+    font-size: 1.6rem;
+    font-weight: bold;
+    text-align: center;
+    line-height: 50px;
+    background-color: var(--orange);
+    border-radius: 5px;
+}
+
+
+/* 모달 */
+.modal-wrapper {
+    background-color: rgba(0, 0, 0, 0.5);
+    position: fixed;
+    width: 100%;
+    height: 100%;
+    top: 0;
+    left: 0;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    z-index: 11000;
+}
+
+.modal-container {
+    background: #fff;
+    min-width: 500px;
+    width: 50%;
+    height: 80%;
+    border-radius: 5px;
+    display: grid;
+    grid-template-rows: auto 1fr auto;
+    padding: 20px;
+    box-sizing: border-box;
+    max-height: 95%;
+    min-height: 500px;
+}
+
+.modal-title {
+    width: 100%;
+    border-bottom: 1px solid #d4cccc;
+    padding: 10px 0;
+}
+
+.modal-subtitle {
+    font-size: 1.3rem;
+    font-weight: 600;
+}
+
+.modal-content-monthly {
+    width: 100%;
+    padding: 20px 0;
+    overflow-y: auto;
+}
+
+.large-modal {
+    width: 90%;
+}
+
+.small-modal {
+    min-width: 200px;
+    min-height: 200px;
+    max-width: 450px;
+    height: auto;
+    max-height: 50%;
+}
+
+.list-modal {
+    width: 80%;
+    height: 80%;
+}
+
+.alert-write {
+    font-size: 1.6rem;
+    line-height: 180%;
+}
+
+
+.modal-content-monthly::-webkit-scrollbar {
+    width: 10px;
+}
+
+.modal-content-monthly::-webkit-scrollbar-thumb {
+    background-color: #6b6b6b;
+    border-radius: 10px;
+    background-clip: padding-box;
+    border: 2px solid transparent;
+}
+
+.modal-content-monthly::-webkit-scrollbar-track {
+    background-color: #eee;
+    border-radius: 10px;
+    box-shadow: inset 0px 0px 5px white;
+}
+
+.modal-end {
+    width: 100%;
+    padding: 15px 0;
+    border-top: 1px solid #eee;
+}
+
+.alert-modal .modal-end button,
+.small-modal .modal-end button {
+    margin-left: 0;
+}
+
+.full-input,
+.full-select {
+    width: 100%;
+}
+
+
+
+/* margin */
+
+/* margin-left 왼쪽 */
+.ml0 {
+    margin-left: 0%;
+}
+
+.ml1 {
+    margin-left: 1%;
+}
+
+.ml2 {
+    margin-left: 2%;
+}
+
+.ml3 {
+    margin-left: 3%;
+}
+
+.ml4 {
+    margin-left: 4%;
+}
+
+.ml5 {
+    margin-left: 5%;
+}
+
+.ml6 {
+    margin-left: 6%;
+}
+
+.ml7 {
+    margin-left: 7%;
+}
+
+.ml8 {
+    margin-left: 8%;
+}
+
+.ml9 {
+    margin-left: 9%;
+}
+
+.ml10 {
+    margin-left: 10%;
+}
+
+.ml15 {
+    margin-left: 15%;
+}
+
+.ml20 {
+    margin-left: 20%;
+}
+
+/* margin-right 오른쪽 */
+.mr0 {
+    margin-right: 0%;
+}
+
+.mr1 {
+    margin-right: 1%;
+}
+
+.mr2 {
+    margin-right: 2%;
+}
+
+.mr3 {
+    margin-right: 3%;
+}
+
+.mr4 {
+    margin-right: 4%;
+}
+
+.mr5 {
+    margin-right: 5%;
+}
+
+.mr6 {
+    margin-right: 6%;
+}
+
+.mr7 {
+    margin-right: 7%;
+}
+
+.mr8 {
+    margin-right: 8%;
+}
+
+.mr9 {
+    margin-right: 9%;
+}
+
+.mr10 {
+    margin-right: 10%;
+}
+
+.mr15 {
+    margin-right: 15%;
+}
+
+.mr20 {
+    margin-right: 20%;
+}
+
+/* margin-top 윗쪽 */
+.mt0 {
+    margin-top: 0%;
+}
+
+.mt1 {
+    margin-top: 1%;
+}
+
+.mt2 {
+    margin-top: 2%;
+}
+
+.mt3 {
+    margin-top: 3%;
+}
+
+.mt4 {
+    margin-top: 4%;
+}
+
+.mt5 {
+    margin-top: 5%;
+}
+
+.mt6 {
+    margin-top: 6%;
+}
+
+.mt7 {
+    margin-top: 7%;
+}
+
+.mt8 {
+    margin-top: 8%;
+}
+
+.mt9 {
+    margin-top: 9%;
+}
+
+.mt10 {
+    margin-top: 10%;
+}
+
+.mt15 {
+    margin-top: 15%;
+}
+
+.mt20 {
+    margin-top: 20%;
+}
+
+/* margin-bottom 아래쪽 */
+
+.mb0 {
+    margin-bottom: 0%;
+}
+
+.mb1 {
+    margin-bottom: 1%;
+}
+
+.mb2 {
+    margin-bottom: 2%;
+}
+
+.mb3 {
+    margin-bottom: 3%;
+}
+
+.mb4 {
+    margin-bottom: 4%;
+}
+
+.mb5 {
+    margin-bottom: 5%;
+}
+
+.mb6 {
+    margin-bottom: 6%;
+}
+
+.mb7 {
+    margin-bottom: 7%;
+}
+
+.mb8 {
+    margin-bottom: 8%;
+}
+
+.mb9 {
+    margin-bottom: 9%;
+}
+
+.mb10 {
+    margin-bottom: 10%;
+}
+
+.mb15 {
+    margin-bottom: 15%;
+}
+
+.mb20 {
+    margin-bottom: 20%;
+}
+
+
+/* padding */
+.pd0 {
+    padding: 0%;
+}
+
+.pd1 {
+    padding: 1%;
+}
+
+.pd2 {
+    padding: 2%;
+}
+
+.pd3 {
+    padding: 3%;
+}
+
+.pd4 {
+    padding: 4%;
+}
+
+.pd5 {
+    padding: 5%;
+}
+
+.pd6 {
+    padding: 6%;
+}
+
+.pd7 {
+    padding: 7%;
+}
+
+.pd8 {
+    padding: 8%;
+}
+
+.pd9 {
+    padding: 9%;
+}
+
+.pd10 {
+    padding: 10%;
+}
+
+.pd15 {
+    padding: 15%;
+}
+
+.pd20 {
+    padding: 20%;
+}
+
+/* padding-top */
+.pt0 {
+    padding-top: 0%;
+}
+
+.pt1 {
+    padding-top: 1%;
+}
+
+.pt2 {
+    padding-top: 2%;
+}
+
+.pt3 {
+    padding-top: 3%;
+}
+
+.pt4 {
+    padding-top: 4%;
+}
+
+.pt5 {
+    padding-top: 5%;
+}
+
+.pt6 {
+    padding-top: 6%;
+}
+
+.pt7 {
+    padding-top: 7%;
+}
+
+.pt8 {
+    padding-top: 8%;
+}
+
+.pt9 {
+    padding-top: 9%;
+}
+
+.pt10 {
+    padding-top: 10%;
+}
+
+.pt15 {
+    padding-top: 15%;
+}
+
+.pt20 {
+    padding-top: 20%;
+}
+
+/* padding-bottom */
+.pb0 {
+    padding-bottom: 0%;
+}
+
+.pb1 {
+    padding-bottom: 1%;
+}
+
+.pb2 {
+    padding-bottom: 2%;
+}
+
+.pb3 {
+    padding-bottom: 3%;
+}
+
+.pb4 {
+    padding-bottom: 4%;
+}
+
+.pb5 {
+    padding-bottom: 5%;
+}
+
+.pb6 {
+    padding-bottom: 6%;
+}
+
+.pb7 {
+    padding-bottom: 7%;
+}
+
+.pb8 {
+    padding-bottom: 8%;
+}
+
+.pb9 {
+    padding-bottom: 9%;
+}
+
+.pb10 {
+    padding-bottom: 10%;
+}
+
+.pb15 {
+    padding-bottom: 15%;
+}
+
+.pb20 {
+    padding-bottom: 20%;
+}
+
+
+/* text 정렬 */
+.text-lf {
+    text-align: left;
+}
+
+.text-ct {
+    text-align: center;
+}
+
+.text-rg {
+    text-align: right;
+}
+
+
+/* 기타 공용 */
+.cursor {
+    cursor: pointer;
+}
+
+.content-w20 {
+    width: 20%;
+}
+
+.content-w30 {
+    width: 30%;
+}
+
+.content-w60 {
+    width: 60%;
+}
+
+.content-w70 {
+    width: 70%;
+}
+
+.input-gray {
+    background-color: var(--inputgray);
+    text-align: left !important;
+}
+
+.box-overflow {
+    height: 320px;
+    overflow-y: auto;
+}
+
+.box-overflow::-webkit-scrollbar{
+    width: 2px;
+}
+.box-overflow::-webkit-scrollbar-thumb{
+    background-color: var(--navbarblue);
+}
+.rest-btn,.save-btn,.del-btn{
+    position: relative;
+}
+.rest-btn::before{
+    content: 'F11';
+    position: absolute;
+    top: -30%;
+    right: 0;
+    background-color: var(--navbarblue);
+    color: white;
+    padding: 0 5px;
+    border-radius: 10px;
+    font-size: 1rem;
+}
+.save-btn::before{
+    content: 'F9';
+    position: absolute;
+    top: -30%;
+    right: 0;
+    background-color: var(--navbarblue);
+    color: white;
+    padding: 0 5px;
+    border-radius: 10px;
+    font-size: 1rem;
+}
+.del-btn::before{
+    content: 'F8';
+    position: absolute;
+    top: -30%;
+    right: 0;
+    background-color: var(--navbarblue);
+    color: white;
+    padding: 0 5px;
+    border-radius: 10px;
+    font-size: 1rem;
+}
+/* input checkbox */
+/* checkbox settings �� */
+
+.ui-checkbox {
+    --primary-color: #005aab;
+    --secondary-color: #fff;
+    --primary-hover-color: #005aab;
+    /* checkbox */
+    --checkbox-diameter: 20px;
+    --checkbox-border-radius: 5px;
+    --checkbox-border-color: #d9d9d9;
+    --checkbox-border-width: 1px;
+    --checkbox-border-style: solid;
+    /* checkmark */
+    --checkmark-size: 1.2;
+}
+
+.ui-checkbox,
+.ui-checkbox *,
+.ui-checkbox *::before,
+.ui-checkbox *::after {
+    -webkit-box-sizing: border-box;
+    box-sizing: border-box;
+}
+
+.ui-checkbox {
+    -webkit-appearance: none;
+    -moz-appearance: none;
+    appearance: none;
+    width: var(--checkbox-diameter);
+    height: var(--checkbox-diameter);
+    border-radius: var(--checkbox-border-radius);
+    background: var(--secondary-color);
+    border: var(--checkbox-border-width) var(--checkbox-border-style) var(--checkbox-border-color);
+    -webkit-transition: all 0.3s;
+    -o-transition: all 0.3s;
+    transition: all 0.3s;
+    cursor: pointer;
+    position: relative;
+}
+
+.ui-checkbox::after {
+    content: "";
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    -webkit-box-shadow: 0 0 0 calc(var(--checkbox-diameter) / 2.5) var(--primary-color);
+    box-shadow: 0 0 0 calc(var(--checkbox-diameter) / 2.5) var(--primary-color);
+    border-radius: inherit;
+    opacity: 0;
+    -webkit-transition: all 0.5s cubic-bezier(0.12, 0.4, 0.29, 1.46);
+    -o-transition: all 0.5s cubic-bezier(0.12, 0.4, 0.29, 1.46);
+    transition: all 0.5s cubic-bezier(0.12, 0.4, 0.29, 1.46);
+}
+
+.ui-checkbox::before {
+    top: 40%;
+    left: 50%;
+    content: "";
+    position: absolute;
+    width: 4px;
+    height: 7px;
+    border-right: 2px solid var(--secondary-color);
+    border-bottom: 2px solid var(--secondary-color);
+    -webkit-transform: translate(-50%, -50%) rotate(45deg) scale(0);
+    -ms-transform: translate(-50%, -50%) rotate(45deg) scale(0);
+    transform: translate(-50%, -50%) rotate(45deg) scale(0);
+    opacity: 0;
+    -webkit-transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s;
+    -o-transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s;
+    transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s;
+}
+
+/* actions */
+
+.ui-checkbox:hover {
+    border-color: var(--primary-color);
+}
+
+.ui-checkbox:checked {
+    background: var(--primary-color);
+    border-color: transparent;
+}
+
+.ui-checkbox:checked::before {
+    opacity: 1;
+    -webkit-transform: translate(-50%, -50%) rotate(45deg) scale(var(--checkmark-size));
+    -ms-transform: translate(-50%, -50%) rotate(45deg) scale(var(--checkmark-size));
+    transform: translate(-50%, -50%) rotate(45deg) scale(var(--checkmark-size));
+    -webkit-transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s;
+    -o-transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s;
+    transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s;
+}
+
+.ui-checkbox:active:not(:checked)::after {
+    -webkit-transition: none;
+    -o-transition: none;
+    -webkit-box-shadow: none;
+    box-shadow: none;
+    transition: none;
+    opacity: 1;
+}(파일 끝에 줄바꿈 문자 없음)
 
client/resources/css/font.css (added)
+++ client/resources/css/font.css
@@ -0,0 +1,27 @@
+@font-face {
+    font-family: 'Pretendard';
+    src: url('../font/PretendardVariable.woff2') format('woff');
+    /* font-weight: 400; */
+    font-style: normal;
+}
+
+@font-face {
+    font-family: "GmarketSansM";
+    src: url("/client/resources/font/GmarketSansMedium.woff") format("woff");
+    font-weight: normal;
+    font-style: normal;
+}
+
+@font-face {
+    font-family: "GmarketSansL";
+    src: url("/client/resources/font/GmarketSansLight.woff") format("woff");
+    font-weight: normal;
+    font-style: normal;
+}
+
+@font-face {
+    font-family: "GmarketSansB";
+    src: url("/client/resources/font/GmarketSansBold.woff") format("woff");
+    font-weight: bold;
+    font-style: normal;
+}(파일 끝에 줄바꿈 문자 없음)
 
client/resources/css/grid.css (added)
+++ client/resources/css/grid.css
@@ -0,0 +1,256 @@
+@charset "utf-8";
+
+.container {
+    width: 100%;
+    /* padding-right: 15px;
+    padding-left: 15px;
+    margin-right: auto;
+    margin-left: auto; */
+}
+/* 480 small */
+@media (min-width: 480px) {
+    .container {
+        max-width: 768px;
+    }
+}
+
+/* 768 medium */
+@media (min-width: 768px) {
+    .container {
+        max-width: 1024px;
+    }
+}
+/* 1024 large */
+@media (min-width: 1024px) {
+    .container {
+        max-width: 1280px;
+    }
+}
+/* 1280 Xlarge */
+@media (min-width: 1280px) {
+    .container{
+        max-width: 100%;
+    }
+}
+
+
+.flex {
+    display: flex;
+    flex-wrap: wrap;
+}
+
+.flex-column {
+    display: flex;
+    flex-direction: column;
+}
+
+.no-space {
+    margin-right: 0;
+    margin-left: 0;
+}
+
+
+.no-space >.gd,
+.no-space >[class*="col-"] {
+    padding-right: 0;
+    padding-left: 0;
+}
+
+.gd-1,
+.gd-2,
+.gd-3,
+.gd-4,
+.gd-5,
+.gd-6,
+.gd-7,
+.gd-8,
+.gd-9,
+.gd-10,
+.gd-11,
+.gd-12,
+.gd,
+.gd-auto,
+.gd-sm-1,
+.gd-sm-2,
+.gd-sm-3,
+.gd-sm-4,
+.gd-sm-5,
+.gd-sm-6,
+.gd-sm-7,
+.gd-sm-8,
+.gd-sm-9,
+.gd-sm-10,
+.gd-sm-11,
+.gd-sm-12,
+.gd-sm,
+.gd-sm-auto,
+.gd-md-1,
+.gd-md-2,
+.gd-md-3,
+.gd-md-4,
+.gd-md-5,
+.gd-md-6,
+.gd-md-7,
+.gd-md-8,
+.gd-md-9,
+.gd-md-10,
+.gd-md-11,
+.gd-md-12,
+.gd-md,
+.gd-md-auto,
+.gd-lg-1,
+.gd-lg-2,
+.gd-lg-3,
+.gd-lg-4,
+.gd-lg-5,
+.gd-lg-6,
+.gd-lg-7,
+.gd-lg-8,
+.gd-lg-9,
+.gd-lg-10,
+.gd-lg-11,
+.gd-lg-12,
+.gd-lg,
+.gd-lg-auto,
+.gd-xl-1,
+.gd-xl-2,
+.gd-xl-3,
+.gd-xl-4,
+.gd-xl-5,
+.gd-xl-6,
+.gd-xl-7,
+.gd-xl-8,
+.gd-xl-9,
+.gd-xl-10,
+.gd-xl-11,
+.gd-xl-12,
+.gd-xl,
+.gd-xl-auto {
+    position: relative;
+    width: 100%;
+    min-height: 1px;
+
+}
+
+
+.gd {
+    -ms-flex-preferred-size: 0;
+    flex-basis: 0;
+    -ms-flex-positive: 1;
+    flex-grow: 1;
+    max-width: 100%;
+}
+
+.gd-auto {
+    -ms-flex: 0 0 auto;
+    flex: 0 0 auto;
+    width: auto;
+    max-width: none;
+}
+
+.gd-1 {
+    -ms-flex: 0 0 8.333333%;
+    flex: 0 0 8.333333%;
+    max-width: 8.333333%;
+}
+
+.gd-2 {
+    -ms-flex: 0 0 16.666667%;
+    flex: 0 0 16.666667%;
+    max-width: 16.666667%;
+}
+
+.gd-3 {
+    -ms-flex: 0 0 25%;
+    flex: 0 0 25%;
+    max-width: 25%;
+}
+
+.gd-4 {
+    -ms-flex: 0 0 33.333333%;
+    flex: 0 0 33.333333%;
+    max-width: 33.333333%;
+}
+
+.gd-5 {
+    -ms-flex: 0 0 41.666667%;
+    flex: 0 0 41.666667%;
+    max-width: 41.666667%;
+}
+
+.gd-6 {
+    -ms-flex: 0 0 50%;
+    flex: 0 0 50%;
+    max-width: 50%;
+}
+
+.gd-7 {
+    -ms-flex: 0 0 58.333333%;
+    flex: 0 0 58.333333%;
+    max-width: 58.333333%;
+}
+
+.gd-8 {
+    -ms-flex: 0 0 66.666667%;
+    flex: 0 0 66.666667%;
+    max-width: 66.666667%;
+}
+
+.gd-9 {
+    -ms-flex: 0 0 75%;
+    flex: 0 0 75%;
+    max-width: 75%;
+}
+
+.gd-10 {
+    -ms-flex: 0 0 83.333333%;
+    flex: 0 0 83.333333%;
+    max-width: 83.333333%;
+}
+
+.gd-11 {
+    -ms-flex: 0 0 91.666667%;
+    flex: 0 0 91.666667%;
+    max-width: 91.666667%;
+}
+
+.gd-12 {
+    -ms-flex: 0 0 100%;
+    flex: 0 0 100%;
+    max-width: 100%;
+}
+
+
+
+.justify-start {
+    justify-content: flex-start;
+}
+
+.justify-center {
+    justify-content: center;
+}
+
+.justify-end {
+    justify-content: flex-end;
+}
+
+.justify-between {
+    justify-content: space-between;
+}
+
+.justify-around {
+    justify-content: space-around;
+}
+
+.align-start {
+    align-items: flex-start;
+}
+
+
+.align-center {
+    align-items: center;
+}
+
+.align-end {
+    align-items: flex-end;
+}
 
client/resources/css/layout.css (added)
+++ client/resources/css/layout.css
@@ -0,0 +1,0 @@
 
client/resources/css/reset.css (added)
+++ client/resources/css/reset.css
@@ -0,0 +1,207 @@
+@charset "utf-8";
+
+:root {
+    --blue: #007bff;
+    --skyblue: #c9e3ff;
+    --indigo: #6610f2;
+    --purple: #6f42c1;
+    --pink: #e83e8c;
+    --red: #dc3545;
+    --orange: #fd7e14;
+    --yellow: #ffc107;
+    --green: #28a745;
+    --teal: #20c997;
+    --cyan: #17a2b8;
+    --white: #fff;
+    --gray: #6c757d;
+    --gray-dark: #343a40;
+    --primary: #007bff;
+    --secondary: #6c757d;
+    --success: #28a745;
+    --info: #17a2b8;
+    --main:#388d6e;
+    --warning: #ffc107;
+    --danger: #dc3545;
+    --light: #f8f9fa;
+    --dark: #343a40;
+    --light:#eeeeee;
+    --headergray: #4f4f4f;
+    --navbarblue :#005aab;
+    --sidenavgray: #eceef2;
+    --lightbeige: #f8f8f8;
+    --bordergray: #c9c9c9;
+    --borderlightgray: #d1d2d2;
+    --tableblue :#f3faff;
+    --inputgray :#efefef;
+}
+
+/* box-sizing 규칙을 명시합니다. */
+*,
+*::before,
+*::after {
+    box-sizing: border-box;
+    margin: 0;
+    padding: 0;
+}
+body {
+    min-width: 1300px;
+    overflow-x: auto;
+}
+
+.layout-wrap {
+    width: 100%;
+    min-height: 100vh;
+    position: relative;
+
+}
+
+
+a {
+    color: #333;
+    text-decoration: none;
+}
+
+ol,
+ul,
+li {
+    list-style: none;
+}
+
+img,
+svg {
+    /* width: 100%; */
+    vertical-align: middle;
+}
+/* 폰트 크기의 팽창을 방지합니다. */
+html {
+    -moz-text-size-adjust: none;
+    -webkit-text-size-adjust: none;
+    text-size-adjust: none;
+    font-size: 10px;
+}
+.layout-wrap{
+    width: 100%;
+    min-height: 100%;
+    display: flex;
+    flex-direction: column;  
+}
+
+/* 기본 여백을 제거하여 작성된 CSS를 더 잘 제어할 수 있습니다. */
+body,
+h1,
+h2,
+h3,
+h4,
+p,
+figure, 
+blockquote,
+dl,    
+dd {
+    margin-block-end: 0;
+}
+
+/* list를 role값으로 갖는 ul, ol 요소의 기본 목록 스타일을 제거합니다. */
+ul[role='list'],
+ol[role='list'] {
+    list-style: none;
+}
+
+/* 핵심 body의 기본값을 설정합니다. */
+#root {
+    height: 100vh;
+    min-height: 100%;
+    line-height: 1.5;
+    display: flex;
+    flex-direction: column;
+
+   }
+
+/* 제목 요소와 상호작용하는 요소에 대해 line-height를 더 짧게 설정합니다. */
+h1,
+h2,
+h3,
+h4,
+button,
+input,
+label {
+    line-height: 1.1;
+}
+
+/* 제목에 대한 text-wrap을 balance로 설정합니다. */
+h1,
+h2,
+h3,
+h4 {
+    text-wrap: balance;
+}
+
+/* 클래스가 없는 기본 a 태그 요소는 기본 스타일을 가져옵니다. */
+a:not([class]) {
+    text-decoration-skip-ink: auto;
+    color: currentColor;
+}
+
+/* 이미지 관련 작업을 더 쉽게 합니다. */
+img,
+picture {
+    max-width: 100%;
+    display: block;
+}
+
+/* input 및 button 항목들이 글꼴을 상속하도록 합니다. */
+input,
+button,
+textarea,
+select {
+    font: inherit;
+}
+
+button{
+    background: inherit ; 
+    border:none; 
+    box-shadow:none; 
+    border-radius:0; 
+    padding:0; 
+    overflow:visible; 
+    cursor:pointer
+}
+
+/* 행 속성이 없는 textarea가 너무 작지 않도록 합니다. */
+textarea:not([rows]) {
+    min-height: 10em;
+}
+
+
+table{
+    min-width: 100%;
+    border-collapse: collapse;
+    table-layout: fixed;
+}
+
+table th,
+table td{
+    font-size: 1.3rem;
+}
+
+select,input{
+    padding: 7px;
+    border: 1px solid #ddd;
+    border-radius: 5px;
+}
+
+
+/* 스크롤바 디자인 */
+::-webkit-scrollbar {
+    width: 8px;
+    height: 8px;
+}
+
+::-webkit-scrollbar-thumb {
+    background-color: #ededed;
+    border-radius: 10px;
+}
+
+::-webkit-scrollbar-track {
+    background-color: #fff;
+    border-radius: 10px;
+}(파일 끝에 줄바꿈 문자 없음)
 
client/resources/css/responsive.css (added)
+++ client/resources/css/responsive.css
@@ -0,0 +1,0 @@
 
client/resources/css/style.css (added)
+++ client/resources/css/style.css
@@ -0,0 +1,338 @@
+.logo-wrap {
+    padding: 10px 30px;
+}
+
+.logo {
+    width: 300px;
+    height: 50px;
+    background: url(../img/common/header-logo-w.png) no-repeat;
+    background-size: contain;
+    background-position: center;
+
+}
+
+.logo-btn {
+    padding-left: 0px;
+    padding-right: 0px;
+}
+
+
+.button-wrap button {
+    border: 1px solid var(--navbarblue);
+    color: var(--navbarblue);
+    padding: 7px 10px !important;
+    margin-left: 10px;
+    border-radius: 5px;
+    font-family: 'Pretendard';
+    font-weight: 600;
+    font-size: 1.2rem;
+}
+
+
+
+.header-btn a {
+    font-family: 'Pretendard';
+    font-weight: bold;
+    font-size: 0.9rem;
+}
+
+.btn-img1 {
+    background: url(../img/common/header01.png) no-repeat;
+}
+
+.btn-img2 {
+    background: url(../img/component/arrow-right-from-bracket-solid.svg) no-repeat;
+}
+
+.btn-img3 {
+    background: url(../img/component/user-solid.svg) no-repeat;
+}
+
+
+.topmenu-wrap p{
+    position: relative;
+    padding: 1px 5px;
+    font-family: 'Pretendard';
+    font-weight: 500;
+    /* height: px; */
+    color: var(--white);
+    font-size: 1.5rem ;
+}
+.topmenu-wrap p.active {
+    width: 100px;
+    background-color: white;
+    color: var(--navbarblue);
+    padding: 1px 5px;
+    border-radius: 50px;
+    font-family: 'Pretendard';
+    font-weight: 500;
+}
+
+.side-wrap p {
+    font-size: 1.3rem;
+    padding: 8px 40px;
+    position: relative;
+    border-radius: 50px;
+    background-color: var(--white);
+    /* margin-bottom: 20px; */
+
+}
+
+.side-wrap p.active {
+    margin-bottom: 5%;
+    background-color: var(--navbarblue);
+    color: var(--white) !important;
+}
+
+
+.side-wrap p::after {
+    content: '';
+    position: absolute;
+    top: 50%;
+    left: 5%;
+    transform: translateY(-50%);
+    width: 20px;
+    height: 20px;
+    background: url(../img/component/file-solid-b.svg) no-repeat;
+}
+
+.side-wrap p.active::after {
+    content: '';
+    position: absolute;
+    top: 50%;
+    left: 5%;
+    transform: translateY(-50%);
+    width: 20px;
+    height: 20px;
+    background: url(../img/component/file-solid-w.svg) no-repeat;
+}
+
+.side-wrap p::before {
+    content: '';
+    position: absolute;
+    top: 50%;
+    right: 5%;
+    transform: translateY(-50%);
+    width: 15px;
+    height: 15px;
+    background: url(../img/component/chevron-down-solid-b.svg) no-repeat;
+}
+
+.side-wrap p.active::before {
+    content: '';
+    position: absolute;
+    top: 50%;
+    right: 5%;
+    transform: translateY(-50%);
+    width: 15px;
+    height: 15px;
+    background: url(../img/component/chevron-up-solid-w.svg) no-repeat;
+}
+
+.sidemenu-wrap li {
+    margin-bottom: 10px;
+}
+
+.sidemenu-wrap li a {
+    text-align: left;
+    font-size: 1.3rem;
+}
+
+.sidemenu-wrap li a.active-text {
+    color: var(--navbarblue);
+}
+
+.list-wrap {
+    width: 100%;
+    height: 100%;
+}
+
+.content-table {
+    background-color: var(--lightbeige);
+    border-radius: 10px;
+}
+
+.wrap-title {
+    font-size: 1.3rem;
+    color: var(--navbarblue);
+    border-bottom: 2px solid var(--bordergray);
+}
+
+.content-title {
+    font-size: 1.7rem;
+    font-weight: bold;
+}
+
+.content-title span {
+    font-size: 1rem;
+}
+
+.list-table {
+    background-color: var(--white);
+    border-left: 1px solid var(--borderlightgray);    
+}
+
+.code-area {
+    padding: 10px 20px;
+    background-color: var(--tableblue);
+    border-radius: 10px;
+}
+.code-area th{
+    white-space: nowrap;
+padding: 7px 10px !important;}
+
+.code-area td {
+
+    text-align: left !important;
+}
+
+
+.blue-text {
+    color: var(--navbarblue);
+    position: relative;
+    text-align: left !important;
+    /* left: 2%; */
+    font-size: 1.3rem;
+    font-weight: 600;
+}
+
+
+.table-border td.selected {
+    background-color: var(--navbarblue);
+    color: var(--white);
+}
+
+.table-scroll {
+    width: 100%;
+    overflow-y: auto;
+}
+
+.table-scroll table {
+    white-space: nowrap;
+    border-collapse: collapse;
+}
+
+.close-btn {
+    background: url(../img/component/xmark-solid.svg) no-repeat;
+    width: 20px;
+    height: 20px;
+}
+
+.table-border th {
+    border: 1px solid var(--borderlightgray);
+}
+.box-overflow{
+    border-top: 1px solid var(--borderlightgray);
+}
+.box-overflow thead {
+    position: sticky;
+    top: -1px;
+}
+
+.wrap {
+    width: 100%;
+    height: 100%;
+}
+
+.content {
+    height: 100%;
+}
+
+.content-wrap {
+    padding-left: 20px;
+    gap: 30px;
+}
+
+.container {
+    width: 100%;
+    height: 100%;
+    flex-wrap: nowrap;
+}
+
+select,
+input {
+    font-size: 1.2rem;
+    font-weight: 600;
+}
+
+p,
+td {
+    font-size: 1.3rem;
+    margin-right: 10px;
+}
+
+td,
+p,
+th,
+button {
+    padding: 7px 0;
+    /* text-align: center; */
+    cursor: pointer;
+}
+
+.table-border td,
+.table-border th,
+.table-header th {
+    border-bottom: 1px solid var(--borderlightgray);
+    border-right: 1px solid var(--borderlightgray);
+
+}
+.table-header{
+    background-color: var(--tableblue); 
+    color: var(--navbarblue);
+}
+
+.list-table th {
+    color: var(--navbarblue);
+}
+
+
+
+
+.table-area {
+    border: 1px solid var(--bordergray);
+    border-radius: 10px;
+}
+
+.box-wrap {
+    font-size: 1.2rem;
+}
+
+.blue-btn {
+    background-color: var(--navbarblue);
+    color: var(--white);
+    padding: 3px 20px;
+    font-size: 1.3rem;
+    border-radius: 5px;
+
+}
+
+.header-btn p {
+    margin: 0 auto;
+}
+
+.section-wrap{
+    background-color: var(--tableblue);
+    border: 1px solid red;
+}
+.section-wrap table{
+    height: 300px;
+    overflow-y: auto;
+    
+}
+
+.Bi002-table{
+    text-align: left;
+}
+.Bi002-table tr{
+    padding: 2rem;
+}
+
+
+.input-box{
+    flex-wrap: nowrap;
+    gap: 1px;
+}
+.input-box input{
+    width: 100%;
+}
 
client/resources/font/GmarketSansBold.woff (Binary) (added)
+++ client/resources/font/GmarketSansBold.woff
Binary file is not shown
 
client/resources/font/GmarketSansLight.woff (Binary) (added)
+++ client/resources/font/GmarketSansLight.woff
Binary file is not shown
 
client/resources/font/GmarketSansMedium.woff (Binary) (added)
+++ client/resources/font/GmarketSansMedium.woff
Binary file is not shown
 
client/resources/font/PretendardVariable.woff2 (Binary) (added)
+++ client/resources/font/PretendardVariable.woff2
Binary file is not shown
 
client/resources/img/common/header-logo-w.png (Binary) (added)
+++ client/resources/img/common/header-logo-w.png
Binary file is not shown
 
client/resources/img/common/header-logo.png (Binary) (added)
+++ client/resources/img/common/header-logo.png
Binary file is not shown
 
client/resources/img/common/header01.png (Binary) (added)
+++ client/resources/img/common/header01.png
Binary file is not shown
 
client/resources/img/common/header02.png (Binary) (added)
+++ client/resources/img/common/header02.png
Binary file is not shown
 
client/resources/img/common/header03.png (Binary) (added)
+++ client/resources/img/common/header03.png
Binary file is not shown
 
client/resources/img/common/header04.png (Binary) (added)
+++ client/resources/img/common/header04.png
Binary file is not shown
 
client/resources/img/component/arrow-right-from-bracket-solid.svg (added)
+++ client/resources/img/component/arrow-right-from-bracket-solid.svg
@@ -0,0 +1,1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#005aab" d="M502.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-128-128c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L402.7 224 192 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l210.7 0-73.4 73.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l128-128zM160 96c17.7 0 32-14.3 32-32s-14.3-32-32-32L96 32C43 32 0 75 0 128L0 384c0 53 43 96 96 96l64 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-64 0c-17.7 0-32-14.3-32-32l0-256c0-17.7 14.3-32 32-32l64 0z"/></svg>(파일 끝에 줄바꿈 문자 없음)
 
client/resources/img/component/chevron-down-solid-b.svg (added)
+++ client/resources/img/component/chevron-down-solid-b.svg
@@ -0,0 +1,1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#333333" d="M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z"/></svg>(파일 끝에 줄바꿈 문자 없음)
 
client/resources/img/component/chevron-down-solid-w.svg (added)
+++ client/resources/img/component/chevron-down-solid-w.svg
@@ -0,0 +1,1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#ffffff" d="M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z"/></svg>(파일 끝에 줄바꿈 문자 없음)
 
client/resources/img/component/chevron-down.svg (added)
+++ client/resources/img/component/chevron-down.svg
@@ -0,0 +1,1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z" /></svg>(파일 끝에 줄바꿈 문자 없음)
 
client/resources/img/component/chevron-up-solid-w.svg (added)
+++ client/resources/img/component/chevron-up-solid-w.svg
@@ -0,0 +1,1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#ffffff" d="M233.4 105.4c12.5-12.5 32.8-12.5 45.3 0l192 192c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L256 173.3 86.6 342.6c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l192-192z"/></svg>(파일 끝에 줄바꿈 문자 없음)
 
client/resources/img/component/chevron-up.svg (added)
+++ client/resources/img/component/chevron-up.svg
@@ -0,0 +1,1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7.41,15.41L12,10.83L16.59,15.41L18,14L12,8L6,14L7.41,15.41Z" /></svg>(파일 끝에 줄바꿈 문자 없음)
 
client/resources/img/component/file-solid-b.svg (added)
+++ client/resources/img/component/file-solid-b.svg
@@ -0,0 +1,1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#333333" d="M0 64C0 28.7 28.7 0 64 0H224V128c0 17.7 14.3 32 32 32H384V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V64zm384 64H256V0L384 128z"/></svg>(파일 끝에 줄바꿈 문자 없음)
 
client/resources/img/component/file-solid-w.svg (added)
+++ client/resources/img/component/file-solid-w.svg
@@ -0,0 +1,1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#ffffff" d="M0 64C0 28.7 28.7 0 64 0H224V128c0 17.7 14.3 32 32 32H384V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V64zm384 64H256V0L384 128z"/></svg>(파일 끝에 줄바꿈 문자 없음)
 
client/resources/img/component/file.svg (added)
+++ client/resources/img/component/file.svg
@@ -0,0 +1,1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13,9V3.5L18.5,9M6,2C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6Z" /></svg>(파일 끝에 줄바꿈 문자 없음)
 
client/resources/img/component/star-solid.svg (added)
+++ client/resources/img/component/star-solid.svg
@@ -0,0 +1,1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#005aab" d="M316.9 18C311.6 7 300.4 0 288.1 0s-23.4 7-28.8 18L195 150.3 51.4 171.5c-12 1.8-22 10.2-25.7 21.7s-.7 24.2 7.9 32.7L137.8 329 113.2 474.7c-2 12 3 24.2 12.9 31.3s23 8 33.8 2.3l128.3-68.5 128.3 68.5c10.8 5.7 23.9 4.9 33.8-2.3s14.9-19.3 12.9-31.3L438.5 329 542.7 225.9c8.6-8.5 11.7-21.2 7.9-32.7s-13.7-19.9-25.7-21.7L381.2 150.3 316.9 18z"/></svg>(파일 끝에 줄바꿈 문자 없음)
 
client/resources/img/component/star.svg (added)
+++ client/resources/img/component/star.svg
@@ -0,0 +1,1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12,17.27L18.18,21L16.54,13.97L22,9.24L14.81,8.62L12,2L9.19,8.62L2,9.24L7.45,13.97L5.82,21L12,17.27Z" /></svg>(파일 끝에 줄바꿈 문자 없음)
 
client/resources/img/component/user-solid.svg (added)
+++ client/resources/img/component/user-solid.svg
@@ -0,0 +1,1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#005aab" d="M224 256A128 128 0 1 0 224 0a128 128 0 1 0 0 256zm-45.7 48C79.8 304 0 383.8 0 482.3C0 498.7 13.3 512 29.7 512H418.3c16.4 0 29.7-13.3 29.7-29.7C448 383.8 368.2 304 269.7 304H178.3z"/></svg>(파일 끝에 줄바꿈 문자 없음)
 
client/resources/img/component/xmark-solid.svg (added)
+++ client/resources/img/component/xmark-solid.svg
@@ -0,0 +1,1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#005aab" d="M342.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 210.7 86.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L146.7 256 41.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192 301.3 297.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.3 256 342.6 150.6z"/></svg>(파일 끝에 줄바꿈 문자 없음)
 
client/views/index.html (added)
+++ client/views/index.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="UTF-8">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge">
+        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+        <meta name="description" content="Node Vue Web">
+        <link rel="stylesheet" href="/client/resources/css/font.css">
+        <link rel="stylesheet" href="/client/resources/css/reset.css">
+        <link rel="stylesheet" href="/client/resources/css/layout.css">
+        <link rel="stylesheet" href="/client/resources/css/grid.css">
+        <link rel="stylesheet" href="/client/resources/css/component.css">
+        <link rel="stylesheet" href="/client/resources/css/style.css">
+        <link rel="stylesheet" href="/client/resources/css/responsive.css">
+        <title>AJIN</title>
+    </head>
+
+    <body>
+        <div id="root" ></div>
+        <script src="/client/build/bundle.js"></script>
+    </body>
+</html>(파일 끝에 줄바꿈 문자 없음)
 
client/views/index.js (added)
+++ client/views/index.js
@@ -0,0 +1,12 @@
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : Vue를 활용한 Client단 구현의 시작점(Index) Component 입니다.
+ */
+import { createApp } from 'vue';
+
+import AppRouter from './pages/AppRouter.js';
+import App from './pages/App.vue';
+
+// const vue = createApp(App).mount('#root');
+const vue = createApp(App).use(AppRouter).mount('#root');(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/AccountingManagement/BaselineInformation/Bi001.vue (added)
+++ client/views/pages/AccountingManagement/BaselineInformation/Bi001.vue
@@ -0,0 +1,340 @@
+<template>
+    <div class="gd-10 Bi001-page container">
+        <div class="wrap pd2 flex-column">
+            <div class="wrap-title pb1 mb1 flex justify-between">
+                <h1>(회계) 공동 코드 등록</h1>
+                <div class="flex justify-end  gd-5">
+
+                    <div class="flex justify-between button-wrap">
+                        <button class="rest-btn">초기화</button>
+                        <button class="save-btn">저장</button>
+                    </div>
+
+
+                </div>
+            </div>
+            <div class="container  flex">
+                <div class="content gd-2 list-wrap  flex-column ">
+                    <div class="content-title flex justify-between mb1">
+                        분류목록
+                    </div>
+                    <div class="content-table pd4 ">
+                        <div class="box-overflow">
+
+                            <table class="list-table">
+                                <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 -->
+                                <colgroup>
+                                    <col style="width: 20%;">
+                                    <col style="width: 80%;">
+    
+                                </colgroup>
+                                <thead>
+                                    <tr class="table-header"
+                                        style="background-color: var(--tableblue); color: var(--navbarblue); ">
+                                        <th>코드분류</th>
+                                        <th>코드분류명</th>
+    
+                                    </tr>
+                                </thead>
+                                <tbody class="table-border">
+                                    <tr v-for="(codeNum) in codeList" key="codeNum.id">
+                                        <td :class="{ 'selected': selectedId === codeNum.id }">{{ codeNum.pathNum }}</td>
+                                        <td @click="clickCodeName(codeNum.id)"
+                                            :class="{ 'selected': selectedId === codeNum.id }" class="wrap-text">{{
+                                        codeNum.pathName }}</td>
+    
+                                    </tr>
+    
+    
+                                </tbody>
+                            </table>
+                        </div>
+                    </div>
+
+                </div>
+                <div class="content gd-10 flex-column content-wrap" style="width: 100%;">
+                    <div>
+                        <div class="content-title mb1 list-box">코드등록</div>
+                        <div class="code-area table-input">
+
+                            <table>
+
+                                <tbody v-for="(codeInput, id) in filteredCodeBox" :key="id" class="filter-table">
+                                    <tr>
+                                        <th class="blue-text text-befor">분류코드</th>
+                                        <td><input type="text" name="" id=""></td>
+                                        <th class="blue-text text-befor">분류명</th>
+                                        <td><input type="text" name="" id=""></td>
+                                        <th class="blue-text text-befor">코드</th>
+                                        <td><input style="width: 50px;" type="text" name="" id=""></td>
+                                        <th>정렬순서</th>
+                                        <td><input style="width: 50px;" type="text" name="" id=""></td>
+                                        <th class="blue-text text-befor">사용여부</th>
+                                        <td><input type="checkbox" name="" id="" class="ui-checkbox"></td>
+                                    </tr>
+                                    <tr v-show="activeItemId === codeInput.id">
+                                        <th>코드명</th>
+                                        <td><input type="text" name="" id=""></td>
+                                        <th>코드약명</th>
+                                        <td><input type="text" name="" id=""></td>
+
+                                        <th>{{ codeInput.pathName1 }}</th>
+                                        <td><input type="text" name="" id=""></td>
+                                        <th>{{ codeInput.pathName2 }}</th>
+                                        <td colspan="4"><input type="text" name="" id=""></td>
+
+                                    </tr>
+                                </tbody>
+                                <tbody v-for="(codeInput, id) in filteredCodeBox" :key="id" class="filter-table">
+                                    <tr>
+                                        <th>{{ codeInput.pathName3 }}</th>
+                                        <td><input type="text" name="" id=""></td>
+                                        <th>{{ codeInput.pathName4 }}</th>
+                                        <td><input type="text" name="" id=""></td>
+                                        <th>{{ codeInput.pathName5 }}</th>
+                                        <td><input type="text" name="" id=""></td>
+                                        <th>{{ codeInput.pathName6 }}</th>
+                                        <td colspan="3"><input type="text" name="" id=""></td>
+
+                                    </tr>
+                                </tbody>
+                                <tbody v-for="(codeInput, id) in filteredCodeBox" :key="id" class="filter-table">
+                                    <tr>
+                                        <th>{{ codeInput.pathName7 }}</th>
+                                        <td><input type="text" name="" id=""></td>
+                                        <th>{{ codeInput.pathName8 }}</th>
+                                        <td><input type="text" name="" id=""></td>
+                                        <th>{{ codeInput.pathName9 }}</th>
+                                        <td><input type="text" name="" id=""></td>
+                                        <th>{{ codeInput.pathName10 }}</th>
+                                        <td colspan="3"><input type="text" name="" id=""></td>
+
+                                    </tr>
+                                </tbody>
+
+                            </table>
+
+
+
+
+                        </div>
+                    </div>
+                    <div class="table-border ">
+                        <div class="content-title mb1">코드목록</div>
+                        <div class="box-overflow">
+
+
+                            <table class="list-table">
+                                <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 -->
+                                <colgroup>
+                                    <col style="width: 5%;">
+                                    <col style="width: 10%;">
+                                    <col style="width: 5%;">
+                                    <col style="width: 5%;">
+                                    <col style="width: 5%;">
+                                    <col style="width: 5%;">
+                                    <col style="width: 5%;">
+                                    <col style="width: 5%;">
+                                    <col style="width: 5%;">
+                                    <col style="width: 5%;">
+                                    <col style="width: 5%;">
+                                    <col style="width: 5%;">
+                                    <col style="width: 5%;">
+                                    <col style="width: 5%;">
+                                    <col style="width: 5%;">
+                                    <col style="width: 5%;">
+                                    <col style="width: 5%;">
+
+
+
+                                </colgroup>
+                                <thead class="list-table">
+                                    <tr v-for="(codeInput, id) in filteredCodeBox" :key="id"
+                                        style="background-color: var(--tableblue);">
+                                        <th>코드</th>
+                                        <th>코드명칭</th>
+                                        <th>코드약칭</th>
+                                        <th>정렬순서</th>
+                                        <th>사용</th>
+                                        <th class="wrap-text">{{ codeInput.pathName1 }}</th>
+                                        <th>{{ codeInput.pathName2 }}</th>
+                                        <th>{{ codeInput.pathName3 }}</th>
+                                        <th>{{ codeInput.pathName4 }}</th>
+                                        <th>{{ codeInput.pathName5 }}</th>
+                                        <th>{{ codeInput.pathName6 }}</th>
+                                        <th>{{ codeInput.pathName7 }}</th>
+                                        <th>{{ codeInput.pathName8 }}</th>
+                                        <th>{{ codeInput.pathName9 }}</th>
+                                        <th>{{ codeInput.pathName10 }}</th>
+                                        <th>{{ codeInput.pathName11 }}</th>
+                                        <th class="wrap-text">{{ codeInput.pathName12 }}</th>
+
+
+
+                                    </tr>
+                                </thead>
+                                <tbody>
+                                    <tr>
+                                        <td>000101</td>
+                                        <td>합계잔액시산표</td>
+                                        <td></td>
+                                        <td>0</td>
+                                        <td><input type="checkbox" checked name="" id="" class="ui-checkbox"></td>
+                                        <td></td>
+                                        <td></td>
+                                        <td></td>
+                                        <td></td>
+                                        <td></td>
+                                        <td></td>
+                                        <td></td>
+                                        <td></td>
+                                        <td></td>
+                                        <td></td>
+                                        <td></td>
+                                        <td></td>
+                                    </tr>
+
+                                    <tr v-if="postList === 0">
+                                        <td colspan="5" class="no-list">검색조건에 해당하는 데이터가 없습니다.</td>
+                                    </tr>
+                                </tbody>
+                            </table>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            activeItemId: 0,
+            selectedId: null,
+            codeList: [
+                { id: 0, pathNum: "001", pathName: "제무제표양식종류", selected: true },
+                { id: 1, pathNum: "002", pathName: "증빙구분" },
+                { id: 2, pathNum: "003", pathName: "카드번호" },
+                { id: 3, pathNum: "004", pathName: "사업장(회계)" },
+                { id: 4, pathNum: "005", pathName: "국세청전자(세금)계산서 수정사유코드" },
+                { id: 5, pathNum: "006", pathName: "은행코드" },
+                { id: 6, pathNum: "007", pathName: "지급조건" },
+                { id: 7, pathNum: "008", pathName: "어음종류" },
+                { id: 8, pathNum: "009", pathName: "어음구분" },
+                { id: 9, pathNum: "010", pathName: "차입종류" },
+                { id: 10, pathNum: "011", pathName: "원금상환방법" },
+                { id: 11, pathNum: "012", pathName: "이자납입방법" },
+                { id: 12, pathNum: "013", pathName: "전표결제진행상태" },
+                { id: 13, pathNum: "014", pathName: "사원번호별 계정과목 조회(사번)" },
+                { id: 14, pathNum: "015", pathName: "국책과제 카드" },
+            ],
+            codeBox: [
+                // 제무제표양식종류
+                { id: 0, pathName1: "관리항목1", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" },
+                // 증빙구분
+                { id: 1, pathName1: "관리항목1", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" },
+                // 카드번호
+                { id: 2, pathName1: "카드번호", pathName2: "사업장구분", pathName3: "관리부서코드", pathName4: "NBS코드", pathName5: "카드수령일", pathName6: "유형", pathName7: "한도", pathName8: "유효기간(CVC)", pathName9: "사용부서명", pathName10: "담당자/부서장", pathName11: "관리항목11", pathName12: "관리항목12" },
+                // 사업장(회계)
+                { id: 3, pathName1: "법인번호", pathName2: "사업자번호", pathName3: "대표자명", pathName4: "업태", pathName5: "종목", pathName6: "대표전화", pathName7: "사업장주소", pathName8: "설립년도", pathName9: "사업장 정식명칭", pathName10: "유형", pathName11: "관리항목11", pathName12: "관리항목12" },
+                // 국세청전자(세금)계산서 수정사유코드
+                { id: 4, pathName1: "관리항목1", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" },
+                // 은행코드
+                { id: 5, pathName1: "NBS은행코드", pathName2: "어음할인율(%)", pathName3: "할인한도액", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" },
+                // 지급조건
+                { id: 6, pathName1: "현금/어음/법인카드", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" },
+                // 어음종류
+                { id: 7, pathName1: "관리항목1", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" },
+                // 어음구분
+                { id: 8, pathName1: "관리항목1", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" },
+                // 차입종류
+                { id: 9, pathName1: "관리항목1", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" },
+                // 원금상환방법
+                { id: 10, pathName1: "관리항목1", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" },
+                // 이자납입방법
+                { id: 11, pathName1: "관리항목1", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" },
+                // 전표결제진행상태
+                { id: 12, pathName1: "관리항목1", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" },
+                // 전표결재진행상태
+                { id: 13, pathName1: "계정과목  (,로구분)", pathName2: "관리항목2", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" },
+                // 국책과제 카드
+                { id: 14, pathName1: "프로젝트 코드", pathName2: "사업장구분", pathName3: "관리항목3", pathName4: "관리항목4", pathName5: "관리항목5", pathName6: "관리항목6", pathName7: "관리항목7", pathName8: "관리항목8", pathName9: "관리항목9", pathName10: "관리항목10", pathName11: "관리항목11", pathName12: "관리항목12" },
+            ]
+        }
+    },
+    created() {
+        if (this.codeList.length > 0) {
+            this.selectedId = this.codeList[0].id;  // 첫 번째 항목의 id를 선택합니다.
+        }
+    },
+    methods: {
+        clickCodeName(id) {
+            console.log(id);
+            this.activeItemId = id;
+            this.selectedId = id;
+            console.log(`ID: ${this.activeItemId}`);
+        }
+    },
+    watch: {
+
+    },
+    computed: {
+        filteredCodeBox() {
+            return this.codeBox.filter(codeInput => this.activeItemId === codeInput.id);
+        },
+
+    },
+    mounted() {
+        console.log('Main mounted');
+    }
+}
+</script>
+
+<style scoped>
+.wrap {
+    width: 100%;
+    height: 100%;
+}
+
+.content-wrap {
+    padding-left: 30px;
+    gap: 30px;
+}
+
+.container {
+    width: 100%;
+    height: 100%;
+    flex-wrap: nowrap;
+}
+
+
+td,
+th {
+    padding: 5px 0;
+    text-align: center;
+    cursor: pointer;
+}
+
+.table-border td,
+.table-border th,
+.table-header th {
+    border-bottom: 1px solid var(--borderlightgray);
+    border-right: 1px solid var(--borderlightgray);
+
+}
+
+.list-table th {
+    color: var(--navbarblue);
+}
+
+.filter-table th {
+    text-align: left;
+}
+
+.wrap-text {
+    word-break: keep-all;
+}
+</style>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/AccountingManagement/BaselineInformation/Bi002.vue (added)
+++ client/views/pages/AccountingManagement/BaselineInformation/Bi002.vue
@@ -0,0 +1,426 @@
+<template>
+    <div class="gd-10 Bi002-page container">
+        <div class="wrap pd2 flex-column">
+            <div class="wrap-title pb1 mb1 flex justify-between">
+                <h1>거래처 정보 등록</h1>
+                <div class="flex justify-end  gd-5">
+
+                    <div class="flex justify-between button-wrap">
+                        <button class="rest-btn">초기화</button>
+                        <button class="save-btn">저장</button>
+                        <button class="del-btn">삭제</button>
+                    </div>
+
+                </div>
+            </div>
+            <div class="content  flex-column">
+                <div class="row">
+                    <div class="content-title flex justify-between mb1">
+                        조회조건
+                    </div>
+                    <div class="flex justify-between pb1" style="border-bottom: 2px solid var(--bordergray);">
+
+                        <div class="flex justify-start box-wrap gd-10">
+
+                            <div class="flex mr5">
+                                <div>
+                                    <p class="blue-text">사업장</p>
+                                </div>
+                                <select name="" id="" style="width: 150px;">
+                                    <option value="본점">본점(제지)</option>
+                                    <option value="본점(포장)">본점(포장)</option>
+                                    <option value="에너지솔루션(주)">에너지솔루션(주)</option>
+                                </select>
+                            </div>
+                        </div>
+                        <div class="flex align-center">
+                            <button class="blue-btn">조회</button>
+                        </div>
+
+
+                    </div>
+                </div>
+            </div>
+            <div class="gd-12 flex">
+
+                <div class="gd-5" style="width: 100%; height: 100px;">
+                    <div class="content-title flex justify-between pt2 pb2">
+                        거래처 정보
+                    </div>
+                    <div style="border-bottom: 2px solid var(--borderlightgray);">
+                        <table class="list-table">
+                            <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 -->
+                            <colgroup>
+                                <col style="width: 10%;">
+                                <col style="width: 20%;">
+                                <col style="width: 20%;">
+                                <col style="width: 5%;">
+                                <col style="width: 5%;">
+                                <col style="width: 5%;">
+                                <col style="width: 5%;">
+                                <col style="width: 5%;">
+                                <col style="width: 5%;">
+                                <col style="width: 5%;">
+                                <col style="width: 5%;">
+
+                            </colgroup>
+                            <thead>
+                                <tr class="table-header">
+                                    <th>코드</th>
+                                    <th>거래처명</th>
+                                    <th>사업자번호</th>
+                                    <th>매입</th>
+                                    <th>매출</th>
+                                    <th>회계</th>
+                                    <th>영업</th>
+                                    <th>원자재</th>
+                                    <th>부자재</th>
+                                    <th>폐기물</th>
+                                    <th>약품</th>
+
+                                </tr>
+                            </thead>
+                            <tbody class="table-border">
+                                <tr v-for="(codeNum) in codeList" key="codeNum.id">
+                                    <td>{{ codeNum.pathNum }}</td>
+                                    <td>{{ codeNum.pathName }}</td>
+                                    <td>{{ codeNum.businessNum }}</td>
+                                    <td><input type="checkbox" class="ui-checkbox"></td>
+                                    <td><input type="checkbox" class="ui-checkbox"></td>
+                                    <td><input type="checkbox" class="ui-checkbox"></td>
+                                    <td><input type="checkbox" class="ui-checkbox"></td>
+                                    <td><input type="checkbox" class="ui-checkbox"></td>
+                                    <td><input type="checkbox" class="ui-checkbox"></td>
+                                    <td><input type="checkbox" class="ui-checkbox"></td>
+                                    <td><input type="checkbox" class="ui-checkbox"></td>
+                                </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                    <div class="flex justify-end">
+                        <button>거래처 찾기</button>
+                    </div>
+                </div>
+                <div class="gd-7 flex-column" style="padding-left: 30px;">
+                    <div class="content-title flex justify-between ">
+                        거래처 등록
+                    </div>
+                    <div class=" flex section-wrap pd3" style="gap: 30px;">
+                        <table class="Bi002-table flex">
+                            <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 -->
+                            <colgroup>
+                                <col style="width: 15%;">
+                                <col style="width: 15%;">
+                                <col style="width: 15%;">
+                                <col style="width: 15%;">
+                                <col style="width: 15%;">
+
+
+
+                            </colgroup>
+                            <tbody>
+                                <tr>
+                                    <th>코드</th>
+                                    <td><input type="text" name="" id=""></td>
+                                    <td><button>거래처복사</button></td>
+                                </tr>
+                                <tr>
+                                    <th>거래처명</th>
+                                    <td><input type="text" name="" id=""></td>
+                                    <th>약칭명</th>
+                                    <td><input type="text" name="" id=""></td>
+                                </tr>
+                                <tr>
+                                    <th>사업자번호</th>
+                                    <td class="input-box flex">
+                                        <input type="text" name="" id="">
+                                        <input type="text" name="" id="">
+                                    </td>
+                                    <th>종사업자번호</th>
+                                    <td class="input-box flex">
+                                        <input type="text" name="" id="">
+                                        <input type="text" name="" id="">
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <th>법인/주민번호</th>
+                                    <td class="flex input-box">
+                                        <input type="text" name="" id="">
+                                        <input type="text" name="" id="">
+                                    </td>
+                                    <th>세금계산서종류</th>
+                                    <td class="flex input-box">
+                                        <select name="" id="">
+                                            <option value="">전자세금계산서</option>
+                                            <option value="">종이세금계산서</option>
+                                            <option value="">기타</option>
+                                        </select>
+                                        <input type="text" name="" id="">
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <th>대표자명</th>
+                                    <td class=" input-box flex">
+                                        <input type="text" name="" id="">
+                                        <!-- <input type="text" name="" id=""> -->
+                                    </td>
+                                    <th>홈페이지</th>
+                                    <td>
+                                        <input type="text" name="" id="">
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <th>업태</th>
+                                    <td class=" input-box flex">
+                                        <input type="text" name="" id="">
+                                    </td>
+                                    <th>종목</th>
+                                    <td>
+                                        <input type="text" name="" id="">
+                                    </td>
+                                </tr>
+                                <tr class="address-row">
+                                    <th>사업장주소</th>
+                                    <th>
+                                        <input type="text" name="" id="">
+                                        <button>검색</button>
+                                    </th>
+                                    <td colspan="3">
+                                        <input type="text" name="" id="">
+
+                                    </td>
+
+
+                                </tr>
+                                <tr>
+
+                                    <th>전화번호</th>
+                                    <td class="input-box flex">
+                                        <input type="text" name="" id="">
+                                        <input type="text" name="" id="">
+                                    </td>
+
+                                    <th>팩스번호</th>
+                                    <td class="input-box flex">
+                                        <input type="text" name="" id="">
+                                        <input type="text" name="" id="">
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <th>사업자구분</th>
+                                    <td class="flex">
+                                        <select name="" id="">
+                                            <option value="">법인</option>
+                                            <option value="">개인</option>
+                                        </select>
+                                    </td>
+                                    <th>해외여부</th>
+                                    <td class="input-box flex">
+                                        <select name="" id="">
+                                            <option value="">국내</option>
+                                            <option value="">해외</option>
+                                        </select>
+                                        <input type="text" name="" id="">
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <th>과세구분</th>
+                                    <td class="flex">
+                                        <select name="" id="">
+                                            <option value="">과세</option>
+                                            <option value="">면세</option>
+                                        </select>
+                                    </td>
+                                    <th>거래코드</th>
+                                    <td class="input-box flex">
+                                        <select name="" id="">
+                                            <option value="">내수</option>
+                                            <option value="">Local</option>
+                                            <option value="">직수출</option>
+                                        </select>
+                                        <input type="text" name="" id="">
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <th>특수관계자</th>
+                                    <td>
+                                        <select name="" id="">
+                                            <option value="">일반</option>
+                                        </select>
+                                    </td>
+                                    <th>계약기간</th>
+                                    <td class="input-box flex">
+                                        <input class=" mr1" type="date" id="date" value="2024-03-04">~
+                                        <input class=" mr1" type="date" id="date" value="2024-03-04">
+
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <th>담당자1</th>
+                                    <td class="input-box flex">
+                                        <input type="text" name="" id="">
+                                        <input type="text" name="" id="">
+                                    </td>
+                                    <th>담당자2</th>
+                                    <td class="input-box flex">
+                                        <input type="text" name="" id="">
+                                        <input type="text" name="" id="">
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <th>모바일번호1</th>
+                                    <td class="input-box flex">
+                                        <input type="text" name="" id="">
+                                        <input type="text" name="" id="">
+                                    </td>
+                                    <th>모바일번호2</th>
+                                    <td class="input-box flex">
+                                        <input type="text" name="" id="">
+                                        <input type="text" name="" id="">
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <th>이메일1</th>
+                                    <td>
+                                        <input type="text" name="" id="">
+                                    </td>
+                                    <th>이메일2</th>
+                                    <td>
+                                        <input type="text" name="" id="">
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <th>거래여부</th>
+                                    <td>
+                                        <input type="checkbox" name="" id="a">
+                                        <label for="a">거래</label>
+                                        <input type="checkbox" name="" id="b">
+                                        <label for="b">중지</label>
+                                    </td>
+                                    <th>지급조건</th>
+                                    <td>
+                                        <select name="" id="">
+                                            <option value="">현금 1개월</option>
+                                            <option value="">현금 2개월</option>
+                                            <option value="">현금 3개월</option>
+                                            <option value="">현금 중간결제</option>
+                                            <option value="">현금 매월25일</option>
+                                            <option value="">현금 매월27일</option>
+                                            <option value="">현금 매월말일</option>
+                                            <option value="">어음 1개월 초</option>
+                                            <option value="">어음 1개월 중</option>
+                                            <option value="">어음 1개월 말</option>
+                                            <option value="">어음 2개월 초</option>
+                                            <option value="">어음 2개월 중</option>
+                                            <option value="">어음 2개월 말</option>
+                                            <option value="">어음 3개월 초</option>
+                                            <option value="">어음 3개월 중</option>
+                                            <option value="">어음 3개월 말</option>
+                                            <option value="">법인카드</option>
+                                        </select>
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <th>거래구분</th>
+                                    <td>
+                                        <input type="checkbox" name="" id="a">
+                                        <label for="a">매입</label>
+                                        <input type="checkbox" name="" id="b">
+                                        <label for="b">매출</label>
+                                    </td>
+                                    <td colspan="6">
+                                        <input type="text">
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <th>사용처</th>
+                                    <th colspan="6">
+                                        <input type="checkbox" name="" id="c">
+                                        <label for="c">회계</label>
+                                        <input type="checkbox" name="" id="c">
+                                        <label for="c">영업</label>
+                                        <input type="checkbox" name="" id="c">
+                                        <label for="c">원자재</label>
+                                        <input type="checkbox" name="" id="c">
+                                        <label for="c">부자재</label>
+                                        <input type="checkbox" name="" id="c">
+                                        <label for="c">폐기물</label>
+                                        <input type="checkbox" name="" id="c">
+                                        <label for="c">약품</label>
+                                    </th>
+                                </tr>
+                            </tbody>
+                        </table>
+
+                    </div>
+                    <div class=" flex section-wrap pd3" style="gap: 30px; background-color: ">
+                        <table class="list-table">
+                            <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 -->
+                            <colgroup>
+                                <col style="width: ;">
+                                <col style="width: ;">
+                                <col style="width: ;">
+                                <col style="width: ;">
+                            </colgroup>
+                            <thead>
+                                <tr class="table-header">
+                                    <th>No</th>
+                                    <th>user ID</th>
+                                    <th>이름</th>
+                                    <th>생년월일</th>
+                                    <th>성별</th>
+                                </tr>
+                            </thead>
+                            <tbody>
+                                <tr>
+                                    <td>1</td>
+                                    <td>test123</td>
+                                    <td>홍길동</td>
+                                    <td>1999.01.01</td>
+                                    <td>여</td>
+                                </tr>
+                                <tr>
+                                    <td>1</td>
+                                    <td>test123</td>
+                                    <td>홍길동</td>
+                                    <td>1999.01.01</td>
+                                    <td>여</td>
+                                </tr>
+                                <tr v-if="postList === 0">
+                                    <td colspan="5" class="no-list">검색조건에 해당하는 데이터가 없습니다.</td>
+                                </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            codeList: [
+                { pathNum: "01001", pathName: "원자재거래처 테스트", businessNum: "123-45-67890", }
+            ]
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Main mounted');
+    }
+}
+</script>
+
+<style></style>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/AccountingManagement/BaselineInformation/Bi003.vue (added)
+++ client/views/pages/AccountingManagement/BaselineInformation/Bi003.vue
@@ -0,0 +1,28 @@
+<template>
+    <div class="row gd-10" >Main.vue</div>
+
+</template>
+
+<script>
+export default {
+    data () {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Main mounted');
+    }
+}
+</script>
+<style>
+
+</style>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/AccountingManagement/BaselineInformation/Bi004.vue (added)
+++ client/views/pages/AccountingManagement/BaselineInformation/Bi004.vue
@@ -0,0 +1,28 @@
+<template>
+    <div class="row gd-10" >Main.vue</div>
+
+</template>
+
+<script>
+export default {
+    data () {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Main mounted');
+    }
+}
+</script>
+<style>
+
+</style>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/AccountingManagement/BaselineInformation/Bi005.vue (added)
+++ client/views/pages/AccountingManagement/BaselineInformation/Bi005.vue
@@ -0,0 +1,28 @@
+<template>
+    <div class="row gd-10" >Main.vue</div>
+
+</template>
+
+<script>
+export default {
+    data () {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Main mounted');
+    }
+}
+</script>
+<style>
+
+</style>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/AccountingManagement/BaselineInformation/Bi006.vue (added)
+++ client/views/pages/AccountingManagement/BaselineInformation/Bi006.vue
@@ -0,0 +1,28 @@
+<template>
+    <div class="row gd-10" >Main.vue</div>
+
+</template>
+
+<script>
+export default {
+    data () {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Main mounted');
+    }
+}
+</script>
+<style>
+
+</style>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/AccountingManagement/BaselineInformation/Bi007.vue (added)
+++ client/views/pages/AccountingManagement/BaselineInformation/Bi007.vue
@@ -0,0 +1,28 @@
+<template>
+    <div class="row gd-10" >Main.vue</div>
+
+</template>
+
+<script>
+export default {
+    data () {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Main mounted');
+    }
+}
+</script>
+<style>
+
+</style>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/AccountingManagement/ChitManagement/Cm001.vue (added)
+++ client/views/pages/AccountingManagement/ChitManagement/Cm001.vue
@@ -0,0 +1,28 @@
+<template>
+    <div class="row gd-10" >Main.vue</div>
+
+</template>
+
+<script>
+export default {
+    data () {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Main mounted');
+    }
+}
+</script>
+<style>
+
+</style>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/AccountingManagement/ChitManagement/Cm002.vue (added)
+++ client/views/pages/AccountingManagement/ChitManagement/Cm002.vue
@@ -0,0 +1,489 @@
+<template>
+    <div class="gd-10 Bi001-page container">
+        <div class="wrap pd2 flex-column">
+            <div class="wrap-title pb1 mb1 flex justify-between">
+                <h1>전표 작성(일반)</h1>
+                <div class="flex justify-end  gd-5">
+
+                    <div class="flex justify-between button-wrap">
+                        <button class="rest-btn">초기화</button>
+                        <button class="save-btn">저장</button>
+                        <button class="del-btn">삭제</button>
+                    </div>
+
+                </div>
+            </div>
+            <div class="content  flex-column">
+                <div class="row">
+                    <div class="content-title flex justify-between mb1">
+                        조회조건
+                    </div>
+                    <div class="flex justify-between pb1" style="border-bottom: 2px solid var(--bordergray);">
+
+                        <div class="flex justify-start box-wrap gd-10">
+
+                            <div class="flex mr5">
+                                <div>
+                                    <p class="blue-text">사업장</p>
+                                </div>
+                                <select name="" id="" style="width: 150px;">
+                                    <option value="본점">본점(제지)</option>
+                                    <option value="본점(포장)">본점(포장)</option>
+                                    <option value="에너지솔루션(주)">에너지솔루션(주)</option>
+                                </select>
+                            </div>
+
+                            <div class="flex mr5">
+                                <div>
+                                    <p class="blue-text">발의 일자</p>
+                                </div>
+                                <input type="date" id="date" value="2024-03-04" style="width: 35%;">
+                                <p class="ml2">~</p>
+                                <input type="date" id="date" value="2024-03-04" style="width: 35%;">
+
+                            </div>
+                            <div class="flex justify-between mr5">
+                                <div>
+                                    <p class="blue-text">발의자</p>
+                                </div>
+                                <div class="flex  box-area">
+                                    <select name="" id="" class="flex30" >
+                                        <option value="">박정현(180516)</option>
+                                        <option value="">권문기(210702)</option>
+                                        <option value="">김황석(200702)</option>
+                                    </select>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="flex align-center">
+                            <button class="blue-btn">조회</button>
+                        </div>
+
+
+                    </div>
+                </div>
+
+                <div style="background-color: var(--tableblue); border-radius: 10px;"
+                    class="content-wrap pt1 pb1 mt1 mb1">
+
+                    <table class="form-table2 code-area">
+                        <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 -->
+                        <colgroup>
+                            <col style="width: 4%;">
+                            <col style="width: 15%;">
+                            <col style="width: 5%;">
+                            <col style="width: 15%;">
+                            <col style="width: 5%;">
+                        </colgroup>
+                        <tbody>
+                            <tr class="">
+                                <th colspan="1" class="blue-text">발의 일자</th>
+                                <td colspan="2">
+                                    <input class=" mr1" type="date" id="date" value="2024-03-04">~
+                                    <input class="content-w30 input-gray" type="text" id="date" placeholder="0012">
+                                </td>
+
+                                <td colspan="4" class="button-wrap">
+                                    <button class="">신규발의번호부여</button>
+                                    <button class="">상세내역초기화</button>
+                                    <button class="" @click="openModal">수입결제전표만들기</button>
+                                </td>
+                                <td class="button-wrap">
+                                </td>
+
+
+
+
+                            </tr>
+
+                            <tr class="content-area">
+                                <th class="blue-text">발의 부서</th>
+                                <td>
+                                    <input class="content-w30 input-gray mr1" type="text" id="date"
+                                        placeholder="103000">
+                                    <input class="content-w60 input-gray" type="text" id="date" placeholder="IT팀">
+                                </td>
+                                <th class="blue-text">발의자</th>
+                                <td>
+                                    <input class="content-w30 input-gray mr1" type="text" id="date"
+                                        placeholder="180516">
+                                    <input class="content-w60 input-gray" type="text" id="date" placeholder="박정현">
+                                </td>
+
+                                <th class="blue-text">차변합계</th>
+                                <td>
+                                    <input class="input-gray content-w40" type="text" id="date" placeholder="">
+                                </td>
+
+                                <th class="blue-text">대변합계</th>
+                                <td>
+                                    <input class="input-gray" type="text" id="date" placeholder="">
+                                </td>
+                                <th class="blue-text">차액</th>
+                                <td>
+                                    <input class="input-gray" type="text" id="date" placeholder="">
+                                </td>
+
+
+                            </tr>
+
+
+                        </tbody>
+                    </table>
+                </div>
+                <div class="flex" style="gap: 15px; height: 100% ; flex-wrap: nowrap;">
+                    <div class="gd-3 pd1 table-area">
+                        <div class="content-title flex justify-between mb1">
+                            전표목록
+                        </div>
+                        
+                        <div class="box-overflow">
+
+                            <table class="list-table">
+                                <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 -->
+                                <colgroup>
+                                    <col style="width: 10%;">
+                                    <col style="width: 15%;">
+                                    <col style="width: 20%;">
+                                    <col style="width: 10%;">
+                                    <col style="width: 10%;">
+
+                                </colgroup>
+                                <thead>
+                                    <tr class="table-header"
+                                        style="background-color: var(--tableblue); color: var(--navbarblue); ">
+                                        <th>선택</th>
+                                        <th>발의번호</th>
+                                        <th>전송일시</th>
+                                        <th>상태</th>
+                                        <th>자동</th>
+                                        <th>G/W</th>
+                                    </tr>
+                                </thead>
+                                <tbody>
+                                    <tr class="table-border">
+                                        <td><input type="checkbox"></td>
+                                        <td></td>
+                                        <td></td>
+                                        <td></td>
+                                        <td></td>
+                                        <td></td>
+                                    </tr>
+
+
+                                </tbody>
+                            </table>
+                        </div>
+                        <div class="button-wrap flex justify-end mb2">
+                        <button>전표 전송</button>
+                        <button style="border: 1px solid var(--red); color: var(--red);">전표 취소</button>
+                        <button>G/W 전송</button>
+                        </div>
+                    </div>
+                    <div class=" pd1 table-area content-wrap" style="width: 80%;">
+                        <div class="content-title flex justify-between mb1">
+                            전표등록
+                        </div>
+                        <div class="box-overflow ">
+
+                            <table class="list-table" >
+                                <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 -->
+                                <colgroup>
+                                    <col style="width: 10%;">
+                                    <col style="width: 10%;">
+                                    <col style="width: 10%;">
+                                    <col style="width: 10%;">
+                                    <col style="width: 10%;">
+                                    <col style="width: 10%;">
+                                    <col style="width: 10%;">
+                                    <col style="width: 10%;">
+                                    <col style="width: 10%;">
+                                </colgroup>
+
+
+                                <thead style="width: 100%;">
+                                    <tr class="table-header table-border"
+                                        style="background-color: var(--tableblue); color: var(--navbarblue); ">
+                                        <th rowspan="2">순번</th>
+                                        <th rowspan="2">계정과목</th>
+                                        <th>관리항목1</th>
+                                        <th>관리일자1</th>
+                                        <th>증빙</th>
+                                        <th>참고항목</th>
+                                        <th>환율</th>
+                                        <th rowspan="2">차변금액</th>
+                                        <th rowspan="2">대변금액</th>
+                                        <th rowspan="2">적요</th>
+                                    </tr>
+
+                                    <tr class="table-header table-border"
+                                        style="background-color: var(--tableblue); color: var(--navbarblue); ">
+                                        <th>관리항목2</th>
+                                        <th>관리일자2</th>
+                                        <th>비용부서</th>
+                                        <th>공급가액</th>
+                                        <th>외화금액($)</th>
+                                    </tr>
+                                </thead>
+                                <tbody class="box-overflow ">
+
+
+                                    <template v-for="(listNam, index) in listNam">
+                                        <tr class="table-header table-border">
+                                            <td rowspan="2">{{ listNam.no }}</td>
+                                            <td rowspan="2">{{ listNam.name }}</td>
+                                            <td>{{ listNam.list1 }}</td>
+                                            <td>{{ listNam.list2 }}</td>
+                                            <td>{{ listNam.list3 }}</td>
+                                            <td>{{ listNam.list4 }}</td>
+                                            <td>{{ listNam.list5 }}</td>
+                                            <td rowspan="2">{{ listNam.list6 }}</td>
+                                            <td rowspan="2">{{ listNam.list7 }}</td>
+                                            <td rowspan="2">{{ listNam.list8 }}</td>
+                                        </tr>
+                                        <tr class="table-header table-border">
+                                            <td>{{ listNam.list9 }}</td>
+                                            <td>{{ listNam.list10 }}</td>
+                                            <td>{{ listNam.list11 }}</td>
+                                            <td>{{ listNam.list12 }}</td>
+                                            <td>{{ listNam.list13 }}</td>
+                                        </tr>
+                                    </template>
+
+
+                                </tbody>
+                            </table>
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+
+        </div>
+        <!-- button 모달 -->
+        <div v-show="isModalOpen" class="modal-wrapper">
+            <div class="modal-container flex flex-column">
+                <div>
+                    <div class="modal-title mb2">
+                        <div class="flex justify-between">
+                            <h2>수입결제전표만들기</h2>
+                            <button class="close-btn " @click="closeModal"></button>
+                        </div>
+                    </div>
+                    <div class="flex button-wrap ">
+                        <p class="blue-text">조회조건</p>
+                        <input type="date" id="date">
+                        <p class="ml2">~</p>
+                        <input type="date" id="date">
+                        <button>조회</button>
+                    </div>
+                    <div class="modal-content-monthly ">
+                        <div>
+                            <p style="text-align: left; " class="blue-text"> 외화거래목록</p>
+                        </div>
+                        <div class="table-zone table-scroll">
+                            <table class="list-table">
+                                <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 -->
+                                <colgroup>
+                                    <col style="width: 10%;">
+                                    <col style="width: 10%;">
+                                    <col style="width: 10%;">
+                                    <col style="width: 10%;">
+                                    <col style="width: 10%;">
+                                </colgroup>
+                                <thead>
+                                    <tr class="table-header table-border "
+                                        style="background-color: var(--tableblue); color: var(--navbarblue); ">
+                                        <th>금융기관코드</th>
+                                        <th>금융기관코드</th>
+                                        <th>계좌번호</th>
+                                        <th>거래일자</th>
+                                        <th>일련번호</th>
+                                        <th>적요</th>
+                                        <th>통화구분</th>
+                                        <th>외화금액</th>
+                                        <th>원화금액</th>
+                                    </tr>
+                                </thead>
+                                <tbody>
+                                    <tr v-for="(modalWrap) in modalList" key="codeNum" style="overflow-y: scroll;">
+                                        <td>{{ modalWrap.code }}</td>
+                                        <td>{{ modalWrap.accountNum }}</td>
+                                        <td>{{ modalWrap.data }}</td>
+                                        <td>{{ modalWrap.pathNum }}</td>
+                                        <td>{{ modalWrap.detailName }}</td>
+                                        <td>{{ modalWrap.division }}</td>
+                                        <td>{{ modalWrap.foreignCurrency }}</td>
+                                        <td>{{ modalWrap.KRW }}</td>
+                                    </tr>
+
+                                </tbody>
+                            </table>
+                        </div>
+                    </div>
+                    <div>
+                        <div class="modal-content-monthly">
+                            <div class="flex justify-between mb1">
+                                <div class="flex button-wrap ">
+                                    <p style="text-align: left;" class="blue-text">선택내역</p>
+                                    <button>임시전표작성</button>
+                                </div>
+                                <div class="flex justify-end">
+                                    <p>차변합계</p>
+                                    <input type="text" class="content-w20">
+
+                                    <p class="ml1">대변합계</p>
+                                    <input type="text" class="content-w20">
+
+                                    <p class="ml1">차액</p>
+                                    <input type="text" class="content-w20">
+                                </div>
+                            </div>
+                            <div class="table-zone">
+                                <table class="list-table">
+                                    <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 -->
+                                    <colgroup>
+                                        <col style="width: 10%;">
+                                        <col style="width: 10%;">
+                                        <col style="width: 10%;">
+                                        <col style="width: 10%;">
+                                        <col style="width: 10%;">
+                                    </colgroup>
+                                    <thead>
+                                        <tr class="table-header table-border"
+                                            style="background-color: var(--tableblue); color: var(--navbarblue); ">
+                                            <th>순번</th>
+                                            <th>계정과목</th>
+                                            <th>관리항목1</th>
+                                            <th>관리항목2</th>
+                                            <th>환율</th>
+                                            <th>외화금액($)</th>
+                                            <th>차변금액</th>
+                                            <th>대변금액</th>
+                                            <th>적요</th>
+                                        </tr>
+                                    </thead>
+                                    <tbody>
+                                        <tr>
+                                            <td></td>
+                                        </tr>
+
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                        <div>
+                            <div class="flex button-wrap mb1">
+                                <p style="text-align: left;" class="blue-text">작성내역</p>
+                                <button>자동전표작성</button>
+                            </div>
+                            <div class="table-zone">
+                                <table class="list-table">
+                                    <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 -->
+                                    <colgroup>
+                                        <col style="width: 10%;">
+                                        <col style="width: 10%;">
+                                        <col style="width: 10%;">
+                                        <col style="width: 10%;">
+                                        <col style="width: 10%;">
+                                    </colgroup>
+                                    <thead>
+                                        <tr class="table-header table-border"
+                                            style="background-color: var(--tableblue); color: var(--navbarblue); ">
+                                            <th>순번</th>
+                                            <th>계정과목</th>
+                                            <th>관리항목1</th>
+                                            <th>관리항목2</th>
+                                            <th>환율</th>
+                                            <th>외화금액($)</th>
+                                            <th>차변금액</th>
+                                            <th>대변금액</th>
+                                            <th>적요</th>
+                                        </tr>
+                                    </thead>
+                                    <tbody>
+                                        <tr>
+                                            <td></td>
+                                        </tr>
+
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+
+export default {
+
+    data() {
+        return {
+            isModalOpen: false,
+            openModal: false,
+            modalList: [
+                {
+                    code: "003", accountNum: "6380000795600017", data: "2023-02-10", pathNum: "400", detailName: "외화송금출금",
+                    division: "USD", foreignCurrency: "10,000,00", KRW: "12,406,000"
+                },
+                {
+                    code: "003", accountNum: "6380000795600017", data: "2023-02-27", pathNum: "401", detailName: "외화송금출금",
+                    division: "USD", foreignCurrency: "10,995,00", KRW: "13,641,141"
+                },
+                {
+                    code: "003", accountNum: "6380000795600017", data: "2023-02-10", pathNum: "400", detailName: "외화송금출금",
+                    division: "USD", foreignCurrency: "10,000,00", KRW: "12,406,000"
+                },
+                {
+                    code: "003", accountNum: "6380000795600017", data: "2023-02-10", pathNum: "400", detailName: "외화송금출금",
+                    division: "USD", foreignCurrency: "10,000,00", KRW: "12,406,000"
+                },
+                {
+                    code: "003", accountNum: "6380000795600017", data: "2023-02-10", pathNum: "400", detailName: "외화송금출금",
+                    division: "USD", foreignCurrency: "10,000,00", KRW: "12,406,000"
+                },
+            ],
+            listNam: [
+                { no: "1", name: "과목", list1: "항목1", list2: "일자1", list3: "증빙", list4: "참고항목", list5: "환율", list6: "차변금액", list7: "대변금액", list8: "적요", list9: "항목2", list10: "일자2", list11: "비용부서", list12: "공급가액", list13: "외화" },
+                { no: "1", name: "과목", list1: "항목1", list2: "일자1", list3: "증빙", list4: "참고항목", list5: "환율", list6: "차변금액", list7: "대변금액", list8: "적요", list9: "항목2", list10: "일자2", list11: "비용부서", list12: "공급가액", list13: "외화" },
+                { no: "1", name: "과목", list1: "항목1", list2: "일자1", list3: "증빙", list4: "참고항목", list5: "환율", list6: "차변금액", list7: "대변금액", list8: "적요", list9: "항목2", list10: "일자2", list11: "비용부서", list12: "공급가액", list13: "외화" },
+                { no: "1", name: "과목", list1: "항목1", list2: "일자1", list3: "증빙", list4: "참고항목", list5: "환율", list6: "차변금액", list7: "대변금액", list8: "적요", list9: "항목2", list10: "일자2", list11: "비용부서", list12: "공급가액", list13: "외화" },
+                { no: "1", name: "과목", list1: "항목1", list2: "일자1", list3: "증빙", list4: "참고항목", list5: "환율", list6: "차변금액", list7: "대변금액", list8: "적요", list9: "항목2", list10: "일자2", list11: "비용부서", list12: "공급가액", list13: "외화" },
+                { no: "1", name: "과목", list1: "항목1", list2: "일자1", list3: "증빙", list4: "참고항목", list5: "환율", list6: "차변금액", list7: "대변금액", list8: "적요", list9: "항목2", list10: "일자2", list11: "비용부서", list12: "공급가액", list13: "외화" },
+
+
+            ]
+        }
+    },
+    methods: {
+        openModal() {
+            this.isModalOpen = true;
+        },
+        closeModal() {
+            this.isModalOpen = false;
+
+        }
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    components: {
+    },
+    mounted() {
+    }
+}
+</script>
+
+<style scoped>
+
+
+
+</style>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/App.vue (added)
+++ client/views/pages/App.vue
@@ -0,0 +1,61 @@
+<template>
+   <div class="flex-column layout-wrap" >
+      <!-- <Header></Header> -->
+      <Menu @itemSelected="handleItemSelected"></Menu>
+      <div class="wrapper flex" :class="loginUser != null ? 'main' : 'login'">
+         <SideMenu :selectedId="selectedId" class="gd-2"></SideMenu>
+         <router-view/>
+      </div>
+   </div>
+</template>
+
+<script>
+import Header from '../pages/layout/Header.vue';
+import Menu from '../pages/layout/Menu.vue';
+import SideMenu from '../pages/layout/sideMenu.vue';
+import axios from 'axios';
+
+const App = {
+  data: () => {
+    return {
+      selectedId: true,
+      SideMenu: true,
+      // store: store,
+      loginUser: null
+    }
+  },
+  methods: {
+    handleItemSelected(id) {
+      this.selectedId = id;
+    },
+    async fetchUser() {
+      try {
+        const response = await axios.get('/api/user');
+        this.loginUser = response.data;
+      } catch (error) {
+        console.error('Error fetching user:', error);
+      }
+    }
+  },
+  watch: {
+
+  },
+  computed: {
+
+  },
+  components: {
+    'Header': Header,
+    'Menu': Menu,
+    'SideMenu': SideMenu,
+  },
+  mounted() {
+    console.log('Vue mounted');
+    this.fetchUser();  // 로그인 상태 확인
+  }
+}
+
+export default App;
+</script>
+<style>
+
+</style>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/AppRouter.js (added)
+++ client/views/pages/AppRouter.js
@@ -0,0 +1,43 @@
+import { createWebHistory, createRouter } from "vue-router";
+
+import Main from "../pages/main/Main.vue";
+import Login from "../pages/login/Login.vue";
+
+// 기준정보 BaselinInformation
+import Bi001 from "./AccountingManagement/BaselineInformation/Bi001.vue";
+import Bi002 from "./AccountingManagement/BaselineInformation/Bi002.vue";
+import Bi003 from "./AccountingManagement/BaselineInformation/Bi003.vue";
+import Bi004 from "./AccountingManagement/BaselineInformation/Bi004.vue";
+import Bi005 from "./AccountingManagement/BaselineInformation/Bi005.vue";
+import Bi006 from "./AccountingManagement/BaselineInformation/Bi006.vue";
+import Bi007 from "./AccountingManagement/BaselineInformation/Bi007.vue";
+import Cm001 from "./AccountingManagement/ChitManagement/Cm001.vue";
+import Cm002 from "./AccountingManagement/ChitManagement/Cm002.vue";
+
+
+const routes = [
+  /* 메인화면 */
+  { path: "/", name: "/", component: Main },
+  { path: "/Login.page", name: "Login", component: Login },//로그인
+
+  // 기준정보 BaselinInformation
+  { path: "/Bi001.page", name: "Bi001", component: Bi001 }, //(회계)공동코드 등록
+  { path: "/Bi002.page", name: "Bi002", component: Bi002 }, //거래처정보 등록
+  { path: "/Bi003.page", name: "Bi003", component: Bi003 }, //계정과목 등록
+  { path: "/Bi004.page", name: "Bi004", component: Bi004 }, //재무제표 양식 등록
+  { path: "/Bi005.page", name: "Bi005", component: Bi005 }, //재무제표 계정설정등록
+  { path: "/Bi006.page", name: "Bi006", component: Bi006 }, //은행계좌 등록
+  { path: "/Bi007.page", name: "Bi007", component: Bi007 }, //거래처대장
+  // 전표관리
+  { path: "/Cm001.page", name: "Cm001", component: Cm001 }, //잔액 이월 전표등록
+  { path: "/Cm002.page", name: "Cm002", component: Cm002 }, //전표작성(일반)
+  
+
+];
+
+const AppRouter = createRouter({
+  history: createWebHistory(),
+  routes,
+});
+
+export default AppRouter;
 
client/views/pages/component/Button.vue (added)
+++ client/views/pages/component/Button.vue
@@ -0,0 +1,0 @@
 
client/views/pages/component/ModalComponent/AlertModal.vue (added)
+++ client/views/pages/component/ModalComponent/AlertModal.vue
@@ -0,0 +1,110 @@
+<template>
+    <div v-show="isModalOpen" class="modal-wrapper">
+        <div class="modal-container small-modal">
+            <div class="modal-title text-ct">
+                <h2>{{title}}</h2>
+            </div>
+            <div class="modal-content-monthly">
+                <p class="alert-write text-ct"  v-html="message">                   
+                </p>
+            </div>
+            <div class="modal-end flex justify-center">
+                <button class="gray-btn large-btn flex50" id="confirmCancle" @click="closeModal" v-show="confirmAt">취소</button>
+                <button class="blue-btn large-btn flex50" id="confirmOk" @click="closeModal">확인</button>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+
+export default {
+    props: {
+        title : {
+            type : String,
+            default : '모달 제목'
+        },
+        message : {
+            type : String,
+            default : '경고 메세지를 입력해주세요. <br /> 삭제,수정,추가 등등'
+        },
+    },
+    data() {
+        return {
+            isModalOpen: false,
+            activeTab: 'tab1',
+            modalType: 'tab-modal',
+            title : this.title,
+            message : this.message,
+            confirmAt : false
+        }
+    },
+    methods: {
+        // 탭 변경
+        showTab: function (tabName) {
+            this.activeTab = tabName;
+        },
+
+        // 닫기
+        closeModal:function(){
+            this.isModalOpen = false;
+        },
+
+        // 모달 호출
+        showModal : function(){
+            
+            this.confirmAt = false;
+            this.isModalOpen = true;
+            document.getElementById("confirmOk").focus()
+        },
+
+        // confirm 호출
+        showConfirm : async function(){
+            this.confirmAt = true;
+            this.isModalOpen = true;   
+            document.getElementById("confirmOk").focus()
+            const promise = new Promise((resolve, reject) => {               
+                document.getElementById("confirmCancle").addEventListener("click", async () => {   
+                    resolve('cancle')
+                });
+    
+                document.getElementById("confirmOk").addEventListener("click", async () => {                   
+                    resolve('ok')                 
+                });
+            });
+
+            return promise.then(
+                (id) => {         
+                    if(id == 'cancle'){
+                        return false;  
+                    }else if(id =='ok'){
+                        return true;          
+                    }
+                 
+                }     
+            );
+        },
+
+        setTitle : function(Title){
+            this.title = Title;
+        },
+
+        setMessage : function(message){
+            this.message = message;
+        },
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    components: {
+
+    },
+    mounted() {
+        console.log('main mounted');
+    }
+}
+</script>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/component/ModalComponent/FormModal.vue (added)
+++ client/views/pages/component/ModalComponent/FormModal.vue
@@ -0,0 +1,174 @@
+<template>
+    <div v-show="isModalOpen" class="modal-wrapper">
+        <div class="modal-container">
+            <div class="modal-title">
+                <div class="flex justify-between align-center">
+                    <h2>모달 제목</h2>
+                    <button class="close-btn" @click="closeModal"><svg-icon type="mdi"  :width="20" :height="20" :path="closePath"></svg-icon></button>
+                </div>
+            </div>
+            <div class="modal-content-monthly" v-show="modalType == 'tab-modal'">
+                <ul class="tab-nav flex justify-between">
+                    <li @click="showTab('tab1')" class="flex50"><a href="#tab01"
+                            :class="{ activeTab: activeTab === 'tab1' }">탭정보1</a></li>
+                    <li @click="showTab('tab2')" class="flex50"><a href="#tab02"
+                            :class="{ activeTab: activeTab === 'tab2' }">탭정보2</a></li>
+                </ul>
+                <ul class="tab-content">
+                    <li id="tab01" v-show="activeTab === 'tab1'">
+                        <table class="form-table">
+                            <colgroup>
+                                <col style="width: 15%;" />
+                                <col style="width: 85%;" />
+                            </colgroup>
+                            <tbody>
+                                <tr>
+                                    <th>파일명</th>
+                                    <td></td>
+                                </tr>
+                                <tr>
+                                    <th>API URL</th>
+                                    <td></td>
+                                </tr>
+                                <tr>
+                                    <th>결과타입</th>
+                                    <td>
+                                        <input type="radio" name="result-type" id="json" class="chekck-type" checked>
+                                        <label for="json" class="chekcktype-label">
+                                            json
+                                        </label>
+                                        <input type="radio" name="result-type" id="xml" class="chekck-type">
+                                        <label for="xml" class="chekcktype-label">
+                                            xml
+                                        </label>
+                                    </td>
+                                </tr>
+                            </tbody>
+                        </table>
+                        <table class="list-table">
+                            <thead>
+                                <tr>
+                                    <th>No</th>
+                                    <th>key</th>
+                                    <th>value</th>
+                                    <th>예외</th>
+                                    <th>날짜</th>
+                                    <th>삭제</th>
+                                </tr>
+                            </thead>
+                            <tbody>
+                                <tr>
+                                    <td>1</td>
+                                    <td>04:00:00</td>
+                                    <td>접속성공</td>
+                                    <td>접속성공</td>
+                                    <td>접속성공</td>
+                                    <td>접속성공</td>
+                                </tr>
+                            </tbody>
+                        </table>
+                    </li>
+                    <li id="tab01" v-show="activeTab === 'tab1'"></li>
+                </ul>
+            </div>
+            <div class="modal-content-monthly" v-show="modalType == 'form-modal'">
+                <table class="form-table">
+                    <colgroup>
+                        <col style="width: 15%;" />
+                        <col style="width: 85%;" />
+                    </colgroup>
+                    <tbody>
+                        <tr>
+                            <th>제목</th>
+                            <td></td>
+                        </tr>
+                        <tr>
+                            <th>DBMS</th>
+                            <td></td>
+                        </tr>
+                        <tr>
+                            <th>호스트</th>
+                            <td></td>
+                        </tr>
+                        <tr>
+                            <th>PORT</th>
+                            <td></td>
+                        </tr>
+                        <tr>
+                            <th>DB명</th>
+                            <td></td>
+                        </tr>
+                        <tr>
+                            <th>접속ID</th>
+                            <td></td>
+                        </tr>
+                        <tr>
+                            <th>접속PW</th>
+                            <td></td>
+                        </tr>
+                    </tbody>
+                </table>
+                <div class="flex justify-end">
+                    <button class="blue-btn small-btn">접속 테스트</button>
+                </div>
+                <table class="list-table orange">
+                    <thead>
+                        <tr>
+                            <th>No</th>
+                            <th>접속시간</th>
+                            <th>접속결과</th>
+                        </tr>
+                    </thead>
+                    <tbody>
+                        <tr>
+                            <td>1</td>
+                            <td>04:00:00</td>
+                            <td>접속성공</td>
+                        </tr>
+                    </tbody>
+                </table>
+            </div>
+            <div class="modal-end flex justify-end">
+                <button v-show="modalType === 'form-modal'" class="orange-btn small-btn">접속</button>
+                <button v-show="modalType === 'tab-modal'" class="blue-btn small-btn">확인</button>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+import SvgIcon from '@jamescoyle/vue-icon';
+import { mdiClose } from '@mdi/js';
+export default {
+    data() {
+        return {
+            isModalOpen: true,
+            activeTab: 'tab1',
+            // modalType: 'form-modal',
+             modalType: 'tab-modal',
+            closePath:mdiClose 
+        }
+    },
+    methods: {
+        // 탭 변경
+        showTab: function (tabName) {
+            this.activeTab = tabName;
+        },
+        closeModal:function(){
+            this.isModalOpen=false;
+        }
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    components: {
+        'SvgIcon':SvgIcon
+    },
+    mounted() {
+        console.log('main mounted');
+    }
+}
+</script>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/component/ModalComponent/ListModal.vue (added)
+++ client/views/pages/component/ModalComponent/ListModal.vue
@@ -0,0 +1,120 @@
+<template>
+    <div v-show="isModalOpen" class="modal-wrapper">
+        <div class="modal-container">
+            <div class="modal-title">
+                <div class="flex justify-between align-center">
+                    <h2>센서 알람 설정</h2>
+                    <button class="close-btn" @click="closeModal"><svg-icon type="mdi" :width="20" :height="20" :path="closePath"></svg-icon></button>
+                </div>
+            </div>
+            <div class="modal-content-monthly">
+                <div class="table-zone">
+                    <table class="list-table">
+                        <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 -->
+                        <colgroup>
+                            <col style="width: 22.5%;">
+                            <col style="width: 22.5%;">
+                            <col style="width: 22.5%;">
+                            <col style="width: 22.5%;">
+                            <col style="width: 10%;">
+                        </colgroup>
+                        <thead>
+                            <tr>
+                                <th>컬럼명</th>
+                                <th>한글명</th>
+                                <th>MIN</th>
+                                <th>MAX</th>
+                                <th>사용여부</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <tr>
+                                <td>SENS1</td>
+                                <td><input type="text" name="" id="" class="full-input" value="벨브1"/></td>
+                                <td><input type="text" name="" id="" class="full-input"/></td>
+                                <td><input type="text" name="" id="" class="full-input"/></td>
+                                <td><input type="checkbox" name="" id=""></td>
+                            </tr>
+                            <tr>
+                                <td>SENS2</td>
+                                <td><input type="text" name="" id="" class="full-input" value="벨브2"/></td>
+                                <td><input type="text" name="" id="" class="full-input"/></td>
+                                <td><input type="text" name="" id="" class="full-input"/></td>
+                                <td><input type="checkbox" name="" id=""></td>
+                            </tr>
+                            <tr>
+                                <td>SENS3</td>
+                                <td><input type="text" name="" id="" class="full-input" value="벨브3"/></td>
+                                <td><input type="text" name="" id="" class="full-input"/></td>
+                                <td><input type="text" name="" id="" class="full-input"/></td>
+                                <td><input type="checkbox" name="" id=""></td>
+                            </tr>
+                            <tr>
+                                <td>SENS4</td>
+                                <td><input type="text" name="" id="" class="full-input" value="벨브4"/></td>
+                                <td><input type="text" name="" id="" class="full-input"/></td>
+                                <td><input type="text" name="" id="" class="full-input"/></td>
+                                <td><input type="checkbox" name="" id=""></td>
+                            </tr>
+                            <tr>
+                                <td>SENS5</td>
+                                <td><input type="text" name="" id="" class="full-input" value="벨브5"/></td>
+                                <td><input type="text" name="" id="" class="full-input"/></td>
+                                <td><input type="text" name="" id="" class="full-input"/></td>
+                                <td><input type="checkbox" name="" id=""></td>
+                            </tr>
+                            <tr>
+                                <td>SENS6</td>
+                                <td><input type="text" name="" id="" class="full-input" value="벨브6"/></td>
+                                <td><input type="text" name="" id="" class="full-input"/></td>
+                                <td><input type="text" name="" id="" class="full-input"/></td>
+                                <td><input type="checkbox" name="" id=""></td>
+                            </tr>
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+            <div class="modal-end flex justify-end">
+                <button v-show="modalType === 'form-modal'" class="orange-btn small-btn">접속</button>
+                <button v-show="modalType === 'tab-modal'" class="blue-btn small-btn">확인</button>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+import SvgIcon from '@jamescoyle/vue-icon';
+import { mdiClose } from '@mdi/js';
+
+export default {
+    data() {
+        return {
+            isModalOpen: true,
+            activeTab: 'tab1',
+            modalType: 'tab-modal',
+            closePath:mdiClose 
+        }
+    },
+    methods: {
+        // 탭 변경
+        showTab: function (tabName) {
+            this.activeTab = tabName;
+        },
+        closeModal: function () {
+            this.isModalOpen = false;
+        }
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    components: {
+        'SvgIcon':SvgIcon
+    },
+    mounted() {
+        console.log('main mounted');
+    }
+}
+</script>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/component/Pagination.vue (added)
+++ client/views/pages/component/Pagination.vue
@@ -0,0 +1,0 @@
 
client/views/pages/component/Searchbar.vue (added)
+++ client/views/pages/component/Searchbar.vue
@@ -0,0 +1,0 @@
 
client/views/pages/component/TableComponent/FormTable.vue (added)
+++ client/views/pages/component/TableComponent/FormTable.vue
@@ -0,0 +1,60 @@
+<template>
+    <div class="table-zone">
+        <table class="form-table">
+            <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 -->
+            <colgroup>
+                <col style="width: ;">
+                <col style="width: ;">
+                <col style="width: ;">
+                <col style="width: ;">
+            </colgroup>
+            <tbody>
+                <tr>
+                    <th>user ID</th>
+                    <td><input type="text" name="" id=""></td>
+                    <th>이름</th>
+                    <td><input type="text" name="" id=""></td>
+                </tr>
+                <tr>
+                    <th>생년월일</th>
+                    <td>
+                        <div class="flex justify-between">
+                            <select name="" id="" class="flex30"></select>
+                            <select name="" id="" class="flex30"></select>
+                            <select name="" id="" class="flex30"></select>
+                        </div>
+                    </td>
+                    <th>성별</th>
+                    <td>
+                        <select name="" id=""></select>
+                    </td>
+                </tr>
+            </tbody>
+        </table>
+    </div>
+</template>
+
+<script>
+
+export default {
+    data() {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    components: {
+    },
+    mounted() {
+        console.log('main mounted');
+    }
+}
+</script>
+
 
client/views/pages/component/TableComponent/FormTable2.vue (added)
+++ client/views/pages/component/TableComponent/FormTable2.vue
@@ -0,0 +1,60 @@
+<template>
+    <div class="table-zone">
+        <table class="form-table2">
+                        <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 -->
+            <colgroup>
+                <col style="width: ;">
+                <col style="width: ;">
+                <col style="width: ;">
+                <col style="width: ;">
+            </colgroup>
+            <tbody>
+                <tr>
+                    <th>user ID</th>
+                    <td><input type="text" name="" id=""></td>
+                    <th>이름</th>
+                    <td><input type="text" name="" id=""></td>
+                </tr>
+                <tr>
+                    <th>생년월일</th>
+                    <td>
+                        <div class="flex justify-between">
+                            <select name="" id="" class="flex30"></select>
+                            <select name="" id="" class="flex30"></select>
+                            <select name="" id="" class="flex30"></select>
+                        </div>
+                    </td>
+                    <th>성별</th>
+                    <td>
+                        <select name="" id=""></select>
+                    </td>
+                </tr>
+            </tbody>
+        </table>
+    </div>
+</template>
+
+<script>
+
+export default {
+    data() {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    components: {
+    },
+    mounted() {
+        console.log('main mounted');
+    }
+}
+</script>
+
 
client/views/pages/component/TableComponent/ListTable.vue (added)
+++ client/views/pages/component/TableComponent/ListTable.vue
@@ -0,0 +1,76 @@
+<template>
+    <div class="table-zone">
+        <div class="list-info flex justify-between align-center">
+            <div class="count-zone">
+                <p>총 <span>40</span>건 중 <span>01</span>건 선택</p>
+            </div>
+            <div class="cunt-selectZone">
+                <select name="" id="">
+                    <option value="">10개 보기</option>
+                    <option value="">20개 보기</option>
+                </select>
+            </div>
+        </div>
+        <table class="list-table">
+            <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 -->
+            <colgroup>
+                <col style="width: ;">
+                <col style="width: ;">
+                <col style="width: ;">
+                <col style="width: ;">
+            </colgroup>
+            <thead>
+                <tr>
+                    <th>No</th>
+                    <th>user ID</th>
+                    <th>이름</th>
+                    <th>생년월일</th>
+                    <th>성별</th>
+                </tr>
+            </thead>
+            <tbody>
+                <tr>
+                    <td>1</td>
+                    <td>test123</td>
+                    <td>홍길동</td>
+                    <td>1999.01.01</td>
+                    <td>여</td>
+                </tr>
+                <tr>
+                    <td>1</td>
+                    <td>test123</td>
+                    <td>홍길동</td>
+                    <td>1999.01.01</td>
+                    <td>여</td>
+                </tr>
+                <tr v-if="postList === 0">
+                    <td colspan="5" class="no-list">검색조건에 해당하는 데이터가 없습니다.</td>
+                </tr>
+            </tbody>
+        </table>
+    </div>
+</template>
+
+<script>
+
+export default {
+    data() {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    components: {
+    },
+    mounted() {
+        console.log('main mounted');
+    }
+}
+</script>
 
client/views/pages/layout/Header.vue (added)
+++ client/views/pages/layout/Header.vue
@@ -0,0 +1,78 @@
+<template>
+    <header>
+
+        <div class="logo-wrap gd flex justify-between align-center ">
+            <router-link to="/Bi002.page" class="logo gd-1"></router-link>
+            <div class="flex justify-end  gd-2 logo-btn">
+                <div class=" header-btn">
+                    <p class="btn-img1"></p>
+                    <a href="/">사용설명서</a>
+                </div>
+                <div class=" header-btn">
+                    <p class="btn-img3"></p>
+                    <a href="/">박정현님</a>
+                </div>
+                <div class=" header-btn">
+                    <p class="btn-img2"></p>
+                    <a href="/">로그아웃</a>
+                </div>
+              
+              
+            </div>
+        </div>
+    </header>
+
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+    }
+}
+</script>
+
+<style scoped>
+.topheader {
+    background-color: var(--headergray);
+    padding: 2px 30px;
+}
+
+.topheader p,
+.topheader button {
+    padding: 0.1% 0;
+    color: var(--white);
+    font-size: 1.4rem;
+}
+
+.header-btn {
+    width: 50px;
+    height: 50px;
+    background-color: var(--white);
+    border-radius: 5px;
+    text-align: center;
+    margin-left: 2%;
+    padding: 3% 0;
+    box-shadow: 1px 1px 5px #00000031;
+
+}
+
+.header-btn p {
+    margin: 0 auto;
+    width: 20px;
+    height: 20px;
+    background-size: contain;
+}
+</style>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/layout/Menu.vue (added)
+++ client/views/pages/layout/Menu.vue
@@ -0,0 +1,130 @@
+<template>
+    <nav class="main-nav flex justify-between align-center">
+        <router-link to="/Bi002.page" class="logo gd-1"></router-link>
+
+        <ul class="flex justify-between topmenu-wrap align-center" >
+
+            <li v-for="(topMenu, idx) in menuList" key="idx">
+                <p @click="selectItem(topMenu.id)" :class="{ active: topMenu.isActive }">{{ topMenu.pathName }}</p>
+            </li>
+
+        </ul>
+        <div class="logo-wrap flex justify-between align-center logo-btn "
+            style="flex-wrap: nowrap; width: 10%;">
+
+            <div class=" header-btn">
+                <p class="btn-img1"></p>
+                <a href="/">사용설명서</a>
+            </div>
+            <div class=" header-btn">
+                <p class="btn-img3"></p>
+                <a href="/">박정현님</a>
+            </div>
+            <div class=" header-btn">
+                <p class="btn-img2"></p>
+                <a href="/">로그아웃</a>
+            </div>
+        </div>
+
+
+
+
+    </nav>
+</template>
+<script>
+export default {
+    data() {
+        return {
+            menuList: [
+                { id: 0, pathName: "인사/급여" },
+                { id: 1, isActive: true, pathName: "회계" },
+                { id: 2, pathName: "원가" },
+                { id: 3, pathName: "영업" },
+                { id: 4, pathName: "원자재" },
+                { id: 5, pathName: "부자재" },
+                { id: 6, pathName: "생산" },
+                { id: 7, pathName: "계근" },
+                { id: 8, pathName: "무역" },
+                { id: 9, pathName: "안전" },
+                { id: 10, pathName: "지시사항" },
+                { id: 11, pathName: "업무계획" },
+                { id: 12, pathName: "고객" },
+                { id: 13, pathName: "프로젝트" },
+                { id: 14, pathName: "시스템" },
+                { id: 15, pathName: "WEB" },
+            ]
+        }
+    },
+    methods: {
+        selectItem(id) {
+            // 모든 메뉴 항목의 isActive 속성을 false로 설정
+            this.menuList.forEach(item => {
+                item.isActive = false;
+            });
+
+            // 클릭한 메뉴 항목의 isActive 속성만 true로 설정
+            const selectedItem = this.menuList.find(item => item.id === id);
+            if (selectedItem) {
+                selectedItem.isActive = true;
+            }
+
+            console.log(id);
+            this.$emit('itemSelected', id);
+
+        }
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+    }
+}
+</script>
+<style scoped>
+ul {
+    width: 100%;
+    list-style: none;
+    padding: 17px 30px;
+    background-color: var(--navbarblue);
+}
+
+li {
+    /* border: 1px solid blue; */
+    text-align: center;
+
+}
+
+.topheader {
+    background-color: var(--headergray);
+    padding: 2px 30px;
+}
+
+.topheader p,
+.topheader button {
+    padding: 0.1% 0;
+    color: var(--white);
+    font-size: 1.4rem;
+}
+
+.header-btn {
+    width: 45px;
+    height: 45px;
+    background-color: var(--white);
+    border-radius: 5px;
+    text-align: center;
+    margin-left: 2%;
+    padding: 3% 0;
+    box-shadow: 1px 1px 5px #00000031;
+
+}
+
+.header-btn p {
+    margin: 0 auto;
+    width: 20px;
+    height: 20px;
+    background-size: contain;
+}
+</style>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/layout/sideMenu.vue (added)
+++ client/views/pages/layout/sideMenu.vue
@@ -0,0 +1,310 @@
+<template>
+    <nav class="gd gd1 pd1 sub-nav">
+        <input type="text" placeholder="메뉴검색" class="mb2">
+        <ul>
+            <li v-if="selectedItem">
+                <div v-for="(sidetitle) in selectedItem.subMenuBox" :key="sidetitle.pathName" class="side-wrap">
+                    <p @click="toggleMenu(sidetitle)" :class="{ active: sidetitle.show }">{{ sidetitle.pathName }}</p>
+                    <!-- <img src="../../../resources/img/component/chevron-down.svg" alt=""> -->
+                    <ul class="sidemenu-wrap">
+                        <li v-for="(subMenu, idx) in sidetitle.subList" :key="idx">
+                            <router-link v-show="sidetitle.show" :to="subMenu.path" class="mb2"
+                                @click="selectSubMenu(subMenu)" :class="{ 'active-text': subMenu.isActive }">{{
+                subMenu.pathName
+            }}</router-link>
+                        </li>
+                    </ul>
+                </div>
+            </li>
+        </ul>
+    </nav>
+</template>
+
+<script>
+
+export default {
+    props: {
+        selectedId: {
+            type: Number,
+            default: null,
+        },
+    },
+    data() {
+        return {
+            selectedId: 1,
+            selectedSubMenu: false,
+            menuList: [
+                {
+                    // 인사/급여관리
+                    id: 0,
+                    subMenuBox: [
+
+                        {
+                            pathName: "기준정보",
+                            show: false,
+                            subList: [
+                                { path: "/", pathName: "(회계)공통코드 등록", isActive: false },
+                                { path: "/", pathName: "거래처 정보 등록", isActive: false },
+                                { path: "/", pathName: "계정과목 등록", isActive: false },
+                                { path: "/", pathName: "재무제표 양식 등록", isActive: false },
+                                { path: "/", pathName: "재무제표 계정 설정 등록", isActive: false },
+                                { path: "/", pathName: "은행 계좌 등록", isActive: false },
+                            ],
+                        },
+                        {
+                            pathName: "전표관리",
+                            show: false,
+                            subList: [
+                                { path: "/", pathName: "(회계)공통코드 등록" },
+                                { path: "/", pathName: "거래처 정보 등록" },
+                                { path: "/", pathName: "계정과목 등록" },
+                                { path: "/", pathName: "재무제표 양식 등록" },
+                                { path: "/", pathName: "재무제표 계정 설정 등록" },
+                                { path: "/", pathName: "은행 계좌 등록" },
+                            ],
+                        },
+                        {
+                            pathName: "기준정보",
+                            show: false,
+                            subList: [
+                                { path: "/", pathName: "(회계)공통코드 등록" },
+                                { path: "/", pathName: "거래처 정보 등록" },
+                                { path: "/", pathName: "계정과목 등록" },
+                                { path: "/", pathName: "재무제표 양식 등록" },
+                                { path: "/", pathName: "재무제표 계정 설정 등록" },
+                                { path: "/", pathName: "은행 계좌 등록" },
+                            ],
+                        },
+                    ]
+                },
+
+                {
+                    // 회계관리
+                    id: 1,
+                    subMenuBox: [
+
+                        {
+                            pathName: "기준정보",
+                            show: true,
+
+                            subList: [
+                                { path: "/Bi001.page", pathName: "(회계)공통코드 등록"},
+                                { path: "/Bi002.page", pathName: "거래처 정보 등록" },
+                                { path: "/Bi003.page", pathName: "계정과목 등록"},
+                                { path: "/Bi004.page", pathName: "재무제표 양식 등록"},
+                                { path: "/Bi005.page", pathName: "재무제표 계정 설정 등록"},
+                                { path: "/Bi006.page", pathName: "은행 계좌 등록" },
+                                { path: "/Bi007.page", pathName: "거래처 대장"},
+                            ],
+                        },
+                        {
+                            pathName: "전표관리",
+                            show: false,
+                            subList: [
+                                { path: "/Cm001.page", pathName: "잔액 이월 전표등록" },
+                                { path: "/Cm002.page", pathName: "전표 작성 (일반)" },
+                                { path: "/", pathName: "전표 작성 (계산서)" },
+                                { path: "/", pathName: "전표 작성 (법인카드)" },
+                                { path: "/", pathName: "전표 작성 (어음분할 발행)" },
+                                { path: "/", pathName: "전표 작성 (포장매출)" },
+                                { path: "/", pathName: "미전송 전표 조회" },
+                                { path: "/", pathName: "전표 확정 (일반)" },
+                                { path: "/", pathName: "전표 확정 (계산서)" },
+                                { path: "/", pathName: "전표 확정 (법인카드)" },
+                                { path: "/", pathName: "전표 확정 (포장매출)" },
+                                { path: "/", pathName: "전표 승인 및 반려등록" },
+                                { path: "/", pathName: "전표 조회" },
+                                { path: "/", pathName: "전표 조회 (부서별)" },
+                                { path: "/", pathName: "분개장 (전표기준)" },
+                                { path: "/", pathName: "계정별 명세서" },
+                                { path: "/", pathName: "계정별 명세서(부서별)" },
+                                { path: "/", pathName: "거래처별 명세서" },
+                                { path: "/", pathName: "거래처별 채원/채무리스트" },
+                                { path: "/", pathName: "미수금 관리 (제품)" },
+                            ],
+                        },
+                        {
+                            pathName: "채권채무관리",
+                            show: false,
+                            subList: [
+                                { path: "/", pathName: "월 채권채무 마감 작업" },
+                                { path: "/", pathName: "채무 연령표" },
+                                { path: "/", pathName: "채권 연령표" },
+                            ],
+                        },
+                        {
+                            pathName: "법인카드관리",
+                            show: false,
+                            subList: [
+                                { path: "/", pathName: "법인카드 관리 대장" },
+                                { path: "/", pathName: "법인카드 일자별 사용 명세" },
+                                { path: "/", pathName: "법인카드 일자별 사용 명세 (계정)" },
+                                { path: "/", pathName: "월별 사용액 현황(카드별)" },
+                                { path: "/", pathName: "월별 사용액 현황(상세)" },
+                                { path: "/", pathName: "계정과목별 사용액 현황(월)" },
+                                { path: "/", pathName: "월별 사용액 현황(요약)" },
+                            ],
+                        },
+                        {
+                            pathName: "자금관리",
+                            show: false,
+                            subList: [
+                                { path: "/", pathName: "분개장" },
+                                { path: "/", pathName: "현금출납장" },
+                                { path: "/", pathName: "일계표" },
+                                { path: "/", pathName: "자금 일일 원장" },
+                                { path: "/", pathName: "일 자금 마감 작업" },
+                                { path: "/", pathName: "잔액 이월 작업" },
+                                { path: "/", pathName: "기초 잔액 등록" },
+                            ],
+                        },
+                        {
+                            pathName: "어음관리",
+                            show: false,
+                            subList: [
+                                { path: "/", pathName: "받을어음 등록" },
+                                { path: "/", pathName: "받을어음 수탁 등록" },
+                                { path: "/", pathName: "받을어음 결제 및 반환 등록" },
+                                { path: "/", pathName: "받을어음 할인 등록" },
+                                { path: "/", pathName: "지급어음 결제 및 반환 등록" },
+                                { path: "/", pathName: "어음 용지 관리" },
+                                { path: "/", pathName: "받을어음 잔액 명세서" },
+                                { path: "/", pathName: "받을어음 수탁 명세서" },
+                                { path: "/", pathName: "받을어음 할인 명세서" },
+                                { path: "/", pathName: "지급어음 잔액 명세서" },
+                            ],
+                        },
+                        {
+                            pathName: "차입금관리",
+                            show: false,
+                            subList: [
+                                { path: "/", pathName: "차입금 등록" },
+                                { path: "/", pathName: "차입금 및 이자 상환 등록" },
+                                { path: "/", pathName: "차입금 잔액 명세서" },
+                                { path: "/", pathName: "차입금 상환 명세서" },
+                                { path: "/", pathName: "이자 지급 명세서" },
+                            ],
+                        },
+                        {
+                            pathName: "결산조정관리",
+                            show: false,
+                            subList: [
+                                { path: "/", pathName: "선급비용 발생 등록" },
+                                { path: "/", pathName: "선급비용 계상 전표 작성" },
+                                { path: "/", pathName: "선급비용 명세서" },
+                                { path: "/", pathName: "미지급이자 전표 작성" },
+                                { path: "/", pathName: "미지급이자 명세서" },
+                                { path: "/", pathName: "이자 비용 명세서" },
+                            ],
+                        },
+                        {
+                            pathName: "결산관리",
+                            show: false,
+                            subList: [
+                                { path: "/", pathName: "합계잔액시산표" },
+                                { path: "/", pathName: "재무상태표" },
+                                { path: "/", pathName: "손익계산서" },
+                                { path: "/", pathName: "제조원가명세서" },
+                                { path: "/", pathName: "결산 기초 정보 등록" },
+                                { path: "/", pathName: "월 결산 마감 작업" },
+                            ],
+                        },
+                        {
+                            pathName: "세무관리",
+                            show: false,
+                            subList: [
+                                { path: "/", pathName: "부가세 명세서" },
+                                { path: "/", pathName: "부가세 집계표(세금 및 계산서)" },
+                                { path: "/", pathName: "부가세 집계표(법인카드)" },
+                                { path: "/", pathName: "부가세 신고서 작성(세금 및 계산서)" },
+                                { path: "/", pathName: "부가세 신고서 작성(법인카드)" },
+                                { path: "/", pathName: "수출 실적 신고서 작성" },
+                            ],
+                        },
+                        {
+                            pathName: "담보관리",
+                            show: false,
+                            subList: [
+                                { path: "/", pathName: "담보 등록" },
+                                { path: "/", pathName: "담보 현황" },
+                            ],
+                        },
+                    ]
+                }
+
+            ]
+        }
+    },
+    methods: {
+
+        toggleMenu(menu) {
+            menu.show = !menu.show;
+        },
+        selectSubMenu(subMenu) {
+            // 이전에 선택된 메뉴가 있다면 비활성화
+            if (this.selectedSubMenu) {
+                this.selectedSubMenu.isActive = false;
+            }
+
+            // 새로 선택된 메뉴를 활성화하고 저장
+            subMenu.isActive = true;
+            this.selectedSubMenu = subMenu;
+        },
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+        selectedItem() {
+
+            console.log('Selected ID:', this.selectedId);  // 선택된 ID를 콘솔에 출력
+            const item = this.menuList.find(item => item.id === this.selectedId);
+            console.log('Found Item:', item);  // 찾은 항목을 콘솔에 출력
+            return item;
+
+
+        },
+    },
+    mounted() {
+
+    }
+}
+</script>
+
+<style scoped>
+nav {
+    height: 100%;
+    position: relative;
+    overflow-y: scroll;
+    background-color: var(--sidenavgray);
+    width: 100%;
+
+}
+nav::-webkit-scrollbar{
+    width: 2px;
+}
+nav::-webkit-scrollbar-thumb{
+    background-color: var(--navbarblue);
+}
+
+input {
+    width: 100%;
+    margin-bottom: 5%;
+}
+
+.side-wrap p {
+    font-family: 'Pretendard';
+    font-weight: 600;
+    color: #333;
+}
+
+
+.sidemenu-wrap li {
+    padding-left: 15%;
+    font-family: 'Pretendard';
+    font-weight: 600;
+    color: #333;
+}
+</style>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/login/Login.vue (added)
+++ client/views/pages/login/Login.vue
@@ -0,0 +1,138 @@
+<template>
+    <div class="login-page">
+        <div class="login-wrap flex-column justify-center align-center">
+            <div class="login-content">
+                <div class="logo">
+                    <!-- <img src="../../../resources/img/logo.png" alt="" /> -->
+                </div>
+                <div class="login-zone">
+                    <div class="input-wrap">
+                        <div class="inputContainer">
+                            <input required="" class="customInput" type="text" v-model="member.userId" v-on:keyup.enter="login" >
+                            <label class="inputLabel">ID</label>
+                            <div class="inputUnderline"></div>
+                        </div>
+                        <div class="inputContainer">
+                            <input required="" class="customInput" type="password" v-model="member.userPassword" v-on:keyup.enter="login">
+                            <label class="inputLabel">PASSWORD</label>
+                            <div class="inputUnderline"></div>
+                        </div>
+                    </div>
+                    <div class="found-zone flex justify-center">
+                        <router-link to="">아이디찾기</router-link>
+                        <router-link to="">비밀번호 찾기</router-link>
+                        <router-link to="/register.page">회원가입</router-link>
+                    </div>
+                </div>
+                <button class="blue-btn large-btn" @click="login">로그인</button>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+
+// import axios from 'axios';
+// import { useStore } from 'vuex';
+// import store from '../AppStore'
+
+export default {
+    data() {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+    }
+}
+</script>
+
+<style scoped>
+.login-page {
+    width: 100%;
+    height: 100%;
+}
+
+.login-content {
+    min-width: 400px;
+    max-width: 400px;
+    padding: 30px;
+    border-radius: 10px;
+    background-color: #fff;
+    box-shadow: 0 0 20px #ddd;
+}
+
+.logo {
+    width: 200px;
+    /* height: 50px; */
+    margin: 0 auto;
+    margin-bottom: 50px;
+}
+
+.logo>img {
+    display: block;
+    height: 100%;
+    margin: auto;
+}
+.inputContainer {
+  position: relative;
+  margin-bottom: 40px;  
+}
+
+.inputContainer:last-child{
+    margin-bottom: 0;
+}
+
+.customInput {
+  width: 100%;
+  padding: 10px;
+  font-size: 13px;
+  background-color: transparent;
+  border: none;
+  outline: none;
+  transition: border-color 0.3s ease;
+}
+
+
+.inputLabel {
+  position: absolute;
+  top: 0;
+  left: 0;
+  pointer-events: none;
+  padding: 5px;
+  font-size: 13px;
+  color: #eee;
+  transform: translateY(-80%);
+}
+
+
+.inputUnderline {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  height: 2px;
+  background-color: #eee;
+}
+
+.found-zone {
+    padding: 20px 0;
+}
+
+.found-zone>a {
+    font-size: 1.3rem;
+    padding: 0 10px;
+}
+
+.login-page .blue-btn {
+    margin-left: 0;
+    padding: 10px 0;
+}</style>(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/main/Main.vue (added)
+++ client/views/pages/main/Main.vue
@@ -0,0 +1,28 @@
+<template>
+    <div class="row gd-10" >Main.vue</div>
+
+</template>
+
+<script>
+export default {
+    data () {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Main mounted');
+    }
+}
+</script>
+<style>
+
+</style>(파일 끝에 줄바꿈 문자 없음)
 
gradle/wrapper/gradle-wrapper.jar (Binary) (deleted)
--- gradle/wrapper/gradle-wrapper.jar
Binary file is not shown
 
gradle/wrapper/gradle-wrapper.properties (deleted)
--- gradle/wrapper/gradle-wrapper.properties
@@ -1,7 +0,0 @@
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
-networkTimeout=10000
-validateDistributionUrl=true
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
 
gradlew (deleted)
--- gradlew
@@ -1,249 +0,0 @@
-#!/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.
-#
-
-##############################################################################
-#
-#   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/subprojects/plugins/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 "${APP_HOME:-./}" > /dev/null && pwd -P ) || 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" "$@"
 
gradlew.bat (deleted)
--- gradlew.bat
@@ -1,92 +0,0 @@
-@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
-
-@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.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto execute
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-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
 
package-lock.json (added)
+++ package-lock.json
This file is too big to display.
 
package.json (added)
+++ package.json
@@ -0,0 +1,32 @@
+{
+  "dependencies": {
+    "@babel/cli": "^7.22.10",
+    "@babel/core": "^7.22.10",
+    "animate.css": "^4.1.1",
+    "axios": "^1.6.7",
+    "babel-loader": "^9.1.3",
+    "bootstrap": "^5.3.3",
+    "css-loader": "^6.8.1",
+    "express": "^4.18.2",
+    "express-http-proxy": "^1.6.3",
+    "file-loader": "^6.2.0",
+    "fs": "^0.0.1-security",
+    "new-line": "^1.1.1",
+    "vue": "^3.3.4",
+    "vue-loader": "^17.2.2",
+    "vue-router": "^4.2.4",
+    "vue-style-loader": "^4.1.3",
+    "webpack": "^5.88.2",
+    "webpack-cli": "^5.1.4"
+  },
+  "scripts": {
+    "prod": "set NODE_ENV=production&&node ./server/modules/web/Server.js",
+    "dev": "set NODE_ENV=development&&node ./server/modules/web/Server.js",
+    "windows-prod": "set NODE_ENV=production&&node ./server/modules/web/Server.js",
+    "windows-dev": "set NODE_ENV=development&&node ./server/modules/web/Server.js",
+    "linux-prod": "export NODE_ENV=production&&node ./server/modules/web/Server.js",
+    "linux-dev": "export NODE_ENV=development&&node ./server/modules/web/Server.js",
+    "webpack-build": "webpack",
+    "webpack-build-watch": "webpack --watch"
+  }
+}
 
server/modules/log/Logger.js (added)
+++ server/modules/log/Logger.js
@@ -0,0 +1,131 @@
+const { LOG_BASE_DIR, SERVICE_STATUS } = require('../../../Global');
+const fs = require('fs');
+const Queue = require('../util/Queue');
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : Log 생성기 모듈 입니다.
+ */
+const Logger = (function () {
+
+    /* let testInterval = setInterval(() => {
+        const date = new Date();
+        var now = `${date.getFullYear()}.${(date.getMonth()+1)}.${date.getDate()} ${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}.${date.getMilliseconds()}`;
+        console.log('now :', now);
+    }, 1000) */
+
+    //로그 쓰기 전, 대기 저장소
+    const eventQueue = new Queue();
+    //로그 쓰는 중인지 아닌지 상태값
+    let isLogging = false;
+
+    /**
+     * @author : 하석형
+     * @since : 2023.08.24
+     * @dscription : Log 처리
+     */
+    const logging = (message) => {
+        const date = new Date();
+        let year = date.getFullYear();
+        let month = prefixZero((date.getMonth() + 1), 2);
+        let day = prefixZero(date.getDate(), 2);
+        let hour = prefixZero(date.getHours(), 2);
+        let minute = prefixZero(date.getMinutes(), 2);
+        let second = prefixZero(date.getSeconds(), 2);
+        let millisecond = prefixZero(date.getMilliseconds(), 3);
+
+        //로그에 쓰일 정보
+        const logMessage = {
+            message: message,
+            datetime: `${year}.${month}.${day} ${hour}:${minute}:${second}.${millisecond}`,
+            logFolderDir: `${LOG_BASE_DIR}/${year}${month}`,//log 폴더 경로
+            logFileName: `log-${year}${month}${day}.log`//log 파일명
+        }
+
+        //로그 쓰는 중이면, 대기 저장소에 등록
+        if (isLogging == true) {
+            eventQueue.push(logMessage);
+        } else {//로그 쓰는 중이 아니면, 로그 쓰는 중인 상태로 변경 후, 로그 쓰기
+            isLogging = true;
+
+            try {
+                //log 폴더 생성
+                if (!fs.existsSync(logMessage.logFolderDir)) {
+                    fs.mkdirSync(logMessage.logFolderDir, { recursive: true/*재귀적 폴더 생성*/ });
+                }
+
+                //log 파일 Full Path
+                let logFileFullPath = `${logMessage.logFolderDir}/${logMessage.logFileName}`;
+                //log 내용
+                let logContent = `[${logMessage.datetime}] ${logMessage.message}`;
+
+                //log 내용 쓰기
+                writeLogFile(logFileFullPath, logContent);
+            } catch (error) {
+                console.log('logging error : ', error);
+            } finally {
+                isLogging = false;
+            }
+        }
+    }
+
+    /**
+     * @author : 하석형
+     * @since : 2023.08.24
+     * @dscription : Log 내용 쓰기
+     */
+    const writeLogFile = (path, content) => {
+        if (SERVICE_STATUS == 'development') {
+            console.log(content);
+        }
+        
+        //파일 쓰기
+        fs.appendFileSync(path, `${content}\n`, 'utf8');
+
+        //로그 쓰기 저장소에서 로그 메세지 꺼내기
+        let logMessage = eventQueue.pop();
+        //메세지가 존재하면 => Log 내용 쓰기 (재귀 호출)
+        if (logMessage != undefined) {
+            //log 파일 Full Path
+            let logFileFullPath = `${logMessage.logFolderDir}/${logMessage.logFileName}`;
+            //log 내용
+            let logContent = `[${logMessage.datetime}] ${logMessage.message}`;
+            //Log 내용 쓰기 (재귀 호출)
+            writeLogFile(logFileFullPath, logContent);
+        } else {
+            return;
+        }
+    }
+
+    /**
+     * @author : 하석형
+     * @since : 2023.08.24
+     * @dscription : 특정 길이만큼 앞에 '0' 붙이기
+     */
+    const prefixZero = (target, length) => {
+        let zero = '';
+        let suffix = target;
+        let result = '';
+
+        if ((typeof target) === "number") {
+            suffix = target.toString();
+        }
+        if (suffix.length < length) {
+            for (i = 0; i < length - suffix.length; i++) {
+                zero += '0';
+            }
+        }
+        result = zero + suffix;
+        return result;
+    }
+
+
+    return {
+        logging: logging
+    }
+
+})();
+
+//Module Export
+module.exports = Logger;(파일 끝에 줄바꿈 문자 없음)
 
server/modules/util/Queue.js (added)
+++ server/modules/util/Queue.js
@@ -0,0 +1,32 @@
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : Queue(선입선출) 자료형 객체 입니다.
+ */
+class Queue {
+    constructor() {
+        this._arr = [];
+    }
+
+    //입력
+    push (item) {
+        this._arr.push(item);
+    }
+
+    //출력 후, 제거
+    pop () {
+        return this._arr.shift();
+    }
+
+    //출력 대기 중인 item return
+    peek () {
+        return this._arr[0];
+    }
+
+    //확인
+    showQueue () {
+        console.log('Queue : ', this._arr);
+    }
+}
+
+module.exports = Queue;(파일 끝에 줄바꿈 문자 없음)
 
server/modules/web/Server.js (added)
+++ server/modules/web/Server.js
@@ -0,0 +1,105 @@
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : Express 라이브러리 활용 HTTP Web Server 모듈입니다.
+ */
+const { BASE_DIR, PORT, API_SERVER_HOST } = require('../../../Global');
+const Logger = require('../log/Logger');//Logger(필수)
+
+const express = require('express');
+const webServer = express();
+const expressProxy = require('express-http-proxy');
+
+//파일 시스템 관련 라이브러리
+const FS = require('fs');
+//stream: 특정 자원을 Streaming 하기 위한 라이브러리 => Transform: Streaming 중인 자원의 Data에 Data 수정 및 추가를 지원해주는 객체
+const Transform = require('stream').Transform;
+//Streaming 중인 자원에 새로운 데이터를 stream 공간에 추가하기 위한 라이브러리
+const newLineStream = require('new-line');
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : HTTP Server start
+ */
+webServer.listen(PORT, function () {
+    Logger.logging(`★★★ Node.js를 활용한 Web Server 구동(Port:${PORT}) ★★★`);
+})
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : Intercepter 역할을 하는 미들웨어 기능
+ */
+webServer.use(function (request, response, next) {
+    let ip = request.headers['x-forwarded-for'] || request.socket.remoteAddress;
+    Logger.logging(`[HTTP] ${request.url} (Method: ${request.method}, IP: ${ip})`);
+    next();
+});
+
+
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : ROOT URL -> index.html
+ */
+webServer.get('/', function (request, response) {
+    //response.sendFile을 통한 HTTP html reponse (html내용 Streaming)
+    response.sendFile(`${BASE_DIR}/client/views/index.html`);
+})
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : 화면요청 URL 처리
+ */
+webServer.get('*.page', function (request, response, next) {
+    //index.html 내용을 직접 Streaming하여 Response, Streaming 중간에 내용 수정
+    //수정 내용 : URL 요청이 아닌, 브라우저에 표시된 URL만 변경하여, 해당하는 URL PATH의 Vue Component를 routing하기 위함
+    const StreamTransform = new Transform();
+    StreamTransform._transform = function (data, encoding, done) {
+        let fileContent = data.toString();
+        let replaceBeforeContent = `<script id="app-start-vue-page">const APP_USER_HTTP_REQUEST_URL = '/';</script>`;
+        let replaceAfterContent = `<script id="app-start-vue-page">const APP_USER_HTTP_REQUEST_URL = '${request.params['0']}.page';</script>`;
+        fileContent.replace(replaceBeforeContent, replaceAfterContent);
+        this.push(fileContent);
+        done();
+    }
+    //Streaming 진행
+    FS.createReadStream(`${BASE_DIR}/client/views/index.html`).pipe(newLineStream()).pipe(StreamTransform).pipe(response);
+})
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : REST API 서버에 데이터 요청 보내기(Proxy)
+ */
+webServer.use('*.json', expressProxy(API_SERVER_HOST, {
+    proxyReqPathResolver: function (request) {
+        //console.log('request : ', request.url, request.params[0]);
+        return `${request.params['0']}.json`;
+    }
+}));
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : ROOT URL, Router's, 화면요청 URL 등.. 이 외 나머지 정적 자원에 대한 처리 기능
+ */
+webServer.get('*.*', function (request, response, next) {
+    response.sendFile(`${BASE_DIR}${request.params['0']}.${request.params['1']}`);
+})
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : Global Error Handler (*맨 마지막에 적용해야됨)
+ */
+webServer.use(function (error, request, response, next) {
+    const errorCode = !error.statusCode ? 500 : error.statusCode;
+    response.status(errorCode).send('에러가 발생하였습니다. 관리자에게 문의바랍니다.');
+    let message = `[Error:${errorCode}] ${request.url}/n ${error.stack}/n`;
+    Logger.logging(message);
+    //next();
+})(파일 끝에 줄바꿈 문자 없음)
 
settings.gradle (deleted)
--- settings.gradle
@@ -1,1 +0,0 @@
-rootProject.name = 'ajinerp'
 
src/main/java/com/ajin/ajinerp/AjinErpApplication.java (deleted)
--- src/main/java/com/ajin/ajinerp/AjinErpApplication.java
@@ -1,42 +0,0 @@
-package com.ajin.ajinerp;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.context.annotation.Bean;
-import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
-
-@SpringBootApplication
-public class AjinErpApplication {
-
-	public static void main(String[] args) {
-		SpringApplication.run(AjinErpApplication.class, args);
-		System.out.println("test!!!123");
-	}
-
-	@Bean(name="jsonView")
-	public MappingJackson2JsonView getJsonView () {
-		ObjectMapper objectMapper = getObjectMapper();
-		MappingJackson2JsonView jsonView = new MappingJackson2JsonView(objectMapper);
-		jsonView.setExtractValueFromSingleKeyModel(true);
-		return jsonView;
-	}
-
-	@Bean(name = "objectMapper")
-	public ObjectMapper getObjectMapper() {
-		ObjectMapper mapper = new ObjectMapper();
-
-		mapper.registerModule(new JavaTimeModule());
-		//기본 날짜 포맷 비활성화
-		mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
-
-		//새로운 날짜 포맷 세팅
-		/*SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-		mapper.setDateFormat(dateFormat);
-		mapper.setTimeZone(TimeZone.getTimeZone("Asia/Seoul"));*/
-
-		return mapper;
-	}
-}
 
src/main/resources/application.properties (deleted)
--- src/main/resources/application.properties
@@ -1,28 +0,0 @@
-#server default
-server.port = 9090
-
-#Datasource Configuration
-spring.datasource.hikari.maximum-pool-size=4
-spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
-spring.datasource.url=jdbc:log4jdbc:postgresql://210.180.118.83:5432/bi_manager?currentSchema=bi_manager
-spring.datasource.username=takensoft
-spring.datasource.password=tts96314728!@
-spring.sql.init.platform=postgres
-
-
-# Mapper Xml Location
-mybatis.mapper-locations=classpath:/spring/mapper/**/*-SQL.xml
-mybatis.config-location=classpath:/spring/mapper/mybatis-config.xml
-
-
-# 업로드 파일 용량 설정
-spring.servlet.multipart.maxFileSize=200MB
-spring.servlet.multipart.maxRequestSize=200MB
-##catalina log 설정
-#logging.level.org.apache.catalina=INFO
-#logging.file.name=logs/catalina.out
-#
-##access log 설정
-#server.tomcat.basedir=./
-#server.tomcat.accesslog.enabled=true
-#server.tomcat.accesslog.directory=logs/access(파일 끝에 줄바꿈 문자 없음)
 
src/main/resources/log4jdbc.log4j2.properties (deleted)
--- src/main/resources/log4jdbc.log4j2.properties
@@ -1,2 +0,0 @@
-log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
-log4jdbc.dump.sql.maxlinelength=0(파일 끝에 줄바꿈 문자 없음)
 
src/main/resources/logback.xml (deleted)
--- src/main/resources/logback.xml
@@ -1,20 +0,0 @@
-<configuration>
-    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
-        <encoder>
-            <pattern>%d{yyyyMMdd HH:mm:ss.SSS} [%thread] %-3level %logger{5} - %msg %n</pattern>
-        </encoder>
-    </appender>
-
-    <logger name="jdbc" level="OFF"/>
-    <logger name="jdbc.sqlonly" level="OFF"/>
-    <logger name="jdbc.sqltiming" level="DEBUG"/>
-    <logger name="jdbc.audit" level="OFF"/>
-    <logger name="jdbc.resultset" level="OFF"/>
-    <logger name="jdbc.resultsettable" level="DEBUG"/>
-    <logger name="jdbc.connection" level="OFF"/>
-
-    <root level="INFO">
-        <appender-ref ref="STDOUT" />
-    </root>
-
-</configuration>(파일 끝에 줄바꿈 문자 없음)
 
src/main/resources/spring/mapper/mybatis-config.xml (deleted)
--- src/main/resources/spring/mapper/mybatis-config.xml
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0/EN"
-        "http://mybatis.org/dtd/mybatis-3-config.dtd">
-<configuration>
-    <settings>
-        <setting name="cacheEnabled" value="true"/> <!-- mapper 캐시 전역 사용여부 -->
-        <setting name="lazyLoadingEnabled" value="false"/> <!-- mybatis 지연 로딩 사용여부 -->
-        <setting name="multipleResultSetsEnabled" value="true"/> <!-- 한개의 구문에서 여러개의  ResultSet 허용 여부 -->
-        <setting name="useColumnLabel" value="true"/> <!-- 컬럼명 대신 컬럼라벨 사용 여부 -->
-        <setting name="useGeneratedKeys" value="false"/> <!-- 키자동생성 -->
-        <setting name="defaultExecutorType" value="SIMPLE"/>
-        <setting name="defaultStatementTimeout" value="25000"/>
-        <setting name="callSettersOnNulls" value="true"/>
-    </settings>
-
-    <typeAliases>
-
-    </typeAliases>
-
-</configuration>(파일 끝에 줄바꿈 문자 없음)
 
src/main/resources/static/index.html (deleted)
--- src/main/resources/static/index.html
@@ -1,10 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>Title</title>
-</head>
-<body>
-    good
-</body>
-</html>(파일 끝에 줄바꿈 문자 없음)
 
src/test/java/com/ajin/ajinerp/AjinErpApplicationTests.java (deleted)
--- src/test/java/com/ajin/ajinerp/AjinErpApplicationTests.java
@@ -1,13 +0,0 @@
-package com.ajin.ajinerp;
-
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-
-@SpringBootTest
-class AjinErpApplicationTests {
-
-	@Test
-	void contextLoads() {
-	}
-
-}
 
webpack.config.js (added)
+++ webpack.config.js
@@ -0,0 +1,42 @@
+const { VueLoaderPlugin } = require("vue-loader");
+
+const {PROJECT_NAME, BASE_DIR, SERVICE_STATUS} = require('./Global');
+
+module.exports = {
+  name: PROJECT_NAME,
+  mode: SERVICE_STATUS,
+  devtool: 'eval',
+
+  entry: {
+    app: [`${BASE_DIR}/client/views/index.js`]
+  },
+
+  module: {
+    rules: [{
+      test: /\.vue?$/,
+      loader: 'vue-loader',
+    }, {
+      test: /\.(js|jsx)?$/,
+      loader: 'babel-loader',
+    }, {
+      test: /\.css$/,
+      use: ['vue-style-loader', 'css-loader']
+    }, {
+      test: /\.(jpe?g|png|gif|svg|ttf|eot|woff|woff2)$/i,
+      use: [{
+        loader:'url-loader',
+        options:{
+          limit:8192,
+          fallback:require.resolve('file-loader')
+        }
+      }]
+    }],
+  },
+
+  plugins: [new VueLoaderPlugin()],
+
+  output: {
+    path: `${BASE_DIR}/client/build`,	// __dirname: webpack.config.js 파일이 위치한 경로
+    filename: 'bundle.js'
+  },
+}(파일 끝에 줄바꿈 문자 없음)
Add a comment
List