hmkim 03-11
250311 김혜민 maven->gradle 변경 Exception Handler 추가
@c29e96eb39242dcd125a5612be7c07cb2f23ca99
 
.gradle/8.13/checksums/checksums.lock (Binary) (added)
+++ .gradle/8.13/checksums/checksums.lock
Binary file is not shown
 
.gradle/8.13/checksums/md5-checksums.bin (Binary) (added)
+++ .gradle/8.13/checksums/md5-checksums.bin
Binary file is not shown
 
.gradle/8.13/checksums/sha1-checksums.bin (Binary) (added)
+++ .gradle/8.13/checksums/sha1-checksums.bin
Binary file is not shown
 
.gradle/8.13/executionHistory/executionHistory.bin (Binary) (added)
+++ .gradle/8.13/executionHistory/executionHistory.bin
Binary file is not shown
 
.gradle/8.13/executionHistory/executionHistory.lock (Binary) (added)
+++ .gradle/8.13/executionHistory/executionHistory.lock
Binary file is not shown
 
.gradle/8.13/fileChanges/last-build.bin (Binary) (added)
+++ .gradle/8.13/fileChanges/last-build.bin
Binary file is not shown
 
.gradle/8.13/fileHashes/fileHashes.bin (Binary) (added)
+++ .gradle/8.13/fileHashes/fileHashes.bin
Binary file is not shown
 
.gradle/8.13/fileHashes/fileHashes.lock (Binary) (added)
+++ .gradle/8.13/fileHashes/fileHashes.lock
Binary file is not shown
 
.gradle/8.13/fileHashes/resourceHashesCache.bin (Binary) (added)
+++ .gradle/8.13/fileHashes/resourceHashesCache.bin
Binary file is not shown
 
.gradle/8.13/gc.properties (added)
+++ .gradle/8.13/gc.properties
@@ -0,0 +1,0 @@
 
.gradle/buildOutputCleanup/buildOutputCleanup.lock (Binary) (added)
+++ .gradle/buildOutputCleanup/buildOutputCleanup.lock
Binary file is not shown
 
.gradle/buildOutputCleanup/cache.properties (added)
+++ .gradle/buildOutputCleanup/cache.properties
@@ -0,0 +1,2 @@
+#Fri Mar 07 14:08:17 KST 2025
+gradle.version=8.13
 
.gradle/buildOutputCleanup/outputFiles.bin (Binary) (added)
+++ .gradle/buildOutputCleanup/outputFiles.bin
Binary file is not shown
 
.gradle/file-system.probe (Binary) (added)
+++ .gradle/file-system.probe
Binary file is not shown
 
.gradle/vcs-1/gc.properties (added)
+++ .gradle/vcs-1/gc.properties
@@ -0,0 +1,0 @@
 
build.gradle (added)
+++ build.gradle
@@ -0,0 +1,100 @@
+/*
+ * This file was generated by the Gradle 'init' task.
+ */
+
+plugins {
+//    id 'java-library'
+//    id 'maven-publish'
+    id 'java'
+    id 'org.springframework.boot' version '3.4.1'
+    id 'io.spring.dependency-management' version '1.1.7'
+}
+
+repositories {
+//    mavenLocal()
+    mavenCentral()
+    maven {
+        url = uri('https://repo1.maven.org/maven2/')
+    }
+
+    maven {
+        url = uri('https://maven.egovframe.go.kr/maven/')
+        mavenContent {
+            releasesOnly()
+        }
+    }
+
+    maven {
+        url = uri('https://repo.maven.apache.org/maven2/')
+    }
+}
+
+dependencies {
+    implementation 'org.springframework.boot:spring-boot-starter-web'
+    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
+    implementation 'org.springframework.boot:spring-boot-starter-validation'
+    implementation 'org.springframework.boot:spring-boot-starter-security'
+    implementation 'org.springframework.boot:spring-boot-starter-web-services'
+//    implementation 'org.springframework.boot:spring-boot-devtools'
+    implementation 'org.springframework.boot:spring-boot-starter-cache'
+
+    implementation ('org.egovframe.rte:org.egovframe.rte.ptl.mvc:4.2.0'){
+        exclude group: 'commons-logging', module: 'commons-logging'
+    }
+    implementation 'org.egovframe.rte:org.egovframe.rte.psl.dataaccess:4.2.0'
+    implementation 'org.egovframe.rte:org.egovframe.rte.fdl.idgnr:4.2.0'
+    implementation 'org.egovframe.rte:org.egovframe.rte.fdl.property:4.2.0'
+    implementation 'org.hsqldb:hsqldb:2.7.2'
+
+    compileOnly 'org.projectlombok:lombok:1.18.34'
+    annotationProcessor 'org.projectlombok:lombok:1.18.34'
+
+    // springdoc-openapi
+    implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.6.0'
+    implementation 'org.hibernate:hibernate-entitymanager:5.6.15.Final'
+
+    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'
+
+    implementation 'com.github.ben-manes.caffeine:caffeine'
+    implementation 'mysql:mysql-connector-java:8.0.23'
+    implementation 'org.mariadb.jdbc:mariadb-java-client:2.6.2'
+    implementation 'org.postgresql:postgresql:42.6.0'
+    implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'
+    implementation 'org.apache.poi:poi-ooxml:4.1.2'
+
+    implementation 'org.apache.commons:commons-lang3:3.14.0'
+    implementation 'com.oracle.database.jdbc:ojdbc10:19.16.0.0'
+    implementation 'io.jsonwebtoken:jjwt-api:0.12.5'
+    implementation 'io.jsonwebtoken:jjwt-impl:0.12.5'
+    implementation 'io.jsonwebtoken:jjwt-jackson:0.12.5'
+
+    implementation group: 'net.rakugakibox.util', name: 'yaml-resource-bundle', version: '1.1'
+
+    testImplementation 'org.springframework.boot:spring-boot-starter-test'
+    testImplementation 'org.springframework.security:spring-security-test'
+}
+
+group = 'com.takensoft'
+// version = '1.0.0'
+version = '0.0.1-SNAPSHOT'
+//description = 'cms'
+
+// java.sourceCompatibility = JavaVersion.VERSION_1_8
+java.sourceCompatibility = '17'
+/*publishing {
+    publications {
+        maven(MavenPublication) {
+            from(components.java)
+        }
+    }
+}*/
+
+
+tasks.withType(JavaCompile) {
+    options.encoding = 'UTF-8'
+}
+
+tasks.withType(Javadoc) {
+    options.encoding = 'UTF-8'
+}
+
 
build/bootJarMainClassName (added)
+++ build/bootJarMainClassName
@@ -0,0 +1,1 @@
+com.takensoft.CmsApplication(파일 끝에 줄바꿈 문자 없음)
 
build/libs/cms-0.0.1-SNAPSHOT-plain.jar (Binary) (added)
+++ build/libs/cms-0.0.1-SNAPSHOT-plain.jar
Binary file is not shown
 
build/libs/cms-0.0.1-SNAPSHOT.jar (added)
+++ build/libs/cms-0.0.1-SNAPSHOT.jar
This file is too big to display.
 
build/reports/problems/problems-report.html (added)
+++ build/reports/problems/problems-report.html
@@ -0,0 +1,663 @@
+<!DOCTYPE html>
+
+<html lang="en">
+<head>
+    <!-- Required meta tags -->
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+
+                    <style type="text/css">
+                /*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */
+html {
+    line-height: 1.15;
+    -ms-text-size-adjust: 100%;
+    -webkit-text-size-adjust: 100%
+}
+
+body {
+    margin: 0
+}
+
+article, aside, footer, header, nav, section {
+    display: block
+}
+
+h1 {
+    font-size: 2em;
+    margin: .67em 0
+}
+
+figcaption, figure, main {
+    display: block
+}
+
+figure {
+    margin: 1em 40px
+}
+
+hr {
+    box-sizing: content-box;
+    height: 0;
+    overflow: visible
+}
+
+pre {
+    font-family: monospace, monospace;
+    font-size: 1em
+}
+
+a {
+    background-color: transparent;
+    -webkit-text-decoration-skip: objects
+}
+
+abbr[title] {
+    border-bottom: none;
+    text-decoration: underline;
+    text-decoration: underline dotted
+}
+
+b, strong {
+    font-weight: inherit
+}
+
+b, strong {
+    font-weight: bolder
+}
+
+code, kbd, samp {
+    font-family: monospace, monospace;
+    font-size: 1em
+}
+
+dfn {
+    font-style: italic
+}
+
+mark {
+    background-color: #ff0;
+    color: #000
+}
+
+small {
+    font-size: 80%
+}
+
+sub, sup {
+    font-size: 75%;
+    line-height: 0;
+    position: relative;
+    vertical-align: baseline
+}
+
+sub {
+    bottom: -.25em
+}
+
+sup {
+    top: -.5em
+}
+
+audio, video {
+    display: inline-block
+}
+
+audio:not([controls]) {
+    display: none;
+    height: 0
+}
+
+img {
+    border-style: none
+}
+
+svg:not(:root) {
+    overflow: hidden
+}
+
+button, input, optgroup, select, textarea {
+    font-family: sans-serif;
+    font-size: 100%;
+    line-height: 1.15;
+    margin: 0
+}
+
+button, input {
+    overflow: visible
+}
+
+button, select {
+    text-transform: none
+}
+
+[type=reset], [type=submit], button, html [type=button] {
+    -webkit-appearance: button
+}
+
+[type=button]::-moz-focus-inner, [type=reset]::-moz-focus-inner, [type=submit]::-moz-focus-inner, button::-moz-focus-inner {
+    border-style: none;
+    padding: 0
+}
+
+[type=button]:-moz-focusring, [type=reset]:-moz-focusring, [type=submit]:-moz-focusring, button:-moz-focusring {
+    outline: 1px dotted ButtonText
+}
+
+fieldset {
+    padding: .35em .75em .625em
+}
+
+legend {
+    box-sizing: border-box;
+    color: inherit;
+    display: table;
+    max-width: 100%;
+    padding: 0;
+    white-space: normal
+}
+
+progress {
+    display: inline-block;
+    vertical-align: baseline
+}
+
+textarea {
+    overflow: auto
+}
+
+[type=checkbox], [type=radio] {
+    box-sizing: border-box;
+    padding: 0
+}
+
+[type=number]::-webkit-inner-spin-button, [type=number]::-webkit-outer-spin-button {
+    height: auto
+}
+
+[type=search] {
+    -webkit-appearance: textfield;
+    outline-offset: -2px
+}
+
+[type=search]::-webkit-search-cancel-button, [type=search]::-webkit-search-decoration {
+    -webkit-appearance: none
+}
+
+::-webkit-file-upload-button {
+    -webkit-appearance: button;
+    font: inherit
+}
+
+details, menu {
+    display: block
+}
+
+summary {
+    display: list-item
+}
+
+canvas {
+    display: inline-block
+}
+
+template {
+    display: none
+}
+
+[hidden] {
+    display: none
+}
+
+/* configuration cache styles */
+
+.report-wrapper {
+    margin: 0;
+    padding: 0 24px;
+}
+
+.gradle-logo {
+    width: 32px;
+    height: 24px;
+    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAIKADAAQAAAABAAAAGAAAAAA915G0AAAD5klEQVRIDbVWC0xTZxT+emmhVUEeA1/ROh/tFAFFGK7oJisIKsNVoOwBbJPowEWHzikRxeiMRpwwjDWRBHQLIzOmiRhe22BT40TitiyaMBQFfMEeLMIEaSmk+/+rvd7be4no6Elu7n++c/5zzv845/wyOyG4iGyDgzCdNOPLM9W41n4bnmNUiHo5DNsz0hGsmcV6lbkyAOOWXJjrz4qWp1C4o3z/LqzWL4VcJB1FIHmZHn/f78a6pDcxbeIEfNvQiPwTZbDZBpC24zOEaGfDpTsgtZby6u+QlrubFWUY3nh6AH39/ahr/Bn1jZfxW3ML2js60dtvgbtcQVblj8CZM7A0PBSrol6Ft+c4KZ8iTB1nwN0//8IEP9/hA2i924Gir0/iq8oa/NvbJzLiDKiUSqTE6pGVbEBY4BxnsYAPSnwXTa3tLCZ5BF3dPdAkGNHzoFcwcaRMnC4CeZkZiAgKFE252nITC1Pew9Dj5GNEGgS4Rbb5eZ1Te7UXG6FLX4cV6zeh5kIDaDpSunL9Boyf5nLOpwT4Sx+BxWrFK8QAnTAapPRQwofcj86uLoG59cbVEOzA0NAQNh38Atn5RSjY8rFAmc/I3dyQvOx1PsSNVy7Roa3ajHDePbBYLSLn1MaGd5KFAXy07xAOl59C6elK+I73hIHcbGd6wXs8qkyH8FZcjLOI5X/9/TrOnLsAldJDUu4As1NToFFPe3IEpm/M2HigwCFnU6t4Zw6Ck1JhGRhgcXq5juXloKyqFnlHirmz5CaNcEAv59kSE9wVikcB3O78A/MSU0Fznk/H9+yAetJEnPr+B8RFLsLcGS8ia28+qQuX+WrPNNZOV+Nc6VH4+3iz89g0pEaLzRUiQ3LGDWsM8Qidq2WL0PGKKlgf74ZIeQTAfFJ6a44WIsDXh9OW/dPdY58aawC9KK6kpOgolO7JxViVSuBGXnvxksudZ5F0O5yzGYxMJnBOGaau4fnPU2RNAtCFBKFoa7akczaAptY2iWmjB33+yQa4kZwfjpi2ex3Dyf43vuAljWQ/4Btmei1WPj+q45hF4U+1J4fEizCEvNf0EWHoIW244sfzoN1RipaT2kDfdjfv3MNpojdISjmfIheE8Fnp8WR9vJ2Zr+O+bYUmO+kJ9KnIUtf9bnvY2x9wcqrrvnCJvfL8Tw4V9v9LU7PdKzJaoNdy645AR4ph1JMncZHRKrVvYyYY5kmP8iO1v2T3dk6HDtYmrgJtOnwKnaPFrg8z+BBX7QSgEyOPJfX9Qd9DFs40GgTOHbrBs2ch4bXFuEG2mmFkeD9hpUMk+NMXEe0TNtsg/Ly94DVurEAuxfwHC1WiVbe0U7MAAAAASUVORK5CYII=");
+    background-size: contain;
+}
+
+.header {
+    display: flex;
+    flex-wrap: wrap;
+    position: fixed;
+    top: 0;
+    left: 0;
+    width: 100%;
+    padding: 24px 24px 0 24px;
+    background-color: white;
+    z-index: 1;
+}
+
+.learn-more {
+    margin-left: auto;
+    align-self: center;
+    font-size: 0.875rem;
+    font-weight: normal;
+}
+
+.title {
+    display: flex;
+    align-items: center;
+    padding: 18px 0 24px 0;
+    flex: 1 0 100%;
+}
+
+.content {
+    font-size: 0.875rem;
+    padding: 240px 0 48px;
+    overflow-x: auto;
+    white-space: nowrap;
+}
+
+.content ol:first-of-type {
+    margin: 0;
+}
+
+.tree-btn {
+    cursor: pointer;
+    display: inline-block;
+    width: 16px;
+    height: 16px;
+    background-size: contain;
+    background-repeat: no-repeat;
+    vertical-align: middle;
+    margin-top: -0.2em;
+}
+
+.tree-btn.collapsed {
+    background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192 512"><path d="M166.9 264.5l-117.8 116c-4.7 4.7-12.3 4.7-17 0l-7.1-7.1c-4.7-4.7-4.7-12.3 0-17L127.3 256 25.1 155.6c-4.7-4.7-4.7-12.3 0-17l7.1-7.1c4.7-4.7 12.3-4.7 17 0l117.8 116c4.6 4.7 4.6 12.3-.1 17z" fill="%23999999" stroke="%23999999"/></svg>');
+}
+
+.tree-btn.expanded {
+    background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 512"><path d="M119.5 326.9L3.5 209.1c-4.7-4.7-4.7-12.3 0-17l7.1-7.1c4.7-4.7 12.3-4.7 17 0L128 287.3l100.4-102.2c4.7-4.7 12.3-4.7 17 0l7.1 7.1c4.7 4.7 4.7 12.3 0 17L136.5 327c-4.7 4.6-12.3 4.6-17-.1z" fill="%23999999" stroke="%23999999"/></svg>');
+}
+
+ul .tree-btn {
+    margin-right: 3px;
+}
+
+.leaf-icon {
+    display: inline-block;
+    width: 16px;
+    height: 16px;
+    background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 512"><path d="M32 256 H224" stroke="%23999999" stroke-width="48" stroke-linecap="round"/></svg>');
+    background-size: contain;
+    background-repeat: no-repeat;
+    vertical-align: middle;
+    margin-top: -0.2em;
+}
+
+.invisible-text {
+    user-select: all; /* Allow the text to be selectable */
+    color: transparent; /* Hide the text */
+    text-indent: -9999px; /* Move the text out of view */
+    position: relative;
+    white-space: pre; /* Preserve meaningful whitespace in the invisible text for copying */
+}
+
+.text-for-copy {
+    display: inline-block;
+}
+
+.enum-icon {
+    display: inline-block;
+    width: 16px;
+    height: 16px;
+    background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024"><circle cx="512" cy="512" r="200" /></svg>');
+    background-size: contain;
+    background-repeat: no-repeat;
+    vertical-align: middle;
+    margin-inline-start: 0.5ex;
+    margin-inline-end: 0.5ex;
+    margin-top: -0.2em;
+}
+
+.error-icon {
+    display: inline-block;
+    width: 16px;
+    height: 16px;
+    background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path d="M193.94 256L296.5 153.44l21.15-21.15c3.12-3.12 3.12-8.19 0-11.31l-22.63-22.63c-3.12-3.12-8.19-3.12-11.31 0L160 222.06 36.29 98.34c-3.12-3.12-8.19-3.12-11.31 0L2.34 120.97c-3.12 3.12-3.12 8.19 0 11.31L126.06 256 2.34 379.71c-3.12 3.12-3.12 8.19 0 11.31l22.63 22.63c3.12 3.12 8.19 3.12 11.31 0L160 289.94 262.56 392.5l21.15 21.15c3.12 3.12 8.19 3.12 11.31 0l22.63-22.63c3.12-3.12 3.12-8.19 0-11.31L193.94 256z" fill="%23FC461E" stroke="%23FC461E"/></svg>');
+    background-size: contain;
+    background-repeat: no-repeat;
+    vertical-align: middle;
+    margin-inline-start: 0.5ex;
+    margin-inline-end: 0.5ex;
+    margin-top: -0.2em;
+}
+
+.advice-icon {
+    display: inline-block;
+    width: 16px;
+    height: 16px;
+    background-image: url('data:image/svg+xml;utf8,<svg width="800px" height="800px" viewBox="-4.93 0 122.88 122.88" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"  style="enable-background:new 0 0 113.01 122.88" xml:space="preserve"><g><path d="M44.13,102.06c-1.14,0.03-2.14-0.81-2.3-1.96c-0.17-1.2,0.64-2.31,1.82-2.54c-1.3-7.37-4.85-11.43-8.6-15.72 c-2.92-3.34-5.95-6.81-8.34-11.92c-2.35-5.03-3.64-10.23-3.6-15.63c0.05-5.4,1.42-10.96,4.4-16.71c0.02-0.04,0.04-0.07,0.06-0.11 l0,0c3.91-6.62,9.38-11.04,15.47-13.52c5.11-2.09,10.66-2.8,16.1-2.3c5.42,0.5,10.73,2.2,15.37,4.94 c5.9,3.49,10.75,8.67,13.42,15.21c1.44,3.54,2.42,7.49,2.54,11.82c0.12,4.31-0.62,8.96-2.61,13.88 c-2.66,6.59-6.18,10.68-9.47,14.51c-3.03,3.53-5.85,6.81-7.42,11.84c0.89,0.21,1.59,0.94,1.73,1.9c0.17,1.24-0.7,2.39-1.94,2.56 l-0.77,0.11c-0.14,1.09-0.23,2.26-0.27,3.51l0.25-0.04c1.24-0.17,2.39,0.7,2.56,1.94c0.17,1.24-0.7,2.39-1.94,2.56l-0.78,0.11 c0.01,0.15,0.02,0.3,0.03,0.45l0,0c0.07,0.88,0.08,1.73,0.03,2.54l0.13-0.02c1.25-0.15,2.38,0.74,2.54,1.98 c0.15,1.25-0.74,2.38-1.98,2.54l-1.68,0.21c-1.2,3.11-3.34,5.48-5.87,6.94c-1.74,1.01-3.67,1.59-5.61,1.71 c-1.97,0.12-3.96-0.25-5.78-1.13c-2.08-1.02-3.94-2.71-5.29-5.14c-0.65-0.33-1.13-0.97-1.23-1.75c-0.04-0.31-0.01-0.61,0.07-0.89 c-0.39-1.16-0.68-2.43-0.87-3.83l-0.07,0.01c-1.24,0.17-2.39-0.7-2.56-1.94c-0.17-1.24,0.7-2.39,1.94-2.56l0.54-0.08 C44.19,104.32,44.18,103.16,44.13,102.06L44.13,102.06z M2.18,58.86C1.01,58.89,0.04,57.98,0,56.81c-0.04-1.17,0.88-2.14,2.05-2.18 l8.7-0.3c1.17-0.04,2.14,0.88,2.18,2.05c0.04,1.17-0.88,2.14-2.05,2.18L2.18,58.86L2.18,58.86z M110.68,50.25 c1.16-0.12,2.2,0.73,2.32,1.89c0.12,1.16-0.73,2.2-1.89,2.32l-8.66,0.91c-1.16,0.12-2.2-0.73-2.32-1.89 c-0.12-1.16,0.73-2.2,1.89-2.32L110.68,50.25L110.68,50.25z M94.91,14.78c0.65-0.97,1.96-1.23,2.93-0.58 c0.97,0.65,1.23,1.96,0.58,2.93l-4.84,7.24c-0.65,0.97-1.96,1.23-2.93,0.58c-0.97-0.65-1.23-1.96-0.58-2.93L94.91,14.78 L94.91,14.78z M57.63,2.06c0.03-1.17,1-2.09,2.16-2.06c1.17,0.03,2.09,1,2.06,2.16l-0.22,8.7c-0.03,1.17-1,2.09-2.16,2.06 c-1.17-0.03-2.09-1-2.06-2.16L57.63,2.06L57.63,2.06z M13.88,15.53c-0.86-0.8-0.9-2.14-0.11-2.99c0.8-0.86,2.14-0.9,2.99-0.11 l6.37,5.94c0.86,0.8,0.9,2.14,0.11,2.99c-0.8,0.86-2.14,0.9-2.99,0.11L13.88,15.53L13.88,15.53z M47.88,96.95l18.49-2.63 c1.59-6.7,5.05-10.73,8.8-15.08c3.08-3.58,6.36-7.4,8.76-13.34c1.76-4.35,2.41-8.43,2.31-12.19c-0.1-3.75-0.96-7.21-2.24-10.34 c-2.3-5.63-6.51-10.11-11.65-13.15c-4.11-2.43-8.8-3.94-13.59-4.37c-4.77-0.44-9.64,0.19-14.13,2.02 c-5.26,2.15-9.99,5.97-13.39,11.72c-2.64,5.12-3.86,10.02-3.9,14.73c-0.04,4.74,1.11,9.33,3.2,13.8c2.13,4.56,4.97,7.8,7.69,10.92 C42.47,83.9,46.48,88.49,47.88,96.95L47.88,96.95z M65.62,99.02l-17.27,2.45c0.05,1.1,0.07,2.25,0.05,3.47l17.05-2.42 C65.47,101.29,65.52,100.12,65.62,99.02L65.62,99.02z M48.49,109.52c0.12,0.92,0.3,1.76,0.53,2.54l16.55-2.04 c0.11-0.86,0.13-1.77,0.05-2.74l0,0l0-0.02l-0.01-0.17L48.49,109.52L48.49,109.52z M51.37,116.36c0.64,0.67,1.35,1.19,2.1,1.55 c1.15,0.56,2.42,0.79,3.67,0.72c1.29-0.08,2.57-0.47,3.74-1.15c1.1-0.64,2.09-1.53,2.88-2.65L51.37,116.36L51.37,116.36z"/></g></svg>');
+    background-size: contain;
+    background-repeat: no-repeat;
+    vertical-align: middle;
+    margin-inline-start: 0.5ex;
+    margin-inline-end: 0.5ex;
+    margin-top: -0.2em;
+}
+
+.warning-icon {
+    display: inline-block;
+    width: 13px;
+    height: 13px;
+    background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M270.2 160h35.5c3.4 0 6.1 2.8 6 6.2l-7.5 196c-.1 3.2-2.8 5.8-6 5.8h-20.5c-3.2 0-5.9-2.5-6-5.8l-7.5-196c-.1-3.4 2.6-6.2 6-6.2zM288 388c-15.5 0-28 12.5-28 28s12.5 28 28 28 28-12.5 28-28-12.5-28-28-28zm281.5 52L329.6 24c-18.4-32-64.7-32-83.2 0L6.5 440c-18.4 31.9 4.6 72 41.6 72H528c36.8 0 60-40 41.5-72zM528 480H48c-12.3 0-20-13.3-13.9-24l240-416c6.1-10.6 21.6-10.7 27.7 0l240 416c6.2 10.6-1.5 24-13.8 24z" fill="%23DEAD22" stroke="%23DEAD22"/></svg>');
+    background-size: contain;
+    background-repeat: no-repeat;
+    vertical-align: middle;
+    margin-inline-start: 0.3ex;
+    margin-inline-end: 1.1ex;
+    margin-top: -0.1em;
+}
+
+.documentation-button {
+    cursor: pointer;
+    display: inline-block;
+    width: 13px;
+    height: 13px;
+    background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M256 340c-15.464 0-28 12.536-28 28s12.536 28 28 28 28-12.536 28-28-12.536-28-28-28zm7.67-24h-16c-6.627 0-12-5.373-12-12v-.381c0-70.343 77.44-63.619 77.44-107.408 0-20.016-17.761-40.211-57.44-40.211-29.144 0-44.265 9.649-59.211 28.692-3.908 4.98-11.054 5.995-16.248 2.376l-13.134-9.15c-5.625-3.919-6.86-11.771-2.645-17.177C185.658 133.514 210.842 116 255.67 116c52.32 0 97.44 29.751 97.44 80.211 0 67.414-77.44 63.849-77.44 107.408V304c0 6.627-5.373 12-12 12zM256 40c118.621 0 216 96.075 216 216 0 119.291-96.61 216-216 216-119.244 0-216-96.562-216-216 0-119.203 96.602-216 216-216m0-32C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8z" fill="%23999999" stroke="%23999999"/></svg>');
+    background-size: contain;
+    background-repeat: no-repeat;
+    vertical-align: middle;
+    margin-inline-start: 0.5ex;
+    margin-inline-end: 0.5ex;
+    margin-top: -0.2em;
+}
+
+.documentation-button::selection {
+    color: transparent;
+}
+
+.documentation-button:hover {
+    color: transparent;
+}
+
+.copy-button {
+    cursor: pointer;
+    display: inline-block;
+    width: 12px;
+    height: 12px;
+    background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M433.941 193.941l-51.882-51.882A48 48 0 0 0 348.118 128H320V80c0-26.51-21.49-48-48-48h-66.752C198.643 13.377 180.858 0 160 0s-38.643 13.377-45.248 32H48C21.49 32 0 53.49 0 80v288c0 26.51 21.49 48 48 48h80v48c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48V227.882a48 48 0 0 0-14.059-33.941zm-22.627 22.627a15.888 15.888 0 0 1 4.195 7.432H352v-63.509a15.88 15.88 0 0 1 7.431 4.195l51.883 51.882zM160 30c9.941 0 18 8.059 18 18s-8.059 18-18 18-18-8.059-18-18 8.059-18 18-18zM48 384c-8.822 0-16-7.178-16-16V80c0-8.822 7.178-16 16-16h66.752c6.605 18.623 24.389 32 45.248 32s38.643-13.377 45.248-32H272c8.822 0 16 7.178 16 16v48H176c-26.51 0-48 21.49-48 48v208H48zm352 96H176c-8.822 0-16-7.178-16-16V176c0-8.822 7.178-16 16-16h144v72c0 13.2 10.8 24 24 24h72v208c0 8.822-7.178 16-16 16z" fill="%23999999" stroke="%23999999"/></svg>');
+    background-size: contain;
+    background-repeat: no-repeat;
+    vertical-align: middle;
+    margin-inline-start: 0.5ex;
+    margin-top: -0.2em;
+}
+
+.groups{
+    display: flex;
+    border-bottom: 1px solid #EDEEEF;
+    flex: 1 0 100%;
+}
+
+.uncategorized {
+    display: flex;
+    border-top: 4px solid #EDEEEF;
+    flex: 1 0 100%;
+}
+
+.group-selector {
+    padding: 0 52px 24px 0;
+    font-size: 0.9rem;
+    font-weight: bold;
+    color: #999999;
+    cursor: pointer;
+}
+
+.group-selector__count {
+    margin: 0 8px;
+    border-radius: 8px;
+    background-color: #999;
+    color: #fff;
+    padding: 1px 8px 2px;
+    font-size: 0.75rem;
+}
+
+.group-selector--active {
+    color: #02303A;
+    cursor: auto;
+}
+
+.group-selector--active .group-selector__count {
+    background-color: #686868;
+}
+
+.group-selector--disabled {
+    cursor: not-allowed;
+}
+
+.accordion-header {
+    cursor: pointer;
+}
+
+.container {
+    padding-left: 0.5em;
+    padding-right: 0.5em;
+}
+
+.stacktrace {
+    border-radius: 4px;
+    overflow-x: auto;
+    padding: 0.5rem;
+    margin-bottom: 0;
+    min-width: 1000px;
+}
+
+/* Lato (bold, regular) */
+@font-face {
+    font-display: swap;
+    font-family: Lato;
+    font-weight: 500;
+    font-style: normal;
+    src: url("https://assets.gradle.com/lato/fonts/lato-semibold/lato-semibold.woff2") format("woff2"),
+    url("https://assets.gradle.com/lato/fonts/lato-semibold/lato-semibold.woff") format("woff");
+}
+
+@font-face {
+    font-display: swap;
+    font-family: Lato;
+    font-weight: bold;
+    font-style: normal;
+    src: url("https://assets.gradle.com/lato/fonts/lato-bold/lato-bold.woff2") format("woff2"),
+    url("https://assets.gradle.com/lato/fonts/lato-bold/lato-bold.woff") format("woff");
+}
+
+* {
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+}
+
+html,
+body {
+    margin: 0;
+    padding: 0;
+}
+
+html {
+    font-family: "Lato", "Helvetica Neue", Arial, sans-serif;
+    font-size: 16px;
+    font-weight: 400;
+    line-height: 1.5;
+}
+
+body {
+    color: #02303A;
+    background-color: #ffffff;
+    -webkit-text-size-adjust: 100%;
+    -ms-text-size-adjust: 100%;
+    -webkit-font-smoothing: antialiased;
+}
+
+
+/* typography */
+h1, h2, h3, h4, h5, h6 {
+    color: #02303A;
+    text-rendering: optimizeLegibility;
+    margin: 0;
+}
+
+h1 {
+    font-size: 1rem;
+}
+
+h2 {
+    font-size: 0.9rem;
+}
+
+h3 {
+    font-size: 1.125rem;
+}
+
+h4, h5, h6 {
+    font-size: 0.875rem;
+}
+
+h1 code {
+    font-weight: bold;
+}
+
+ul, ol, dl {
+    list-style-position: outside;
+    line-height: 1.6;
+    padding: 0;
+    margin: 0 0 0 20px;
+    list-style-type: none;
+}
+
+li {
+    line-height: 2;
+}
+
+a {
+    color: #1DA2BD;
+    text-decoration: none;
+    transition: all 0.3s ease, visibility 0s;
+}
+
+a:hover {
+    color: #35c1e4;
+}
+
+/* code */
+code, pre {
+    font-family: Inconsolata, Monaco, "Courier New", monospace;
+    font-style: normal;
+    font-variant-ligatures: normal;
+    font-variant-caps: normal;
+    font-variant-numeric: normal;
+    font-variant-east-asian: normal;
+    font-weight: normal;
+    font-stretch: normal;
+    color: #686868;
+}
+
+*:not(pre) > code {
+    letter-spacing: 0;
+    padding: 0.1em 0.5ex;
+    text-rendering: optimizeSpeed;
+    word-spacing: -0.15em;
+    word-wrap: break-word;
+}
+
+pre {
+    font-size: 0.75rem;
+    line-height: 1.8;
+    margin-top: 0;
+    margin-bottom: 1.5em;
+    padding: 1rem;
+}
+
+pre code {
+    background-color: transparent;
+    color: inherit;
+    line-height: 1.8;
+    font-size: 100%;
+    padding: 0;
+}
+
+a code {
+    color: #1BA8CB;
+}
+
+pre.code, pre.programlisting, pre.screen, pre.tt {
+    background-color: #f7f7f8;
+    border-radius: 4px;
+    font-size: 1em;
+    line-height: 1.45;
+    margin-bottom: 1.25em;
+    overflow-x: auto;
+    padding: 1rem;
+}
+
+li em, p em {
+    padding: 0 1px;
+}
+
+code em, tt em {
+    text-decoration: none;
+}
+
+code + .copy-button {
+    margin-inline-start: 0.2ex;
+}
+
+.java-exception {
+    font-size: 0.75rem;
+    padding-left: 24px;
+}
+
+.java-exception ul {
+    margin: 0;
+    line-height: inherit;
+}
+
+.java-exception code {
+    white-space: pre;
+}
+
+.java-exception-part-toggle {
+    user-select: none;
+    cursor: pointer;
+    border-radius: 2px;
+    padding: 0.1em 0.2em;
+    background: azure;
+    color: #686868;
+}
+
+                </style>
+    <!-- Inconsolata is used as a default monospace font in the report. -->
+    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inconsolata:400,700" />
+
+    <title>Gradle Configuration Cache</title>
+</head>
+<body>
+
+<div id="playground"></div>
+
+<div class="report" id="report">
+    Loading...
+</div>
+
+<script type="text/javascript">
+function configurationCacheProblems() { return (
+// begin-report-data
+{"diagnostics":[{"locations":[{"path":"C:\\Users\\takensoft\\IdeaProjects\\cms_backend\\src\\main\\java\\com\\takensoft\\cms\\bbs\\web\\BbsMngController.java"},{"taskPath":":compileJava"}],"problem":[{"text":"Java compilation note"}],"severity":"ADVICE","problemDetails":[{"text":"Note: C:\\Users\\takensoft\\IdeaProjects\\cms_backend\\src\\main\\java\\com\\takensoft\\cms\\bbs\\web\\BbsMngController.java uses unchecked or unsafe operations."}],"contextualLabel":"C:\\Users\\takensoft\\IdeaProjects\\cms_backend\\src\\main\\java\\com\\takensoft\\cms\\bbs\\web\\BbsMngController.java uses unchecked or unsafe operations.","problemId":[{"name":"java","displayName":"Java compilation"},{"name":"compilation","displayName":"Compilation"},{"name":"compiler-note-unchecked-filename","displayName":"Java compilation note"}]},{"locations":[{"path":"C:\\Users\\takensoft\\IdeaProjects\\cms_backend\\src\\main\\java\\com\\takensoft\\cms\\bbs\\web\\BbsMngController.java"},{"taskPath":":compileJava"}],"problem":[{"text":"Java compilation note"}],"severity":"ADVICE","problemDetails":[{"text":"Note: Recompile with -Xlint:unchecked for details."}],"contextualLabel":"Recompile with -Xlint:unchecked for details.","problemId":[{"name":"java","displayName":"Java compilation"},{"name":"compilation","displayName":"Compilation"},{"name":"compiler-note-unchecked-recompile","displayName":"Java compilation note"}]}],"problemsReport":{"totalProblemCount":2,"buildName":"cms","requestedTasks":":classes","documentationLink":"https://docs.gradle.org/8.13/userguide/reporting_problems.html","documentationLinkCaption":"Problem report","summaries":[]}}
+// end-report-data
+);}
+</script>
+                <script type="text/javascript">
+                !function(n,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports["configuration-cache-report"]=t():n["configuration-cache-report"]=t()}(this,(()=>(({70:function(){void 0===ArrayBuffer.isView&&(ArrayBuffer.isView=function(n){return null!=n&&null!=n.__proto__&&n.__proto__.__proto__===Int8Array.prototype.__proto__}),void 0===Math.imul&&(Math.imul=function(n,t){return(4294901760&n)*(65535&t)+(65535&n)*(0|t)|0}),this["configuration-cache-report"]=function(n){"use strict";var t,r,i,e,u,o,f,s,c,a,h,l,_,v,d,g,w,b,p,m,k,y,q,B,C,x,j,P,I,S,z,E,T,L,N,A,M,F,D,O,R,H,$,G,U,V,Q,Z,Y,W,K,X,J,nn,tn,rn,en,un,on,fn,sn,cn,an,hn,ln,_n,vn,dn,gn,wn,bn,pn,mn,kn,yn,qn,Bn,Cn,xn,jn,Pn,In,Sn,zn=Math.imul,En=ArrayBuffer.isView;function Tn(n,t){if(!(t>=0))throw fu(ie("Requested element count "+t+" is less than zero."));return function(n,t){if(!(t>=0))throw fu(ie("Requested element count "+t+" is less than zero."));if(0===t)return pt();if(t>=n.length)return function(n){switch(n.length){case 0:return pt();case 1:return gr(n[0]);default:return function(n){return Ar(function(n){return new qt(n,!1)}(n))}(n)}}(n);if(1===t)return gr(n[0]);var r=0,i=Nr(),e=0,u=n.length;n:for(;e<u;){var o=n[e];if(e=e+1|0,i.d(o),(r=r+1|0)===t)break n}return i}(n,Wn(n.length-t|0,0))}function Ln(n,t,r,i,e,u,o){return t=t===A?", ":t,r=r===A?"":r,i=i===A?"":i,e=e===A?-1:e,u=u===A?"...":u,o=o===A?null:o,function(n,t,r,i,e,u,o,f){r=r===A?", ":r,i=i===A?"":i,e=e===A?"":e,u=u===A?-1:u,o=o===A?"...":o,f=f===A?null:f,t.e(i);var s=0,c=0,a=n.length;n:for(;c<a;){var h=n[c];if(c=c+1|0,(s=s+1|0)>1&&t.e(r),!(u<0||s<=u))break n;Qt(t,h,f)}return u>=0&&s>u&&t.e(o),t.e(e),t}(n,bi(),t,r,i,e,u,o).toString()}function Nn(n){return n.length-1|0}function An(n,t){if(null==t){var r=0,i=n.length-1|0;if(r<=i)do{var e=r;if(r=r+1|0,null==n[e])return e}while(r<=i)}else{var u=0,o=n.length-1|0;if(u<=o)do{var f=u;if(u=u+1|0,oe(t,n[f]))return f}while(u<=o)}return-1}function Mn(n,t,r,i,e,u,o){return t=t===A?", ":t,r=r===A?"":r,i=i===A?"":i,e=e===A?-1:e,u=u===A?"...":u,o=o===A?null:o,Fn(n,bi(),t,r,i,e,u,o).toString()}function Fn(n,t,r,i,e,u,o,f){r=r===A?", ":r,i=i===A?"":i,e=e===A?"":e,u=u===A?-1:u,o=o===A?"...":o,f=f===A?null:f,t.e(i);var s=0,c=n.f();n:for(;c.g();){var a=c.h();if((s=s+1|0)>1&&t.e(r),!(u<0||s<=u))break n;Qt(t,a,f)}return u>=0&&s>u&&t.e(o),t.e(e),t}function Dn(n){if(n.i())throw mu("List is empty.");return n.j(0)}function On(n){return new Yn(n)}function Rn(n){if(Ue(n,Ti)){var t;switch(n.k()){case 0:t=pt();break;case 1:t=gr(Ue(n,Ei)?n.j(0):n.f().h());break;default:t=Hn(n)}return t}return mt(Vn(n))}function Hn(n){return Ar(n)}function $n(n){if(Ue(n,Ti)&&n.k()<=1)return Rn(n);var t=Vn(n);return function(n){var t=(n.k()/2|0)-1|0;if(t<0)return lr();var r=kt(n),i=0;if(i<=t)do{var e=i;i=i+1|0;var u=n.j(e);n.f4(e,n.j(r)),n.f4(r,u),r=r-1|0}while(e!==t)}(t),t}function Gn(n,t){if(!(t>=0))throw fu(ie("Requested element count "+t+" is less than zero."));return function(n,t){if(!(t>=0))throw fu(ie("Requested element count "+t+" is less than zero."));if(0===t)return pt();if(Ue(n,Ti)){if(t>=n.k())return Rn(n);if(1===t)return gr(function(n){if(Ue(n,Ei))return Dn(n);var t=n.f();if(!t.g())throw mu("Collection is empty.");return t.h()}(n))}var r=0,i=Nr(),e=n.f();n:for(;e.g();){var u=e.h();if(i.d(u),(r=r+1|0)===t)break n}return mt(i)}(n,Wn(n.k()-t|0,0))}function Un(n,t){if(!(t>=0))throw fu(ie("Requested element count "+t+" is less than zero."));if(0===t)return pt();var r=n.k();if(t>=r)return Rn(n);if(1===t)return gr(Qn(n));var i=Nr();if(Ue(n,li)){var e=r-t|0;if(e<r)do{var u=e;e=e+1|0,i.d(n.j(u))}while(e<r)}else for(var o=n.l(r-t|0);o.g();){var f=o.h();i.d(f)}return i}function Vn(n){return Ue(n,Ti)?Hn(n):Zn(n,Lr())}function Qn(n){if(n.i())throw mu("List is empty.");return n.j(kt(n))}function Zn(n,t){for(var r=n.f();r.g();){var i=r.h();t.d(i)}return t}function Yn(n){this.n_1=n}function Wn(n,t){return n<t?t:n}function Kn(n,t){return n>t?t:n}function Xn(n,t){return Ut().q(n,t,-1)}function Jn(n,t){return new Et(n,t)}function nt(n){var t=n.f();if(!t.g())return pt();var r=t.h();if(!t.g())return gr(r);var i=Lr();for(i.d(r);t.g();)i.d(t.h());return i}function tt(n){this.r_1=n}function rt(n,t){this.s_1=n,this.t_1=t}function it(){}function et(n){this.x_1=n,this.w_1=0}function ut(n,t){this.a1_1=n,et.call(this,n),ft().b1(t,this.a1_1.k()),this.w_1=t}function ot(){t=this}function ft(){return null==t&&new ot,t}function st(){ft(),it.call(this)}function ct(n){this.h1_1=n}function at(n,t){return t===n?"(this Map)":Oi(t)}function ht(n,t){var r;n:{for(var i=n.o().f();i.g();){var e=i.h();if(oe(e.j1(),t)){r=e;break n}}r=null}return r}function lt(){r=this}function _t(){return null==r&&new lt,r}function vt(n){this.q1_1=n,it.call(this)}function dt(){_t(),this.n1_1=null,this.o1_1=null}function gt(){i=this}function wt(){return null==i&&new gt,i}function bt(n){return n.length>0?nu(n):pt()}function pt(){return null==e&&new yt,e}function mt(n){switch(n.k()){case 0:return pt();case 1:return gr(n.j(0));default:return n}}function kt(n){return n.k()-1|0}function yt(){e=this,this.z1_1=new de(-1478467534,-1720727600)}function qt(n,t){this.b2_1=n,this.c2_1=t}function Bt(){u=this}function Ct(){return null==u&&new Bt,u}function xt(n,t){return Ue(n,Ti)?n.k():t}function jt(n,t){if(Ue(t,Ti))return n.m(t);for(var r=!1,i=t.f();i.g();){var e=i.h();n.d(e)&&(r=!0)}return r}function Pt(){}function It(n,t){this.h2_1=n,this.g2_1=n.i2_1.l(function(n,t){if(!(0<=t&&t<=n.k()))throw cu("Position index "+t+" must be in range ["+Oe(0,n.k())+"].");return n.k()-t|0}(n,t))}function St(n){st.call(this),this.i2_1=n}function zt(n){this.k2_1=n,this.j2_1=n.l2_1.f()}function Et(n,t){this.l2_1=n,this.m2_1=t}function Tt(n){for(;n.n2_1.g();){var t=n.n2_1.h();if(n.q2_1.t2_1(t)===n.q2_1.s2_1)return n.p2_1=t,n.o2_1=1,lr()}n.o2_1=0}function Lt(n){this.q2_1=n,this.n2_1=n.r2_1.f(),this.o2_1=-1,this.p2_1=null}function Nt(n,t,r){t=t===A||t,this.r2_1=n,this.s2_1=t,this.t2_1=r}function At(){return null==o&&new Mt,o}function Mt(){o=this,this.u2_1=new de(1993859828,793161749)}function Ft(n,t,r){return Dt(Dt(n,r)-Dt(t,r)|0,r)}function Dt(n,t){var r=n%t|0;return r>=0?r:r+t|0}function Ot(){f=this,this.p_1=new Ht(1,0)}function Rt(){return null==f&&new Ot,f}function Ht(n,t){Rt(),Vt.call(this,n,t,1)}function $t(n,t,r){Pt.call(this),this.d3_1=r,this.e3_1=t,this.f3_1=this.d3_1>0?n<=t:n>=t,this.g3_1=this.f3_1?n:this.e3_1}function Gt(){s=this}function Ut(){return null==s&&new Gt,s}function Vt(n,t,r){if(Ut(),0===r)throw fu("Step must be non-zero.");if(r===vr().MIN_VALUE)throw fu("Step must be greater than Int.MIN_VALUE to avoid overflow on negation.");this.z2_1=n,this.a3_1=function(n,t,r){var i;if(r>0)i=n>=t?t:t-Ft(t,n,r)|0;else{if(!(r<0))throw fu("Step is zero.");i=n<=t?t:t+Ft(n,t,0|-r)|0}return i}(n,t,r),this.b3_1=r}function Qt(n,t,r){null!=r?n.e(r(t)):null==t||Ze(t)?n.e(t):t instanceof zi?n.i3(t.h3_1):n.e(Oi(t))}function Zt(n,t,r){if(n===t)return!0;if(!(r=r!==A&&r))return!1;var i=mi(n),e=mi(t);return i===e||oe(new zi(Zi(Pi(i).toLowerCase(),0)),new zi(Zi(Pi(e).toLowerCase(),0)))}function Yt(n){return Wi(n)-1|0}function Wt(n,t,r,i){return r=r===A?0:r,(i=i!==A&&i)||"string"!=typeof n?Kt(n,t,r,Wi(n),i):n.indexOf(t,r)}function Kt(n,t,r,i,e,u){var o=(u=u!==A&&u)?Xn(Kn(r,Yt(n)),Wn(i,0)):Oe(Wn(r,0),Kn(i,Wi(n)));if("string"==typeof n&&"string"==typeof t){var f=o.z2_1,s=o.a3_1,c=o.b3_1;if(c>0&&f<=s||c<0&&s<=f)do{var a=f;if(f=f+c|0,xi(t,0,n,a,Wi(t),e))return a}while(a!==s)}else{var h=o.z2_1,l=o.a3_1,_=o.b3_1;if(_>0&&h<=l||_<0&&l<=h)do{var v=h;if(h=h+_|0,tr(t,0,n,v,Wi(t),e))return v}while(v!==l)}return-1}function Xt(n){var t=0,r=Wi(n)-1|0,i=!1;n:for(;t<=r;){var e=ki(Zi(n,i?r:t));if(i){if(!e)break n;r=r-1|0}else e?t=t+1|0:i=!0}return Ki(n,t,r+1|0)}function Jt(n,t){return ie(Ki(n,t.y2(),t.c3()+1|0))}function nr(n,t,r,i,e){r=r===A?0:r,i=i!==A&&i,rr(e=e===A?0:e);var u,o,f=nu(t);return new ur(n,r,e,(u=f,o=i,function(n,t){var r=function(n,t,r,i){if(!i&&1===t.k()){var e=function(n){if(Ue(n,Ei))return function(n){var t;switch(n.k()){case 0:throw mu("List is empty.");case 1:t=n.j(0);break;default:throw fu("List has more than one element.")}return t}(n);var t=n.f();if(!t.g())throw mu("Collection is empty.");var r=t.h();if(t.g())throw fu("Collection has more than one element.");return r}(t),u=Wt(n,e,r);return u<0?null:fr(u,e)}var o=Oe(Wn(r,0),Wi(n));if("string"==typeof n){var f=o.z2_1,s=o.a3_1,c=o.b3_1;if(c>0&&f<=s||c<0&&s<=f)do{var a,h=f;f=f+c|0;n:{for(var l=t.f();l.g();){var _=l.h();if(xi(_,0,n,h,_.length,i)){a=_;break n}}a=null}if(null!=a)return fr(h,a)}while(h!==s)}else{var v=o.z2_1,d=o.a3_1,g=o.b3_1;if(g>0&&v<=d||g<0&&d<=v)do{var w,b=v;v=v+g|0;n:{for(var p=t.f();p.g();){var m=p.h();if(tr(m,0,n,b,m.length,i)){w=m;break n}}w=null}if(null!=w)return fr(b,w)}while(b!==d)}return null}(n,u,t,o);return null==r?null:fr(r.t3_1,r.u3_1.length)}))}function tr(n,t,r,i,e,u){if(i<0||t<0||t>(Wi(n)-e|0)||i>(Wi(r)-e|0))return!1;var o=0;if(o<e)do{var f=o;if(o=o+1|0,!Zt(Zi(n,t+f|0),Zi(r,i+f|0),u))return!1}while(o<e);return!0}function rr(n){if(!(n>=0))throw fu(ie("Limit must be non-negative, but was "+n))}function ir(n){if(n.l3_1<0)n.j3_1=0,n.m3_1=null;else{var t;if(n.o3_1.r3_1>0?(n.n3_1=n.n3_1+1|0,t=n.n3_1>=n.o3_1.r3_1):t=!1,t||n.l3_1>Wi(n.o3_1.p3_1))n.m3_1=Oe(n.k3_1,Yt(n.o3_1.p3_1)),n.l3_1=-1;else{var r=n.o3_1.s3_1(n.o3_1.p3_1,n.l3_1);if(null==r)n.m3_1=Oe(n.k3_1,Yt(n.o3_1.p3_1)),n.l3_1=-1;else{var i=r.v3(),e=r.w3();n.m3_1=function(n,t){return t<=vr().MIN_VALUE?Rt().p_1:Oe(n,t-1|0)}(n.k3_1,i),n.k3_1=i+e|0,n.l3_1=n.k3_1+(0===e?1:0)|0}}n.j3_1=1}}function er(n){this.o3_1=n,this.j3_1=-1,this.k3_1=function(n,t,r){if(0>r)throw fu("Cannot coerce value to an empty range: maximum "+r+" is less than minimum 0.");return n<0?0:n>r?r:n}(n.q3_1,0,Wi(n.p3_1)),this.l3_1=this.k3_1,this.m3_1=null,this.n3_1=0}function ur(n,t,r,i){this.p3_1=n,this.q3_1=t,this.r3_1=r,this.s3_1=i}function or(n,t){this.t3_1=n,this.u3_1=t}function fr(n,t){return new or(n,t)}function sr(){}function cr(){}function ar(){}function hr(){c=this}function lr(){return null==c&&new hr,c}function _r(){a=this,this.MIN_VALUE=-2147483648,this.MAX_VALUE=2147483647,this.SIZE_BYTES=4,this.SIZE_BITS=32}function vr(){return null==a&&new _r,a}function dr(n){for(var t=[],r=n.f();r.g();)t.push(r.h());return t}function gr(n){return 0===(t=[n]).length?Lr():Ar(new qt(t,!0));var t}function wr(n){return n<0&&function(){throw yu("Index overflow has happened.")}(),n}function br(n){return void 0!==n.toArray?n.toArray():dr(n)}function pr(n){return function(n,t){for(var r=0,i=n.length;r<i;){var e=n[r];r=r+1|0,t.d(e)}return t}(t=[n],(r=t.length,i=ce(se(Zr)),function(n,t,r){zr.call(r),Zr.call(r),r.y5_1=function(n){return Ur(n,0,ce(se(Vr)))}(n)}(r,0,i),i));var t,r,i}function mr(){it.call(this)}function kr(n){this.j4_1=n,this.h4_1=0,this.i4_1=-1}function yr(n,t){this.n4_1=n,kr.call(this,n),ft().b1(t,this.n4_1.k()),this.h4_1=t}function qr(){mr.call(this),this.o4_1=0}function Br(n){this.r4_1=n}function Cr(n){this.s4_1=n}function xr(n,t){this.t4_1=n,this.u4_1=t}function jr(){zr.call(this)}function Pr(n){this.x4_1=n,zr.call(this)}function Ir(n){this.e5_1=n,mr.call(this)}function Sr(){dt.call(this),this.c5_1=null,this.d5_1=null}function zr(){mr.call(this)}function Er(){h=this;var n=Nr();n.c_1=!0,this.i5_1=n}function Tr(){return null==h&&new Er,h}function Lr(){return n=ce(se(Fr)),t=[],Fr.call(n,t),n;var n,t}function Nr(n){return t=ce(se(Fr)),r=[],Fr.call(t,r),t;var t,r}function Ar(n){return function(n,t){var r;return r=br(n),Fr.call(t,r),t}(n,ce(se(Fr)))}function Mr(n,t){return ft().e1(t,n.k()),t}function Fr(n){Tr(),qr.call(this),this.b_1=n,this.c_1=!1}function Dr(n,t,r,i,e){if(r===i)return n;var u=(r+i|0)/2|0,o=Dr(n,t,r,u,e),f=Dr(n,t,u+1|0,i,e),s=o===t?n:t,c=r,a=u+1|0,h=r;if(h<=i)do{var l=h;if(h=h+1|0,c<=u&&a<=i){var _=o[c],v=f[a];e.compare(_,v)<=0?(s[l]=_,c=c+1|0):(s[l]=v,a=a+1|0)}else c<=u?(s[l]=o[c],c=c+1|0):(s[l]=f[a],a=a+1|0)}while(l!==i);return s}function Or(n,t){return(3&n)-(3&t)|0}function Rr(){_=this}function Hr(n){this.n5_1=n,jr.call(this)}function $r(n){return function(n,t){Sr.call(t),Vr.call(t),t.t5_1=n,t.u5_1=n.w5()}(new Jr((null==_&&new Rr,_)),n),n}function Gr(){return $r(ce(se(Vr)))}function Ur(n,t,r){if($r(r),!(n>=0))throw fu(ie("Negative initial capacity: "+n));if(!(t>=0))throw fu(ie("Non-positive load factor: "+t));return r}function Vr(){this.v5_1=null}function Qr(n,t){return zr.call(t),Zr.call(t),t.y5_1=n,t}function Zr(){}function Yr(n,t){var r=Kr(n,n.h6_1.m5(t));if(null==r)return null;var i=r;if(null!=i&&Ve(i))return Wr(i,n,t);var e=i;return n.h6_1.l5(e.j1(),t)?e:null}function Wr(n,t,r){var i;n:{for(var e=0,u=n.length;e<u;){var o=n[e];if(e=e+1|0,t.h6_1.l5(o.j1(),r)){i=o;break n}}i=null}return i}function Kr(n,t){var r=n.i6_1[t];return void 0===r?null:r}function Xr(n){this.g6_1=n,this.z5_1=-1,this.a6_1=Object.keys(n.i6_1),this.b6_1=-1,this.c6_1=null,this.d6_1=!1,this.e6_1=-1,this.f6_1=null}function Jr(n){this.h6_1=n,this.i6_1=this.k6(),this.j6_1=0}function ni(){}function ti(n){this.n6_1=n,this.l6_1=null,this.m6_1=null,this.m6_1=this.n6_1.y6_1.v6_1}function ri(){v=this;var n,t=(fi(0,0,n=ce(se(si))),n);t.x6_1=!0,this.e7_1=t}function ii(){return null==v&&new ri,v}function ei(n,t,r){this.d7_1=n,xr.call(this,t,r),this.b7_1=null,this.c7_1=null}function ui(n){this.y6_1=n,jr.call(this)}function oi(){return $r(n=ce(se(si))),si.call(n),n.w6_1=Gr(),n;var n}function fi(n,t,r){return Ur(n,t,r),si.call(r),r.w6_1=Gr(),r}function si(){ii(),this.v6_1=null,this.x6_1=!1}function ci(){d=this;var n=ai(0),t=n.y5_1;(t instanceof si?t:_e()).j5(),this.f7_1=n}function ai(n){return function(n,t){return function(n,t,r){Qr(function(n,t){return fi(n,t,ce(se(si)))}(n,t),r),hi.call(r)}(n,0,t),t}(n,ce(se(hi)))}function hi(){null==d&&new ci}function li(){}function _i(){}function vi(n){_i.call(this),this.k7_1=n}function di(){gi.call(this)}function gi(){_i.call(this),this.m7_1=""}function wi(){if(!w){w=!0;var n="undefined"!=typeof process&&process.versions&&!!process.versions.node;g=n?new vi(process.stdout):new di}}function bi(){return n=ce(se(pi)),pi.call(n,""),n;var n}function pi(n){this.o7_1=void 0!==n?n:""}function mi(n){var t=Pi(n).toUpperCase();return t.length>1?n:Zi(t,0)}function ki(n){return function(n){return 9<=n&&n<=13||28<=n&&n<=32||160===n||n>4096&&(5760===n||8192<=n&&n<=8202||8232===n||8233===n||8239===n||8287===n||12288===n)}(n)}function yi(){b=this,this.q7_1=new RegExp("[\\\\^$*+?.()|[\\]{}]","g"),this.r7_1=new RegExp("[\\\\$]","g"),this.s7_1=new RegExp("\\$","g")}function qi(){return null==b&&new yi,b}function Bi(n,t){qi(),this.v7_1=n,this.w7_1=function(n){if(Ue(n,Ti)){var t;switch(n.k()){case 0:t=At();break;case 1:t=pr(Ue(n,Ei)?n.j(0):n.f().h());break;default:t=Zn(n,ai(n.k()))}return t}return function(n){switch(n.k()){case 0:return At();case 1:return pr(n.f().h());default:return n}}(Zn(n,(r=ce(se(hi)),Qr(oi(),r),hi.call(r),r)));var r}(t),this.x7_1=new RegExp(n,Mn(t,"","gu",A,A,A,Ci)),this.y7_1=null,this.z7_1=null}function Ci(n){return n.d8_1}function xi(n,t,r,i,e,u){return tr(n,t,r,i,e,u=u!==A&&u)}function ji(n,t){return n-t|0}function Pi(n){return String.fromCharCode(n)}function Ii(){p=this,this.e8_1=0,this.f8_1=65535,this.g8_1=55296,this.h8_1=56319,this.i8_1=56320,this.j8_1=57343,this.k8_1=55296,this.l8_1=57343,this.m8_1=2,this.n8_1=16}function Si(){return null==p&&new Ii,p}function zi(n){Si(),this.h3_1=n}function Ei(){}function Ti(){}function Li(){}function Ni(){}function Ai(){}function Mi(){}function Fi(){m=this}function Di(n,t){null==m&&new Fi,this.p8_1=n,this.q8_1=t}function Oi(n){var t=null==n?null:ie(n);return null==t?"null":t}function Ri(n){return new Hi(n)}function Hi(n){this.t8_1=n,this.s8_1=0}function $i(){return Qi(),k}function Gi(){return Qi(),y}function Ui(){return Qi(),q}function Vi(){return Qi(),B}function Qi(){x||(x=!0,k=new ArrayBuffer(8),y=new Float64Array($i()),new Float32Array($i()),q=new Int32Array($i()),Gi()[0]=-1,B=0!==Ui()[0]?1:0,C=1-Vi()|0)}function Zi(n,t){var r;if(Yi(n)){var i,e=n.charCodeAt(t);if(Si(),e<0?i=!0:(Si(),i=e>65535),i)throw fu("Invalid Char code: "+e);r=De(e)}else r=n.y3(t);return r}function Yi(n){return"string"==typeof n}function Wi(n){return Yi(n)?n.length:n.x3()}function Ki(n,t,r){return Yi(n)?n.substring(t,r):n.z3(t,r)}function Xi(n){return ie(n)}function Ji(n,t){var r;switch(typeof n){case"number":r="number"==typeof t?ne(n,t):t instanceof de?ne(n,t.w8()):te(n,t);break;case"string":case"boolean":r=te(n,t);break;default:r=function(n,t){return n.a4(t)}(n,t)}return r}function ne(n,t){var r;if(n<t)r=-1;else if(n>t)r=1;else if(n===t){var i;if(0!==n)i=0;else{var e=1/n;i=e===1/t?0:e<0?-1:1}r=i}else r=n!=n?t!=t?0:1:-1;return r}function te(n,t){return n<t?-1:n>t?1:0}function re(n){if(!("kotlinHashCodeValue$"in n)){var t=4294967296*Math.random()|0,r=new Object;r.value=t,r.enumerable=!1,Object.defineProperty(n,"kotlinHashCodeValue$",r)}return n.kotlinHashCodeValue$}function ie(n){return null==n?"null":function(n){return!!$e(n)||En(n)}(n)?"[...]":n.toString()}function ee(n){if(null==n)return 0;var t;switch(typeof n){case"object":t="function"==typeof n.hashCode?n.hashCode():re(n);break;case"function":t=re(n);break;case"number":t=function(n){return Qi(),(0|n)===n?Fe(n):(Gi()[0]=n,zn(Ui()[(Qi(),C)],31)+Ui()[Vi()]|0)}(n);break;case"boolean":t=n?1:0;break;default:t=ue(String(n))}return t}function ue(n){var t=0,r=0,i=n.length-1|0;if(r<=i)do{var e=r;r=r+1|0;var u=n.charCodeAt(e);t=zn(t,31)+u|0}while(e!==i);return t}function oe(n,t){return null==n?null==t:null!=t&&("object"==typeof n&&"function"==typeof n.equals?n.equals(t):n!=n?t!=t:"number"==typeof n&&"number"==typeof t?n===t&&(0!==n||1/n==1/t):n===t)}function fe(n,t){null!=Error.captureStackTrace?Error.captureStackTrace(n,t):n.stack=(new Error).stack}function se(n){return n.prototype}function ce(n){return Object.create(n)}function ae(n,t,r){Error.call(n),function(n,t,r){var i=Xe(Object.getPrototypeOf(n));if(!(1&i)){var e;if(null==t){var u;if(null!==t){var o=null==r?null:r.toString();u=null==o?A:o}else u=A;e=u}else e=t;n.message=e}2&i||(n.cause=r),n.name=Object.getPrototypeOf(n).constructor.name}(n,t,r)}function he(n){var t;return null==n?function(){throw ju()}():t=n,t}function le(){throw Iu()}function _e(){throw zu()}function ve(){j=this,this.x8_1=new de(0,-2147483648),this.y8_1=new de(-1,2147483647),this.z8_1=8,this.a9_1=64}function de(n,t){null==j&&new ve,ar.call(this),this.u8_1=n,this.v8_1=t}function ge(){return Me(),P}function we(){return Me(),I}function be(){return Me(),S}function pe(){return Me(),E}function me(){return Me(),T}function ke(n,t){if(Me(),xe(n,t))return 0;var r=Ie(n),i=Ie(t);return r&&!i?-1:!r&&i?1:Ie(qe(n,t))?-1:1}function ye(n,t){Me();var r=n.v8_1>>>16|0,i=65535&n.v8_1,e=n.u8_1>>>16|0,u=65535&n.u8_1,o=t.v8_1>>>16|0,f=65535&t.v8_1,s=t.u8_1>>>16|0,c=0,a=0,h=0,l=0;return c=(c=c+((a=(a=a+((h=(h=h+((l=l+(u+(65535&t.u8_1)|0)|0)>>>16|0)|0)+(e+s|0)|0)>>>16|0)|0)+(i+f|0)|0)>>>16|0)|0)+(r+o|0)|0,new de((h&=65535)<<16|(l&=65535),(c&=65535)<<16|(a&=65535))}function qe(n,t){return Me(),ye(n,t.e9())}function Be(n,t){if(Me(),Se(n))return ge();if(Se(t))return ge();if(xe(n,pe()))return ze(t)?pe():ge();if(xe(t,pe()))return ze(n)?pe():ge();if(Ie(n))return Ie(t)?Be(Ee(n),Ee(t)):Ee(Be(Ee(n),t));if(Ie(t))return Ee(Be(n,Ee(t)));if(Te(n,me())&&Te(t,me()))return Le(Ce(n)*Ce(t));var r=n.v8_1>>>16|0,i=65535&n.v8_1,e=n.u8_1>>>16|0,u=65535&n.u8_1,o=t.v8_1>>>16|0,f=65535&t.v8_1,s=t.u8_1>>>16|0,c=65535&t.u8_1,a=0,h=0,l=0,_=0;return l=l+((_=_+zn(u,c)|0)>>>16|0)|0,_&=65535,h=(h=h+((l=l+zn(e,c)|0)>>>16|0)|0)+((l=(l&=65535)+zn(u,s)|0)>>>16|0)|0,l&=65535,a=(a=(a=a+((h=h+zn(i,c)|0)>>>16|0)|0)+((h=(h&=65535)+zn(e,s)|0)>>>16|0)|0)+((h=(h&=65535)+zn(u,f)|0)>>>16|0)|0,h&=65535,a=a+(((zn(r,c)+zn(i,s)|0)+zn(e,f)|0)+zn(u,o)|0)|0,new de(l<<16|_,(a&=65535)<<16|h)}function Ce(n){return Me(),4294967296*n.v8_1+function(n){return Me(),n.u8_1>=0?n.u8_1:4294967296+n.u8_1}(n)}function xe(n,t){return Me(),n.v8_1===t.v8_1&&n.u8_1===t.u8_1}function je(n,t){if(Me(),t<2||36<t)throw vu("radix out of range: "+t);if(Se(n))return"0";if(Ie(n)){if(xe(n,pe())){var r=Pe(t),i=n.d9(r),e=qe(Be(i,r),n).g9();return je(i,t)+e.toString(t)}return"-"+je(Ee(n),t)}for(var u=2===t?31:t<=10?9:t<=21?7:t<=35?6:5,o=Le(Math.pow(t,u)),f=n,s="";;){var c=f.d9(o),a=qe(f,Be(c,o)).g9().toString(t);if(Se(f=c))return a+s;for(;a.length<u;)a="0"+a;s=a+s}}function Pe(n){return Me(),new de(n,n<0?-1:0)}function Ie(n){return Me(),n.v8_1<0}function Se(n){return Me(),0===n.v8_1&&0===n.u8_1}function ze(n){return Me(),!(1&~n.u8_1)}function Ee(n){return Me(),n.e9()}function Te(n,t){return Me(),ke(n,t)<0}function Le(n){if(Me(),(t=n)!=t)return ge();if(n<=-0x8000000000000000)return pe();if(n+1>=0x8000000000000000)return Me(),z;if(n<0)return Ee(Le(-n));var t,r=4294967296;return new de(n%r|0,n/r|0)}function Ne(n,t){return Me(),ke(n,t)>0}function Ae(n,t){return Me(),ke(n,t)>=0}function Me(){L||(L=!0,P=Pe(0),I=Pe(1),S=Pe(-1),z=new de(-1,2147483647),E=new de(0,-2147483648),T=Pe(16777216))}function Fe(n){return n instanceof de?n.g9():function(n){return n>2147483647?2147483647:n<-2147483648?-2147483648:0|n}(n)}function De(n){var t;return t=function(n){return n<<16>>16}(Fe(n)),function(n){return 65535&n}(t)}function Oe(n,t){return new Ht(n,t)}function Re(n,t,r,i){return He("class",n,t,r,i,null)}function He(n,t,r,i,e,u){return{kind:n,simpleName:t,associatedObjectKey:r,associatedObjects:i,suspendArity:e,$kClass$:A,iid:u}}function $e(n){return Array.isArray(n)}function Ge(n,t,r,i,e,u,o,f){null!=i&&(n.prototype=Object.create(i.prototype),n.prototype.constructor=n);var s=r(t,u,o,null==f?[]:f);n.$metadata$=s,null!=e&&((null!=s.iid?n:n.prototype).$imask$=function(n){for(var t=1,r=[],i=0,e=n.length;i<e;){var u=n[i];i=i+1|0;var o=t,f=u.prototype.$imask$,s=null==f?u.$imask$:f;null!=s&&(r.push(s),o=s.length);var c=u.$metadata$.iid,a=null==c?null:(l=void 0,v=1<<(31&(h=c)),(l=new Int32Array(1+(h>>5)|0))[_=h>>5]=l[_]|v,l);null!=a&&(r.push(a),o=Math.max(o,a.length)),o>t&&(t=o)}var h,l,_,v;return function(n,t){for(var r=0,i=new Int32Array(n);r<n;){for(var e=r,u=0,o=0,f=t.length;o<f;){var s=t[o];o=o+1|0,e<s.length&&(u|=s[e])}i[e]=u,r=r+1|0}return i}(t,r)}(e))}function Ue(n,t){return function(n,t){var r=n.$imask$;return null!=r&&function(n,t){var r=t>>5;if(r>n.length)return!1;var i=1<<(31&t);return!!(n[r]&i)}(r,t)}(n,t.$metadata$.iid)}function Ve(n){return!!$e(n)&&!n.$type$}function Qe(n){var t;switch(typeof n){case"string":case"number":case"boolean":case"function":t=!0;break;default:t=n instanceof Object}return t}function Ze(n){return"string"==typeof n||Ue(n,sr)}function Ye(n,t,r,i){return He("interface",n,t,r,i,(null==N&&(N=0),N=We()+1|0,We()))}function We(){if(null!=N)return N;!function(){throw Tu("lateinit property iid has not been initialized")}()}function Ke(n,t,r,i){return He("object",n,t,r,i,null)}function Xe(n){var t=n.constructor,r=null==t?null:t.$metadata$,i=null==r?null:r.errorInfo;if(null!=i)return i;var e,u=0;if(Je(n,"message")&&(u|=1),Je(n,"cause")&&(u|=2),3!==u){var o=(e=n,Object.getPrototypeOf(e));o!=Error.prototype&&(u|=Xe(o))}return null!=r&&(r.errorInfo=u),u}function Je(n,t){return n.hasOwnProperty(t)}function nu(n){return new Fr(n)}function tu(n,t,r){for(var i=new Int32Array(r),e=0,u=0,o=0,f=0,s=n.length;f<s;){var c=Zi(n,f);f=f+1|0;var a=t[c];if(u|=(31&a)<<o,a<32){var h=e;e=h+1|0,i[h]=u,u=0,o=0}else o=o+5|0}return i}function ru(n,t){for(var r=0,i=n.length-1|0,e=-1,u=0;r<=i;)if(t>(u=n[e=(r+i|0)/2|0]))r=e+1|0;else{if(t===u)return e;i=e-1|0}return e-(t<u?1:0)|0}function iu(){M=this;var n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",t=new Int32Array(128),r=0,i=Wi(n)-1|0;if(r<=i)do{var e=r;r=r+1|0,t[Zi(n,e)]=e}while(r<=i);var u=tu("hCgBpCQGYHZH5BRpBPPPPPPRMP5BPPlCPP6BkEPPPPcPXPzBvBrB3BOiDoBHwD+E3DauCnFmBmB2D6E1BlBTiBmBlBP5BhBiBrBvBjBqBnBPRtBiCmCtBlB0BmB5BiB7BmBgEmChBZgCoEoGVpBSfRhBPqKQ2BwBYoFgB4CJuTiEvBuCuDrF5DgEgFlJ1DgFmBQtBsBRGsB+BPiBlD1EIjDPRPPPQPPPPPGQSQS/DxENVNU+B9zCwBwBPPCkDPNnBPqDYY1R8B7FkFgTgwGgwUwmBgKwBuBScmEP/BPPPPPPrBP8B7F1B/ErBqC6B7BiBmBfQsBUwCw/KwqIwLwETPcPjQgJxFgBlBsD",t,222),o=new Int32Array(u.length),f=0,s=u.length-1|0;if(f<=s)do{var c=f;f=f+1|0,o[c]=0===c?u[c]:o[c-1|0]+u[c]|0}while(f<=s);this.h9_1=o,this.i9_1=tu("aaMBXHYH5BRpBPPPPPPRMP5BPPlCPPzBDOOPPcPXPzBvBjB3BOhDmBBpB7DoDYxB+EiBP1DoExBkBQhBekBPmBgBhBctBiBMWOOXhCsBpBkBUV3Ba4BkB0DlCgBXgBtD4FSdBfPhBPpKP0BvBXjEQ2CGsT8DhBtCqDpFvD1D3E0IrD2EkBJrBDOBsB+BPiBlB1EIjDPPPPPPPPPPPGPPMNLsBNPNPKCvBvBPPCkDPBmBPhDXXgD4B6FzEgDguG9vUtkB9JcuBSckEP/BPPPPPPBPf4FrBjEhBpC3B5BKaWPrBOwCk/KsCuLqDHPbPxPsFtEaaqDL",t,222),this.j9_1=tu("GFjgggUHGGFFZZZmzpz5qB6s6020B60ptltB6smt2sB60mz22B1+vv+8BZZ5s2850BW5q1ymtB506smzBF3q1q1qB1q1q1+Bgii4wDTm74g3KiggxqM60q1q1Bq1o1q1BF1qlrqrBZ2q5wprBGFZWWZGHFsjiooLowgmOowjkwCkgoiIk7ligGogiioBkwkiYkzj2oNoi+sbkwj04DghhkQ8wgiYkgoioDsgnkwC4gikQ//v+85BkwvoIsgoyI4yguI0whiwEowri4CoghsJowgqYowgm4DkwgsY/nwnzPowhmYkg6wI8yggZswikwHgxgmIoxgqYkwgk4DkxgmIkgoioBsgssoBgzgyI8g9gL8g9kI0wgwJoxgkoC0wgioFkw/wI0w53iF4gioYowjmgBHGq1qkgwBF1q1q8qBHwghuIwghyKk0goQkwgoQk3goQHGFHkyg0pBgxj6IoinkxDswno7Ikwhz9Bo0gioB8z48Rwli0xN0mpjoX8w78pDwltoqKHFGGwwgsIHFH3q1q16BFHWFZ1q10q1B2qlwq1B1q10q1B2q1yq1B6q1gq1Biq1qhxBir1qp1Bqt1q1qB1g1q1+B//3q16B///q1qBH/qlqq9Bholqq9B1i00a1q10qD1op1HkwmigEigiy6Cptogq1Bixo1kDq7/j00B2qgoBWGFm1lz50B6s5q1+BGWhggzhwBFFhgk4//Bo2jigE8wguI8wguI8wgugUog1qoB4qjmIwwi2KgkYHHH4lBgiFWkgIWoghssMmz5smrBZ3q1y50B5sm7gzBtz1smzB5smz50BqzqtmzB5sgzqzBF2/9//5BowgoIwmnkzPkwgk4C8ys65BkgoqI0wgy6FghquZo2giY0ghiIsgh24B4ghsQ8QF/v1q1OFs0O8iCHHF1qggz/B8wg6Iznv+//B08QgohsjK0QGFk7hsQ4gB",t,222)}function eu(){return null==M&&new iu,M}function uu(){F=this,this.k9_1=new Int32Array([170,186,688,704,736,837,890,7468,7544,7579,8305,8319,8336,8560,9424,11388,42652,42864,43e3,43868]),this.l9_1=new Int32Array([1,1,9,2,5,1,1,63,1,37,1,1,13,16,26,2,2,1,2,4])}function ou(){return null==F&&new uu,F}function fu(n){var t=function(n,t){return wu(n,t),su.call(t),t}(n,ce(se(su)));return fe(t,fu),t}function su(){fe(this,su)}function cu(n){var t=function(n,t){return wu(n,t),au.call(t),t}(n,ce(se(au)));return fe(t,cu),t}function au(){fe(this,au)}function hu(n){var t=function(n,t){return wu(n,t),lu.call(t),t}(n,ce(se(lu)));return fe(t,hu),t}function lu(){fe(this,lu)}function _u(n,t){return ae(t,n),du.call(t),t}function vu(n){var t=_u(n,ce(se(du)));return fe(t,vu),t}function du(){fe(this,du)}function gu(n){return function(n){ae(n),du.call(n)}(n),bu.call(n),n}function wu(n,t){return _u(n,t),bu.call(t),t}function bu(){fe(this,bu)}function pu(){var n,t=(gu(n=ce(se(ku))),ku.call(n),n);return fe(t,pu),t}function mu(n){var t=function(n,t){return wu(n,t),ku.call(t),t}(n,ce(se(ku)));return fe(t,mu),t}function ku(){fe(this,ku)}function yu(n){var t=function(n,t){return wu(n,t),qu.call(t),t}(n,ce(se(qu)));return fe(t,yu),t}function qu(){fe(this,qu)}function Bu(){var n,t=(gu(n=ce(se(xu))),xu.call(n),n);return fe(t,Bu),t}function Cu(n){var t=function(n,t){return wu(n,t),xu.call(t),t}(n,ce(se(xu)));return fe(t,Cu),t}function xu(){fe(this,xu)}function ju(){var n,t=(gu(n=ce(se(Pu))),Pu.call(n),n);return fe(t,ju),t}function Pu(){fe(this,Pu)}function Iu(){var n,t=(gu(n=ce(se(Su))),Su.call(n),n);return fe(t,Iu),t}function Su(){fe(this,Su)}function zu(){var n,t=(gu(n=ce(se(Eu))),Eu.call(n),n);return fe(t,zu),t}function Eu(){fe(this,Eu)}function Tu(n){var t=function(n,t){return wu(n,t),Lu.call(t),t}(n,ce(se(Lu)));return fe(t,Tu),t}function Lu(){fe(this,Lu)}function Nu(n,t){var r,i=n.className;return(r="(^|.*\\s+)"+t+"($|\\s+.*)",function(n,t){return Bi.call(t,n,At()),t}(r,ce(se(Bi)))).a8(i)}function Au(n,t){this.o9_1=n,this.p9_1=t}function Mu(n){this.q9_1=n}function Fu(n,t,r){var i,e=Ff(),u=Wu(),o=Mf().ga(t),f=Wu();if(0===Wi(r))i=Lf();else{var s=n.ia_1,c=null==s?null:new Mu(s).v9(r,"Copy reference to the clipboard");i=null==c?Lf():c}return e.ja([u,o,f,i])}function Du(n){n=n===A?null:n,this.ia_1=n}function Ou(n,t,r){Yu.call(this),this.ma_1=n,this.na_1=t,this.oa_1=r}function Ru(n,t){this.ra_1=n,this.sa_1=t}function Hu(n,t){Yu.call(this),this.va_1=n,this.wa_1=t}function $u(n,t){Yu.call(this),this.xa_1=n,this.ya_1=t}function Gu(n){Yu.call(this),this.za_1=n}function Uu(n){Yu.call(this),this.ab_1=n}function Vu(n){Yu.call(this),this.bb_1=n}function Qu(n,t){Yu.call(this),this.cb_1=n,this.db_1=t}function Zu(n){Yu.call(this),this.eb_1=n}function Yu(){}function Wu(){return ro(),D}function Ku(){return ro(),O}function Xu(){return ro(),R}function Ju(){return ro(),H}function no(n){return ro(),Ff().fb(Jf(to),n)}function to(n){return ro(),n.gb(["invisible-text","text-for-copy"]),lr()}function ro(){$||($=!0,D=no("`"),O=no(" "),R=no("("),H=no(")"))}function io(n,t){Yu.call(this),this.hb_1=n,this.ib_1=t}function eo(n){Yu.call(this),this.jb_1=n}function uo(n,t){Yu.call(this),this.kb_1=n,this.lb_1=t}function oo(n){Yu.call(this),this.mb_1=n}function fo(n){Yu.call(this),this.nb_1=n}function so(n){Yu.call(this),this.ob_1=n}function co(n,t,r){Yu.call(this),this.pb_1=n,this.qb_1=t,this.rb_1=r}function ao(n){Yu.call(this),this.sb_1=n}function ho(n){Yu.call(this),this.tb_1=n}function lo(n){return n.xb_1.vb_1.k()}function _o(){if(Z)return lr();Z=!0,G=new ko("Inputs",0,"Build configuration inputs"),U=new ko("ByMessage",1,"Problems grouped by message"),V=new ko("ByLocation",2,"Problems grouped by location"),Q=new ko("IncompatibleTasks",3,"Incompatible tasks")}function vo(n){yc.call(this),this.yb_1=n}function go(n){yc.call(this),this.ac_1=n}function wo(n){yc.call(this),this.bc_1=n}function bo(n){yc.call(this),this.cc_1=n}function po(n){yo.call(this),this.dc_1=n}function mo(n,t,r,i,e,u,o,f){this.ec_1=n,this.fc_1=t,this.gc_1=r,this.hc_1=i,this.ic_1=e,this.jc_1=u,this.kc_1=o,this.lc_1=f}function ko(n,t,r){Di.call(this,n,t),this.qc_1=r}function yo(){Bc.call(this)}function qo(n,t){var r=Af(),i=Jf(Lo),e=Af().y9(Jf(No),[]),u=function(n,t){var r,i=Af(),e=Jf(Oo),u=Ff().ga("Learn more about the "),o=$f();return i.y9(e,[u,o.fb(Jf((r=t,function(n){return n.bd(r.tc_1),lr()})),t.sc_1),Ff().ga(".")])}(0,t.gc_1),o=Af().y9(Jf(Ao),[Co(0,t)]),f=Af();return r.y9(i,[e,u,o,f.y9(Jf(Mo),[Io(0,Ro(),t.lc_1,lo(t.jc_1)),Io(0,Ho(),t.lc_1,lo(t.hc_1)),Io(0,$o(),t.lc_1,lo(t.ic_1)),Io(0,Go(),t.lc_1,lo(t.kc_1))])])}function Bo(n,t){var r,i,e=Af(),u=Jf(Fo);switch(t.lc_1.q8_1){case 0:r=zo(0,t.jc_1,((i=function(n){return new wo(n)}).callableName="<init>",i));break;case 3:r=zo(0,t.kc_1,function(){var n=function(n){return new bo(n)};return n.callableName="<init>",n}());break;case 1:r=zo(0,t.hc_1,function(){var n=function(n){return new go(n)};return n.callableName="<init>",n}());break;case 2:r=zo(0,t.ic_1,function(){var n=function(n){return new vo(n)};return n.callableName="<init>",n}());break;default:le()}return e.y9(u,[r])}function Co(n,t){return Af().ja([Po(0,t),xo(0,t)])}function xo(n,t){for(var r=Af(),i=t.fc_1,e=Lr(),u=0,o=i.f();o.g();){var f=o.h(),s=u;u=s+1|0,jt(e,0===wr(s)?gr(jo(Vo(),f)):bt([Gf().ja([]),jo(Vo(),f)]))}return r.ha(e)}function jo(n,t){return Df().ja([Ic(t)])}function Po(n,t){return Nf().ja([jc().ka(t.ec_1)])}function Io(n,t,r,i){var e,u,o;return Af().y9(Jf((e=i,u=t,o=r,function(n){return n.t9("group-selector"),0===e?(n.t9("group-selector--disabled"),lr()):u.equals(o)?(n.t9("group-selector--active"),lr()):(n.u9(function(n){return function(t){return new po(n)}}(u)),lr()),lr()})),[Ff().rc(t.qc_1,[So(0,i)])])}function So(n,t){return Ff().y9(Jf(Do),[Ku(),Xu(),Ff().ga(""+t),Ju()])}function zo(n,t,r){return function(n,t,r){var i,e=Af(),u=Of();return e.ja([u.ha(ys(t,(i=r,function(n){var t,r=n.cd().ub_1;return r instanceof Hu?Nc(i,(Vo(),(t=function(n){return Eo(0,n)}).callableName="viewNode",t),n,r.va_1,r.wa_1,Cc()):r instanceof $u?Nc(i,function(){var n=function(n){return Eo(0,n)};return n.callableName="viewNode",n}(Vo()),n,r.xa_1,r.ya_1,xc()):r instanceof io?Nc(i,function(){var n=function(n){return Eo(0,n)};return n.callableName="viewNode",n}(Vo()),n,r.hb_1,r.ib_1,A,So(Vo(),n.cd().vb_1.k())):r instanceof Ou?Lc(i,n,r):Nc(i,function(){var n=function(n){return Eo(0,n)};return n.callableName="viewNode",n}(Vo()),n,r)})))])}(0,t.xb_1.uc().vc(),r)}function Eo(n,t){var r;return t instanceof eo?Sc((r=t,function(n){return n.ed("project "),n.fd(r.jb_1),lr()})):t instanceof co?Sc(function(n){return function(t){return t.ed(n.pb_1+" "),t.fd(n.qb_1),t.ed(" of "),t.fd(n.rb_1),lr()}}(t)):t instanceof so?Sc(function(n){return function(t){return t.ed("system property "),t.fd(n.ob_1),lr()}}(t)):t instanceof uo?Sc(function(n){return function(t){return t.ed("task "),t.fd(n.kb_1),t.ed(" of type "),t.fd(n.lb_1),lr()}}(t)):t instanceof fo?Sc(function(n){return function(t){return t.ed("bean of type "),t.fd(n.nb_1),lr()}}(t)):t instanceof ao?Sc(function(n){return function(t){return t.ed(n.sb_1),lr()}}(t)):t instanceof ho?Sc(function(n){return function(t){return t.ed("class "),t.fd(n.tb_1),lr()}}(t)):t instanceof Zu?Sc(function(n){return function(t){return t.ed(n.eb_1),lr()}}(t)):t instanceof Gu?Ic(t.za_1):t instanceof Qu?Qo(t):Ff().ga(ie(t))}function To(n){return n.t9("report-wrapper"),lr()}function Lo(n){return n.t9("header"),lr()}function No(n){return n.t9("gradle-logo"),lr()}function Ao(n){return n.t9("title"),lr()}function Mo(n){return n.t9("groups"),lr()}function Fo(n){return n.t9("content"),lr()}function Do(n){return n.t9("group-selector__count"),lr()}function Oo(n){return n.t9("learn-more"),lr()}function Ro(){return _o(),G}function Ho(){return _o(),U}function $o(){return _o(),V}function Go(){return _o(),Q}function Uo(){Y=this}function Vo(){return null==Y&&new Uo,Y}function Qo(n){var t;return $f().fb(Jf((t=n,function(n){return n.t9("documentation-button"),n.bd(t.cb_1),lr()})),n.db_1)}function Zo(n,t,r){this.kd_1=n,this.ld_1=t,this.md_1=r}function Yo(n,t,r){this.nd_1=n,this.od_1=t,this.pd_1=r}function Wo(n,t){for(var r=vf(n),i=t.trace,e=Nr(i.length),u=0,o=i.length;u<o;){var f,s=i[u];u=u+1|0,f=Jo(s),e.d(f)}return new Zo(t,r,e)}function Ko(n,t){var r,i=null==(r=t.kd_1.error)?null:nf(r);null==i||n.d(i)}function Xo(n){return function(n,t,r){var i=null==n.error?null:new Hu(t,r);return null==i?new $u(t,r):i}(n.kd_1,new Gu(n.ld_1),ef(n.kd_1))}function Jo(n){var t;switch(n.kind){case"Project":t=new eo(n.path);break;case"Task":t=new uo(n.path,n.type);break;case"TaskPath":t=new oo(n.path);break;case"Bean":t=new fo(n.type);break;case"Field":t=new co("field",n.name,n.declaringType);break;case"InputProperty":t=new co("input property",n.name,n.task);break;case"OutputProperty":t=new co("output property",n.name,n.task);break;case"SystemProperty":t=new so(n.name);break;case"PropertyUsage":t=new co("property",n.name,n.from);break;case"BuildLogic":t=new ao(n.location);break;case"BuildLogicClass":t=new ho(n.type);break;default:t=new Zu("Gradle runtime")}return t}function nf(n){var t=n.parts;if(null==t){var r=n.summary;return null==r?null:new Gu(vf(r))}for(var i=n.summary,e=null==i?null:vf(i),u=Lr(),o=Ri(t);o.g();){var f=rf(o.h());null==f||u.d(f)}for(var s=Mn(u,"\n"),c=Lr(),a=Ri(t);a.g();){var h=tf(a.h());null==h||c.d(h)}return new Ou(e,s,c)}function tf(n){var t=rf(n);if(null==t)return null;var r,i,e=nt(new Nt(function(n,t,r,i){var e;return Jn(nr(n,["\r\n","\n","\r"],A,r=r!==A&&r,i=i===A?0:i),(e=n,function(n){return Jt(e,n)}))}(t),!0,lf));return new Ru(e,(r=!(null==n.internalText),i=e.k(),r&&i>1?ps():null))}function rf(n){var t=n.text;return null==t?n.internalText:t}function ef(n){var t=n.documentationLink;return null==t?null:new Qu(t,"")}function uf(n,t){return new cs(of(n,jf().sd(t),ps()))}function of(n,t,r){return new ks(n,function(n,t){var r,i=Jn(On(n.o()),If);return nt(Jn(new rt(i,new ff(_f)),(r=t,function(n){return of(n.v3(),n.w3().wd_1,r)})))}(t,1===Pf(t)?ms():ps()),0===Pf(t)?ps():r)}function ff(n){this.td_1=n}function sf(n){var t=Lr(),r=n.ld_1,i=Dn(r.ca_1).fa_1,e=ie(Xt(Ze(i)?i:_e())),u=r.vd(function(n,t){var r;if(!(t>=0))throw fu(ie("Requested element count "+t+" is less than zero."));if(0===t)return Rn(n);if(Ue(n,Ti)){var i=n.k()-t|0;if(i<=0)return pt();if(1===i)return gr(function(n){if(Ue(n,Ei))return Qn(n);var t=n.f();if(!t.g())throw mu("Collection is empty.");for(var r=t.h();t.g();)r=t.h();return r}(n));if(r=Nr(),Ue(n,Ei)){if(Ue(n,li)){var e=t,u=n.k();if(e<u)do{var o=e;e=e+1|0,r.d(n.j(o))}while(e<u)}else for(var f=n.l(t);f.g();){var s=f.h();r.d(s)}return r}}else r=Lr();for(var c=0,a=n.f();a.g();){var h=a.h();c>=t?r.d(h):c=c+1|0}return mt(r)}(r.ca_1,1));return t.d(new io(new Zu(e),ef(n.kd_1))),t.d(new Gu(u)),t.m(n.md_1),t.j5()}function cf(n){var t=Lr(),r=n.ld_1,i=r.vd(r.ca_1);return t.d(new $u(new Gu(i),ef(n.kd_1))),t.j5()}function af(n){var t=Lr();return t.d(Xo(n)),t.m(n.md_1),Ko(t,n),t.j5()}function hf(n){var t=Lr();return t.m(new St(n.md_1)),t.d(Xo(n)),Ko(t,n),t.j5()}function lf(n){return Wi(n)>0}function _f(n,t){return function(n,t){return n===t?0:null==n?-1:null==t?1:Ji(null!=n&&("string"==(i=typeof(r=n))||"boolean"===i||function(n){return"number"==typeof n||n instanceof de}(r)||Ue(r,cr))?n:_e(),t);var r,i}(Oi(n.v3()),Oi(t.v3()))}function vf(n){var t;return Bf().qd((t=n,function(n){for(var r=t,i=0,e=r.length;i<e;){var u=r[i];i=i+1|0;var o=u.text;null==o||n.ed(o);var f=u.name;null==f||(n.fd(f),lr())}return lr()}))}function df(n,t){return(0!==(r=n)?r.toString():"No")+" "+gf(t,n)+" "+wf(n)+" found";var r}function gf(n,t){return t<2?n:n+"s"}function wf(n){return n<=1?"was":"were"}function bf(n,t){this.sc_1=n,this.tc_1=t}function pf(n){kf.call(this),this.fa_1=n}function mf(n,t){kf.call(this),this.da_1=n,this.ea_1=t}function kf(){}function yf(){this.dd_1=Lr()}function qf(){W=this}function Bf(){return null==W&&new qf,W}function Cf(n){Bf(),this.ca_1=n}function xf(){K=this}function jf(){return null==K&&new xf,K}function Pf(n){return n.k()}function If(n){var t=n.j1(),r=n.i1();return fr(t,new Sf(Ue(r,Ni)?r:_e()))}function Sf(n){jf(),this.wd_1=n}function zf(n,t,r){var i;Tf(t,n,r),i="Component mounted at #"+n.id+".",wi(),(wi(),g).j7(i)}function Ef(n){var t=document.getElementById(n);if(null==t)throw hu("'"+n+"' element missing");return t}function Tf(n,t,r){var i,e,u;i=n.z9(r),e=t,u=function(n,t,r){return function(i){return Tf(n,r,n.ba(i,t)),lr()}}(n,r,t),fs(),e.innerHTML="",us(e,i,u)}function Lf(){return fs(),X}function Nf(){return fs(),J}function Af(){return fs(),nn}function Mf(){return fs(),tn}function Ff(){return fs(),rn}function Df(){return fs(),en}function Of(){return fs(),un}function Rf(){return fs(),on}function Hf(){return fs(),fn}function $f(){return fs(),sn}function Gf(){return fs(),cn}function Uf(n){this.x9_1=n}function Vf(){an=this}function Qf(){return null==an&&new Vf,an}function Zf(){hn=this,Xf.call(this)}function Yf(){return null==hn&&new Zf,hn}function Wf(n,t,r,i){t=t===A?pt():t,r=r===A?null:r,i=i===A?pt():i,Xf.call(this),this.be_1=n,this.ce_1=t,this.de_1=r,this.ee_1=i}function Kf(){}function Xf(){Qf()}function Jf(n){fs();var t,r=Lr();return n(new ns((t=r,function(n){return t.d(n),lr()}))),r}function ns(n){this.r9_1=n}function ts(n,t){es.call(this),this.fe_1=n,this.ge_1=t}function rs(n){es.call(this),this.he_1=n}function is(n,t){es.call(this),this.ie_1=n,this.je_1=t}function es(){}function us(n,t,r){if(fs(),t instanceof Wf)!function(n,t,r){var i=function(n,t,r){var i=n.createElement(t);return r(i),i}(he(n.ownerDocument),t,r);n.appendChild(i)}(n,t.be_1,(e=t,u=r,function(n){for(var t=e.ce_1.f();t.g();)os(n,t.h(),u);var r=e.de_1;null==r||function(n,t){n.appendChild(he(n.ownerDocument).createTextNode(t))}(n,r);for(var i=e.ee_1.f();i.g();)us(n,i.h(),u);return lr()}));else if(t instanceof Kf){var i=t instanceof Kf?t:_e();us(n,i.ke_1,function(n,t){return function(r){return n(t.le_1(r)),lr()}}(r,i))}else if(oe(t,Yf()))return lr();var e,u}function os(n,t,r){var i,e;fs(),t instanceof is?n.setAttribute(t.ie_1,t.je_1):t instanceof rs?function(n,t){for(var r=Lr(),i=0,e=t.length;i<e;){var u=t[i];i=i+1|0,Nu(n,u)||r.d(u)}var o=r;if(!o.i()){var f=n.className,s=ie(Xt(Ze(f)?f:_e())),c=bi();c.p7(s),0!==Wi(s)&&c.p7(" "),Fn(o,c," "),n.className=c.toString()}}(n,[t.he_1]):t instanceof ts&&n.addEventListener(t.fe_1,(i=r,e=t,function(n){return n.stopPropagation(),i(e.ge_1(n)),lr()}))}function fs(){ln||(ln=!0,X=Yf(),new Uf("hr"),J=new Uf("h1"),new Uf("h2"),nn=new Uf("div"),new Uf("pre"),tn=new Uf("code"),rn=new Uf("span"),en=new Uf("small"),un=new Uf("ol"),on=new Uf("ul"),fn=new Uf("li"),sn=new Uf("a"),cn=new Uf("br"),new Uf("p"))}function ss(n){as.call(this),this.ne_1=n}function cs(n){this.xb_1=n}function as(){}function hs(n){return n.me(A,A,n.wb_1.ad())}function ls(){_n=this}function _s(){return null==_n&&new ls,_n}function vs(){if(gn)return lr();gn=!0,vn=new ws("Collapsed",0),dn=new ws("Expanded",1)}function ds(n){bs.call(this),this.ve_1=n}function gs(n,t,r){bs.call(this),this.se_1=n,this.te_1=t,this.ue_1=r}function ws(n,t){Di.call(this,n,t)}function bs(){}function ps(){return vs(),vn}function ms(){return vs(),dn}function ks(n,t,r){t=t===A?pt():t,r=r===A?ps():r,this.ub_1=n,this.vb_1=t,this.wb_1=r}function ys(n,t){return nt(Jn(n,(r=t,function(n){return function(n,t){var r,i=n.cd(),e=Hf(),u=t(n),o=i.vb_1;r=null==(i.wb_1.equals(ms())&&!o.i()?o:null)?null:function(n,t){return Rf().ha(function(n,t){return ys(n.vc(),t)}(n,t))}(n,t);var f=r;return e.ja([u,null==f?Lf():f])}(n,r)})));var r}function qs(){if(kn)return lr();kn=!0,bn=new Bs("ByMessage",0,"Messages"),pn=new Bs("ByGroup",1,"Group"),mn=new Bs("ByFileLocation",2,"Locations")}function Bs(n,t,r){Di.call(this,n,t),this.cf_1=r}function Cs(n,t){this.df_1=n,this.ef_1=t}function xs(n,t){this.ff_1=n,this.gf_1=t}function js(n){return new ks(new Gu(Bf().rd(n+" more problem"+(n>1?"s have":" has")+" been skipped")))}function Ps(n,t,r,i){var e,u,o=n.v1(t);if(null==o){var f=Lr(),s=fr(new ks(new Vs(Bf().qd((u=t,function(n){return n.fd(u),lr()}))),f,ms()),f);n.h5(t,s),e=s}else e=o;e.u3_1.d(Es(r,i))}function Is(n,t,r,i){var e;if(t=t===A?Lr():t,r=r===A?oi():r,i===A){var u=wn;wn=u+1|0,e=u}else e=i;i=e,this.hf_1=n,this.if_1=t,this.jf_1=r,this.kf_1=i}function Ss(n,t){if(t.i())return null;for(var r,i=n,e=null,u=t.f();u.g();){var o=u.h();r=e;var f,s=i,c=o.ef_1+" ("+o.df_1+")",a=s.v1(c);if(null==a){var h=Lr(),l=new Is(new ks(new Vs(Bf().qd(Fs(o))),h,ms()),h);s.h5(c,l),f=l}else f=a;e=f,null==r||he(r).if_1.u(he(e).hf_1)||he(r).if_1.d(he(e).hf_1),i=he(e).jf_1}return e}function zs(n,t){if(n.k()===t.length){var r;n:{var i=function(n,t){var r=t.length,i=xt(n,10),e=Nr(Math.min(i,r)),u=0,o=n.f();t:for(;o.g();){var f,s=o.h();if(u>=r)break t;var c=u;u=c+1|0,f=fr(s,t[c]),e.d(f)}return e}(n,t);if(Ue(i,Ti)&&i.i())r=!0;else{for(var e=i.f();e.g();){var u=e.h();if(u.t3_1.df_1!==u.u3_1.name||u.t3_1.ef_1!==u.u3_1.displayName){r=!1;break n}}r=!0}}return r}return!1}function Es(n,t,r){var i=function(n,t,r){t=t===A?null:t;var i=Ns(function(n,t){return n&&null!=t.contextualLabel?he(t.contextualLabel):Ts(t)}(r=r!==A&&r,n),t).j5();return Ls(n,new Gu(i))}(n,t=t===A?null:t,r=r!==A&&r),e=function(n,t,r){r=r!==A&&r;var i,e=n.problemDetails;if(null==e)i=null;else{var u,o=e[0].text,f=null==o?null:function(n,t,r,i){if(r=r!==A&&r,i=i===A?0:i,1===t.length){var e=t[0];if(0!==Wi(e))return function(n,t,r,i){rr(i);var e=0,u=Wt(n,t,e,r);if(-1===u||1===i)return gr(ie(n));var o,f=i>0,s=Nr(f&&Kn(i,10));n:do{var c;if(c=ie(Ki(n,e,u)),s.d(c),e=u+t.length|0,f&&s.k()===(i-1|0))break n;u=Wt(n,t,e,r)}while(-1!==u);return o=ie(Ki(n,e,Wi(n))),s.d(o),s}(n,e,r,i)}for(var u=function(n){return new tt(n)}(nr(n,t,A,r,i)),o=Nr(xt(u,10)),f=u.f();f.g();){var s;s=Jt(n,f.h()),o.d(s)}return o}(o,["\n"]);if(null==f)u=null;else{for(var s=Nr(xt(f,10)),c=f.f();c.g();){var a,h=c.h();a=Ms(n)?Bf().qd(Os(h)):Bf().rd(h),s.d(a)}u=s}var l,_=u;if(null==_)l=null;else{for(var v=Nr(xt(_,10)),d=_.f();d.g();){var g;g=new ks(new Gu(d.h())),v.d(g)}l=v}var w=null==l?null:Hn(l);i=null==w?Lr():w}var b=i,p=null==b?Lr():b;r||null==n.contextualLabel||p.d(new ks(new Gu(Bf().rd(he(n.contextualLabel)))));var m=function(n){var t=n.solutions;if(null==t||0===t.length)return null;for(var r=new Vu(Bf().rd("Solutions")),i=he(n.solutions),e=Nr(i.length),u=0,o=i.length;u<o;){var f,s=i[u];u=u+1|0,f=new ks(new Uu(vf(s))),e.d(f)}return new ks(r,e)}(n);null==m||p.d(m);var k,y=n.error,q=null==y?null:nf(y);if(null==q||p.d(new ks(q)),t){var B=n.locations;k=!(null==B||0===B.length)}else k=!1;return k&&p.d(function(n){var t,r=n.locations;if(null==r)t=null;else{for(var i=Nr(r.length),e=Ri(r);e.g();){var u,o=e.h();u=new ks(new Gu(Bf().qd(Rs(o)))),i.d(u)}t=i}var f=t;return new ks(new Zu("Locations"),null==f?pt():f)}(n)),p}(n,null==t,r);return new ks(i,e)}function Ts(n){return function(n){if(0===n.length)throw mu("Array is empty.");return n[Nn(n)]}(n.problemId).displayName}function Ls(n,t){var r;switch(n.severity){case"WARNING":var i=n.documentationLink;r=new $u(t,null==i?null:new Qu(i,""));break;case"ERROR":var e=n.documentationLink;r=new Hu(t,null==e?null:new Qu(e,""));break;case"ADVICE":var u=n.documentationLink;r=new Qs(t,null==u?null:new Qu(u,""));break;default:console.error("no severity "+n.severity),r=t}return r}function Ns(n,t){t=t===A?null:t;var r,i=new yf;if(i.ed(n),null==t);else{if(null!=t.line){var e=As(t);i.xd(e+(null==(r=t).line||null==r.length?"":"-"+r.length),""+t.path+e)}var u=t.taskPath;null==u||i.fd(u);var o=t.pluginId;null!=o&&i.fd(o)}return i}function As(n){var t;if(null==n.line)t=null;else{var r,i=":"+n.line,e=n.column;t=i+(null==(r=null==e?null:":"+e)?"":r)}return null==t?"":t}function Ms(n){var t,r,i=n.problemId;n:{for(var e=0,u=i.length;e<u;){var o=i[e];if(e=e+1|0,"compilation"===o.name){r=o;break n}}r=null}if(null!=r){var f,s=n.problemId;n:{for(var c=0,a=s.length;c<a;){var h=s[c];if(c=c+1|0,"java"===h.name){f=h;break n}}f=null}t=!(null==f)}else t=!1;return t}function Fs(n){return function(t){return t.ed(n.ef_1),t.fd(n.df_1),lr()}}function Ds(n){return n.name}function Os(n){return function(t){return t.xd(function(n,t,r,i){i=i!==A&&i;var e=new RegExp(qi().t7(" "),i?"gui":"gu"),u=qi().u7(" ");return n.replace(e,u)}(n),""),lr()}}function Rs(n){return function(t){return t.ed("- "),t.fd(""+n.path+As(n)),lr()}}function Hs(){return qs(),bn}function $s(){return qs(),pn}function Gs(){return qs(),mn}function Us(n){Zs.call(this),this.lf_1=n}function Vs(n,t){t=t!==A&&t,Zs.call(this),this.mf_1=n,this.nf_1=t}function Qs(n,t){t=t===A?null:t,Yu.call(this),this.of_1=n,this.pf_1=t}function Zs(){Yu.call(this)}function Ys(n){yc.call(this),this.qf_1=n}function Ws(n){yc.call(this),this.rf_1=n}function Ks(n){yc.call(this),this.sf_1=n}function Xs(n){nc.call(this),this.tf_1=n}function Js(n,t,r,i,e,u,o,f){this.uf_1=n,this.vf_1=t,this.wf_1=r,this.xf_1=i,this.yf_1=e,this.zf_1=u,this.ag_1=o,this.bg_1=f}function nc(){Bc.call(this)}function tc(n,t){var r=Lr();lo(t.xf_1)>0&&r.d(fc(0,Hs(),t.bg_1,t.ag_1)),lo(t.yf_1)>0&&r.d(fc(0,$s(),t.bg_1,t.ag_1)),lo(t.zf_1)>0&&r.d(fc(0,Gs(),t.bg_1,t.ag_1));var i=Af(),e=Jf(hc),u=Af().y9(Jf(lc),[]),o=function(n,t){var r,i=Af(),e=Jf(wc),u=Ff().ga("Learn more about "),o=$f();return i.y9(e,[u,o.fb(Jf((r=t,function(n){return n.bd(r.tc_1),lr()})),t.sc_1),Ff().ga(".")])}(0,t.wf_1),f=Af().y9(Jf(_c),[ic(0,t)]),s=Af();return i.y9(e,[u,o,f,s.zd(Jf(vc),r)])}function rc(n,t){var r,i,e=Af(),u=Jf(dc);switch(t.bg_1.q8_1){case 0:r=sc(0,t.xf_1,((i=function(n){return new Ys(n)}).callableName="<init>",i));break;case 1:r=sc(0,t.yf_1,function(){var n=function(n){return new Ws(n)};return n.callableName="<init>",n}());break;case 2:r=sc(0,t.zf_1,function(){var n=function(n){return new Ks(n)};return n.callableName="<init>",n}());break;default:le()}return e.y9(u,[r])}function ic(n,t){return Af().ja([oc(0,t),ec(0,t)])}function ec(n,t){for(var r=Af(),i=t.vf_1,e=Lr(),u=0,o=i.f();o.g();){var f=o.h(),s=u;u=s+1|0,jt(e,0===wr(s)?gr(uc(pc(),f)):bt([Gf().ja([]),uc(pc(),f)]))}return r.ha(e)}function uc(n,t){return Df().ja([Ic(t)])}function oc(n,t){return Nf().ja([jc().ka(t.uf_1)])}function fc(n,t,r,i){var e,u,o,f;return Af().y9(Jf((e=i,u=t,o=r,function(n){return n.t9("group-selector"),0===e?(n.t9("group-selector--disabled"),lr()):u.equals(o)?(n.t9("group-selector--active"),lr()):(n.u9(function(n){return function(t){return new Xs(n)}}(u)),lr()),lr()})),[Ff().rc(t.cf_1,[(f=i,Ff().y9(Jf(gc),[Ku(),Xu(),Ff().ga(""+f),Ju()]))])])}function sc(n,t,r){return function(n,t,r){var i,e=Af(),u=Of();return e.ja([u.ha(ys(t,(i=r,function(n){return function(n,t,r,i){var e,u;return t instanceof Us?Ic(Bf().rd(t.lf_1)):t instanceof Vs?Af().y9(Jf((u=t,function(n){return u.nf_1&&(n.t9("uncategorized"),lr()),lr()})),[Af().ja([zc(r,i),Ic(t.mf_1)])]):t instanceof Ou?Lc(i,r,t):t instanceof Gu?Ic(t.za_1):t instanceof Uu?Af().ja([(Vc(),xn),Ic(t.ab_1)]):t instanceof Vu?Af().ja([zc(r,i),Ic(t.bb_1)]):t instanceof Hu?Nc(i,((e=function(n){return cc(0,n)}).callableName="viewIt",e),r,t.va_1,t.wa_1,Cc()):t instanceof Qs?Nc(i,function(){var n=function(n){return cc(0,n)};return n.callableName="viewIt",n}(),r,t.of_1,t.pf_1,(Vc(),Bn)):t instanceof $u?Nc(i,function(){var n=function(n){return cc(0,n)};return n.callableName="viewIt",n}(),r,t.xa_1,t.ya_1,xc()):t instanceof Zu?Af().ja([zc(r,i),Ic(Bf().rd(t.eb_1))]):Ff().ga("Unknown node type viewNode: "+t)}(pc(),n.cd().ub_1,n,i)})))])}(0,t.xb_1.uc().vc(),r)}function cc(n,t){var r;if(t instanceof Qu)r=Qo(t);else if(t instanceof Zu)r=Ic(Bf().rd(t.eb_1));else if(t instanceof Gu)r=Ic(t.za_1);else{var i="Unknown node type viewIt: "+t;console.error(i),r=Ff().ga(i)}return r}function ac(n){return n.t9("report-wrapper"),lr()}function hc(n){return n.t9("header"),lr()}function lc(n){return n.t9("gradle-logo"),lr()}function _c(n){return n.t9("title"),lr()}function vc(n){return n.t9("groups"),lr()}function dc(n){return n.t9("content"),lr()}function gc(n){return n.t9("group-selector__count"),lr()}function wc(n){return n.t9("learn-more"),lr()}function bc(){yn=this,document.title="Gradle - Problems Report"}function pc(){return null==yn&&new bc,yn}function mc(n,t,r){return n.pe(t.zb().oe(),r)}function kc(n){Bc.call(this),this.hd_1=n}function yc(){Bc.call(this)}function qc(n,t){Bc.call(this),this.wc_1=n,this.xc_1=t}function Bc(){}function Cc(){return Vc(),qn}function xc(){return Vc(),Cn}function jc(){return Vc(),jn}function Pc(){return Vc(),Pn}function Ic(n){return Vc(),Pc().ka(n)}function Sc(n){return Vc(),Pc().ka(Bf().qd(n))}function zc(n,t){return Vc(),n.cd().ye()?Ac(n,t):function(n){return Vc(),Ff().fb(Jf(Gc),Mc(n))}(n)}function Ec(n,t,r,i){var e,u,o;return Vc(),Ff().fb(Jf((e=r,u=t,o=i,function(n){return n.t9("java-exception-part-toggle"),n.u9(function(n,t){return function(r){return new qc(n,t())}}(u,o)),n.s9("Click to "+function(n){var t;switch(Vc(),n.q8_1){case 0:t="show";break;case 1:t="hide";break;default:le()}return t}(e)),lr()})),"("+n+" internal "+gf("line",n)+" "+function(n){var t;switch(Vc(),n.q8_1){case 0:t="hidden";break;case 1:t="shown";break;default:le()}return t}(r)+")")}function Tc(n,t){t=t===A?Lf():t,Vc();for(var r=Rf(),i=Nr(xt(n,10)),e=0,u=n.f();u.g();){var o,f=e;e=f+1|0,s=u.h(),c=(c=0===wr(f)?t:Lf())===A?Lf():c,Vc(),o=Hf().ja([Mf().ga(s),c]),i.d(o)}var s,c;return r.ha(i)}function Lc(n,t,r){Vc();var i,e,u,o=Af(),f=Ac(t,n),s=Ff().ga("Exception"),c=Ff().ja([(Vc(),In).v9(r.na_1,"Copy exception to the clipboard")]),a=null==r.ma_1?null:Ff().ga(" "),h=null==a?Lf():a,l=r.ma_1,_=null==l?null:Ic(l),v=null==_?Lf():_;switch(t.cd().wb_1.q8_1){case 0:i=Lf();break;case 1:i=function(n,t){Vc();for(var r=Af(),i=Jf(Uc),e=n.oa_1,u=Nr(xt(e,10)),o=0,f=e.f();f.g();){var s,c=f.h(),a=o;o=a+1|0;var h,l=wr(a);if(null!=c.sa_1){var _,v=Ec(c.ra_1.k(),l,c.sa_1,t),d=c.sa_1;switch(null==d?-1:d.q8_1){case 0:_=Tc(Un(c.ra_1,1),v);break;case 1:_=Tc(c.ra_1,v);break;default:le()}h=_}else h=Tc(c.ra_1);s=h,u.d(s)}return r.zd(i,u)}(r,(e=n,u=t,function(){return e(new ss(u))}));break;default:le()}return o.ja([f,s,c,h,v,i])}function Nc(n,t,r,i,e,u,o){e=e===A?null:e,u=u===A?Lf():u,o=o===A?Lf():o,Vc();var f=Af(),s=zc(r,n),c=t(i),a=null==e?null:t(e);return f.ja([s,u,c,null==a?Lf():a,o])}function Ac(n,t){var r,i;return Vc(),Ff().fb(Jf((r=n,i=t,function(n){return n.gb(["invisible-text","tree-btn"]),r.cd().wb_1===ps()&&(n.t9("collapsed"),lr()),r.cd().wb_1===ms()&&(n.t9("expanded"),lr()),n.s9("Click to "+function(n){var t;switch(Vc(),n.q8_1){case 0:t="expand";break;case 1:t="collapse";break;default:le()}return t}(r.cd().wb_1)),n.u9(function(n,t){return function(r){return n(new ss(t))}}(i,r)),lr()})),Mc(n))}function Mc(n){return Vc(),function(n,t){var r;if(!(t>=0))throw fu(ie("Count 'n' must be non-negative, but was "+t+"."));switch(t){case 0:r="";break;case 1:r=ie(n);break;default:var i="";if(0!==Wi(n))for(var e=ie(n),u=t;1&~u||(i+=e),0!=(u=u>>>1|0);)e+=e;return i}return r}("    ",n.we()-1|0)+"- "}function Fc(n){return Vc(),n.gb(["invisible-text","error-icon"]),lr()}function Dc(n){return Vc(),n.gb(["invisible-text","advice-icon"]),lr()}function Oc(n){return Vc(),n.gb(["invisible-text","warning-icon"]),lr()}function Rc(n){return Vc(),n.gb(["invisible-text","enum-icon"]),lr()}function Hc(n){return Vc(),new kc(n)}function $c(n){return Vc(),new kc(n)}function Gc(n){return Vc(),n.gb(["invisible-text","leaf-icon"]),lr()}function Uc(n){return Vc(),n.t9("java-exception"),lr()}function Vc(){if(!Sn){Sn=!0;var n=Ff();qn=n.fb(Jf(Fc),"[error] ");var t=Ff();Bn=t.fb(Jf(Dc),"[advice] ");var r=Ff();Cn=r.fb(Jf(Oc),"[warn]  ");var i=Ff();xn=i.fb(Jf(Rc),"[enum]  "),jn=new Du,Pn=new Du(Hc),In=new Mu($c)}}return Ge(Yn,A,Re),Ge(tt,A,Re),Ge(rt,A,Re),Ge(Ti,"Collection",Ye),Ge(it,"AbstractCollection",Re,A,[Ti]),Ge(et,"IteratorImpl",Re),Ge(ut,"ListIteratorImpl",Re,et),Ge(ot,"Companion",Ke),Ge(Ei,"List",Ye,A,[Ti]),Ge(st,"AbstractList",Re,it,[it,Ei]),Ge(ct,A,Re),Ge(lt,"Companion",Ke),Ge(vt,A,Re,it),Ge(Ni,"Map",Ye),Ge(dt,"AbstractMap",Re,A,[Ni]),Ge(gt,"Companion",Ke),Ge(li,"RandomAccess",Ye),Ge(yt,"EmptyList",Ke,A,[Ei,li]),Ge(qt,"ArrayAsCollection",Re,A,[Ti]),Ge(Bt,"EmptyIterator",Ke),Ge(Pt,"IntIterator",Re),Ge(It,A,Re),Ge(St,"ReversedListReadOnly",Re,st),Ge(zt,A,Re),Ge(Et,"TransformingSequence",Re),Ge(Lt,A,Re),Ge(Nt,"FilteringSequence",Re),Ge(Mi,"Set",Ye,A,[Ti]),Ge(Mt,"EmptySet",Ke,A,[Mi]),Ge(Ot,"Companion",Ke),Ge(Vt,"IntProgression",Re),Ge(Ht,"IntRange",Re,Vt),Ge($t,"IntProgressionIterator",Re,Pt),Ge(Gt,"Companion",Ke),Ge(er,A,Re),Ge(ur,"DelimitedRangesSequence",Re),Ge(or,"Pair",Re),Ge(sr,"CharSequence",Ye),Ge(cr,"Comparable",Ye),Ge(ar,"Number",Re),Ge(hr,"Unit",Ke),Ge(_r,"IntCompanionObject",Ke),Ge(mr,"AbstractMutableCollection",Re,it,[it,Ti]),Ge(kr,"IteratorImpl",Re),Ge(yr,"ListIteratorImpl",Re,kr),Ge(qr,"AbstractMutableList",Re,mr,[mr,Ti,Ei]),Ge(Br,A,Re),Ge(Cr,A,Re),Ge(Li,"Entry",Ye),Ge(Ai,"MutableEntry",Ye,A,[Li]),Ge(xr,"SimpleEntry",Re,A,[Ai]),Ge(zr,"AbstractMutableSet",Re,mr,[mr,Mi,Ti]),Ge(jr,"AbstractEntrySet",Re,zr),Ge(Pr,A,Re,zr),Ge(Ir,A,Re,mr),Ge(Sr,"AbstractMutableMap",Re,dt,[dt,Ni]),Ge(Er,"Companion",Ke),Ge(Fr,"ArrayList",Re,qr,[qr,Ti,Ei,li]),Ge(Rr,"HashCode",Ke),Ge(Hr,"EntrySet",Re,jr),Ge(Vr,"HashMap",Re,Sr,[Sr,Ni]),Ge(Zr,"HashSet",Re,zr,[zr,Mi,Ti]),Ge(Xr,A,Re),Ge(ni,"InternalMap",Ye),Ge(Jr,"InternalHashCodeMap",Re,A,[ni]),Ge(ti,"EntryIterator",Re),Ge(ri,"Companion",Ke),Ge(ei,"ChainEntry",Re,xr),Ge(ui,"EntrySet",Re,jr),Ge(si,"LinkedHashMap",Re,Vr,[Vr,Ni]),Ge(ci,"Companion",Ke),Ge(hi,"LinkedHashSet",Re,Zr,[Zr,Mi,Ti]),Ge(_i,"BaseOutput",Re),Ge(vi,"NodeJsOutput",Re,_i),Ge(gi,"BufferedOutput",Re,_i),Ge(di,"BufferedOutputToConsoleLog",Re,gi),Ge(pi,"StringBuilder",Re,A,[sr]),Ge(yi,"Companion",Ke),Ge(Bi,"Regex",Re),Ge(Ii,"Companion",Ke),Ge(zi,"Char",Re,A,[cr]),Ge(Fi,"Companion",Ke),Ge(Di,"Enum",Re,A,[cr]),Ge(Hi,A,Re),Ge(ve,"Companion",Ke),Ge(de,"Long",Re,ar,[ar,cr]),Ge(iu,"Letter",Ke),Ge(uu,"OtherLowercase",Ke),Ge(du,"Exception",Re,Error),Ge(bu,"RuntimeException",Re,du),Ge(su,"IllegalArgumentException",Re,bu),Ge(au,"IndexOutOfBoundsException",Re,bu),Ge(lu,"IllegalStateException",Re,bu),Ge(ku,"NoSuchElementException",Re,bu),Ge(qu,"ArithmeticException",Re,bu),Ge(xu,"UnsupportedOperationException",Re,bu),Ge(Pu,"NullPointerException",Re,bu),Ge(Su,"NoWhenBranchMatchedException",Re,bu),Ge(Eu,"ClassCastException",Re,bu),Ge(Lu,"UninitializedPropertyAccessException",Re,bu),Ge(Au,"Model",Re),Ge(Mu,"CopyButtonComponent",Re),Ge(Du,"PrettyTextComponent",Re),Ge(Yu,"ProblemNode",Re),Ge(Ou,"Exception",Re,Yu),Ge(Ru,"StackTracePart",Re),Ge(Hu,"Error",Re,Yu),Ge($u,"Warning",Re,Yu),Ge(Gu,"Message",Re,Yu),Ge(Uu,"ListElement",Re,Yu),Ge(Vu,"TreeNode",Re,Yu),Ge(Qu,"Link",Re,Yu),Ge(Zu,"Label",Re,Yu),Ge(io,"Info",Re,Yu),Ge(eo,"Project",Re,Yu),Ge(uo,"Task",Re,Yu),Ge(oo,"TaskPath",Re,Yu),Ge(fo,"Bean",Re,Yu),Ge(so,"SystemProperty",Re,Yu),Ge(co,"Property",Re,Yu),Ge(ao,"BuildLogic",Re,Yu),Ge(ho,"BuildLogicClass",Re,Yu),Ge(Bc,"BaseIntent",Re),Ge(yc,"TreeIntent",Re,Bc),Ge(vo,"TaskTreeIntent",Re,yc),Ge(go,"MessageTreeIntent",Re,yc),Ge(wo,"InputTreeIntent",Re,yc),Ge(bo,"IncompatibleTaskTreeIntent",Re,yc),Ge(yo,"Intent",Re,Bc),Ge(po,"SetTab",Re,yo),Ge(mo,"Model",Re),Ge(ko,"Tab",Re,Di),Ge(Uo,"ConfigurationCacheReportPage",Ke),Ge(Zo,"ImportedProblem",Re),Ge(Yo,"ImportedDiagnostics",Re),Ge(ff,"sam$kotlin_Comparator$0",Re),Ge(bf,"LearnMore",Re),Ge(kf,"Fragment",Re),Ge(pf,"Text",Re,kf),Ge(mf,"Reference",Re,kf),Ge(yf,"Builder",Re),Ge(qf,"Companion",Ke),Ge(Cf,"PrettyText",Re),Ge(xf,"Companion",Ke),Ge(Sf,"Trie",Re),Ge(Uf,"ViewFactory",Re),Ge(Vf,"Companion",Ke),Ge(Xf,"View",Re),Ge(Zf,"Empty",Ke,Xf),Ge(Wf,"Element",Re,Xf),Ge(Kf,"MappedView",Re,Xf),Ge(ns,"Attributes",Re),Ge(es,"Attribute",Re),Ge(ts,"OnEvent",Re,es),Ge(rs,"ClassName",Re,es),Ge(is,"Named",Re,es),Ge(as,"Intent",Re),Ge(ss,"Toggle",Re,as),Ge(cs,"Model",Re),Ge(ls,"TreeView",Ke),Ge(bs,"Focus",Re),Ge(ds,"Original",Re,bs),Ge(gs,"Child",Re,bs),Ge(ws,"ViewState",Re,Di),Ge(ks,"Tree",Re),Ge(Bs,"Tab",Re,Di),Ge(Cs,"ProblemIdElement",Re),Ge(xs,"ProblemSummary",Re),Ge(Is,"ProblemNodeGroup",Re),Ge(Zs,"ProblemApiNode",Re,Yu),Ge(Us,"Text",Re,Zs),Ge(Vs,"ProblemIdNode",Re,Zs),Ge(Qs,"Advice",Re,Yu),Ge(Ys,"MessageTreeIntent",Re,yc),Ge(Ws,"ProblemIdTreeIntent",Re,yc),Ge(Ks,"FileLocationTreeIntent",Re,yc),Ge(nc,"Intent",Re,Bc),Ge(Xs,"SetTab",Re,nc),Ge(Js,"Model",Re),Ge(bc,"ProblemsReportPage",Ke),Ge(kc,"Copy",Re,Bc),Ge(qc,"ToggleStackTracePart",Re,Bc),se(Yn).f=function(){return this.n_1.f()},se(tt).f=function(){return this.r_1.f()},se(rt).f=function(){var n,t,r=function(n,t){for(var r=n.f();r.g();){var i=r.h();t.d(i)}return t}(this.s_1,Lr());return n=r,t=this.t_1,function(n,t){if(n.k()<=1)return lr();var r=br(n);!function(n,t){if(function(){if(null!=l)return l;l=!1;var n=[],t=0;if(t<600)do{var r=t;t=t+1|0,n.push(r)}while(t<600);var i=Or;n.sort(i);var e=1,u=n.length;if(e<u)do{var o=e;e=e+1|0;var f=n[o-1|0],s=n[o];if((3&f)==(3&s)&&f>=s)return!1}while(e<u);return l=!0,!0}()){var r=(i=t,function(n,t){return i.compare(n,t)});n.sort(r)}else!function(n,t,r,i){var e=n.length,u=function(n){var t=0,r=n.length-1|0;if(t<=r)do{var i=t;t=t+1|0,n[i]=null}while(i!==r);return n}(Array(e)),o=Dr(n,u,0,r,i);if(o!==n){var f=0;if(f<=r)do{var s=f;f=f+1|0,n[s]=o[s]}while(s!==r)}}(n,0,Nn(n),t);var i}(r,t);var i=0,e=r.length;if(i<e)do{var u=i;i=i+1|0,n.f4(u,r[u])}while(i<e)}(n,t),r.f()},se(it).u=function(n){var t;n:if(Ue(this,Ti)&&this.i())t=!1;else{for(var r=this.f();r.g();)if(oe(r.h(),n)){t=!0;break n}t=!1}return t},se(it).v=function(n){var t;n:if(Ue(n,Ti)&&n.i())t=!0;else{for(var r=n.f();r.g();){var i=r.h();if(!this.u(i)){t=!1;break n}}t=!0}return t},se(it).i=function(){return 0===this.k()},se(it).toString=function(){return Mn(this,", ","[","]",A,A,(n=this,function(t){return t===n?"(this Collection)":Oi(t)}));var n},se(it).toArray=function(){return dr(this)},se(et).g=function(){return this.w_1<this.x_1.k()},se(et).h=function(){if(!this.g())throw pu();var n=this.w_1;return this.w_1=n+1|0,this.x_1.j(n)},se(ut).c1=function(){return this.w_1>0},se(ut).d1=function(){if(!this.c1())throw pu();return this.w_1=this.w_1-1|0,this.a1_1.j(this.w_1)},se(ot).e1=function(n,t){if(n<0||n>=t)throw cu("index: "+n+", size: "+t)},se(ot).b1=function(n,t){if(n<0||n>t)throw cu("index: "+n+", size: "+t)},se(ot).f1=function(n){for(var t=1,r=n.f();r.g();){var i=r.h(),e=zn(31,t),u=null==i?null:ee(i);t=e+(null==u?0:u)|0}return t},se(ot).g1=function(n,t){if(n.k()!==t.k())return!1;for(var r=t.f(),i=n.f();i.g();)if(!oe(i.h(),r.h()))return!1;return!0},se(st).f=function(){return new et(this)},se(st).l=function(n){return new ut(this,n)},se(st).equals=function(n){return n===this||!(null==n||!Ue(n,Ei))&&ft().g1(this,n)},se(st).hashCode=function(){return ft().f1(this)},se(ct).g=function(){return this.h1_1.g()},se(ct).h=function(){return this.h1_1.h().i1()},se(lt).k1=function(n){var t=n.j1(),r=null==t?null:ee(t),i=null==r?0:r,e=n.i1(),u=null==e?null:ee(e);return i^(null==u?0:u)},se(lt).l1=function(n){return Oi(n.j1())+"="+Oi(n.i1())},se(lt).m1=function(n,t){return!(null==t||!Ue(t,Li))&&!!oe(n.j1(),t.j1())&&oe(n.i1(),t.i1())},se(vt).r1=function(n){return this.q1_1.s1(n)},se(vt).u=function(n){return!(null!=n&&!Qe(n))&&this.r1(null==n||Qe(n)?n:_e())},se(vt).f=function(){return new ct(this.q1_1.o().f())},se(vt).k=function(){return this.q1_1.k()},se(dt).t1=function(n){return!(null==ht(this,n))},se(dt).s1=function(n){var t;n:{var r=this.o();if(Ue(r,Ti)&&r.i())t=!1;else{for(var i=r.f();i.g();)if(oe(i.h().i1(),n)){t=!0;break n}t=!1}}return t},se(dt).u1=function(n){if(null==n||!Ue(n,Li))return!1;var t=n.j1(),r=n.i1(),i=(Ue(this,Ni)?this:_e()).v1(t);return!(!oe(r,i)||null==i&&!(Ue(this,Ni)?this:_e()).t1(t))},se(dt).equals=function(n){if(n===this)return!0;if(null==n||!Ue(n,Ni))return!1;if(this.k()!==n.k())return!1;var t;n:{var r=n.o();if(Ue(r,Ti)&&r.i())t=!0;else{for(var i=r.f();i.g();){var e=i.h();if(!this.u1(e)){t=!1;break n}}t=!0}}return t},se(dt).v1=function(n){var t=ht(this,n);return null==t?null:t.i1()},se(dt).hashCode=function(){return ee(this.o())},se(dt).i=function(){return 0===this.k()},se(dt).k=function(){return this.o().k()},se(dt).toString=function(){var n;return Mn(this.o(),", ","{","}",A,A,(n=this,function(t){return n.p1(t)}))},se(dt).p1=function(n){return at(this,n.j1())+"="+at(this,n.i1())},se(dt).w1=function(){return null==this.o1_1&&(this.o1_1=new vt(this)),he(this.o1_1)},se(gt).x1=function(n){for(var t=0,r=n.f();r.g();){var i=r.h(),e=t,u=null==i?null:ee(i);t=e+(null==u?0:u)|0}return t},se(gt).y1=function(n,t){return n.k()===t.k()&&n.v(t)},se(yt).equals=function(n){return!(null==n||!Ue(n,Ei))&&n.i()},se(yt).hashCode=function(){return 1},se(yt).toString=function(){return"[]"},se(yt).k=function(){return 0},se(yt).i=function(){return!0},se(yt).a2=function(n){return n.i()},se(yt).v=function(n){return this.a2(n)},se(yt).j=function(n){throw cu("Empty list doesn't contain element at index "+n+".")},se(yt).f=function(){return Ct()},se(yt).l=function(n){if(0!==n)throw cu("Index: "+n);return Ct()},se(qt).k=function(){return this.b2_1.length},se(qt).i=function(){return 0===this.b2_1.length},se(qt).d2=function(n){return function(n,t){return An(n,t)>=0}(this.b2_1,n)},se(qt).e2=function(n){var t;n:if(Ue(n,Ti)&&n.i())t=!0;else{for(var r=n.f();r.g();){var i=r.h();if(!this.d2(i)){t=!1;break n}}t=!0}return t},se(qt).v=function(n){return this.e2(n)},se(qt).f=function(){return Ri(this.b2_1)},se(Bt).g=function(){return!1},se(Bt).c1=function(){return!1},se(Bt).h=function(){throw pu()},se(Bt).d1=function(){throw pu()},se(Pt).h=function(){return this.f2()},se(It).g=function(){return this.g2_1.c1()},se(It).c1=function(){return this.g2_1.g()},se(It).h=function(){return this.g2_1.d1()},se(It).d1=function(){return this.g2_1.h()},se(St).k=function(){return this.i2_1.k()},se(St).j=function(n){return this.i2_1.j(function(n,t){if(!(0<=t&&t<=kt(n)))throw cu("Element index "+t+" must be in range ["+Oe(0,kt(n))+"].");return kt(n)-t|0}(this,n))},se(St).f=function(){return this.l(0)},se(St).l=function(n){return new It(this,n)},se(zt).h=function(){return this.k2_1.m2_1(this.j2_1.h())},se(zt).g=function(){return this.j2_1.g()},se(Et).f=function(){return new zt(this)},se(Lt).h=function(){if(-1===this.o2_1&&Tt(this),0===this.o2_1)throw pu();var n=this.p2_1;return this.p2_1=null,this.o2_1=-1,null==n||Qe(n)?n:_e()},se(Lt).g=function(){return-1===this.o2_1&&Tt(this),1===this.o2_1},se(Nt).f=function(){return new Lt(this)},se(Mt).equals=function(n){return!(null==n||!Ue(n,Mi))&&n.i()},se(Mt).hashCode=function(){return 0},se(Mt).toString=function(){return"[]"},se(Mt).k=function(){return 0},se(Mt).i=function(){return!0},se(Mt).a2=function(n){return n.i()},se(Mt).v=function(n){return this.a2(n)},se(Mt).f=function(){return Ct()},se(Ht).y2=function(){return this.z2_1},se(Ht).c3=function(){return this.a3_1},se(Ht).i=function(){return this.z2_1>this.a3_1},se(Ht).equals=function(n){return n instanceof Ht&&(!(!this.i()||!n.i())||this.z2_1===n.z2_1&&this.a3_1===n.a3_1)},se(Ht).hashCode=function(){return this.i()?-1:zn(31,this.z2_1)+this.a3_1|0},se(Ht).toString=function(){return this.z2_1+".."+this.a3_1},se($t).g=function(){return this.f3_1},se($t).f2=function(){var n=this.g3_1;if(n===this.e3_1){if(!this.f3_1)throw pu();this.f3_1=!1}else this.g3_1=this.g3_1+this.d3_1|0;return n},se(Gt).q=function(n,t,r){return new Vt(n,t,r)},se(Vt).f=function(){return new $t(this.z2_1,this.a3_1,this.b3_1)},se(Vt).i=function(){return this.b3_1>0?this.z2_1>this.a3_1:this.z2_1<this.a3_1},se(Vt).equals=function(n){return n instanceof Vt&&(!(!this.i()||!n.i())||this.z2_1===n.z2_1&&this.a3_1===n.a3_1&&this.b3_1===n.b3_1)},se(Vt).hashCode=function(){return this.i()?-1:zn(31,zn(31,this.z2_1)+this.a3_1|0)+this.b3_1|0},se(Vt).toString=function(){return this.b3_1>0?this.z2_1+".."+this.a3_1+" step "+this.b3_1:this.z2_1+" downTo "+this.a3_1+" step "+(0|-this.b3_1)},se(er).h=function(){if(-1===this.j3_1&&ir(this),0===this.j3_1)throw pu();var n=this.m3_1,t=n instanceof Ht?n:_e();return this.m3_1=null,this.j3_1=-1,t},se(er).g=function(){return-1===this.j3_1&&ir(this),1===this.j3_1},se(ur).f=function(){return new er(this)},se(or).toString=function(){return"("+this.t3_1+", "+this.u3_1+")"},se(or).v3=function(){return this.t3_1},se(or).w3=function(){return this.u3_1},se(or).hashCode=function(){var n=null==this.t3_1?0:ee(this.t3_1);return zn(n,31)+(null==this.u3_1?0:ee(this.u3_1))|0},se(or).equals=function(n){if(this===n)return!0;if(!(n instanceof or))return!1;var t=n instanceof or?n:_e();return!!oe(this.t3_1,t.t3_1)&&!!oe(this.u3_1,t.u3_1)},se(hr).toString=function(){return"kotlin.Unit"},se(_r).b4=function(){return this.MIN_VALUE},se(_r).c4=function(){return this.MAX_VALUE},se(_r).d4=function(){return this.SIZE_BYTES},se(_r).e4=function(){return this.SIZE_BITS},se(mr).m=function(n){this.g4();for(var t=!1,r=n.f();r.g();){var i=r.h();this.d(i)&&(t=!0)}return t},se(mr).toJSON=function(){return this.toArray()},se(mr).g4=function(){},se(kr).g=function(){return this.h4_1<this.j4_1.k()},se(kr).h=function(){if(!this.g())throw pu();var n=this.h4_1;return this.h4_1=n+1|0,this.i4_1=n,this.j4_1.j(this.i4_1)},se(yr).c1=function(){return this.h4_1>0},se(yr).d1=function(){if(!this.c1())throw pu();return this.h4_1=this.h4_1-1|0,this.i4_1=this.h4_1,this.n4_1.j(this.i4_1)},se(qr).d=function(n){return this.g4(),this.p4(this.k(),n),!0},se(qr).f=function(){return new kr(this)},se(qr).u=function(n){return this.q4(n)>=0},se(qr).q4=function(n){var t=0,r=kt(this);if(t<=r)do{var i=t;if(t=t+1|0,oe(this.j(i),n))return i}while(i!==r);return-1},se(qr).l=function(n){return new yr(this,n)},se(qr).equals=function(n){return n===this||!(null==n||!Ue(n,Ei))&&ft().g1(this,n)},se(qr).hashCode=function(){return ft().f1(this)},se(Br).g=function(){return this.r4_1.g()},se(Br).h=function(){return this.r4_1.h().j1()},se(Cr).g=function(){return this.s4_1.g()},se(Cr).h=function(){return this.s4_1.h().i1()},se(xr).j1=function(){return this.t4_1},se(xr).i1=function(){return this.u4_1},se(xr).v4=function(n){var t=this.u4_1;return this.u4_1=n,t},se(xr).hashCode=function(){return _t().k1(this)},se(xr).toString=function(){return _t().l1(this)},se(xr).equals=function(n){return _t().m1(this,n)},se(jr).u=function(n){return this.w4(n)},se(Pr).y4=function(n){throw Cu("Add is not supported on keys")},se(Pr).d=function(n){return this.y4(null==n||Qe(n)?n:_e())},se(Pr).z4=function(n){return this.x4_1.t1(n)},se(Pr).u=function(n){return!(null!=n&&!Qe(n))&&this.z4(null==n||Qe(n)?n:_e())},se(Pr).f=function(){return new Br(this.x4_1.o().f())},se(Pr).k=function(){return this.x4_1.k()},se(Pr).g4=function(){return this.x4_1.g4()},se(Ir).f5=function(n){throw Cu("Add is not supported on values")},se(Ir).d=function(n){return this.f5(null==n||Qe(n)?n:_e())},se(Ir).r1=function(n){return this.e5_1.s1(n)},se(Ir).u=function(n){return!(null!=n&&!Qe(n))&&this.r1(null==n||Qe(n)?n:_e())},se(Ir).f=function(){return new Cr(this.e5_1.o().f())},se(Ir).k=function(){return this.e5_1.k()},se(Ir).g4=function(){return this.e5_1.g4()},se(Sr).g5=function(){return null==this.c5_1&&(this.c5_1=new Pr(this)),he(this.c5_1)},se(Sr).w1=function(){return null==this.d5_1&&(this.d5_1=new Ir(this)),he(this.d5_1)},se(Sr).g4=function(){},se(zr).equals=function(n){return n===this||!(null==n||!Ue(n,Mi))&&wt().y1(this,n)},se(zr).hashCode=function(){return wt().x1(this)},se(Fr).j5=function(){return this.g4(),this.c_1=!0,this.k()>0?this:Tr().i5_1},se(Fr).k=function(){return this.b_1.length},se(Fr).j=function(n){var t=this.b_1[Mr(this,n)];return null==t||Qe(t)?t:_e()},se(Fr).f4=function(n,t){this.g4(),Mr(this,n);var r=this.b_1[n];this.b_1[n]=t;var i=r;return null==i||Qe(i)?i:_e()},se(Fr).d=function(n){return this.g4(),this.b_1.push(n),this.o4_1=this.o4_1+1|0,!0},se(Fr).p4=function(n,t){this.g4(),this.b_1.splice(function(n,t){return ft().b1(t,n.k()),t}(this,n),0,t),this.o4_1=this.o4_1+1|0},se(Fr).m=function(n){if(this.g4(),n.i())return!1;for(var t,r,i,e=(t=this,r=n.k(),i=t.k(),t.b_1.length=t.k()+r|0,i),u=0,o=n.f();o.g();){var f=o.h(),s=u;u=s+1|0;var c=wr(s);this.b_1[e+c|0]=f}return this.o4_1=this.o4_1+1|0,!0},se(Fr).q4=function(n){return An(this.b_1,n)},se(Fr).toString=function(){return Ln(this.b_1,", ","[","]",A,A,Xi)},se(Fr).k5=function(){return[].slice.call(this.b_1)},se(Fr).toArray=function(){return this.k5()},se(Fr).g4=function(){if(this.c_1)throw Bu()},se(Rr).l5=function(n,t){return oe(n,t)},se(Rr).m5=function(n){var t=null==n?null:ee(n);return null==t?0:t},se(Hr).o5=function(n){throw Cu("Add is not supported on entries")},se(Hr).d=function(n){return this.o5(null!=n&&Ue(n,Ai)?n:_e())},se(Hr).w4=function(n){return this.n5_1.u1(n)},se(Hr).f=function(){return this.n5_1.t5_1.f()},se(Hr).k=function(){return this.n5_1.k()},se(Vr).t1=function(n){return this.t5_1.z4(n)},se(Vr).s1=function(n){var t;n:{var r=this.t5_1;if(Ue(r,Ti)&&r.i())t=!1;else{for(var i=r.f();i.g();){var e=i.h();if(this.u5_1.l5(e.i1(),n)){t=!0;break n}}t=!1}}return t},se(Vr).o=function(){return null==this.v5_1&&(this.v5_1=this.x5()),he(this.v5_1)},se(Vr).x5=function(){return new Hr(this)},se(Vr).v1=function(n){return this.t5_1.v1(n)},se(Vr).h5=function(n,t){return this.t5_1.h5(n,t)},se(Vr).k=function(){return this.t5_1.k()},se(Zr).d=function(n){return null==this.y5_1.h5(n,this)},se(Zr).u=function(n){return this.y5_1.t1(n)},se(Zr).i=function(){return this.y5_1.i()},se(Zr).f=function(){return this.y5_1.g5().f()},se(Zr).k=function(){return this.y5_1.k()},se(Xr).g=function(){return-1===this.z5_1&&(this.z5_1=function(n){if(null!=n.c6_1&&n.d6_1){var t=n.c6_1.length;if(n.e6_1=n.e6_1+1|0,n.e6_1<t)return 0}if(n.b6_1=n.b6_1+1|0,n.b6_1<n.a6_1.length){n.c6_1=n.g6_1.i6_1[n.a6_1[n.b6_1]];var r=n,i=n.c6_1;return r.d6_1=null!=i&&Ve(i),n.e6_1=0,0}return n.c6_1=null,1}(this)),0===this.z5_1},se(Xr).h=function(){if(!this.g())throw pu();var n=this.d6_1?this.c6_1[this.e6_1]:this.c6_1;return this.f6_1=n,this.z5_1=-1,n},se(Jr).w5=function(){return this.h6_1},se(Jr).k=function(){return this.j6_1},se(Jr).h5=function(n,t){var r=this.h6_1.m5(n),i=Kr(this,r);if(null==i)this.i6_1[r]=new xr(n,t);else{if(null==i||!Ve(i)){var e,u=i;return this.h6_1.l5(u.j1(),n)?u.v4(t):(e=[u,new xr(n,t)],this.i6_1[r]=e,this.j6_1=this.j6_1+1|0,null)}var o=i,f=Wr(o,this,n);if(null!=f)return f.v4(t);o.push(new xr(n,t))}return this.j6_1=this.j6_1+1|0,null},se(Jr).z4=function(n){return!(null==Yr(this,n))},se(Jr).v1=function(n){var t=Yr(this,n);return null==t?null:t.i1()},se(Jr).f=function(){return new Xr(this)},se(ti).g=function(){return!(null===this.m6_1)},se(ti).h=function(){if(!this.g())throw pu();var n=he(this.m6_1);this.l6_1=n;var t,r=n.b7_1;return t=r!==this.n6_1.y6_1.v6_1?r:null,this.m6_1=t,n},se(ei).v4=function(n){return this.d7_1.g4(),se(xr).v4.call(this,n)},se(ui).o5=function(n){throw Cu("Add is not supported on entries")},se(ui).d=function(n){return this.o5(null!=n&&Ue(n,Ai)?n:_e())},se(ui).w4=function(n){return this.y6_1.u1(n)},se(ui).f=function(){return new ti(this)},se(ui).k=function(){return this.y6_1.k()},se(ui).g4=function(){return this.y6_1.g4()},se(si).j5=function(){var n;if(this.g4(),this.x6_1=!0,this.k()>0)n=this;else{var t=ii().e7_1;n=Ue(t,Ni)?t:_e()}return n},se(si).t1=function(n){return this.w6_1.t1(n)},se(si).s1=function(n){var t=this.v6_1;if(null==t)return!1;var r=t;do{if(oe(r.i1(),n))return!0;r=he(r.b7_1)}while(r!==this.v6_1);return!1},se(si).x5=function(){return new ui(this)},se(si).v1=function(n){var t=this.w6_1.v1(n);return null==t?null:t.i1()},se(si).h5=function(n,t){this.g4();var r=this.w6_1.v1(n);if(null==r){var i=new ei(this,n,t);return this.w6_1.h5(n,i),function(n,t){if(null!=n.b7_1||null!=n.c7_1)throw hu(ie("Check failed."));var r=t.v6_1;if(null==r)t.v6_1=n,n.b7_1=n,n.c7_1=n;else{var i=r.c7_1;if(null==i)throw hu(ie("Required value was null."));var e=i;n.c7_1=e,n.b7_1=r,r.c7_1=n,e.b7_1=n}}(i,this),null}return r.v4(t)},se(si).k=function(){return this.w6_1.k()},se(si).g4=function(){if(this.x6_1)throw Bu()},se(hi).g4=function(){return this.y5_1.g4()},se(_i).h7=function(){this.i7("\n")},se(_i).j7=function(n){this.i7(n),this.h7()},se(vi).i7=function(n){var t=String(n);this.k7_1.write(t)},se(di).i7=function(n){var t=String(n),r=t.lastIndexOf("\n",0);if(r>=0){var i=this.m7_1;this.m7_1=i+t.substring(0,r),this.n7();var e=r+1|0;t=t.substring(e)}this.m7_1=this.m7_1+t},se(di).n7=function(){console.log(this.m7_1),this.m7_1=""},se(gi).i7=function(n){var t=this.m7_1;this.m7_1=t+String(n)},se(pi).x3=function(){return this.o7_1.length},se(pi).y3=function(n){var t=this.o7_1;if(!(n>=0&&n<=Yt(t)))throw cu("index: "+n+", length: "+this.x3()+"}");return Zi(t,n)},se(pi).z3=function(n,t){return this.o7_1.substring(n,t)},se(pi).i3=function(n){return this.o7_1=this.o7_1+new zi(n),this},se(pi).e=function(n){return this.o7_1=this.o7_1+Oi(n),this},se(pi).p7=function(n){var t=this.o7_1;return this.o7_1=t+(null==n?"null":n),this},se(pi).toString=function(){return this.o7_1},se(yi).t7=function(n){var t=this.q7_1;return n.replace(t,"\\$&")},se(yi).u7=function(n){var t=this.s7_1;return n.replace(t,"$$$$")},se(Bi).a8=function(n){this.x7_1.lastIndex=0;var t=this.x7_1.exec(ie(n));return null!=t&&0===t.index&&this.x7_1.lastIndex===Wi(n)},se(Bi).toString=function(){return this.x7_1.toString()},se(zi).o8=function(n){return ji(this.h3_1,n)},se(zi).a4=function(n){return function(n,t){return ji(n.h3_1,t instanceof zi?t.h3_1:_e())}(this,n)},se(zi).equals=function(n){return function(n,t){return t instanceof zi&&n===t.h3_1}(this.h3_1,n)},se(zi).hashCode=function(){return this.h3_1},se(zi).toString=function(){return Pi(this.h3_1)},se(Di).r8=function(n){return Ji(this.q8_1,n.q8_1)},se(Di).a4=function(n){return this.r8(n instanceof Di?n:_e())},se(Di).equals=function(n){return this===n},se(Di).hashCode=function(){return re(this)},se(Di).toString=function(){return this.p8_1},se(Hi).g=function(){return!(this.s8_1===this.t8_1.length)},se(Hi).h=function(){if(this.s8_1===this.t8_1.length)throw mu(""+this.s8_1);var n=this.s8_1;return this.s8_1=n+1|0,this.t8_1[n]},se(de).b9=function(n){return ke(this,n)},se(de).a4=function(n){return this.b9(n instanceof de?n:_e())},se(de).c9=function(n){return ye(this,n)},se(de).d9=function(n){return function(n,t){if(Me(),Se(t))throw vu("division by zero");if(Se(n))return ge();if(xe(n,pe())){if(xe(t,we())||xe(t,be()))return pe();if(xe(t,pe()))return we();var r=function(n){Me();return new de(n.u8_1>>>1|n.v8_1<<31,n.v8_1>>1)}(n),i=function(n){Me();return new de(n.u8_1<<1,n.v8_1<<1|n.u8_1>>>31)}(r.d9(t));return xe(i,ge())?Ie(t)?we():be():ye(i,qe(n,Be(t,i)).d9(t))}if(xe(t,pe()))return ge();if(Ie(n))return Ie(t)?Ee(n).d9(Ee(t)):Ee(Ee(n).d9(t));if(Ie(t))return Ee(n.d9(Ee(t)));for(var e=ge(),u=n;Ae(u,t);){for(var o=Ce(u)/Ce(t),f=Math.max(1,Math.floor(o)),s=Math.ceil(Math.log(f)/Math.LN2),c=s<=48?1:Math.pow(2,s-48),a=Le(f),h=Be(a,t);Ie(h)||Ne(h,u);)h=Be(a=Le(f-=c),t);Se(a)&&(a=we()),e=ye(e,a),u=qe(u,h)}return e}(this,n)},se(de).e9=function(){return this.f9().c9(new de(1,0))},se(de).f9=function(){return new de(~this.u8_1,~this.v8_1)},se(de).g9=function(){return this.u8_1},se(de).w8=function(){return Ce(this)},se(de).valueOf=function(){return this.w8()},se(de).equals=function(n){return n instanceof de&&xe(this,n)},se(de).hashCode=function(){return Me(),this.u8_1^this.v8_1},se(de).toString=function(){return je(this,10)},se(Au).toString=function(){return"Model(text="+this.o9_1+", tooltip="+this.p9_1+")"},se(Au).hashCode=function(){var n=ue(this.o9_1);return zn(n,31)+ue(this.p9_1)|0},se(Au).equals=function(n){if(this===n)return!0;if(!(n instanceof Au))return!1;var t=n instanceof Au?n:_e();return this.o9_1===t.o9_1&&this.p9_1===t.p9_1},se(Mu).v9=function(n,t){return this.w9(new Au(n,t))},se(Mu).w9=function(n){var t,r;return Df().y9(Jf((t=n,r=this,function(n){return n.s9(t.p9_1),n.t9("copy-button"),n.u9(function(n,t){return function(r){return n.q9_1(t.o9_1)}}(r,t)),lr()})),[])},se(Mu).z9=function(n){return this.w9(n instanceof Au?n:_e())},se(Mu).aa=function(n,t){return t},se(Mu).ba=function(n,t){var r=null==n||Qe(n)?n:_e();return this.aa(r,t instanceof Au?t:_e())},se(Du).ka=function(n){return function(n,t){for(var r=Ff(),i=t.ca_1,e=Nr(xt(i,10)),u=i.f();u.g();){var o,f,s=u.h();s instanceof pf?f=Ff().ga(s.fa_1):s instanceof mf?f=Fu(n,s.da_1,s.ea_1):le(),o=f,e.d(o)}return r.ha(e)}(this,n)},se(Du).z9=function(n){return this.ka(n instanceof Cf?n:_e())},se(Du).la=function(n,t){return t},se(Du).ba=function(n,t){var r=null==n||Qe(n)?n:_e();return this.la(r,t instanceof Cf?t:_e())},se(Ou).pa=function(n,t,r){return new Ou(n,t,r)},se(Ou).qa=function(n,t,r,i){return n=n===A?this.ma_1:n,t=t===A?this.na_1:t,r=r===A?this.oa_1:r,i===A?this.pa(n,t,r):i.pa.call(this,n,t,r)},se(Ou).toString=function(){return"Exception(summary="+this.ma_1+", fullText="+this.na_1+", parts="+this.oa_1+")"},se(Ou).hashCode=function(){var n=null==this.ma_1?0:this.ma_1.hashCode();return n=zn(n,31)+ue(this.na_1)|0,zn(n,31)+ee(this.oa_1)|0},se(Ou).equals=function(n){if(this===n)return!0;if(!(n instanceof Ou))return!1;var t=n instanceof Ou?n:_e();return!!oe(this.ma_1,t.ma_1)&&this.na_1===t.na_1&&!!oe(this.oa_1,t.oa_1)},se(Ru).ta=function(n,t){return new Ru(n,t)},se(Ru).ua=function(n,t,r){return n=n===A?this.ra_1:n,t=t===A?this.sa_1:t,r===A?this.ta(n,t):r.ta.call(this,n,t)},se(Ru).toString=function(){return"StackTracePart(lines="+this.ra_1+", state="+this.sa_1+")"},se(Ru).hashCode=function(){var n=ee(this.ra_1);return zn(n,31)+(null==this.sa_1?0:this.sa_1.hashCode())|0},se(Ru).equals=function(n){if(this===n)return!0;if(!(n instanceof Ru))return!1;var t=n instanceof Ru?n:_e();return!!oe(this.ra_1,t.ra_1)&&!!oe(this.sa_1,t.sa_1)},se(Hu).toString=function(){return"Error(label="+this.va_1+", docLink="+this.wa_1+")"},se(Hu).hashCode=function(){var n=ee(this.va_1);return zn(n,31)+(null==this.wa_1?0:ee(this.wa_1))|0},se(Hu).equals=function(n){if(this===n)return!0;if(!(n instanceof Hu))return!1;var t=n instanceof Hu?n:_e();return!!oe(this.va_1,t.va_1)&&!!oe(this.wa_1,t.wa_1)},se($u).toString=function(){return"Warning(label="+this.xa_1+", docLink="+this.ya_1+")"},se($u).hashCode=function(){var n=ee(this.xa_1);return zn(n,31)+(null==this.ya_1?0:ee(this.ya_1))|0},se($u).equals=function(n){if(this===n)return!0;if(!(n instanceof $u))return!1;var t=n instanceof $u?n:_e();return!!oe(this.xa_1,t.xa_1)&&!!oe(this.ya_1,t.ya_1)},se(Gu).toString=function(){return"Message(prettyText="+this.za_1+")"},se(Gu).hashCode=function(){return this.za_1.hashCode()},se(Gu).equals=function(n){if(this===n)return!0;if(!(n instanceof Gu))return!1;var t=n instanceof Gu?n:_e();return!!this.za_1.equals(t.za_1)},se(Uu).toString=function(){return"ListElement(prettyText="+this.ab_1+")"},se(Uu).hashCode=function(){return this.ab_1.hashCode()},se(Uu).equals=function(n){if(this===n)return!0;if(!(n instanceof Uu))return!1;var t=n instanceof Uu?n:_e();return!!this.ab_1.equals(t.ab_1)},se(Vu).toString=function(){return"TreeNode(prettyText="+this.bb_1+")"},se(Vu).hashCode=function(){return this.bb_1.hashCode()},se(Vu).equals=function(n){if(this===n)return!0;if(!(n instanceof Vu))return!1;var t=n instanceof Vu?n:_e();return!!this.bb_1.equals(t.bb_1)},se(Qu).toString=function(){return"Link(href="+this.cb_1+", label="+this.db_1+")"},se(Qu).hashCode=function(){var n=ue(this.cb_1);return zn(n,31)+ue(this.db_1)|0},se(Qu).equals=function(n){if(this===n)return!0;if(!(n instanceof Qu))return!1;var t=n instanceof Qu?n:_e();return this.cb_1===t.cb_1&&this.db_1===t.db_1},se(Zu).toString=function(){return"Label(text="+this.eb_1+")"},se(Zu).hashCode=function(){return ue(this.eb_1)},se(Zu).equals=function(n){if(this===n)return!0;if(!(n instanceof Zu))return!1;var t=n instanceof Zu?n:_e();return this.eb_1===t.eb_1},se(io).toString=function(){return"Info(label="+this.hb_1+", docLink="+this.ib_1+")"},se(io).hashCode=function(){var n=ee(this.hb_1);return zn(n,31)+(null==this.ib_1?0:ee(this.ib_1))|0},se(io).equals=function(n){if(this===n)return!0;if(!(n instanceof io))return!1;var t=n instanceof io?n:_e();return!!oe(this.hb_1,t.hb_1)&&!!oe(this.ib_1,t.ib_1)},se(eo).toString=function(){return"Project(path="+this.jb_1+")"},se(eo).hashCode=function(){return ue(this.jb_1)},se(eo).equals=function(n){if(this===n)return!0;if(!(n instanceof eo))return!1;var t=n instanceof eo?n:_e();return this.jb_1===t.jb_1},se(uo).toString=function(){return"Task(path="+this.kb_1+", type="+this.lb_1+")"},se(uo).hashCode=function(){var n=ue(this.kb_1);return zn(n,31)+ue(this.lb_1)|0},se(uo).equals=function(n){if(this===n)return!0;if(!(n instanceof uo))return!1;var t=n instanceof uo?n:_e();return this.kb_1===t.kb_1&&this.lb_1===t.lb_1},se(oo).toString=function(){return"TaskPath(path="+this.mb_1+")"},se(oo).hashCode=function(){return ue(this.mb_1)},se(oo).equals=function(n){if(this===n)return!0;if(!(n instanceof oo))return!1;var t=n instanceof oo?n:_e();return this.mb_1===t.mb_1},se(fo).toString=function(){return"Bean(type="+this.nb_1+")"},se(fo).hashCode=function(){return ue(this.nb_1)},se(fo).equals=function(n){if(this===n)return!0;if(!(n instanceof fo))return!1;var t=n instanceof fo?n:_e();return this.nb_1===t.nb_1},se(so).toString=function(){return"SystemProperty(name="+this.ob_1+")"},se(so).hashCode=function(){return ue(this.ob_1)},se(so).equals=function(n){if(this===n)return!0;if(!(n instanceof so))return!1;var t=n instanceof so?n:_e();return this.ob_1===t.ob_1},se(co).toString=function(){return"Property(kind="+this.pb_1+", name="+this.qb_1+", owner="+this.rb_1+")"},se(co).hashCode=function(){var n=ue(this.pb_1);return n=zn(n,31)+ue(this.qb_1)|0,zn(n,31)+ue(this.rb_1)|0},se(co).equals=function(n){if(this===n)return!0;if(!(n instanceof co))return!1;var t=n instanceof co?n:_e();return this.pb_1===t.pb_1&&this.qb_1===t.qb_1&&this.rb_1===t.rb_1},se(ao).toString=function(){return"BuildLogic(location="+this.sb_1+")"},se(ao).hashCode=function(){return ue(this.sb_1)},se(ao).equals=function(n){if(this===n)return!0;if(!(n instanceof ao))return!1;var t=n instanceof ao?n:_e();return this.sb_1===t.sb_1},se(ho).toString=function(){return"BuildLogicClass(type="+this.tb_1+")"},se(ho).hashCode=function(){return ue(this.tb_1)},se(ho).equals=function(n){if(this===n)return!0;if(!(n instanceof ho))return!1;var t=n instanceof ho?n:_e();return this.tb_1===t.tb_1},se(vo).zb=function(){return this.yb_1},se(vo).toString=function(){return"TaskTreeIntent(delegate="+this.yb_1+")"},se(vo).hashCode=function(){return ee(this.yb_1)},se(vo).equals=function(n){if(this===n)return!0;if(!(n instanceof vo))return!1;var t=n instanceof vo?n:_e();return!!oe(this.yb_1,t.yb_1)},se(go).zb=function(){return this.ac_1},se(go).toString=function(){return"MessageTreeIntent(delegate="+this.ac_1+")"},se(go).hashCode=function(){return ee(this.ac_1)},se(go).equals=function(n){if(this===n)return!0;if(!(n instanceof go))return!1;var t=n instanceof go?n:_e();return!!oe(this.ac_1,t.ac_1)},se(wo).zb=function(){return this.bc_1},se(wo).toString=function(){return"InputTreeIntent(delegate="+this.bc_1+")"},se(wo).hashCode=function(){return ee(this.bc_1)},se(wo).equals=function(n){if(this===n)return!0;if(!(n instanceof wo))return!1;var t=n instanceof wo?n:_e();return!!oe(this.bc_1,t.bc_1)},se(bo).zb=function(){return this.cc_1},se(bo).toString=function(){return"IncompatibleTaskTreeIntent(delegate="+this.cc_1+")"},se(bo).hashCode=function(){return ee(this.cc_1)},se(bo).equals=function(n){if(this===n)return!0;if(!(n instanceof bo))return!1;var t=n instanceof bo?n:_e();return!!oe(this.cc_1,t.cc_1)},se(po).toString=function(){return"SetTab(tab="+this.dc_1+")"},se(po).hashCode=function(){return this.dc_1.hashCode()},se(po).equals=function(n){if(this===n)return!0;if(!(n instanceof po))return!1;var t=n instanceof po?n:_e();return!!this.dc_1.equals(t.dc_1)},se(mo).mc=function(n,t,r,i,e,u,o,f){return new mo(n,t,r,i,e,u,o,f)},se(mo).nc=function(n,t,r,i,e,u,o,f,s){return n=n===A?this.ec_1:n,t=t===A?this.fc_1:t,r=r===A?this.gc_1:r,i=i===A?this.hc_1:i,e=e===A?this.ic_1:e,u=u===A?this.jc_1:u,o=o===A?this.kc_1:o,f=f===A?this.lc_1:f,s===A?this.mc(n,t,r,i,e,u,o,f):s.mc.call(this,n,t,r,i,e,u,o,f)},se(mo).toString=function(){return"Model(heading="+this.ec_1+", summary="+this.fc_1+", learnMore="+this.gc_1+", messageTree="+this.hc_1+", locationTree="+this.ic_1+", inputTree="+this.jc_1+", incompatibleTaskTree="+this.kc_1+", tab="+this.lc_1+")"},se(mo).hashCode=function(){var n=this.ec_1.hashCode();return n=zn(n,31)+ee(this.fc_1)|0,n=zn(n,31)+this.gc_1.hashCode()|0,n=zn(n,31)+this.hc_1.hashCode()|0,n=zn(n,31)+this.ic_1.hashCode()|0,n=zn(n,31)+this.jc_1.hashCode()|0,n=zn(n,31)+this.kc_1.hashCode()|0,zn(n,31)+this.lc_1.hashCode()|0},se(mo).equals=function(n){if(this===n)return!0;if(!(n instanceof mo))return!1;var t=n instanceof mo?n:_e();return!!(this.ec_1.equals(t.ec_1)&&oe(this.fc_1,t.fc_1)&&this.gc_1.equals(t.gc_1)&&this.hc_1.equals(t.hc_1)&&this.ic_1.equals(t.ic_1)&&this.jc_1.equals(t.jc_1)&&this.kc_1.equals(t.kc_1)&&this.lc_1.equals(t.lc_1))},se(Uo).gd=function(n,t){var r,i;return n instanceof vo?r=t.nc(A,A,A,A,_s().id(n.yb_1,t.ic_1)):n instanceof go?r=t.nc(A,A,A,_s().id(n.ac_1,t.hc_1)):n instanceof wo?r=t.nc(A,A,A,A,A,_s().id(n.bc_1,t.jc_1)):n instanceof bo?r=t.nc(A,A,A,A,A,A,_s().id(n.cc_1,t.kc_1)):n instanceof qc?r=function(n,t,r,i){var e;return r instanceof go?e=n.nc(A,A,A,mc(n.hc_1,r,i)):r instanceof vo?e=n.nc(A,A,A,A,mc(n.ic_1,r,i)):r instanceof wo?e=n.nc(A,A,A,A,A,mc(n.jc_1,r,i)):r instanceof bo?e=n.nc(A,A,A,A,A,A,mc(n.kc_1,r,i)):(console.error("Unhandled tree intent: "+r),e=n),e}(t,0,n.xc_1,(i=n,function(n){var t;if(!(n instanceof Ou))throw fu(ie("Failed requirement."));for(var r=n.oa_1,e=i.wc_1,u=Nr(xt(r,10)),o=0,f=r.f();f.g();){var s,c,a=f.h(),h=o;if(o=h+1|0,e===wr(h)){var l=a.sa_1;c=a.ua(A,null==l?null:l.ad())}else c=a;s=c,u.d(s)}return t=u,n.qa(A,A,t)})):n instanceof kc?(window.navigator.clipboard.writeText(n.hd_1),r=t):n instanceof po?r=t.nc(A,A,A,A,A,A,A,n.dc_1):(console.error("Unhandled intent: "+n),r=t),r},se(Uo).ba=function(n,t){var r=n instanceof Bc?n:_e();return this.gd(r,t instanceof mo?t:_e())},se(Uo).jd=function(n){return Af().y9(Jf(To),[qo(0,n),Bo(0,n)])},se(Uo).z9=function(n){return this.jd(n instanceof mo?n:_e())},se(Zo).toString=function(){return"ImportedProblem(problem="+this.kd_1+", message="+this.ld_1+", trace="+this.md_1+")"},se(Zo).hashCode=function(){var n=ee(this.kd_1);return n=zn(n,31)+this.ld_1.hashCode()|0,zn(n,31)+ee(this.md_1)|0},se(Zo).equals=function(n){if(this===n)return!0;if(!(n instanceof Zo))return!1;var t=n instanceof Zo?n:_e();return!!oe(this.kd_1,t.kd_1)&&!!this.ld_1.equals(t.ld_1)&&!!oe(this.md_1,t.md_1)},se(ff).ud=function(n,t){return this.td_1(n,t)},se(ff).compare=function(n,t){return this.ud(n,t)},se(bf).toString=function(){return"LearnMore(text="+this.sc_1+", documentationLink="+this.tc_1+")"},se(bf).hashCode=function(){var n=ue(this.sc_1);return zn(n,31)+ue(this.tc_1)|0},se(bf).equals=function(n){if(this===n)return!0;if(!(n instanceof bf))return!1;var t=n instanceof bf?n:_e();return this.sc_1===t.sc_1&&this.tc_1===t.tc_1},se(pf).toString=function(){return"Text(text="+this.fa_1+")"},se(pf).hashCode=function(){return ue(this.fa_1)},se(pf).equals=function(n){if(this===n)return!0;if(!(n instanceof pf))return!1;var t=n instanceof pf?n:_e();return this.fa_1===t.fa_1},se(mf).toString=function(){return"Reference(name="+this.da_1+", clipboardString="+this.ea_1+")"},se(mf).hashCode=function(){var n=ue(this.da_1);return zn(n,31)+ue(this.ea_1)|0},se(mf).equals=function(n){if(this===n)return!0;if(!(n instanceof mf))return!1;var t=n instanceof mf?n:_e();return this.da_1===t.da_1&&this.ea_1===t.ea_1},se(yf).ed=function(n){return this.dd_1.d(new pf(n)),this},se(yf).xd=function(n,t){return this.dd_1.d(new mf(n,t)),this},se(yf).fd=function(n,t,r){return t=t===A?n:t,r===A?this.xd(n,t):r.xd.call(this,n,t)},se(yf).j5=function(){return new Cf(Rn(this.dd_1))},se(qf).rd=function(n){return new Cf(gr(new pf(n)))},se(qf).qd=function(n){var t=new yf;return n(t),t.j5()},se(Cf).vd=function(n){return new Cf(n)},se(Cf).toString=function(){return"PrettyText(fragments="+this.ca_1+")"},se(Cf).hashCode=function(){return ee(this.ca_1)},se(Cf).equals=function(n){if(this===n)return!0;if(!(n instanceof Cf))return!1;var t=n instanceof Cf?n:_e();return!!oe(this.ca_1,t.ca_1)},se(xf).sd=function(n){return function(n){for(var t=Gr(),r=n.f();r.g();)for(var i=t,e=r.h().f();e.g();){var u,o=e.h(),f=i,s=f.v1(o);if(null==s){var c=Gr();f.h5(o,c),u=c}else u=s;i=u instanceof Vr?u:_e()}return t}(n)},se(Sf).toString=function(){return"Trie(nestedMaps="+this.wd_1+")"},se(Sf).hashCode=function(){return ee(this.wd_1)},se(Sf).equals=function(n){return function(n,t){return t instanceof Sf&&!!oe(n,t instanceof Sf?t.wd_1:_e())}(this.wd_1,n)},se(Uf).ga=function(n){return Qf().yd(this.x9_1,A,n)},se(Uf).ha=function(n){return Qf().yd(this.x9_1,A,A,n)},se(Uf).ja=function(n){return Qf().yd(this.x9_1,A,A,nu(n))},se(Uf).y9=function(n,t){return Qf().yd(this.x9_1,n,A,nu(t))},se(Uf).zd=function(n,t){return Qf().yd(this.x9_1,n,A,t)},se(Uf).fb=function(n,t){return Qf().yd(this.x9_1,n,t)},se(Uf).rc=function(n,t){return Qf().yd(this.x9_1,A,n,nu(t))},se(Uf).toString=function(){return"ViewFactory(elementName="+this.x9_1+")"},se(Uf).hashCode=function(){return ue(this.x9_1)},se(Uf).equals=function(n){if(this===n)return!0;if(!(n instanceof Uf))return!1;var t=n instanceof Uf?n:_e();return this.x9_1===t.x9_1},se(Vf).ae=function(n,t,r,i){return new Wf(n,t,r,i)},se(Vf).yd=function(n,t,r,i,e){return t=t===A?pt():t,r=r===A?null:r,i=i===A?pt():i,e===A?this.ae(n,t,r,i):e.ae.call(this,n,t,r,i)},se(Wf).toString=function(){return"Element(elementName="+this.be_1+", attributes="+this.ce_1+", innerText="+this.de_1+", children="+this.ee_1+")"},se(Wf).hashCode=function(){var n=ue(this.be_1);return n=zn(n,31)+ee(this.ce_1)|0,n=zn(n,31)+(null==this.de_1?0:ue(this.de_1))|0,zn(n,31)+ee(this.ee_1)|0},se(Wf).equals=function(n){if(this===n)return!0;if(!(n instanceof Wf))return!1;var t=n instanceof Wf?n:_e();return this.be_1===t.be_1&&!!oe(this.ce_1,t.ce_1)&&this.de_1==t.de_1&&!!oe(this.ee_1,t.ee_1)},se(ns).u9=function(n){return this.r9_1(new ts("click",n))},se(ns).t9=function(n){return this.r9_1(new rs(n))},se(ns).gb=function(n){for(var t=0,r=n.length;t<r;){var i=n[t];t=t+1|0,this.r9_1(new rs(i))}return lr()},se(ns).s9=function(n){return this.r9_1(new is("title",n))},se(ns).bd=function(n){return this.r9_1(new is("href",n))},se(ss).oe=function(){return this.ne_1},se(ss).toString=function(){return"Toggle(focus="+this.ne_1+")"},se(ss).hashCode=function(){return ee(this.ne_1)},se(ss).equals=function(n){if(this===n)return!0;if(!(n instanceof ss))return!1;var t=n instanceof ss?n:_e();return!!oe(this.ne_1,t.ne_1)},se(cs).pe=function(n,t){return this.re(n.qe((r=t,function(n){return n.me(r(n.ub_1))})));var r},se(cs).re=function(n){return new cs(n)},se(cs).toString=function(){return"Model(tree="+this.xb_1+")"},se(cs).hashCode=function(){return this.xb_1.hashCode()},se(cs).equals=function(n){if(this===n)return!0;if(!(n instanceof cs))return!1;var t=n instanceof cs?n:_e();return!!this.xb_1.equals(t.xb_1)},se(ls).id=function(n,t){var r;if(n instanceof ss){var i=n.oe();r=t.re(i.qe(hs))}else le();return r},se(ds).cd=function(){return this.ve_1},se(ds).we=function(){return 0},se(ds).qe=function(n){return n(this.ve_1)},se(ds).toString=function(){return"Original(tree="+this.ve_1+")"},se(ds).hashCode=function(){return this.ve_1.hashCode()},se(ds).equals=function(n){if(this===n)return!0;if(!(n instanceof ds))return!1;var t=n instanceof ds?n:_e();return!!this.ve_1.equals(t.ve_1)},se(gs).cd=function(){return this.ue_1},se(gs).we=function(){return this.se_1.we()+1|0},se(gs).qe=function(n){return this.se_1.qe((t=this,r=n,function(n){for(var i,e=n.vb_1,u=t.te_1,o=Nr(xt(e,10)),f=0,s=e.f();s.g();){var c,a=s.h(),h=f;f=h+1|0,c=u===wr(h)?r(a):a,o.d(c)}return i=o,n.me(A,i)}));var t,r},se(gs).toString=function(){return"Child(parent="+this.se_1+", index="+this.te_1+", tree="+this.ue_1+")"},se(gs).hashCode=function(){var n=ee(this.se_1);return n=zn(n,31)+this.te_1|0,zn(n,31)+this.ue_1.hashCode()|0},se(gs).equals=function(n){if(this===n)return!0;if(!(n instanceof gs))return!1;var t=n instanceof gs?n:_e();return!!oe(this.se_1,t.se_1)&&this.te_1===t.te_1&&!!this.ue_1.equals(t.ue_1)},se(ws).ad=function(){var n;switch(this.q8_1){case 0:n=ms();break;case 1:n=ps();break;default:le()}return n},se(bs).vc=function(){var n,t;return Jn(On(Oe(0,this.cd().vb_1.k()-1|0)),(n=this,(t=function(t){return n.xe(t)}).callableName="child",t))},se(bs).xe=function(n){return new gs(this,n,this.cd().vb_1.j(n))},se(ks).uc=function(){return new ds(this)},se(ks).ye=function(){return!this.vb_1.i()},se(ks).ze=function(n,t,r){return new ks(n,t,r)},se(ks).me=function(n,t,r,i){return n=n===A?this.ub_1:n,t=t===A?this.vb_1:t,r=r===A?this.wb_1:r,i===A?this.ze(n,t,r):i.ze.call(this,n,t,r)},se(ks).toString=function(){return"Tree(label="+this.ub_1+", children="+this.vb_1+", state="+this.wb_1+")"},se(ks).hashCode=function(){var n=null==this.ub_1?0:ee(this.ub_1);return n=zn(n,31)+ee(this.vb_1)|0,zn(n,31)+this.wb_1.hashCode()|0},se(ks).equals=function(n){if(this===n)return!0;if(!(n instanceof ks))return!1;var t=n instanceof ks?n:_e();return!!oe(this.ub_1,t.ub_1)&&!!oe(this.vb_1,t.vb_1)&&!!this.wb_1.equals(t.wb_1)},se(Cs).toString=function(){return"ProblemIdElement(name="+this.df_1+", displayName="+this.ef_1+")"},se(Cs).hashCode=function(){var n=ue(this.df_1);return zn(n,31)+ue(this.ef_1)|0},se(Cs).equals=function(n){if(this===n)return!0;if(!(n instanceof Cs))return!1;var t=n instanceof Cs?n:_e();return this.df_1===t.df_1&&this.ef_1===t.ef_1},se(xs).toString=function(){return"ProblemSummary(problemId="+this.ff_1+", count="+this.gf_1+")"},se(xs).hashCode=function(){var n=ee(this.ff_1);return zn(n,31)+this.gf_1|0},se(xs).equals=function(n){if(this===n)return!0;if(!(n instanceof xs))return!1;var t=n instanceof xs?n:_e();return!!oe(this.ff_1,t.ff_1)&&this.gf_1===t.gf_1},se(Is).toString=function(){return"ProblemNodeGroup(tree="+this.hf_1+", children="+this.if_1+", childGroups="+this.jf_1+", id="+this.kf_1+")"},se(Is).hashCode=function(){var n=this.hf_1.hashCode();return n=zn(n,31)+ee(this.if_1)|0,n=zn(n,31)+ee(this.jf_1)|0,zn(n,31)+this.kf_1|0},se(Is).equals=function(n){if(this===n)return!0;if(!(n instanceof Is))return!1;var t=n instanceof Is?n:_e();return!!this.hf_1.equals(t.hf_1)&&!!oe(this.if_1,t.if_1)&&!!oe(this.jf_1,t.jf_1)&&this.kf_1===t.kf_1},se(Us).toString=function(){return"Text(text="+this.lf_1+")"},se(Us).hashCode=function(){return ue(this.lf_1)},se(Us).equals=function(n){if(this===n)return!0;if(!(n instanceof Us))return!1;var t=n instanceof Us?n:_e();return this.lf_1===t.lf_1},se(Vs).toString=function(){return"ProblemIdNode(prettyText="+this.mf_1+", separator="+this.nf_1+")"},se(Vs).hashCode=function(){var n=this.mf_1.hashCode();return zn(n,31)+(0|this.nf_1)|0},se(Vs).equals=function(n){if(this===n)return!0;if(!(n instanceof Vs))return!1;var t=n instanceof Vs?n:_e();return!!this.mf_1.equals(t.mf_1)&&this.nf_1===t.nf_1},se(Qs).toString=function(){return"Advice(label="+this.of_1+", docLink="+this.pf_1+")"},se(Qs).hashCode=function(){var n=ee(this.of_1);return zn(n,31)+(null==this.pf_1?0:ee(this.pf_1))|0},se(Qs).equals=function(n){if(this===n)return!0;if(!(n instanceof Qs))return!1;var t=n instanceof Qs?n:_e();return!!oe(this.of_1,t.of_1)&&!!oe(this.pf_1,t.pf_1)},se(Ys).zb=function(){return this.qf_1},se(Ys).toString=function(){return"MessageTreeIntent(delegate="+this.qf_1+")"},se(Ys).hashCode=function(){return ee(this.qf_1)},se(Ys).equals=function(n){if(this===n)return!0;if(!(n instanceof Ys))return!1;var t=n instanceof Ys?n:_e();return!!oe(this.qf_1,t.qf_1)},se(Ws).zb=function(){return this.rf_1},se(Ws).toString=function(){return"ProblemIdTreeIntent(delegate="+this.rf_1+")"},se(Ws).hashCode=function(){return ee(this.rf_1)},se(Ws).equals=function(n){if(this===n)return!0;if(!(n instanceof Ws))return!1;var t=n instanceof Ws?n:_e();return!!oe(this.rf_1,t.rf_1)},se(Ks).zb=function(){return this.sf_1},se(Ks).toString=function(){return"FileLocationTreeIntent(delegate="+this.sf_1+")"},se(Ks).hashCode=function(){return ee(this.sf_1)},se(Ks).equals=function(n){if(this===n)return!0;if(!(n instanceof Ks))return!1;var t=n instanceof Ks?n:_e();return!!oe(this.sf_1,t.sf_1)},se(Xs).toString=function(){return"SetTab(tab="+this.tf_1+")"},se(Xs).hashCode=function(){return this.tf_1.hashCode()},se(Xs).equals=function(n){if(this===n)return!0;if(!(n instanceof Xs))return!1;var t=n instanceof Xs?n:_e();return!!this.tf_1.equals(t.tf_1)},se(Js).cg=function(n,t,r,i,e,u,o,f){return new Js(n,t,r,i,e,u,o,f)},se(Js).dg=function(n,t,r,i,e,u,o,f,s){return n=n===A?this.uf_1:n,t=t===A?this.vf_1:t,r=r===A?this.wf_1:r,i=i===A?this.xf_1:i,e=e===A?this.yf_1:e,u=u===A?this.zf_1:u,o=o===A?this.ag_1:o,f=f===A?this.bg_1:f,s===A?this.cg(n,t,r,i,e,u,o,f):s.cg.call(this,n,t,r,i,e,u,o,f)},se(Js).toString=function(){return"Model(heading="+this.uf_1+", summary="+this.vf_1+", learnMore="+this.wf_1+", messageTree="+this.xf_1+", problemIdTree="+this.yf_1+", fileLocationTree="+this.zf_1+", problemCount="+this.ag_1+", tab="+this.bg_1+")"},se(Js).hashCode=function(){var n=this.uf_1.hashCode();return n=zn(n,31)+ee(this.vf_1)|0,n=zn(n,31)+this.wf_1.hashCode()|0,n=zn(n,31)+this.xf_1.hashCode()|0,n=zn(n,31)+this.yf_1.hashCode()|0,n=zn(n,31)+this.zf_1.hashCode()|0,n=zn(n,31)+this.ag_1|0,zn(n,31)+this.bg_1.hashCode()|0},se(Js).equals=function(n){if(this===n)return!0;if(!(n instanceof Js))return!1;var t=n instanceof Js?n:_e();return!!(this.uf_1.equals(t.uf_1)&&oe(this.vf_1,t.vf_1)&&this.wf_1.equals(t.wf_1)&&this.xf_1.equals(t.xf_1)&&this.yf_1.equals(t.yf_1)&&this.zf_1.equals(t.zf_1)&&this.ag_1===t.ag_1&&this.bg_1.equals(t.bg_1))},se(bc).eg=function(n,t){var r,i;return n instanceof Ks?r=t.dg(A,A,A,A,A,_s().id(n.sf_1,t.zf_1)):n instanceof Ws?r=t.dg(A,A,A,A,_s().id(n.rf_1,t.yf_1)):n instanceof Ys?r=t.dg(A,A,A,_s().id(n.qf_1,t.xf_1)):n instanceof qc?r=function(n,t,r,i){var e;return r instanceof Ys?e=n.dg(A,A,A,mc(n.xf_1,r,i)):r instanceof Ws?e=n.dg(A,A,A,A,mc(n.yf_1,r,i)):r instanceof Ks?e=n.dg(A,A,A,A,A,mc(n.zf_1,r,i)):(console.error("Unhandled tree intent: "+r),e=n),e}(t,0,n.xc_1,(i=n,function(n){var t;if(!(n instanceof Ou))throw fu(ie("Failed requirement."));for(var r=n.oa_1,e=i.wc_1,u=Nr(xt(r,10)),o=0,f=r.f();f.g();){var s,c,a=f.h(),h=o;if(o=h+1|0,e===wr(h)){var l=a.sa_1;c=a.ua(A,null==l?null:l.ad())}else c=a;s=c,u.d(s)}return t=u,n.qa(A,A,t)})):n instanceof kc?(window.navigator.clipboard.writeText(n.hd_1),r=t):n instanceof Xs?r=t.dg(A,A,A,A,A,A,A,n.tf_1):(console.error("Unhandled intent: "+n),r=t),r},se(bc).ba=function(n,t){var r=n instanceof Bc?n:_e();return this.eg(r,t instanceof Js?t:_e())},se(bc).fg=function(n){return Af().y9(Jf(ac),[tc(0,n),rc(0,n)])},se(bc).z9=function(n){return this.fg(n instanceof Js?n:_e())},se(kc).toString=function(){return"Copy(text="+this.hd_1+")"},se(kc).hashCode=function(){return ue(this.hd_1)},se(kc).equals=function(n){if(this===n)return!0;if(!(n instanceof kc))return!1;var t=n instanceof kc?n:_e();return this.hd_1===t.hd_1},se(qc).toString=function(){return"ToggleStackTracePart(partIndex="+this.wc_1+", location="+this.xc_1+")"},se(qc).hashCode=function(){var n=this.wc_1;return zn(n,31)+ee(this.xc_1)|0},se(qc).equals=function(n){if(this===n)return!0;if(!(n instanceof qc))return!1;var t=n instanceof qc?n:_e();return this.wc_1===t.wc_1&&!!oe(this.xc_1,t.xc_1)},se(Jr).k6=function(){var n=Object.create(null);return n.foo=1,delete n.foo,lr(),n},l=null,wn=0,function(){var n=configurationCacheProblems();if(null==n.problemsReport)zf(Ef("report"),Vo(),function(n){var t,r,i,e,u,o,f,s,c,a,h=function(n){for(var t=Lr(),r=Lr(),i=Lr(),e=0,u=n.length;e<u;){var o=n[e];e=e+1|0;var f,s=o.input,c=null==s?null:r.d(Wo(s,o));if(null==c){var a=o.incompatibleTask;f=null==a?null:i.d(Wo(a,o))}else f=c;if(null==f){var h=he(o.problem);t.d(Wo(h,o))}}return new Yo(t,r,i)}(n.diagnostics),l=n.totalProblemCount;return new mo((f=(t=n).buildName,s=t.requestedTasks,c=null==s?null:Wt(s," ",A,r=r!==A&&r)>=0,a=null==c||c,Bf().qd((i=t,e=f,u=s,o=a,function(n){n.ed(function(n){var t;if(Wi(n)>0){var r,i=Zi(n,0);r=function(n){return 97<=n&&n<=122||!(ji(n,128)<0)&&function(n){var t;return t=1===function(n){var t=n,r=ru(eu().h9_1,t),i=eu().h9_1[r],e=(i+eu().i9_1[r]|0)-1|0,u=eu().j9_1[r];if(t>e)return 0;var o=3&u;if(0===o){var f=2,s=i,c=0;if(c<=1)do{if(c=c+1|0,(s=s+(u>>f&127)|0)>t)return 3;if((s=s+(u>>(f=f+7|0)&127)|0)>t)return 0;f=f+7|0}while(c<=1);return 3}if(u<=7)return o;var a=t-i|0;return u>>zn(2,u<=31?a%2|0:a)&3}(n)||function(n){var t=ru(ou().k9_1,n);return t>=0&&n<(ou().k9_1[t]+ou().l9_1[t]|0)}(n),t}(n)}(i)?function(n){return function(n){var t=Pi(n).toUpperCase();if(t.length>1){var r;if(329===n)r=t;else{var i=Zi(t,0),e=t.substring(1).toLowerCase();r=Pi(i)+e}return r}return Pi(function(n){return function(n){var t=n;return 452<=t&&t<=460||497<=t&&t<=499?De(zn(3,(t+1|0)/3|0)):4304<=t&&t<=4346||4349<=t&&t<=4351?n:mi(n)}(n)}(n))}(n)}(i):Pi(i),t=ie(r)+n.substring(1)}else t=n;return t}(i.cacheAction)+" the configuration cache for ");var t=e;null==t||n.fd(t),null==e||n.ed(" build and ");var r=u;return null==(null==r?null:n.fd(r))&&n.ed("default"),n.ed(o?" tasks":" task"),lr()}))),function(n,t){var r=n.cacheActionDescription,i=null==r?null:vf(r),e=Bf().rd(function(n){var t=n.od_1.k(),r=df(t,"build configuration input");return t>0?r+" and will cause the cache to be discarded when "+(t<=1?"its":"their")+" value change":r}(t)),u=Bf().rd(function(n,t){var r=n.totalProblemCount,i=t.nd_1.k(),e=df(r,"problem");return r>i?e+", only the first "+i+" "+wf(i)+" included in this report":e}(n,t));return function(n,t){for(var r=0,i=n.length;r<i;){var e=n[r];r=r+1|0,null!=e&&t.d(e)}return t}([i,e,u],Lr())}(n,h),new bf("Gradle Configuration Cache",n.documentationLink),uf(new Zu(Ho().qc_1),Jn(On(h.nd_1),af)),uf(new Zu($o().qc_1),function(n){return Jn(On(n),hf)}(h.nd_1)),uf(new Zu(Ro().qc_1),Jn(On(h.od_1),sf)),uf(new Zu(Go().qc_1),Jn(On(h.pd_1),cf)),0===l?Ro():Ho())}(n));else{var t=n.problemsReport;zf(Ef("report"),pc(),function(n,t){for(var r=n.summaries,i=Nr(r.length),e=0,u=r.length;e<u;){var o,f=r[e];e=e+1|0;for(var s=f.problemId,c=Nr(s.length),a=0,h=s.length;a<h;){var l,_=s[a];a=a+1|0,l=new Cs(_.name,_.displayName),c.d(l)}o=new xs(c,f.count),i.d(o)}for(var v=i,d=function(n,t){for(var r=oi(),i=0,e=n.length;i<e;){var u=n[i];i=i+1|0;var o,f=Ln(u.problemId,":",A,A,A,A,Ds),s=r.v1(f);if(null==s){var c=Lr();r.h5(f,c),o=c}else o=s;o.d(u)}for(var a=r.o(),h=Nr(xt(a,10)),l=a.f();l.g();){for(var _,v=l.h(),d=v.i1(),g=Nr(xt(d,10)),w=d.f();w.g();){var b;b=Es(w.h(),null,!0),g.d(b)}var p,m=Hn(g),k=Dn(v.i1()),y=Ls(k,new Gu(Ns(Ts(k)).ed(" ("+v.i1().k()+")").j5()));n:{for(var q=t.f();q.g();){var B=q.h();if(zs(B.ff_1,k.problemId)){p=B;break n}}p=null}var C=p;null==C||m.d(js(C.gf_1)),_=new ks(y,m),h.d(_)}var x=h;return new cs(new ks(new Us("message tree root"),x))}(t,v),g=function(n,t){for(var r=function(){var n=Lr();return new Is(new ks(new Vs(Bf().rd("Ungrouped"),!0),n),n,oi())}(),i=oi(),e=0,u=n.length;e<u;){var o=n[e];e=e+1|0;for(var f=$n(Tn(o.problemId,1)),s=Nr(xt(f,10)),c=f.f();c.g();){var a,h=c.h();a=new Cs(h.name,h.displayName),s.d(a)}var l=Ss(i,s),_=Es(o);null==l?r.if_1.d(_):l.if_1.d(_)}for(var v=Nr(xt(t,10)),d=t.f();d.g();){var g,w=d.h();g=new xs($n(Gn(w.ff_1,1)),w.gf_1),v.d(g)}for(var b=oi(),p=v.f();p.g();){var m,k=p.h(),y=k.ff_1,q=b.v1(y);if(null==q){var B=Lr();b.h5(y,B),m=B}else m=q;m.d(k)}for(var C=b.o(),x=Nr(xt(C,10)),j=C.f();j.g();){for(var P,I=j.h(),S=I.j1(),z=0,E=I.i1().f();E.g();)z=z+E.h().gf_1|0;P=new xs(S,z),x.d(P)}for(var T=x.f();T.g();){var L=T.h(),N=Ss(i,L.ff_1),A=null==N?null:N.if_1;null==A||A.d(js(L.gf_1))}for(var M=i.w1(),F=Nr(xt(M,10)),D=M.f();D.g();){var O;O=D.h().hf_1,F.d(O)}var R=function(n,t){var r=Nr(n.k());return r.m(n),r.d(t),r}(F,r.hf_1);return new cs(new ks(new Us("group tree root"),R))}(t,v),w=0,b=v.f();b.g();)w=w+b.h().gf_1|0;var p=function(n,t){for(var r=Lr(),i=oi(),e=0,u=n.length;e<u;){var o=n[e];e=e+1|0;var f=o.locations;if(null==f||0===f.length)r.d(Es(o));else{var s,c=o.locations;if(null==c)s=null;else{for(var a=Lr(),h=Ri(c);h.g();){var l=h.h();null!=l.path&&a.d(l)}s=a}if(null==s);else for(var _=s.f();_.g();){var v=_.h();Ps(i,he(v.path),o,v)}var d,g=o.locations;if(null==g)d=null;else{for(var w=Lr(),b=Ri(g);b.g();){var p=b.h();null!=p.pluginId&&w.d(p)}d=w}if(null==d);else for(var m=d.f();m.g();){var k=m.h();Ps(i,he(k.pluginId),o,k)}var y,q=o.locations;if(null==q)y=null;else{for(var B=Lr(),C=Ri(q);C.g();){var x=C.h();null!=x.taskPath&&B.d(x)}y=B}if(null==y);else for(var j=y.f();j.g();){var P=j.h();Ps(i,he(P.taskPath),o,P)}}}var I=function(n,t,r){for(var i=n.w1(),e=Nr(xt(i,10)),u=i.f();u.g();){var o;o=u.h().t3_1,e.d(o)}var f=Hn(e);return t.i()||f.d(new ks(new Vs(Bf().rd("no location"),!0),t)),r>0&&f.d(js(r)),f}(i,r,t);return new cs(new ks(new Us("text"),I))}(t,w);return new Js(Bf().rd("Problems Report"),function(n,t){var r,i,e,u=n.description,o=null==u?null:gr(vf(u));return r=null==o?gr(Bf().qd((i=t,e=n,function(n){n.ed(i.length+" problems have been reported during the execution");var t=e.buildName;null==t||(n.ed(" of build "),n.fd(t));var r=e.requestedTasks;return null==r||(n.ed(" for the following tasks:"),n.fd(r),lr()),lr()}))):o,r}(n,t),new bf("reporting problems",n.documentationLink),d,g,p,t.length,function(n,t,r){return lo(r)>0?Gs():lo(n)>0?Hs():lo(t)>0?$s():Hs()}(d,g,p))}(t,n.diagnostics))}}(),n}(void 0===this["configuration-cache-report"]?{}:this["configuration-cache-report"])}}[70](),{}))));
+//# sourceMappingURL=configuration-cache-report.js.map
+                </script>
+
+</body>
+</html>
 
build/resources/main/application.yml (added)
+++ build/resources/main/application.yml
@@ -0,0 +1,89 @@
+server:
+  port: 9090
+  servlet:
+    context-path: '/'
+
+spring:
+  # \uc218\ub3d9 Bean\uc774 \uc790\ub3d9 Bean\uc744 \uc624\ubc84\ub77c\uc774\ub529\ud558\uac8c \uc124\uc815
+  main:
+    allow-bean-definition-overriding: true
+  # open-in-view(\ud639\uc740 Open-Session-In-View(OSIV))
+  # true(\uae30\ubcf8\uac12) : \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc751\ub2f5 \ub610\ub294 view\uac00 \ub80c\ub354\ub9c1\ub420 \ub54c\uae4c\uc9c0 \uc601\uc18d\uc131 \ucee8\ud14d\uc2a4\ud2b8 \uc720\uc9c0
+  # false : \ud2b8\ub79c\uc81d\uc158\uc774 \uc885\ub8cc\ub420 \ub54c \uc601\uc18d\uc131 \ucee8\ud14d\uc2a4\ud2b8 \uc885\ub8cc
+  jpa:
+    open-in-view: false
+  #Datasource Configuration
+  cms:
+    datasource:
+      driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
+      jdbc-url: jdbc:log4jdbc:postgresql://210.180.118.83:5432/cms_portal?currentSchema=cms
+      username: takensoft
+      password: tts96314728!@
+
+  # 오라클 설정
+#  ums:
+#    datasource:
+#      driver-class-name: oracle.jdbc.OracleDriver
+#      jdbc-url: jdbc:oracle:thin:@localhost:1521:xe
+#      username: c##test1
+#      password: 1234
+
+  sql:
+    init:
+      platform: postgres
+
+  servlet:
+    multipart:
+      max-file-size: 500MB
+      max-request-size: 500MB
+
+  # 캐시 설정
+  cache:
+    type: caffeine
+    caffeine:
+      spec: maximumSize=100, expireAfterAccess=1h
+  web:
+    resources:
+      # static-locations: file:///C:/uploadFiles/, classpath:/static/
+      static-locations: /home/cloud-user/uploadFiles
+
+# Mybatis settings
+#mybatis:
+#  type-aliases-package: com.takensoft.**.**.vo, com.takensoft.**.**.dto, com.takensoft.common
+#  mapper-locations: classpath:mybatis/mapper/**/*-SQL.xml
+#  configuration:
+#    cache-enabled: true # mapper 캐시 전역 사용여부
+#    lazy-loading-enabled: false # MyBatis 지연 로딩 사용여부
+#    multiple-result-sets-enabled: true # 한 개의 구문에서 여러 개의 ResultSet 허용 여부
+#    use-column-label: true # 컬럼명 대신 컬럼 라벨 사용 여부
+#    use-generated-keys: false # 키 자동 생성
+#    default-executor-type: SIMPLE
+#    default-statement-timeout: 25000
+#    call-setters-on-nulls: true
+#    map-underscore-to-camel-case: true # 카멜케이스 사용
+
+# jwt
+jwt:
+  secret: akdnciepwlmdkcngpqktmektakensoftepckdbnskqmdkfsdflksdfoasjkdfbasdfasdfwerhjjhkgdfgdfseasdfef
+  accessTime: 600000      # 10분 600000
+  refreshTime: 86400000   # 24시간 86400000
+
+# cookie 유지 시간 -> jwt refreshToken과 동일하게 지정
+cookie:
+  time: 86400 # 24시간
+
+# frontUrl
+front:
+  url: http://localhost:8080
+
+# 암복호화
+crypto:
+  secret: takensoftcms2024!@#
+  vector: takensoft2024cms!@#
+
+password:
+  reset: 1234
+
+file:
+  file-upload-path: /fileUpload/
+  edit-file-upload-path: /editFileUpload/(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/message/messages_en.yml (added)
+++ build/resources/main/message/messages_en.yml
@@ -0,0 +1,55 @@
+# 공통 에러
+common:
+  success: "Successfully processed."
+  unknown: "An error has occurred."
+  bad_request: "Bad request."
+  null_point: "A null value occurred."
+  illegal_argument: "Invalid argument provided."
+  method_not_allowed: "Unsupported HTTP method."
+  not_found: "No information found."
+  insert_fail: "Registration failed."
+  update_fail: "Edit failed."
+  delete_fail: "Deletion failed."
+  payload_too_large : "File size limit exceeded."
+  duplication_code: "This code already exists."
+  duplication_data: "This data already exists."
+
+
+# 네트워크 관련
+network:
+  unknown_host: "Request to an unknown host."
+
+# SQL 관련
+sql:
+  null_value: "Null value violation in SQL query."
+  duplicate_key: "Duplicate key violation in SQL query."
+  data_integrity: "Data integrity violation in SQL query."
+  unknown: "An unknown SQL error occurred."
+
+# jwt 인증 관련
+jwt:
+  expired: "Login session has expired."
+  signature_invalid: "Invalid token type."
+  insufficient_authentication: "Insufficient authentication information."
+
+# 접근 관련
+access:
+  denied: "Access is denied."
+  unauthorized: "Unauthorized access."
+
+# 사용자 관련
+user:
+  signup:
+    id_taken: "The userid is already in use."
+    email_taken: "The email is already in use."
+    success: "Registration completed successfully."
+  login:
+    user_not_found: "User information does not exist."
+    invalid_credentials: "Incorrect password."
+    authentication_required: "Authentication request was denied."
+    account_locked: "Account is locked."
+    account_disabled: "Account is disabled."
+    account_expired: "Account has expired."
+    credentials_expired: "Password has expired."
+  logout:
+    success: "You have been logged out."(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/message/messages_ko.yml (added)
+++ build/resources/main/message/messages_ko.yml
@@ -0,0 +1,55 @@
+# 공통
+common:
+  success: "정상 처리되었습니다."
+  unknown: "오류가 발생했습니다."
+  bad_request: "잘못된 요청입니다."
+  null_point: "Null 값이 발생했습니다."
+  illegal_argument: "잘못된 인자가 전달되었습니다."
+  method_not_allowed: "지원하지 않는 HTTP 메서드입니다."
+  not_found: "정보를 찾을 수 없습니다."
+  insert_fail: "등록에 실패했습니다."
+  update_fail: "수정에 실패했습니다."
+  delete_fail: "삭제에 실패했습니다."
+  payload_too_large: "파일 용량 제한을 초과했습니다."
+  duplication_code: "이미 존재하는 코드입니다."
+  duplication_data: "이미 존재하는 정보입니다."
+
+# 네트워크 관련
+network:
+  unknown_host: "알 수 없는 호스트에 대한 요청입니다."
+
+
+# SQL 관련
+sql:
+  null_value: "SQL Query에서 NULL 값이 발생했습니다."
+  duplicate_key: "SQL Query에서 중복 키가 발생했습니다."
+  data_integrity: "SQL Query에서 데이터 무결성을 위반했습니다."
+  unknown: "SQL Query 오류가 발생했습니다."
+
+# jwt 인증 관련
+jwt:
+  expired: "로그인 시간이 만료되었습니다."
+  signature_invalid: "잘못된 토큰 유형입니다."
+  insufficient_authentication: "인증 정보가 부족합니다."
+
+# 접근 관련
+access:
+  denied: "접근 권한이 없습니다."
+  unauthorized: "잘못된 접근입니다."
+
+# 사용자 관련
+user:
+  signup:
+    id_taken: "이미 사용중인 아이디입니다."
+    email_taken: "이미 사용중인 이메일입니다."
+    success: "회원가입이 정상처리 되었습니다."
+  login:
+    user_not_found: "회원정보가 존재하지 않습니다."
+    invalid_credentials: "비밀번호가 일치하지 않습니다."
+    authentication_required: "인증 요구가 거부되었습니다."
+    account_locked: "계정이 잠겼습니다."
+    account_disabled: "계정이 비활성화 되어있습니다."
+    account_expired: "계정 유효기간이 만료되었습니다."
+    credentials_expired: "계정 비밀번호 유효기간이 만료되었습니다."
+  logout:
+    success: "로그아웃 되었습니다."
 
build/resources/main/mybatis/mapper-ora/ums/ums-SQL.xml (added)
+++ build/resources/main/mybatis/mapper-ora/ums/ums-SQL.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.takensoft.ums.dao.UmsDAO">
+    <insert id="save" parameterType="UmsVO">
+        INSERT INTO CUSTOMER_SMS_SEND (
+                                       USER_ID
+                                      , SCHEDULE_TYPE
+                                      , TITLE
+                                      ,MSG_CONTENT
+                                      , CALLING_NUM
+                                      ,PHONE_NUM
+                                      , RESERV_DTTM
+                                      , REG_DTTM
+        ) VALUES (
+                     #{userId},
+                     #{scheduleType},
+                     #{title},
+                     #{msgContent},
+                     #{callingNum},
+                     #{phoneNum},
+                     NULL,
+                     TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS')
+                 )
+    </insert>
+
+    <select id="findAll" resultType="UmsVO">
+        SELECT * FROM CUSTOMER_SMS_SEND
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/accesCtrl/accesCtrl-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/accesCtrl/accesCtrl-SQL.xml
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작성자 : takensoft
+    작성일 : 2024.04.09
+    내 용 : 접근 제어 관리 관련
+-->
+<mapper namespace="com.takensoft.cms.accesCtrl.dao.AccesCtrlDAO">
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.09
+        내 용 : 접근 제어 등록
+    -->
+    <insert id="save" parameterType="AccesCtrlVO" useGeneratedKeys="true" keyProperty="acsCntrlId">
+        INSERT INTO acs_cntrl_mng (
+            cntrl_type
+            , cntrl_ip
+            , cntrl_crs
+            , use_yn
+            , rgtr
+            , reg_dt
+        ) VALUES (
+            #{cntrlType}
+            , #{cntrlIp}
+            , #{cntrlCrs}
+            , 'Y'
+            , #{rgtr}
+            , NOW()
+        )
+    </insert>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.15
+        내 용 : 접근 제어 수정
+    -->
+    <update id="update" parameterType="AccesCtrlVO">
+        UPDATE acs_cntrl_mng
+           SET cntrl_type = #{cntrlType}
+             , cntrl_ip = #{cntrlIp}
+             , cntrl_crs = #{cntrlCrs}
+             , use_yn = #{useYn}
+             , mdfr = #{mdfr}
+             , mdfcn_dt = NOW()
+         WHERE acs_cntrl_id = #{acsCntrlId}
+    </update>
+
+    <sql id="selectAccesCtrl">
+        SELECT acm.acs_cntrl_id
+             , acm.cntrl_type
+             , cm.cd_nm     AS cntrl_type_nm
+             , acm.cntrl_ip
+             , acm.cntrl_crs
+             , acm.use_yn
+             , acm.rgtr
+             , TO_CHAR(acm.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , acm.mdfr
+             , TO_CHAR(acm.mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+          FROM acs_cntrl_mng acm
+     LEFT JOIN cd_mng cm
+            ON acm.cntrl_type = cm.cd
+    </sql>
+
+    <sql id="selectRequirement">
+        <if test="searchText != null and searchText != ''">
+            <choose>
+                <when test="searchType != null and searchType != ''">
+                    <if test="searchType == 'ip'">
+                        AND acm.cntrl_ip LIKE '%' || #{searchText} || '%'
+                    </if>
+                    <if test="searchType == 'crs'">
+                        AND acm.cntrl_crs LIKE '%' || #{searchText} || '%'
+                    </if>
+                </when>
+                <otherwise>
+                    AND (
+                        acm.cntrl_ip LIKE '%' || #{searchText} || '%'
+                    OR
+                        acm.cntrl_crs LIKE '%' || #{searchText} || '%'
+                    )
+                </otherwise>
+            </choose>
+        </if>
+    </sql>
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.12
+        내 용 : 접근 제어 조회(관리자 페이지용)
+    -->
+    <select id="findAll" parameterType="Pagination" resultType="AccesCtrlVO">
+        <include refid="selectAccesCtrl" />
+        WHERE acm.use_yn = 'Y'
+        <include refid="selectRequirement" />
+        ORDER BY COALESCE(acm.mdfcn_dt, acm.reg_dt) DESC
+        LIMIT #{recordSize} OFFSET #{limitStart}
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.18
+        내 용 : 접근제어 목록 갯수(관리자 페이지용)
+    -->
+    <select id="findAllCnt" parameterType="Pagination" resultType="Integer">
+        SELECT COUNT(acm.acs_cntrl_id)
+          FROM acs_cntrl_mng acm
+         WHERE acm.use_yn = 'Y'
+        <include refid="selectRequirement" />
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.12
+        내 용 : 접근 제어 조회(시스템용 - 시큐리티 접근 제어)
+    -->
+    <select id="findAllAccesCtrlSecurity" parameterType="String" resultType="AccesCtrlVO">
+        <include refid="selectAccesCtrl" />
+        WHERE acm.use_yn = 'Y'
+          AND acm.cntrl_ip = #{ip}
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.12
+        내 용 : 접근 제어 상세 조회
+    -->
+    <select id="findByAccesCtrl" parameterType="Integer" resultType="AccesCtrlVO">
+        <include refid="selectAccesCtrl" />
+        WHERE acm.acs_cntrl_id = #{acsCntrlId}
+          AND acm.use_yn = 'Y'
+    </select>
+
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/author/author-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/author/author-SQL.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작성자 : takensoft
+    작성일 : 2024.04.01
+    내 용 : 권한 정보 관련
+-->
+<mapper namespace="com.takensoft.cms.author.dao.AuthorDAO">
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.05
+        내 용 : 권한 코드 중복 확인
+    -->
+    <select id="findByCheckAuthorCode" parameterType="AuthorVO" resultType="boolean">
+        SELECT COUNT(authrt_cd)
+          FROM authrt_info
+         WHERE authrt_cd = #{authrtCd}
+         <if test="originAuthrtCd != null and originAuthrtCd != ''">
+           AND authrt_cd != #{originAuthrtCd}
+         </if>
+    </select>
+
+    <sql id="selectAuthrt">
+         SELECT ai.authrt_cd
+             , ai.authrt_nm
+             , ai.authrt_expln
+             , ai.use_yn
+             , ai.sys_pvsn_yn
+             , ai.rgtr
+             , (SELECT mbr_nm FROM mbr_info WHERE mbr_id = ai.rgtr) AS rgtr_nm
+             , TO_CHAR(ai.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , ai.mdfr
+             , (SELECT mbr_nm FROM mbr_info WHERE mbr_id = ai.mdfr) AS mdfr_nm
+             , TO_CHAR(ai.mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+          FROM authrt_info ai
+    </sql>
+
+    <sql id="selectRequirement">
+        <if test="searchText != null and searchText != ''">
+            AND ai.authrt_nm LIKE '%' || #{searchText} || '%'
+        </if>
+    </sql>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.25
+        내 용 : 전체 권한 목록 조회(신규 메뉴 등록 시 권한을 주기 위해 사용)
+    -->
+    <select id="findAllSystem" resultType="AuthorVO">
+        <include refid="selectAuthrt" />
+        WHERE ai.use_yn = 'Y'
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.05
+        내 용 : 권한 목록 조회
+    -->
+    <select id="findAll" parameterType="Pagination" resultType="AuthorVO">
+        <include refid="selectAuthrt" />
+         WHERE ai.use_yn = 'Y'
+        <include refid="selectRequirement" />
+        LIMIT #{recordSize} OFFSET #{limitStart}
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.25
+        내 용 : 권한 목록 갯수 조회
+    -->
+    <select id="findAllCnt" parameterType="Pagination" resultType="Integer">
+        SELECT COUNT(ai.authrt_cd)
+          FROM authrt_info ai
+         WHERE ai.use_yn = 'Y'
+        <include refid="selectRequirement" />
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.05
+        내 용 : 권한 상세 조회
+    -->
+    <select id="findByAuthorCode" parameterType="String" resultType="AuthorVO">
+        <include refid="selectAuthrt" />
+         WHERE ai.authrt_cd = #{authrtCd}
+           AND ai.use_yn = 'Y'
+    </select>
+
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.05
+        내 용 : 권한 등록
+    -->
+    <insert id="save" parameterType="AuthorVO">
+        INSERT INTO authrt_info (
+            authrt_cd
+            , authrt_nm
+            , authrt_expln
+            , use_yn
+            , sys_pvsn_yn
+            , rgtr
+            , reg_dt
+        ) VALUES (
+            #{authrtCd}
+            , #{authrtNm}
+            , #{authrtExpln}
+            , #{useYn}
+            , 1
+            , #{rgtr}
+            , NOW()
+        )
+    </insert>
+    <!--
+       작성자 : takensoft
+       작성일 : 2024.04.05
+       내 용 : 권한 수정
+   -->
+    <update id="update" parameterType="AuthorVO">
+        UPDATE authrt_info
+           SET authrt_cd = #{authrtCd}
+             , authrt_nm = #{authrtNm}
+             , authrt_expln = #{authrtExpln}
+             , use_yn = #{useYn}
+             , mdfr = #{mdfr}
+             , mdfcn_dt = NOW()
+        WHERE authrt_cd = #{originAuthrtCd}
+    </update>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/bbs/bbsCn-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/bbs/bbsCn-SQL.xml
@@ -0,0 +1,515 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작 성 자 : 하석형
+    작 성 일 : 2024.05.09
+    내   용 : 게시판 내용 관련
+-->
+<mapper namespace="com.takensoft.cms.bbs.dao.BbsCnDAO">
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.05.09
+        내   용 : (미사용)게시판 내용 아이디 중복 확인
+    -->
+    <select id="bbsCnIdCheck" resultType="boolean">
+        SELECT COUNT(bbs_id)
+        FROM bbs_cn
+        WHERE bbs_id = #{bbsId}
+    </select>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.05.09
+        내   용 : 게시판 내용 등록
+    -->
+    <insert id="save" parameterType="BbsCnVO">
+        INSERT INTO bbs_cn (
+              bbs_id
+            , bbs_mng_id
+            , bbs_nm
+            , bbs_cn
+            , inq_cnt
+            , atch_file_mng_id
+            , img_file_mng_id
+            , ntc_pst_yn
+            , ntc_bgng_dt
+            , ntc_end_dt
+            , prvt_pst_yn
+            , ans_bbs_id
+            , ans_cn
+            , ans_grd
+            , ans_sn
+            , ans_stts
+            , vdo_url
+            , use_yn
+            , rgtr
+            , reg_dt
+        ) VALUES (
+            #{bbsId}
+            , #{bbsMngId}
+            , #{bbsNm}
+            , #{bbsCn}
+            , #{inqCnt}
+            , #{atchFileMngId}
+            , #{imgFileMngId}
+            , #{ntcPstYn}
+            , #{ntcBgngDt}::TIMESTAMP
+            , #{ntcEndDt}::TIMESTAMP
+            , #{prvtPstYn}
+            , #{ansBbsId}
+            , #{ansCn}
+            , #{ansGrd}
+            , #{ansSn}
+            , #{ansStts}
+            , #{vdoUrl}
+            , 'Y'
+            , #{rgtr}
+            , NOW()
+        )
+    </insert>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.05.09
+        내   용 : 게시판 내용 SQL
+    -->
+    <sql id="selectBbsCn">
+        SELECT
+            bbs_id
+            , bbs_mng_id
+            , bbs_nm
+            , bbs_cn
+            , inq_cnt
+            , atch_file_mng_id
+            , img_file_mng_id
+            , ntc_pst_yn
+            , ntc_bgng_dt
+            , ntc_end_dt
+            , prvt_pst_yn
+            , ans_bbs_id
+            , ans_cn
+            , ans_grd
+            , ans_sn
+            , ans_stts
+            , answer
+            , mi3.mbr_nm AS answer_nm
+            , to_char(bc.ans_dt, 'YYYY-MM-DD HH24:MI') AS ans_dt
+            , vdo_url
+            , bc.use_yn
+            , bc.rgtr
+            , to_char(bc.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+            , mi.mbr_nm AS rgtr_nm
+            , bc.mdfr
+            , to_char(bc.mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+            , mi2.mbr_nm AS mdfr_nm
+        FROM bbs_cn bc
+        LEFT JOIN
+            mbr_info mi
+        ON
+            bc.rgtr = mi.mbr_id
+        LEFT JOIN
+             mbr_info mi2
+         ON
+             bc.mdfr = mi2.mbr_id
+        LEFT JOIN
+             mbr_info mi3
+             ON
+                 bc.mdfr = mi3.mbr_id
+    </sql>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.05.09
+        내   용 : 게시판 내용 SQL
+    -->
+    <sql id="selectBbsCnDetail">
+        SELECT
+            bbs_id
+             , bbs_mng_id
+             , bbs_nm
+             , bbs_cn
+             , inq_cnt
+             , atch_file_mng_id
+             , img_file_mng_id
+             , ntc_pst_yn
+             , ntc_bgng_dt
+             , ntc_end_dt
+             , prvt_pst_yn
+             , ans_bbs_id
+             , ans_cn
+             , ans_grd
+             , ans_sn
+             , ans_stts
+             , answer
+             , ans_dt
+             , vdo_url
+             , use_yn
+             , rgtr
+             , reg_dt
+             , mdfr
+             , mdfcn_dt
+    </sql>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.05.09
+        내   용 : 게시판 내용 목록 조회 검색 조건 SQL
+    -->
+    <sql id="selectRequirement">
+        <if test="searchText != null and searchText != ''">
+            <choose>
+                <when test="searchType != null and searchType != ''">
+                    <if test="searchType == 'bbsNm'">
+                        AND bbs_nm LIKE '%' || #{searchText} || '%'
+                    </if>
+                    <if test="searchType == 'mbrNm'">
+                        AND mi.mbr_nm LIKE '%' || #{searchText} || '%'
+                    </if>
+                    <if test="searchType == 'bbsCn'">
+                        AND bbs_cn LIKE '%' || #{searchText} || '%'
+                    </if>
+                    <if test="searchType == 'ansCn'">
+                        AND ans_cn LIKE '%' || #{searchText} || '%'
+                    </if>
+                </when>
+                <otherwise>
+                    AND (
+                       bbs_nm LIKE '%' || #{searchText} || '%'
+                    OR mi.mbr_nm LIKE '%' || #{searchText} || '%'
+                    OR bbs_cn LIKE '%' || #{searchText} || '%'
+                    OR ans_cn LIKE '%' || #{searchText} || '%'
+                    )
+
+                </otherwise>
+            </choose>
+        </if>
+    </sql>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.05.09
+        내   용 : 게시판 내용 목록 조회 개수
+    -->
+    <select id="findAllCnt" parameterType="Pagination" resultType="Integer">
+        SELECT COUNT(bbs_id)
+          FROM bbs_cn bc
+          LEFT JOIN
+               mbr_info mi
+            ON
+               bc.rgtr = mi.mbr_id
+          LEFT JOIN
+               mbr_info mi2
+            ON
+               bc.mdfr = mi2.mbr_id
+         WHERE bc.use_yn = 'Y'
+           AND bc.bbs_mng_id = #{id}
+        <include refid="selectRequirement" />
+    </select>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.05.09
+        내   용 : 게시판 내용 목록 조회
+    -->
+    <select id="findAllsub" parameterType="Pagination" resultType="BbsCnVO">
+        <include refid="selectBbsCn" />
+        WHERE bc.use_yn = 'Y'
+        AND bc.bbs_mng_id = #{id}
+        <include refid="selectRequirement" />
+        ORDER BY bbs_id DESC
+        OFFSET #{limitStart} LIMIT #{recordSize}
+    </select>
+
+    <select id="findAll" parameterType="Pagination" resultType="BbsCnVO">
+        select  bbs_id
+              , bbs_mng_id
+              , bbs_nm
+              , bbs_cn
+              , inq_cnt
+              , atch_file_mng_id
+              , img_file_mng_id
+              , ntc_pst_yn
+              , ntc_bgng_dt
+              , ntc_end_dt
+              , prvt_pst_yn
+              , ans_bbs_id
+              , ans_cn
+              , ans_grd
+              , ans_sn
+              , ans_stts
+              , answer
+              , mi3.mbr_nm AS answer_nm
+              , to_char(bc.ans_dt, 'YYYY-MM-DD HH24:MI') AS ans_dt
+              , vdo_url
+              , bc.use_yn
+              , bc.rgtr
+              , to_char(bc.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+              , bc.mdfr
+              , to_char(bc.mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+              , bc.now_ntc_yn
+              , mi.mbr_nm AS rgtr_nm
+              , mi2.mbr_nm AS mdfr_nm
+              , cf.abslt_path AS abslt_path
+          from( SELECT bbs_id
+                     , bbs_mng_id
+                     , bbs_nm
+                     , bbs_cn
+                     , inq_cnt
+                     , atch_file_mng_id
+                     , img_file_mng_id
+                     , ntc_pst_yn
+                     , ntc_bgng_dt
+                     , ntc_end_dt
+                     , prvt_pst_yn
+                     , ans_bbs_id
+                     , ans_cn
+                     , ans_grd
+                     , ans_sn
+                     , ans_stts
+                     , answer
+                     , ans_dt
+                     , vdo_url
+                     , use_yn
+                     , rgtr
+                     , reg_dt
+                     , mdfr
+                     , mdfcn_dt
+                     , 'Y' as now_ntc_yn
+                  from bbs_cn bc
+                 WHERE use_yn = 'Y'
+                   AND ntc_pst_yn = 'Y'
+       <![CDATA[   AND ntc_bgng_dt <= CURRENT_TIMESTAMP AND ntc_end_dt >= CURRENT_TIMESTAMP ]]>
+                 union all
+                SELECT bbs_id
+                     , bbs_mng_id
+                     , bbs_nm
+                     , bbs_cn
+                     , inq_cnt
+                     , atch_file_mng_id
+                     , img_file_mng_id
+                     , ntc_pst_yn
+                     , ntc_bgng_dt
+                     , ntc_end_dt
+                     , prvt_pst_yn
+                     , ans_bbs_id
+                     , ans_cn
+                     , ans_grd
+                     , ans_sn
+                     , ans_stts
+                     , answer
+                     , ans_dt
+                     , vdo_url
+                     , use_yn
+                     , rgtr
+                     , reg_dt
+                     , mdfr
+                     , mdfcn_dt
+                     , 'N' as now_ntc_yn
+                  from bbs_cn bc
+                 WHERE use_yn = 'Y'
+        <![CDATA[  and (ntc_pst_yn ='N' or ntc_bgng_dt > CURRENT_TIMESTAMP or ntc_end_dt < CURRENT_TIMESTAMP) ]]>
+        )as bc
+         LEFT JOIN mbr_info mi
+           ON bc.rgtr = mi.mbr_id
+         LEFT JOIN mbr_info mi2
+           ON bc.mdfr = mi2.mbr_id
+         LEFT JOIN mbr_info mi3
+           ON bc.answer = mi3.mbr_id
+         LEFT JOIN (
+             SELECT cf2.file_id
+                  , cf2.file_mng_id
+                  , cf2.abslt_path
+               FROM cmmn_file cf2
+              INNER JOIN (
+                   SELECT file_mng_id
+                        , MIN(file_id) AS min_id
+                     FROM cmmn_file
+                    GROUP BY file_mng_id
+               ) AS cf_min
+                 ON  cf2.file_id = cf_min.min_id
+         ) AS cf
+           ON bc.img_file_mng_id = cf.file_mng_id
+        WHERE bbs_mng_id = #{id}
+        <include refid="selectRequirement" />
+        ORDER BY bc.now_ntc_yn DESC, bc.reg_dt DESC
+        OFFSET #{limitStart} LIMIT #{recordSize}
+    </select>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.05.09
+        내   용 : 게시판 내용 상세 조회
+    -->
+    <select id="findByBbsId" parameterType="String" resultType="BbsCnVO">
+        <include refid="selectBbsCn" />
+        WHERE bc.bbs_id = #{bbsId}
+        AND bc.use_yn = 'Y'
+    </select>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.05.09
+        내   용 : 게시판 내용 수정
+    -->
+    <update id="update" parameterType="HashMap">
+        UPDATE
+            bbs_cn
+        SET
+            bbs_nm = #{bbsNm}
+            , bbs_cn = #{bbsCn}
+            , inq_cnt = #{inqCnt}
+            , atch_file_mng_id = #{atchFileMngId}
+            , img_file_mng_id = #{imgFileMngId}
+            , ntc_pst_yn = #{ntcPstYn}
+            , ntc_bgng_dt = #{ntcBgngDt}::TIMESTAMP
+            , ntc_end_dt = #{ntcEndDt}::TIMESTAMP
+            , prvt_pst_yn = #{prvtPstYn}
+            , ans_bbs_id = #{ansBbsId}
+            , ans_cn = #{ansCn}
+            , ans_grd = #{ansGrd}
+            , ans_sn = #{ansSn}
+            , ans_stts = #{ansStts}
+            , vdo_url = #{vdoUrl}
+            , use_yn = #{useYn}
+            , mdfr = #{mdfr}
+            , mdfcn_dt = NOW()
+        WHERE bbs_id = #{bbsId}
+    </update>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.05.09
+        내   용 : 게시판 내용 삭제
+    -->
+    <update id="delete" parameterType="BbsCnVO">
+        UPDATE
+            bbs_cn
+        SET
+            use_yn = 'N'
+          , mdfr = #{mdfr}
+          , mdfcn_dt = NOW()
+        WHERE bbs_id = #{bbsId}
+    </update>
+    <!--
+        작 성 자 : 방선주
+        작 성 일 : 2024.05.22
+        내   용 : 조회수 증가 로직
+    -->
+    <update id="updateVwCnt" parameterType="String">
+        UPDATE
+            bbs_cn
+        SET
+            inq_cnt = inq_cnt + 1
+        WHERE bbs_id = #{bbsId}
+    </update>
+
+    <!--
+        작 성 자 : 방선주
+        작 성 일 : 2024.05.23
+        내   용 : 이전글
+    -->
+    <select id="findPrevBbsCn" parameterType="BbsCnVO" resultType="BbsCnVO">
+        <include refid="selectBbsCnDetail"/>
+              FROM bbs_cn
+             WHERE use_yn  = 'Y'
+               AND bbs_mng_id = #{bbsMngId}
+         <![CDATA[  AND bbs_id < #{bbsId} ]]>
+            ORDER BY bbs_id DESC
+            LIMIT 1
+    </select>
+
+    <!--
+        작 성 자 : 방선주
+        작 성 일 : 2024.05.23
+        내   용 : 다음글
+    -->
+    <select id="findNextBbsCn" parameterType="BbsCnVO" resultType="BbsCnVO">
+        <include refid="selectBbsCnDetail"/>
+        FROM bbs_cn
+        WHERE use_yn  = 'Y'
+          AND bbs_mng_id = #{bbsMngId}
+         <![CDATA[  AND bbs_id > #{bbsId} ]]>
+            ORDER BY bbs_id ASC
+            LIMIT 1
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.28
+        내   용 : 게시글 최신 목록 조회 (최신글 5건 출력)
+    -->
+    <select id="selectBbsCnListByNew" resultType="HashMap">
+        SELECT bc.bbs_mng_id as mng_id
+             , bc.bbs_id as id
+             , btm.bbs_type AS type
+             , bm.bbs_nm AS nm
+             , bc.bbs_nm AS ttl
+             , bc.bbs_cn AS cn
+             , bc.ans_cn AS ans
+             , (SELECT mi.mbr_nm FROM mbr_info AS mi WHERE mi.mbr_id = bc.rgtr) AS writer
+             , TO_CHAR(bc.reg_dt, 'YYYY-MM-DD HH24:MI') AS dt
+          FROM bbs_cn AS bc
+     LEFT JOIN bbs_mng AS bm
+            ON bc.bbs_mng_id = bm.bbs_mng_id
+           AND bm.use_yn = 'Y'
+     LEFT JOIN bbs_type_mng AS btm
+            ON bm.bbs_type_id = btm.bbs_type_id
+           AND btm.use_yn = 'Y'
+         WHERE bc.use_yn = 'Y'
+      ORDER BY bc.reg_dt DESC
+         LIMIT 5
+    </select>
+
+    <!--
+        작 성 자 : 방선주
+        작 성 일 : 2024.06.04
+        내   용 : 질의형 게시판 답변
+    -->
+    <update id="saveAnswer" parameterType="BbsCnVO">
+        UPDATE
+            bbs_cn
+        SET ans_cn = #{ansCn}
+          , ans_stts = #{ansStts}
+          , answer = #{answer}
+          , ans_dt = now()
+        WHERE bbs_id = #{bbsId};
+    </update>
+
+    <!--
+       작 성 자 : 방선주
+       작 성 일 : 2024.06.13
+       내   용 : 최근공지 5개 조회
+   -->
+    <select id="findFiveNotice" resultType="BbsCnVO">
+        SELECT bbs_id
+             , bbs_mng_id
+             , bbs_nm
+             , bbs_cn
+             , inq_cnt
+             , atch_file_mng_id
+             , img_file_mng_id
+             , ntc_pst_yn
+             , ntc_bgng_dt
+             , ntc_end_dt
+             , prvt_pst_yn
+             , ans_bbs_id
+             , ans_cn
+             , ans_grd
+             , ans_sn
+             , ans_stts
+             , answer
+             , ans_dt
+             , vdo_url
+             , use_yn
+             , rgtr
+             , TO_CHAR(reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , mdfr
+             , TO_CHAR(mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+          FROM bbs_cn
+         WHERE use_yn  = 'Y'
+           AND bbs_mng_id = #{bbsMngId}
+         ORDER BY bbs_id DESC
+         LIMIT 5
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/bbs/bbsMng-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/bbs/bbsMng-SQL.xml
@@ -0,0 +1,336 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작성자 : 박정하
+    작성일 : 2024.05.08
+    내 용 : 게시판 관리 관련
+-->
+<mapper namespace="com.takensoft.cms.bbs.dao.BbsMngDAO">
+    <!-- 게시판 관리 resultMap -->
+    <resultMap id="bbsMngMap" type="BbsMngVO">
+        <result property="bbsMngId" column="bbs_mng_id" />
+        <result property="bbsTypeId" column="bbs_type_id" />
+        <result property="bbsNm" column="bbs_nm" />
+        <result property="bbsUpInfo" column="bbs_up_info" />
+        <result property="bbsExpln" column="bbs_expln" />
+        <result property="artclCnt" column="artcl_cnt" />
+        <result property="atchFileUseYn" column="atch_file_use_yn" />
+        <result property="ntcUseYn" column="ntc_use_yn" />
+        <result property="fileExtnNm" column="file_extn_nm" />
+        <result property="fileSzLmt" column="file_sz_lmt" />
+        <result property="prvtPstUseYn" column="prvt_pst_use_yn" />
+        <result property="bfrAftrPstUseYn" column="bfr_aftr_pst_use_yn" />
+        <result property="useYn" column="use_yn" />
+        <result property="rgtr" column="rgtr" />
+        <result property="regDt" column="reg_dt" />
+        <result property="mdfr" column="mdfr" />
+        <result property="mdfcnDt" column="mdfcn_dt" />
+        <result property="cd" column="cd" />
+    </resultMap>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.08
+        내   용 : 게시판 관리 아이디 중복 확인
+    -->
+    <select id="bbsMngIdCheck" resultType="boolean">
+        SELECT COUNT(bbs_mng_id)
+        FROM bbs_mng
+        WHERE bbs_mng_id = #{bbsMngId}
+    </select>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.05.10
+        내   용 : 게시판 관리 등록
+    -->
+    <insert id="save" parameterType="BbsMngVO">
+        INSERT INTO bbs_mng (
+            bbs_mng_id
+            , bbs_type_id
+            , bbs_nm
+            , bbs_up_info
+            , bbs_expln
+            , artcl_cnt
+            , atch_file_use_yn
+            , ntc_use_yn
+            , file_extn_nm
+            , file_sz_lmt
+            , prvt_pst_use_yn
+            , bfr_aftr_pst_use_yn
+            , cmnt_use_yn
+            , use_yn
+            , rgtr
+            , reg_dt
+            , cd
+        ) VALUES (
+            #{bbsMngId}
+            , #{bbsTypeId}
+            , #{bbsNm}
+            , #{bbsUpInfo}
+            , #{bbsExpln}
+            , #{artclCnt}
+            , #{atchFileUseYn}
+            , #{ntcUseYn}
+            , #{fileExtnNm}
+            , #{fileSzLmt}
+            , #{prvtPstUseYn}
+            , #{bfrAftrPstUseYn}
+            , #{cmntUseYn}
+            , 'Y'
+            , #{rgtr}
+            , NOW()
+            , #{cd}
+        )
+    </insert>
+
+    <sql id="selectBbsMng">
+        SELECT
+               bm.bbs_mng_id
+             , bm.bbs_type_id
+             , bbs_nm
+             , bbs_up_info
+             , bbs_expln
+             , artcl_cnt
+             , atch_file_use_yn
+             , ntc_use_yn
+             , file_extn_nm
+             , file_sz_lmt
+             , prvt_pst_use_yn
+             , bfr_aftr_pst_use_yn
+             , cmnt_use_yn
+             , bm.use_yn
+             , bm.rgtr
+             , to_char(bm.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , bm.mdfr
+             , to_char(bm.mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+             , cd
+
+    </sql>
+
+    <sql id="selectRequirement">
+        <if test="searchText != null and searchText != ''">
+            <choose>
+                <when test="searchType != null and searchType != ''">
+                    <if test="searchType == 'bbsTypeId'">
+                        AND bbs_type_id LIKE '%' || #{searchText} || '%'
+                    </if>
+                    <if test="searchType == 'bbsNm'">
+                        AND bbs_nm LIKE '%' || #{searchText} || '%'
+                    </if>
+                </when>
+                <otherwise>
+                    AND (
+                        bbs_type_id LIKE '%' || #{searchText} || '%'
+                    OR
+                        bbs_nm LIKE '%' || #{searchText} || '%'
+                    )
+                </otherwise>
+            </choose>
+        </if>
+    </sql>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.05.10
+        내   용 : 게시판 관리 목록 조회 개수
+    -->
+    <select id="findAllCnt" parameterType="Pagination" resultType="int">
+        SELECT COUNT(bbs_mng_id)
+        FROM bbs_mng
+        WHERE use_yn = 'Y'
+        <include refid="selectRequirement" />
+    </select>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.05.10
+        내   용 : 게시판 관리 목록 조회
+    -->
+    <select id="findAll" parameterType="Pagination" resultType="BbsMngVO">
+        <include refid="selectBbsMng" />
+            , bc.bbs_cn_cnt
+        FROM bbs_mng bm
+        LEFT JOIN (
+             SELECT bbs_mng_id, count(bbs_mng_id) as bbs_cn_cnt
+               FROM bbs_cn
+              WHERE use_yn = 'Y'
+              GROUP BY bbs_mng_id
+        ) bc
+        ON bm.bbs_mng_id = bc.bbs_mng_id
+        WHERE bm.use_yn = 'Y'
+        <include refid="selectRequirement" />
+        ORDER BY bbs_mng_id DESC
+        OFFSET #{limitStart} LIMIT #{recordSize}
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.16
+        내   용 : 게시판 관리 목록 조회 (메뉴 관리용)
+    -->
+    <select id="findAllByMenuMng" resultType="BbsMngVO">
+        <include refid="selectBbsMng" />
+        FROM bbs_mng bm
+        WHERE bm.use_yn = 'Y'
+        ORDER BY bbs_mng_id DESC
+    </select>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.05.08
+        내   용 : 게시판 관리 상세 조회
+    -->
+    <select id="findByBbsMngId" parameterType="String" resultType="BbsMngVO">
+        <include refid="selectBbsMng" />
+        FROM bbs_mng bm
+        WHERE bm.bbs_mng_id = #{bbsMngId}
+        AND bm.use_yn = 'Y'
+    </select>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.05.09
+        내   용 : 게시판 관리 수정
+    -->
+    <update id="update" parameterType="BbsMngVO">
+        UPDATE
+            bbs_mng
+        SET
+            bbs_type_id = #{bbsTypeId}
+            , bbs_nm = #{bbsNm}
+            , bbs_up_info = #{bbsUpInfo}
+            , bbs_expln = #{bbsExpln}
+            , artcl_cnt = #{artclCnt}
+            , atch_file_use_yn = #{atchFileUseYn}
+            , ntc_use_yn = #{ntcUseYn}
+            , file_extn_nm = #{fileExtnNm}
+            , file_sz_lmt = #{fileSzLmt}
+            , prvt_pst_use_yn = #{prvtPstUseYn}
+            , bfr_aftr_pst_use_yn = #{bfrAftrPstUseYn}
+            , cmnt_use_yn = #{cmntUseYn}
+            , use_yn = #{useYn}
+            , mdfr = #{mdfr}
+            , mdfcn_dt = NOW()
+            , cd = #{cd}
+        WHERE bbs_mng_id = #{bbsMngId}
+    </update>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.05.09
+        내   용 : 게시판 관리 삭제
+    -->
+    <update id="delete" parameterType="BbsMngVO">
+        UPDATE
+            bbs_mng
+        SET
+            use_yn = 'N'
+          , mdfr = #{mdfr}
+          , mdfcn_dt = NOW()
+        WHERE bbs_mng_id = #{bbsMngId}
+    </update>
+
+
+
+    <!-- ********************************* 게시판 라우터 (시작) ********************************* -->
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.05.13
+        내   용 : 게시판 라우터 등록
+    -->
+    <insert id="saveBbsRouter" parameterType="BbsRouterVO">
+        INSERT INTO bbs_router (
+            bbs_router_id
+            , bbs_mng_id
+            , bbs_korn_nm
+            , bbs_eng_nm
+            , page_crs
+            , mngr_page_crs
+            , compn_crs
+            , expsr_yn
+            , use_yn
+            , reg_dt
+        ) VALUES (
+            #{bbsRouterId}
+            , #{bbsMngId}
+            , #{bbsKornNm}
+            , #{bbsEngNm}
+            , #{pageCrs}
+            , #{mngrPageCrs}
+            , #{compnCrs}
+            , #{expsrYn}
+            , 'Y'
+            , NOW()
+        )
+    </insert>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.05.13
+        내   용 : 게시판 라우터 수정
+    -->
+    <update id="updateBbsRouter" parameterType="BbsRouterVO">
+        UPDATE
+            bbs_router
+        SET
+            use_yn = 'N'
+        WHERE bbs_mng_id = #{bbsMngId}
+    </update>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.05.13
+        내   용 : 게시판 라우터 삭제
+    -->
+    <delete id="deleteBbsRouter" parameterType="String">
+        DELETE
+        FROM bbs_router
+        WHERE bbs_mng_id = #{bbsMngId}
+    </delete>
+
+    <!--
+       작 성 자 : 방선주
+       작 성 일 : 2024.06.04
+       내   용 : 게시판 라우터 목록 조회
+   -->
+    <select id="findAllBbsRouter" parameterType="String" resultType="BbsRouterVO">
+        SELECT bbs_router_id
+             , bbs_mng_id
+             , bbs_korn_nm
+             , bbs_eng_nm
+             , page_crs
+             , compn_crs
+             , expsr_yn
+             , use_yn
+             , reg_dt
+             , mngr_page_crs
+          FROM bbs_router
+         WHERE bbs_mng_id = #{bbsMngId}
+    </select>
+
+    <!--
+        작 성 자 : 방선주
+        작 성 일 : 2024.06.05
+        내   용 : 게시판 라우터 crs 수정
+    -->
+    <update id="updateCrs" parameterType="BbsRouterVO">
+        UPDATE
+            bbs_router
+        SET
+            page_crs = #{pageCrs}
+        WHERE bbs_router_id = #{bbsRouterId}
+    </update>
+    <!-- ********************************* 게시판 라우터 (종료) ********************************* -->
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.07.18
+        내   용 : 게시판 관리 목록 조회 개수 (접속 통계용)
+    -->
+    <select id="findAllCntNotPagination" resultType="int">
+        SELECT COUNT(bbs_mng_id)
+        FROM bbs_mng
+        WHERE use_yn = 'Y'
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/bbs/bbsRouter-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/bbs/bbsRouter-SQL.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작 성 자 : 하석형
+    작 성 일 : 2024.05.09
+    내   용 : 게시판 내용 관련
+-->
+<mapper namespace="com.takensoft.cms.bbs.dao.BbsRouterDAO">
+
+    <!-- 콘텐츠 조회(라우터 조회용 - 권한포함) -->
+    <resultMap id="bbsRouterAuthrtMap" type="ContsAuthrtVO">
+<!--        <result property="contsId" column="bbs_router_id" />-->
+        <result property="contsId" column="bbs_mng_id" />
+<!--        <result property="menuId" column="menu_id" />-->
+        <result property="contsKornNm" column="bbs_korn_nm" />
+        <result property="contsEngNm" column="bbs_eng_nm" />
+        <result property="pageCrs" column="page_crs" />
+        <result property="compnCrs" column="compn_crs" />
+        <collection property="authrtList" ofType="MenuAuthorVO">
+            <result property="authrtCd" column="authrt_cd" />
+            <result property="menuId" column="menu_id" />
+            <result property="inqAuthrt" column="inq_authrt" />
+            <result property="regAuthrt" column="reg_authrt" />
+            <result property="mdfcnAuthrt" column="mdfcn_authrt" />
+            <result property="delAuthrt" column="del_authrt" />
+            <result property="fileDwnldAuthrt" column="file_dwnld_authrt" />
+        </collection>
+    </resultMap>
+
+    <!--
+        작 성 자 : takensoft
+        작 성 일 : 2024.05.16
+        내   용 : 게시판 라우터 조회(권한 포함)
+    -->
+    <select id="findByBbsRouterAuthrt" resultMap="bbsRouterAuthrtMap">
+        SELECT A.bbs_mng_id
+             , A.bbs_korn_nm
+             , A.bbs_eng_nm
+             , A.page_crs
+             , A.compn_crs
+             , mi.menu_id
+             , mai.authrt_cd
+             , mai.inq_authrt
+             , mai.reg_authrt
+             , mai.mdfcn_authrt
+             , mai.del_authrt
+             , mai.file_dwnld_authrt
+          FROM ( SELECT br.bbs_router_id
+                      , br.bbs_mng_id
+                      , br.bbs_korn_nm
+                      , br.bbs_eng_nm
+                      , br.page_crs
+                      , br.compn_crs
+                      , br.use_yn
+                   FROM bbs_router br
+              LEFT JOIN bbs_mng bm
+                     ON br.bbs_mng_id = bm.bbs_mng_id
+                  WHERE bm.use_yn = 'Y'
+
+              UNION ALL
+
+                 SELECT br.bbs_router_id
+                      , br.bbs_mng_id
+                      , br.bbs_korn_nm
+                      , concat('adm', br.bbs_eng_nm) AS bbs_eng_nm
+                      , br.mngr_page_crs AS page_crs
+                      , br.compn_crs
+                      , br.use_yn
+                   FROM bbs_router br
+              LEFT JOIN bbs_mng bm
+                     ON br.bbs_mng_id = bm.bbs_mng_id
+                  WHERE bm.use_yn = 'Y'
+              ) A
+     LEFT JOIN menu_info mi
+            ON A.bbs_mng_id = mi.menu_type_ctgry
+     LEFT JOIN menu_authrt_info mai
+            ON mi.menu_id = mai.menu_id
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/bbs/bbsTypeMng-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/bbs/bbsTypeMng-SQL.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작성자 : 박정하
+    작성일 : 2024.05.08
+    내 용 : 게시판 관리 관련
+-->
+<mapper namespace="com.takensoft.cms.bbs.dao.BbsTypeMngDAO">
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.08
+        내   용 : 게시판 유형 관리 등록
+    -->
+    <insert id="insertBbsTypeMng" parameterType="BbsTypeMngVO">
+        INSERT INTO bbs_type_mng (
+            bbs_type_id
+            , bbs_type_korn_nm
+            , bbs_type_eng_nm
+            , bbs_type
+            , page_crs
+            , compn_crs
+            , expsr_yn
+            , use_yn
+            , rgtr
+            , reg_dt
+        ) VALUES (
+            #{bbsTypeId}
+            , #{bbsTypeKornNm}
+            , #{bbsTypeEngNm}
+            , #{bbsType}
+            , #{pageCrs}
+            , #{compnCrs}
+            , #{expsrYn}
+            , 'Y'
+            , #{rgtr}
+            , NOW()
+        )
+    </insert>
+
+    <sql id="findBbsTypeMng">
+        SELECT bbs_type_id
+             , bbs_type_korn_nm
+             , bbs_type_eng_nm
+             , bbs_type
+             , page_crs
+             , compn_crs
+             , expsr_yn
+             , use_yn
+             , rgtr
+             , TO_CHAR(reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , mdfr
+             , TO_CHAR(mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+        FROM bbs_type_mng
+    </sql>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.05.13
+        내   용 : 게시판 유형 관리 목록 조회
+    -->
+    <select id="findAll" parameterType="BbsTypeMngVO" resultType="BbsTypeMngVO">
+        <include refid="findBbsTypeMng" />
+        WHERE use_yn = 'Y'
+        <choose>
+            <when test="bbsType != null and bbsType != ''">
+            AND
+                bbs_type = #{bbsType}
+            </when>
+            <otherwise>
+            AND
+                expsr_yn = #{expsrYn}
+            </otherwise>
+        </choose>
+    </select>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.05.13
+        내   용 : 게시판 유형 관리 상세 조회
+    -->
+    <select id="findByBbsTypeId" parameterType="String" resultType="BbsTypeMngVO">
+        SELECT bbs_type_id
+            , bbs_type_korn_nm
+            , bbs_type_eng_nm
+            , bbs_type
+            , page_crs
+            , compn_crs
+            , expsr_yn
+            , use_yn
+            , rgtr
+            , TO_CHAR(reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+            , mdfr
+            , TO_CHAR(mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+        FROM bbs_type_mng
+        WHERE bbs_type_id = #{bbsTypeId}
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/bbs/cmnt-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/bbs/cmnt-SQL.xml
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작성자 : 방선주
+    작성일 : 2024.05.27
+    내 용 : 게시판 댓글 관련
+-->
+<mapper namespace="com.takensoft.cms.bbs.dao.CmntDAO">
+    <resultMap id="CmntMap" type="CmntVO">
+        <result property="cmntId" column="cmnt_id"/>
+        <result property="bbsId" column="bbs_id"/>
+        <result property="upCmntId" column="up_cmnt_id"/>
+        <result property="cmntCn" column="cmnt_cn"/>
+        <result property="cmntGrd" column="cmnt_grd"/>
+        <result property="cmntSn" column="cmnt_sn"/>
+        <result property="useYn" column="use_yn"/>
+        <result property="rgtr" column="rgtr"/>
+        <result property="regDt" column="reg_dt"/>
+        <result property="mdfr" column="mdfr"/>
+        <result property="mdfcnDt" column="mdfcn_dt"/>
+    </resultMap>
+
+    <!--
+    작성자 : 방선주
+    작성일 : 2024.05.27
+    내 용 : 게시판 댓글 등록
+    -->
+    <insert id="saveCmnt" parameterType="CmntVO">
+        INSERT INTO cmnt(
+                          bbs_id
+                        , up_cmnt_id
+                        , cmnt_cn
+                        , cmnt_grd
+                        , cmnt_sn
+                        , use_yn
+                        , rgtr
+                        , reg_dt
+        ) VALUES (
+                          #{bbsId}
+                        , #{upCmntId}
+                        , #{cmntCn}
+                        , #{cmntGrd}
+                        , #{cmntSn}
+                        , 'Y'
+                        , #{rgtr}
+                        , now()
+        );
+    </insert>
+
+    <!--
+    작성자 : 방선주
+    작성일 : 2024.05.27
+    내 용 : 부모가 같은 댓글 개수 조회
+    -->
+    <select id="getCmntCount" parameterType="CmntVO" resultType="Integer">
+        SELECT COUNT(*)
+        FROM cmnt
+        WHERE bbs_id = #{bbsId}
+          <if test="upCmntId != null">
+            AND up_cmnt_id = #{upCmntId}
+          </if>
+          AND use_yn = 'Y'
+    </select>
+    <!--
+    작성자 : 방선주
+    작성일 : 2024.05.27
+    내 용 : 부모의 정보 조회
+    -->
+    <select id="findParentCmnt" parameterType="int" resultMap="CmntMap">
+        SELECT cmnt_id
+             , bbs_id
+             , up_cmnt_id
+             , cmnt_cn
+             , cmnt_grd
+             , cmnt_sn
+             , use_yn
+             , rgtr
+             , TO_CHAR(reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , mdfr
+             , TO_CHAR(mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+        FROM cmnt
+        WHERE cmnt_id = #{upCmntId}
+    </select>
+
+    <!--
+        작성자 : 방선주
+        작성일 : 2024.05.27
+        내 용 : 댓글 조회
+        -->
+    <select id="findCmntList" parameterType="String" resultMap="CmntMap">
+        WITH RECURSIVE CommentHierarchy AS (
+            SELECT  cm1.cmnt_id
+                 , cm1.bbs_id
+                 , cm1.up_cmnt_id
+                 , cm1.cmnt_cn
+                 , cm1.cmnt_grd
+                 , cm1.cmnt_sn
+                 , cm1.use_yn
+                 , cm1.rgtr
+                 , TO_CHAR(cm1.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+                 , rgtrInfo.mbr_nm AS rgtrNm
+                 , cm1.mdfr
+                 , TO_CHAR(cm1.mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+                 , mdfrInfo.mbr_nm AS mdfrNm
+            FROM cmnt cm1
+                     LEFT JOIN mbr_info rgtrInfo ON cm1.rgtr = rgtrInfo.mbr_id
+                     LEFT JOIN mbr_info mdfrInfo ON cm1.mdfr = mdfrInfo.mbr_id
+            WHERE cm1.bbs_id = #{bbsId}
+              AND cm1.up_cmnt_id = 0
+            UNION ALL
+            SELECT  cm.cmnt_id
+                 , cm.bbs_id
+                 , cm.up_cmnt_id
+                 , cm.cmnt_cn
+                 , cm.cmnt_grd
+                 , cm.cmnt_sn
+                 , cm.use_yn
+                 , cm.rgtr
+                 , TO_CHAR(cm.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+                 , rgtrInfo.mbr_nm AS rgtrNm
+                 , cm.mdfr
+                 , TO_CHAR(cm.mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+                 , mdfrInfo.mbr_nm AS mdfrNm
+            FROM cmnt cm
+                     INNER JOIN CommentHierarchy ch ON cm.up_cmnt_id = ch.cmnt_id
+                     LEFT JOIN mbr_info rgtrInfo ON cm.rgtr = rgtrInfo.mbr_id
+                     LEFT JOIN mbr_info mdfrInfo ON cm.mdfr = mdfrInfo.mbr_id
+        )
+        SELECT * FROM CommentHierarchy
+        ORDER BY cmnt_sn, cmnt_id
+    </select>
+
+    <!--
+        작성자 : 방선주
+        작성일 : 2024.05.27
+        내 용 : 댓글 업데이트
+        -->
+    <update id="updateCmnt" parameterType="CmntVO">
+        UPDATE cmnt
+        SET cmnt_cn = #{cmntCn}
+          , mdfr = #{mdfr}
+          , mdfcn_dt = now()
+        WHERE cmnt_id = #{cmntId}
+    </update>
+
+    <!--
+        작성자 : 방선주
+        작성일 : 2024.05.27
+        내 용 : 댓글 삭제
+        -->
+    <update id="deleteCmnt" parameterType="CmntVO">
+        UPDATE cmnt
+        SET use_yn = #{useYn}
+          , mdfr = #{mdfr}
+          , mdfcn_dt = now()
+        WHERE cmnt_id = #{cmntId}
+    </update>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/bbs/search-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/bbs/search-SQL.xml
@@ -0,0 +1,524 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작성자 : 하석형
+    작성일 : 2024.06.12
+    내 용 : 통합 검색 관리 관련
+-->
+<mapper namespace="com.takensoft.cms.search.dao.SearchDAO">
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.06.12
+        내   용 : 검색 조건 SQL
+    -->
+    <sql id="searchSQL">
+        <!-- 검색 조건 및 검색어 -->
+        <choose>
+            <when test="searchType != null and searchType != ''">
+                <if test="searchType == 'title'">
+                    AND bbs_nm LIKE '%' || #{searchText} || '%'
+                </if>
+                <if test="searchType == 'content'">
+                    AND bbs_cn LIKE '%' || #{searchText} || '%'
+                </if>
+            </when>
+            <otherwise>
+                AND (
+                bbs_nm LIKE '%' || #{searchText} || '%'
+                OR
+                bbs_cn LIKE '%' || #{searchText} || '%'
+                )
+            </otherwise>
+        </choose>
+
+        <!-- 검색 기간 -->
+        <if test="startDt != null and startDt != ''">
+            <![CDATA[
+            AND reg_dt::DATE >= #{startDt}::DATE
+            ]]>
+        </if>
+        <if test="endDt != null and endDt != ''">
+            <![CDATA[
+            AND reg_dt::DATE <= #{endDt}::DATE
+            ]]>
+        </if>
+    </sql>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.06.12
+        내   용 : 검색 조건 Order By SQL
+    -->
+    <sql id="searchOrderBySQL">
+        <!-- 검색 정렬 -->
+        <choose>
+            <when test="sort != null and sort != ''">
+                <!-- (미구현)정확도 조건 -->
+                <if test="sort == 'A'">
+                </if>
+            </when>
+            <otherwise>
+                reg_dt DESC
+            </otherwise>
+        </choose>
+    </sql>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.06.12
+        내   용 : 게시판 검색 목록 조회 개수
+    -->
+    <select id="findAllCountByBbs" parameterType="SearchVO" resultType="int">
+        SELECT
+            COUNT(*)
+        FROM
+            bbs_cn bc
+        WHERE
+            bc.bbs_mng_id = #{bbsMngId}
+        AND
+            bc.use_yn = 'Y'
+        <include refid="searchSQL" />
+        <if test="roles != null and roles.size() > 0">
+            <choose>
+                <!-- ROLE_ADMIN일 때는 모든 데이터를 보여줍니다. -->
+                <when test="roles.contains('ROLE_ADMIN')">
+                </when>
+                <!-- ROLE_USER일 때는 작성자가 일치하는 데이터는 보여줍니다. -->
+                <when test="roles.contains('ROLE_USER')">
+                    AND (bc.prvt_pst_yn = 'N' OR bc.rgtr = #{mbrId})
+                </when>
+                <!-- 그 외는 비밀글을 조회할 수 없습니다. -->
+                <otherwise>
+                    AND bc.prvt_pst_yn = 'N'
+                </otherwise>
+            </choose>
+        </if>
+    </select>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.06.12
+        내   용 : 게시판 검색 목록 조회
+    -->
+    <select id="findAllByBbs" parameterType="SearchVO" resultType="SearchContentVO">
+        SELECT
+            bbs_mng_id AS menuTypeCtgry
+            , bbs_id AS pageId
+            , bbs_nm AS title
+            , bbs_cn AS content
+            , reg_dt::DATE
+        FROM
+            bbs_cn bc
+        WHERE
+            bc.bbs_mng_id = #{bbsMngId}
+        AND
+            bc.use_yn = 'Y'
+        <include refid="searchSQL" />
+        <if test="roles != null and roles.size() > 0">
+            <choose>
+                <!-- ROLE_ADMIN일 때는 모든 데이터를 보여줍니다. -->
+                <when test="roles.contains('ROLE_ADMIN')">
+                </when>
+                <!-- ROLE_USER일 때는 작성자가 일치하는 데이터는 보여줍니다. -->
+                <when test="roles.contains('ROLE_USER')">
+                    AND (bc.prvt_pst_yn = 'N' OR bc.rgtr = #{mbrId})
+                </when>
+                <!-- 그 외는 비밀글을 조회할 수 없습니다. -->
+                <otherwise>
+                    AND bc.prvt_pst_yn = 'N'
+                </otherwise>
+            </choose>
+        </if>
+        ORDER BY
+        <include refid="searchOrderBySQL" />
+        LIMIT #{typePreCnt}
+        <!--<if test="bbsMngIdList != null and bbsMngIdList.size() > 0">
+            AND bc.bbs_mng_id IN
+            <foreach item="bbsMngId" collection="bbsMngIdList" open="(" separator="," close=")">
+                #{bbsMngId}
+            </foreach>
+        </if>-->
+    </select>
+
+
+
+    <!-- ********************************* 컨텐츠 검색 - 기업 정보 (시작) ********************************* -->
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.06.14
+        내   용 : 기업 정보 검색 목록 조회 개수
+    -->
+    <select id="findAllCountByEntInfo" parameterType="SearchVO" resultType="int">
+        SELECT
+            COUNT(*)
+        FROM
+            ent_info ei
+        WHERE
+            ei.use_yn = 'Y'
+        <!-- 검색어 -->
+        AND (
+            ent_nm LIKE '%' || #{searchText} || '%'
+        OR
+            rmrk LIKE '%' || #{searchText} || '%'
+        )
+        <!-- 검색 기간 -->
+        <if test="startDt != null and startDt != ''">
+            <![CDATA[
+                AND reg_dt::DATE >= #{startDt}::DATE
+            ]]>
+        </if>
+        <if test="endDt != null and endDt != ''">
+            <![CDATA[
+                AND reg_dt::DATE <= #{endDt}::DATE
+            ]]>
+        </if>
+    </select>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.06.14
+        내   용 : 기업 정보 검색 목록 조회
+    -->
+    <select id="findAllByEntInfo" parameterType="SearchVO" resultType="HashMap">
+        SELECT
+            ei.ent_id AS page_id
+            , ei.ent_nm
+            , ei.rprsv_nm
+            , ei.rmrk
+            , ei.reg_dt::DATE
+        FROM
+            ent_info ei
+        WHERE
+            ei.use_yn = 'Y'
+        <!-- 검색어 -->
+        AND (
+            ei.ent_nm LIKE '%' || #{searchText} || '%'
+        OR
+            ei.rmrk LIKE '%' || #{searchText} || '%'
+        )
+        <!-- 검색 기간 -->
+        <if test="startDt != null and startDt != ''">
+            <![CDATA[
+            AND ei.reg_dt::DATE >= #{startDt}::DATE
+            ]]>
+        </if>
+        <if test="endDt != null and endDt != ''">
+            <![CDATA[
+            AND ei.reg_dt::DATE <= #{endDt}::DATE
+            ]]>
+        </if>
+        <!-- 검색 정렬 -->
+        ORDER BY
+            ei.reg_dt DESC
+        LIMIT #{typePreCnt}
+    </select>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.06.14
+        내   용 : 기업 상담 신청 검색 목록 조회 개수
+    -->
+    <select id="findAllCountByEntDscsnAply" parameterType="SearchVO" resultType="int">
+        SELECT
+            COUNT(*)
+        FROM
+            ent_dscsn_aply eda
+        WHERE
+            eda.use_yn = 'Y'
+        <if test="roles != null and roles.size() > 0">
+            <choose>
+                <!-- ROLE_ADMIN일 때는 모든 데이터를 보여줍니다. -->
+                <when test="roles.contains('ROLE_ADMIN')">
+                </when>
+                <!-- ROLE_USER일 때는 작성자가 일치하는 데이터는 보여줍니다. -->
+                <when test="roles.contains('ROLE_USER')">
+                    AND ((prcs_stts = 'C' OR prcs_stts IS NULL) OR eda.actn_pic = #{mbrId})
+                </when>
+                <!-- 그 외는 변경요청(C)과 미배정(null)만 조회할 수 있습니다. -->
+                <otherwise>
+                    AND (prcs_stts = 'C' OR prcs_stts IS NULL)
+                </otherwise>
+            </choose>
+        </if>
+        <!-- 검색어 -->
+        AND eda.ent_nm LIKE '%' || #{searchText} || '%'
+        <!-- 검색 기간 -->
+        <if test="startDt != null and startDt != ''">
+            <![CDATA[
+                AND eda.reg_dt::DATE >= #{startDt}::DATE
+            ]]>
+        </if>
+        <if test="endDt != null and endDt != ''">
+            <![CDATA[
+                AND eda.reg_dt::DATE <= #{endDt}::DATE
+            ]]>
+        </if>
+    </select>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.06.14
+        내   용 : 기업 상담 신청 검색 목록 조회
+    -->
+    <select id="findAllByEntDscsnAply" parameterType="SearchVO" resultType="HashMap">
+        SELECT
+            eda.ent_dscsn_aply_id AS page_id
+             , eda.ent_nm
+             , eda.rmrk
+             , CASE
+                   WHEN prcs_stts = 'N' THEN '접수전'
+                   WHEN prcs_stts = 'I' THEN '처리중'
+                   WHEN prcs_stts = 'E' THEN '완료'
+                   WHEN prcs_stts = 'C' THEN '변경요청'
+                   ELSE '미배정'
+            END AS prcs_stts
+             , eda.reg_dt::DATE
+        FROM
+            ent_dscsn_aply eda
+        WHERE
+            eda.use_yn = 'Y'
+        <if test="roles != null and roles.size() > 0">
+            <choose>
+                <!-- ROLE_ADMIN일 때는 모든 데이터를 보여줍니다. -->
+                <when test="roles.contains('ROLE_ADMIN')">
+                </when>
+                <!-- ROLE_USER일 때는 작성자가 일치하는 데이터는 보여줍니다. -->
+                <when test="roles.contains('ROLE_USER')">
+                    AND ((prcs_stts = 'C' OR prcs_stts IS NULL) OR eda.actn_pic = #{mbrId})
+                </when>
+                <!-- 그 외는 변경요청(C)과 미배정(null)만 조회할 수 있습니다. -->
+                <otherwise>
+                    AND (prcs_stts = 'C' OR prcs_stts IS NULL)
+                </otherwise>
+            </choose>
+        </if>
+        <!-- 검색어 -->
+        AND eda.ent_nm LIKE '%' || #{searchText} || '%'
+        <!-- 검색 기간 -->
+        <if test="startDt != null and startDt != ''">
+            <![CDATA[
+                AND eda.reg_dt::DATE >= #{startDt}::DATE
+            ]]>
+        </if>
+        <if test="endDt != null and endDt != ''">
+            <![CDATA[
+                AND eda.reg_dt::DATE <= #{endDt}::DATE
+            ]]>
+        </if>
+        <!-- 검색 정렬 -->
+        ORDER BY
+            eda.reg_dt DESC
+        LIMIT #{typePreCnt}
+    </select>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.06.14
+        내   용 : 투자 상담 검색 목록 조회 개수
+    -->
+    <select id="findAllCountByIvstDscsn" parameterType="SearchVO" resultType="int">
+        SELECT
+            COUNT(*)
+        FROM
+            ivst_dscsn id
+        LEFT JOIN
+            ent_info ei
+        ON
+            id.ent_id = ei.ent_id
+        WHERE
+            id.use_yn = 'Y'
+        <!-- 검색어 -->
+        AND (
+            ei.ent_nm LIKE '%' || #{searchText} || '%'
+        OR
+            id.main_cn LIKE '%' || #{searchText} || '%'
+        )
+        <!-- 검색 기간 -->
+        <if test="startDt != null and startDt != ''">
+            <![CDATA[
+                AND id.reg_dt::DATE >= #{startDt}::DATE
+            ]]>
+        </if>
+        <if test="endDt != null and endDt != ''">
+            <![CDATA[
+                AND id.reg_dt::DATE <= #{endDt}::DATE
+            ]]>
+        </if>
+    </select>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.06.14
+        내   용 : 투자 상담 검색 목록 조회
+    -->
+    <select id="findAllByIvstDscsn" parameterType="SearchVO" resultType="HashMap">
+        SELECT
+             id.ivst_dscsn_id AS page_id
+             , ei.ent_nm
+             , id.ttl
+             , id.main_cn
+             , id.reg_dt::DATE
+        FROM
+            ivst_dscsn id
+        LEFT JOIN
+            ent_info ei
+        ON
+            id.ent_id = ei.ent_id
+        WHERE
+            id.use_yn = 'Y'
+        <!-- 검색어 -->
+        AND (
+            ei.ent_nm LIKE '%' || #{searchText} || '%'
+        OR
+            id.main_cn LIKE '%' || #{searchText} || '%'
+        )
+        <!-- 검색 기간 -->
+        <if test="startDt != null and startDt != ''">
+            <![CDATA[
+                AND id.reg_dt::DATE >= #{startDt}::DATE
+            ]]>
+        </if>
+        <if test="endDt != null and endDt != ''">
+            <![CDATA[
+                AND id.reg_dt::DATE <= #{endDt}::DATE
+            ]]>
+        </if>
+        <!-- 검색 정렬 -->
+        ORDER BY
+            id.reg_dt DESC
+        LIMIT #{typePreCnt}
+    </select>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.06.14
+        내   용 : 검토 사항 검색 목록 조회 개수
+    -->
+    <select id="findAllCountByRvwMttr" parameterType="SearchVO" resultType="int">
+        SELECT
+            COUNT(*)
+        FROM
+            rvw_mttr rm
+        LEFT JOIN
+            (SELECT
+                ei.ent_nm
+                , id.ivst_dscsn_id
+                , id.ttl
+            FROM
+                ent_info ei
+            LEFT JOIN
+                (SELECT DISTINCT ON (ent_id)
+                    ent_id
+                    , ivst_dscsn_id
+                    , ttl
+                FROM
+                    ivst_dscsn
+                WHERE
+                    use_yn = 'Y'
+                ORDER BY
+                    ent_id, reg_dt DESC
+                ) AS id
+            ON
+                ei.ent_id = id.ent_id
+            WHERE
+                ei.use_yn = 'Y'
+            ) AS ei_id
+        ON
+            rm.ivst_dscsn_id = ei_id.ivst_dscsn_id
+        LEFT JOIN
+            cd_mng cm
+        ON
+            rm."type" = cm.cd
+        WHERE
+            rm.use_yn = 'Y'
+        <!-- 검색어 -->
+        AND (
+            ei_id.ent_nm LIKE '%' || #{searchText} || '%'
+        OR
+            ei_id.ttl LIKE '%' || #{searchText} || '%'
+        )
+        <!-- 검색 기간 -->
+        <if test="startDt != null and startDt != ''">
+            <![CDATA[
+                AND rm.reg_dt::DATE >= #{startDt}::DATE
+            ]]>
+        </if>
+        <if test="endDt != null and endDt != ''">
+            <![CDATA[
+                AND rm.reg_dt::DATE <= #{endDt}::DATE
+            ]]>
+        </if>
+    </select>
+
+    <!--
+        작 성 자 : 하석형
+        작 성 일 : 2024.06.14
+        내   용 : 검토 사항 검색 목록 조회
+    -->
+    <select id="findAllByRvwMttr" parameterType="SearchVO" resultType="HashMap">
+        SELECT
+            rm.rvw_mttr_id AS page_id
+            , ei_id.ent_nm
+            , ei_id.ttl
+            , cm.cd_nm AS "type"
+            , rm.rcpt_cn
+            , rm.reg_dt::DATE
+        FROM
+            rvw_mttr rm
+        LEFT JOIN
+            (SELECT
+                 ei.ent_nm
+                  , id.ivst_dscsn_id
+                  , id.ttl
+             FROM
+                 ent_info ei
+             LEFT JOIN
+                 (SELECT DISTINCT ON (ent_id)
+                     ent_id
+                     , ivst_dscsn_id
+                     , ttl
+                  FROM
+                      ivst_dscsn
+                  WHERE
+                      use_yn = 'Y'
+                  ORDER BY
+                      ent_id, reg_dt DESC
+                 ) AS id
+             ON
+                 ei.ent_id = id.ent_id
+             WHERE
+                 ei.use_yn = 'Y'
+            ) AS ei_id
+        ON
+            rm.ivst_dscsn_id = ei_id.ivst_dscsn_id
+        LEFT JOIN
+            cd_mng cm
+        ON
+            rm."type" = cm.cd
+        WHERE
+            rm.use_yn = 'Y'
+        <!-- 검색어 -->
+        AND (
+            ei_id.ent_nm LIKE '%' || #{searchText} || '%'
+        OR
+            ei_id.ttl LIKE '%' || #{searchText} || '%'
+        )
+        <!-- 검색 기간 -->
+        <if test="startDt != null and startDt != ''">
+            <![CDATA[
+                AND rm.reg_dt::DATE >= #{startDt}::DATE
+            ]]>
+        </if>
+        <if test="endDt != null and endDt != ''">
+            <![CDATA[
+                AND rm.reg_dt::DATE <= #{endDt}::DATE
+            ]]>
+        </if>
+        <!-- 검색 정렬 -->
+        ORDER BY
+            rm.reg_dt DESC
+        LIMIT #{typePreCnt}
+    </select>
+    <!-- ********************************* 컨텐츠 검색 - 기업 정보 (종료) ********************************* -->
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/bbs/wordMng-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/bbs/wordMng-SQL.xml
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작성자 : 방선주
+    작성일 : 2024.05.31
+    내 용 : 금지어 등록
+-->
+<mapper namespace="com.takensoft.cms.bbs.dao.WordMngDAO">
+
+    <!--
+    작성자 : 방선주
+    작성일 : 2024.05.31
+    내 용 : 금지어 등록
+    -->
+    <insert id="saveWords" parameterType="WordMngVO">
+        INSERT INTO cntrl_nm_mng(
+                    cntrl_nm
+                  , rgtr
+                  , reg_dt
+        ) VALUES (
+                    #{cntrlNm}
+                  , #{rgtr}
+                  , now()
+        )
+    </insert>
+
+    <!--
+    작성자 : 방선주
+    작성일 : 2024.05.31
+    내 용 : 금지어 목록 조회
+    -->
+    <select id="findAllWord" parameterType="Pagination" resultType="WordMngVO">
+        SELECT cntrl_nm_id
+             , cntrl_nm
+             , cnm.rgtr
+             , mi.mbr_nm AS rgtr_nm
+             , to_char(cnm.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+          FROM cntrl_nm_mng cnm
+          LEFT JOIN mbr_info mi
+            ON cnm.rgtr = mi.mbr_id
+        <where>
+            <if test="searchText != null and searchText != ''">
+                <choose>
+                    <when test="searchType == 'cntrlNm'">
+                        AND cntrl_nm LIKE '%' || #{searchText} || '%'
+                    </when>
+                    <when test="searchType == 'rgtrNm'">
+                        AND mi.mbr_nm LIKE '%' || #{searchText} || '%'
+                    </when>
+                    <otherwise>
+                        AND (
+                        cntrl_nm LIKE '%' || #{searchText} || '%'
+                        OR
+                        mi.mbr_nm LIKE '%' || #{searchText} || '%'
+                        )
+                    </otherwise>
+                </choose>
+            </if>
+        </where>
+        ORDER BY cntrl_nm_id DESC
+        OFFSET #{limitStart} LIMIT #{recordSize}
+    </select>
+
+    <!--
+    작성자 : 방선주
+    작성일 : 2024.05.31
+    내 용 : 금지어 목록 count
+    -->
+    <select id="findAllCnt" parameterType="Pagination" resultType="Integer">
+        SELECT COUNT(cntrl_nm_id)
+        FROM cntrl_nm_mng
+        LEFT JOIN mbr_info mi
+        ON cntrl_nm_mng.rgtr = mi.mbr_id
+        <where>
+            <if test="searchText != null and searchText != ''">
+                <choose>
+                    <when test="searchType == 'cntrlNm'">
+                        AND cntrl_nm LIKE '%' || #{searchText} || '%'
+                    </when>
+                    <when test="searchType == 'rgtrNm'">
+                        AND mi.mbr_nm LIKE '%' || #{searchText} || '%'
+                    </when>
+                    <otherwise>
+                        AND (
+                        cntrl_nm LIKE '%' || #{searchText} || '%'
+                        OR
+                        mi.mbr_nm LIKE '%' || #{searchText} || '%'
+                        )
+                    </otherwise>
+                </choose>
+            </if>
+        </where>
+    </select>
+    <!--
+        작성자 : 방선주
+        작성일 : 2024.05.31
+        내 용 : 금지어 삭제
+    -->
+    <delete id="deleteWords" parameterType="Integer">
+        DELETE FROM cntrl_nm_mng
+        WHERE cntrl_nm_id = #{cntrlNmId}
+    </delete>
+
+    <!--
+        작성자 : 방선주
+        작성일 : 2024.05.31
+        내 용 : 금지어 string 목록
+    -->
+    <select id="findWordList" resultType="String">
+        SELECT cntrl_nm
+        FROM cntrl_nm_mng cnm
+
+    </select>
+
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/cntnStats/cntnStats-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/cntnStats/cntnStats-SQL.xml
@@ -0,0 +1,414 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작 성 자 : takensoft
+    작 성 일 : 2024.05.23
+    내   용 : 접속 통계 관련
+-->
+<mapper namespace="com.takensoft.cms.cntnStats.dao.CntnStatsDAO">
+
+    <!--                                   사용자 접속 통계 관련                                   -->
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.05.24
+        내 용 : 사용자 접속 통계 등록 검증
+    -->
+    <select id="userCntnStatsSaveChck" parameterType="CntnStatsVO" resultType="boolean">
+        SELECT COUNT(user_cntn_id)
+          FROM user_cntn_stats
+         WHERE authrt_cd = #{authrtCd}
+           AND cntn_yr = #{cntnYr}
+           AND cntn_mm = #{cntnMm}
+           AND cntn_day = #{cntnDay}
+    </select>
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.05.23
+        내 용 : 사용자 접속 통계 등록
+    -->
+    <insert id="userCntnStatsSave" parameterType="CntnStatsVO">
+        INSERT INTO user_cntn_stats (
+            authrt_cd
+            , cntn_yr
+            , cntn_mm
+            , cntn_day
+            , cntn_nope
+        ) VALUES (
+            #{authrtCd}
+            , #{cntnYr}
+            , #{cntnMm}
+            , #{cntnDay}
+            , 1
+        )
+    </insert>
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.05.23
+        내 용 : 사용자 접속 통계 카운트 증가
+    -->
+    <update id="userCntnStatsUpdate" parameterType="CntnStatsVO">
+        UPDATE user_cntn_stats
+           SET cntn_nope = cntn_nope + 1
+         WHERE authrt_cd = #{authrtCd}
+           AND cntn_yr = #{cntnYr}
+           AND cntn_mm = #{cntnMm}
+           AND cntn_day = #{cntnDay}
+    </update>
+    <!--                                   사용자 접속 통계 관련                                   -->
+
+
+    <!--                                   콘텐츠 접속 통계 관련                                   -->
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.05.24
+        내 용 : 콘텐츠 접속 통계 등록 검증
+    -->
+    <select id="contsCntnStatsSaveChck" parameterType="CntnStatsVO" resultType="boolean">
+        SELECT COUNT(conts_cntn_id)
+          FROM conts_cntn_stats
+         WHERE conts_id = #{typeId}
+           AND authrt_cd = #{authrtCd}
+           AND cntn_yr = #{cntnYr}
+           AND cntn_mm = #{cntnMm}
+           AND cntn_day = #{cntnDay}
+    </select>
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.05.23
+        내 용 : 컨텐츠 접속 통계 등록
+    -->
+    <insert id="contsCntnStatsSave" parameterType="CntnStatsVO">
+        INSERT INTO conts_cntn_stats (
+            conts_id
+            , authrt_cd
+            , cntn_yr
+            , cntn_mm
+            , cntn_day
+            , cntn_nope
+        ) VALUES (
+            #{typeId}
+            , #{authrtCd}
+            , #{cntnYr}
+            , #{cntnMm}
+            , #{cntnDay}
+            , 1
+        )
+    </insert>
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.05.24
+        내 용 : 콘텐츠 접속 통계 수정
+    -->
+    <update id="contsCntnStatsUpdate" parameterType="CntnStatsVO">
+        UPDATE conts_cntn_stats
+           SET cntn_nope = cntn_nope + 1
+         WHERE conts_id = #{typeId}
+           AND authrt_cd = #{authrtCd}
+           AND cntn_yr = #{cntnYr}
+           AND cntn_mm = #{cntnMm}
+           AND cntn_day = #{cntnDay}
+    </update>
+
+    <!--                                   콘텐츠 접속 통계 관련                                   -->
+
+
+    <!--                                   게시판 접속 통계 관련                                   -->
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.05.24
+        내 용 : 게시판 접속 통계 등록 검증
+    -->
+    <select id="bbsCntnStatsSaveChck" parameterType="CntnStatsVO" resultType="boolean">
+        SELECT COUNT(bbs_cntn_id)
+          FROM bbs_cntn_stats
+         WHERE bbs_id = #{typeId}
+           AND authrt_cd = #{authrtCd}
+           AND cntn_yr = #{cntnYr}
+           AND cntn_mm = #{cntnMm}
+           AND cntn_day = #{cntnDay}
+    </select>
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.05.23
+        내 용 : 게시판 접속 통계 등록
+    -->
+    <insert id="bbsCntnStatsSave" parameterType="CntnStatsVO">
+        INSERT INTO bbs_cntn_stats (
+            bbs_id
+            , authrt_cd
+            , cntn_yr
+            , cntn_mm
+            , cntn_day
+            , cntn_nope
+        ) VALUES (
+            #{typeId}
+            , #{authrtCd}
+            , #{cntnYr}
+            , #{cntnMm}
+            , #{cntnDay}
+            , 1
+        )
+    </insert>
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.05.24
+        내 용 : 게시판 접속 통계 수정
+    -->
+    <update id="bbsCntnStatsUpdate" parameterType="CntnStatsVO">
+        UPDATE bbs_cntn_stats
+           SET cntn_nope = cntn_nope + 1
+         WHERE bbs_id = #{typeId}
+           AND authrt_cd = #{authrtCd}
+           AND cntn_yr = #{cntnYr}
+           AND cntn_mm = #{cntnMm}
+           AND cntn_day = #{cntnDay}
+    </update>
+    <!--                                   게시판 접속 통계 관련                                   -->
+
+
+    <!--                                   메뉴 접속 통계 관련                                   -->
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.05.24
+        내 용 : 메뉴 접속 통계 등록 검증
+    -->
+    <select id="menuCntnStatsSaveChck" parameterType="CntnStatsVO" resultType="boolean">
+        SELECT COUNT(menu_cntn_id)
+          FROM menu_cntn_stats
+         WHERE menu_id = #{typeId}
+           AND authrt_cd = #{authrtCd}
+           AND cntn_yr = #{cntnYr}
+           AND cntn_mm = #{cntnMm}
+           AND cntn_day = #{cntnDay}
+    </select>
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.05.23
+        내 용 : 메뉴 접속 통계 등록
+    -->
+
+    <insert id="menuCntnStatsSave" parameterType="CntnStatsVO">
+        INSERT INTO menu_cntn_stats (
+            menu_id
+            , authrt_cd
+            , cntn_yr
+            , cntn_mm
+            , cntn_day
+            , cntn_nope
+        ) VALUES (
+            #{typeId}
+            , #{authrtCd}
+            , #{cntnYr}
+            , #{cntnMm}
+            , #{cntnDay}
+            , 1
+        )
+    </insert>
+    <!--
+       작성자 : takensoft
+       작성일 : 2024.05.24
+       내 용 : 메뉴 접속 통계 수정
+   -->
+    <update id="menuCntnStatsUpdate" parameterType="CntnStatsVO">
+        UPDATE menu_cntn_stats
+           SET cntn_nope = cntn_nope + 1
+         WHERE menu_id = #{typeId}
+           AND authrt_cd = #{authrtCd}
+           AND cntn_yr = #{cntnYr}
+           AND cntn_mm = #{cntnMm}
+           AND cntn_day = #{cntnDay}
+    </update>
+    <!--                                   메뉴 접속 통계 관련                                   -->
+
+    <!--                                   통계관리 관련 통계 정보                                   -->
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.05.28
+        내 용 : 사용자 접속 통계
+    -->
+
+    <!--                                   통계관리 관련 통계 정보                                   -->
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.30
+        내   용 : 사용자 접속 통계 목록 조회
+    -->
+    <select id="selectUserCntnStats" parameterType="HashMap" resultType="HashMap">
+        SELECT ai.dates
+             , array_agg(authrt_nm) AS authrt_nm
+             , array_agg(COALESCE(ucs.cntn_nope, 0)) AS cntn_nope
+        FROM (SELECT generate_series(to_date(#{startDt}, 'YYYY-MM-DD'), to_date(#{endDt}, 'YYYY-MM-DD'), '1 day'::interval)::date AS dates , authrt_cd , authrt_nm FROM authrt_info WHERE use_yn = 'Y') AS ai
+        LEFT JOIN (SELECT authrt_cd, to_date(concat(cntn_yr, cntn_mm, cntn_day), 'YYYYMMDD') AS cntn_date, cntn_nope FROM user_cntn_stats) AS ucs
+        ON dates = ucs.cntn_date
+        AND ai.authrt_cd = ucs.authrt_cd
+        GROUP BY ai.dates
+        ORDER BY dates DESC
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.30
+        내   용 : 사용자 접속 통계 목록 개수 조회
+    -->
+    <select id="selectUserCntnStatsCnt" parameterType="HashMap">
+        SELECT COALESCE(SUM(cntn_nope), 0)
+          FROM user_cntn_stats
+         WHERE to_date(concat(cntn_yr, cntn_mm, cntn_day), 'YYYYMMDD') >= to_date(#{startDt}, 'YYYY-MM-DD')
+           AND to_date(#{endDt}, 'YYYY-MM-DD') >= to_date(concat(cntn_yr, cntn_mm, cntn_day), 'YYYYMMDD')
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.30
+        내   용 : 메뉴별 접속 통계 목록 조회
+    -->
+    <select id="selectMenuCntnStats" parameterType="HashMap" resultType="HashMap">
+        WITH RECURSIVE menu_tree AS (
+            SELECT '' || mi.menu_nm AS menu_name
+                 , mi.menu_id
+              FROM menu_info AS mi
+             WHERE mi.use_yn = 'Y'
+               AND mi.menu_nm != '메인'
+               AND up_menu_id = #{menuMainDepth}
+        UNION ALL
+            SELECT mt.menu_name || ' > ' || mi.menu_nm AS menu_name
+                 , mi.menu_id
+              FROM menu_tree AS mt
+        INNER JOIN menu_info AS mi
+                ON mt.menu_id = mi.up_menu_id
+             WHERE mi.use_yn = 'Y'
+               AND mi.menu_nm != '메인'
+        )
+        select (SELECT menu_name FROM menu_tree WHERE menu_tree.menu_id = menus.menu_id) AS menu_name
+             , array_agg((SELECT authrt_nm FROM authrt_info WHERE authrt_info.authrt_cd = menus.authrt_cd AND authrt_info.use_yn = 'Y')) AS authrt_nm
+             , array_agg(cntn_nope) AS cntn_nope
+          from (select mt.menu_id, mai.authrt_cd, SUM(COALESCE(mcs.cntn_nope, 0)) AS cntn_nope
+                  from menu_tree AS mt
+             LEFT JOIN menu_authrt_info AS mai
+                    ON mt.menu_id = mai.menu_id
+             LEFT JOIN authrt_info AS ai
+                    ON mai.authrt_cd = ai.authrt_cd
+             LEFT JOIN menu_cntn_stats AS mcs
+                    ON mt.menu_id = mcs.menu_id
+                   AND mai.authrt_cd = mcs.authrt_cd
+                   AND TO_DATE(CONCAT(cntn_yr, cntn_mm, cntn_day), 'YYYYMMDD') >= TO_DATE(#{startDt}, 'YYYY-MM-DD')
+                   AND TO_DATE(#{endDt}, 'YYYY-MM-DD') >= TO_DATE(CONCAT(cntn_yr, cntn_mm, cntn_day), 'YYYYMMDD')
+                 WHERE ai.use_yn='Y'
+              group by mt.menu_id, mai.authrt_cd) as menus
+      group by menu_id
+      order by menu_name
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.30
+        내   용 : 메뉴별 접속 통계 목록 개수 조회
+    -->
+    <select id="selectMenuCntnStatsCnt" parameterType="HashMap">
+        WITH RECURSIVE menu_tree AS (
+            SELECT mi.*
+                 , '' || mi.menu_nm AS name
+              FROM menu_info mi
+             WHERE up_menu_id = #{menuMainDepth}
+            UNION ALL
+            SELECT mi.*
+                 , mt.name || ' > ' || mi.menu_nm AS name
+              FROM menu_tree mt
+        INNER JOIN menu_info mi
+                ON mt.menu_id = mi.up_menu_id
+        )
+        SELECT SUM(COALESCE(menu.cntn_nope, 0))
+          FROM menu_tree
+        LEFT JOIN (
+            SELECT menu_id, cntn_nope
+              FROM menu_cntn_stats
+             WHERE to_date(concat(cntn_yr, cntn_mm, cntn_day), 'YYYYMMDD') >= to_date(#{startDt}, 'YYYY-MM-DD')
+               AND to_date(#{endDt}, 'YYYY-MM-DD') >= to_date(concat(cntn_yr, cntn_mm, cntn_day), 'YYYYMMDD')
+        ) as menu
+            on menu_tree.menu_id = menu.menu_id
+         WHERE menu_tree.use_yn = 'Y'
+           AND menu_tree.menu_grd != '0'
+           AND menu_tree.menu_nm != '메인'
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.30
+        내   용 : 게시판 접속 통계 목록 조회
+    -->
+    <select id="selectBbsCntnStats" parameterType="HashMap" resultType="HashMap">
+        SELECT (SELECT bbs_nm from bbs_mng where bbs_mng_id = bbs.bbs_mng_id) AS bbs_nm
+             , array_agg((SELECT authrt_nm FROM authrt_info WHERE authrt_info.authrt_cd = bbs.authrt_cd AND authrt_info.use_yn = 'Y')) AS authrt_nm
+             , array_agg(coalesce(cntn_nope, 0)) AS cntn_nope
+        from (
+            SELECT bm.bbs_mng_id
+                 , ad.authrt_cd
+              from bbs_mng as bm
+            left join (
+                SELECT mai.authrt_cd
+                     , menu_type_ctgry
+                  from menu_info as mi
+             LEFT JOIN menu_authrt_info as mai
+                    on mi.menu_id = mai.menu_id
+             LEFT JOIN authrt_info AS ai
+                    ON mai.authrt_cd = ai.authrt_cd
+                 WHERE mi.use_yn = 'Y'
+                   AND ai.use_yn='Y'
+              order by mi.menu_id
+            ) as ad
+              on bm.bbs_mng_id = ad.menu_type_ctgry
+           where bm.use_yn = 'Y'
+        ) as bbs
+        left join (
+            select bbs_id
+                 , authrt_cd
+                 , sum(cntn_nope) as cntn_nope
+              from bbs_cntn_stats
+             where to_date(concat(cntn_yr, cntn_mm, cntn_day), 'YYYYMMDD') >= to_date(#{startDt}, 'YYYY-MM-DD')
+               AND to_date(#{endDt}, 'YYYY-MM-DD') >= to_date(concat(cntn_yr, cntn_mm, cntn_day), 'YYYYMMDD')
+          group by bbs_id, authrt_cd
+        ) as bcs
+          on bbs.bbs_mng_id = bcs.bbs_id
+         and bbs.authrt_cd = bcs.authrt_cd
+    group by bbs_mng_id
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.30
+        내   용 : 게시판 접속 통계 목록 개수 조회
+    -->
+    <select id="selectBbsCntnStatsCnt" parameterType="HashMap">
+        SELECT SUM(COALESCE(cntn_nope, 0))
+        FROM (
+            SELECT bm.bbs_mng_id
+                 , ad.authrt_cd
+              FROM bbs_mng AS bm
+            LEFT JOIN (
+                SELECT mai.authrt_cd
+                     , menu_type_ctgry
+                  FROM menu_info AS mi
+             LEFT JOIN menu_authrt_info AS mai
+                    ON mi.menu_id = mai.menu_id
+             LEFT JOIN authrt_info AS ai
+                    ON mai.authrt_cd = ai.authrt_cd
+                 WHERE mi.use_yn = 'Y'
+                   AND ai.use_yn='Y'
+              ORDER BY mi.menu_id
+            ) AS ad
+                ON bm.bbs_mng_id = ad.menu_type_ctgry
+             WHERE bm.use_yn = 'Y'
+        ) AS bbs
+        LEFT JOIN (
+            SELECT bbs_id
+                 , authrt_cd
+                 , SUM(COALESCE(cntn_nope, 0)) as cntn_nope
+              FROM bbs_cntn_stats
+             WHERE to_date(concat(cntn_yr, cntn_mm, cntn_day), 'YYYYMMDD') >= to_date(#{startDt}, 'YYYY-MM-DD')
+               AND to_date(#{endDt}, 'YYYY-MM-DD') >= to_date(concat(cntn_yr, cntn_mm, cntn_day), 'YYYYMMDD')
+          GROUP BY bbs_id, authrt_cd
+        ) AS bcs
+          ON bbs.bbs_mng_id = bcs.bbs_id
+         AND bbs.authrt_cd = bcs.authrt_cd
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/codeManage/codeManage-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/codeManage/codeManage-SQL.xml
@@ -0,0 +1,247 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작성자 : takensoft
+    작성일 : 2024.04.09
+    내 용 : 공통코드 관련
+-->
+<mapper namespace="com.takensoft.cms.codeManage.dao.CodeManageDAO">
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.09
+        내 용 : 공통코드 중복 확인
+    -->
+    <select id="findByCheckCd" resultType="boolean">
+        SELECT COUNT(cd)
+          FROM cd_mng
+         WHERE cd = #{cd}
+         <if test="originCd != null and originCd != ''">
+           AND cd != #{originCd}
+        </if>
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.09
+        내 용 : 코드 등록
+    -->
+    <insert id="save" parameterType="CodeManageVO">
+        INSERT INTO cd_mng (
+            cd
+            , up_cd
+            , cd_nm
+            , cd_vl
+            , cd_expln
+            , cd_grd
+            , cd_sn
+            , use_yn
+            , sys_pvsn_yn
+            , rgtr
+            , reg_dt
+        ) VALUES (
+            #{cd}
+            , #{upCd}
+            , #{cdNm}
+            , #{cdVl}
+            , #{cdExpln}
+            , #{cdGrd}
+            , #{cdSn}
+            , 'Y'
+            , 1
+            , #{rgtr}
+            , NOW()
+        )
+    </insert>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.09
+        내 용 : 코드 깊이 조회
+    -->
+    <select id="findByCdGrd" parameterType="String" resultType="Integer">
+        SELECT cd_grd
+          FROM cd_mng
+         WHERE cd = #{upCd}
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.09
+        내 용 : 코드 순서 조회
+    -->
+    <select id="findByCdSn" parameterType="String" resultType="Integer">
+        SELECT COALESCE(MAX(cd_sn), 0)
+          FROM cd_mng
+         WHERE use_yn = 'Y'
+         <choose>
+             <when test="upCd != null and upCd != ''">
+           AND up_cd = #{upCd}
+             </when>
+             <otherwise>
+           AND up_cd IS NULL
+             </otherwise>
+         </choose>
+    </select>
+
+    <sql id="selectCd">
+        SELECT cd
+             , up_cd
+             , cd_nm
+             , cd_vl
+             , cd_expln
+             , cd_grd
+             , cd_sn
+             , use_yn
+             , sys_pvsn_yn
+             , rgtr
+             , TO_CHAR(reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , mdfr
+             , TO_CHAR(mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+          FROM cd_mng
+    </sql>
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.09
+        내 용 : 최상위 코드 조회 [관리자용]
+    -->
+    <select id="findTopCd" resultType="CodeManageVO">
+        <include refid="selectCd" />
+         WHERE up_cd IS NULL
+      ORDER BY cd_sn
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.09
+        내 용 : 하위 코드 조회 [관리자용]
+    -->
+    <select id="findChildCd" parameterType="String" resultType="CodeManageVO">
+        <include refid="selectCd" />
+         WHERE up_cd = #{cd}
+      ORDER BY cd_sn
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.09
+        내 용 : 하위 코드 조회 [사용자용]
+    -->
+    <select id="findChildCdUser" parameterType="String" resultType="CodeManageVO">
+        <include refid="selectCd" />
+        WHERE up_cd = #{cd}
+          AND use_yn = 'Y'
+        ORDER BY cd_sn
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.09
+        내 용 : 코드 상세 조회
+    -->
+    <select id="findByCd" parameterType="String" resultType="CodeManageVO">
+        SELECT cm.cd
+             , cm.up_cd
+             , cm2.cd_nm AS up_cd_nm
+             , cm.cd_nm
+             , cm.cd_vl
+             , cm.cd_expln
+             , cm.cd_grd
+             , cm.cd_sn
+             , cm.use_yn
+             , cm.sys_pvsn_yn
+             , cm.rgtr
+             , TO_CHAR(cm.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , cm.mdfr
+             , TO_CHAR(cm.mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+          FROM cd_mng cm
+     LEFT JOIN cd_mng cm2
+            ON cm.up_cd = cm2.cd
+         WHERE cm.cd = #{cd}
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.15
+        내 용 : 코드 수정
+    -->
+    <update id="update" parameterType="CodeManageVO">
+        UPDATE cd_mng
+           SET cd = #{cd}
+             , up_cd = #{upCd}
+             , cd_nm = #{cdNm}
+             , cd_vl = #{cdVl}
+             , cd_expln = #{cdExpln}
+             , cd_grd = #{cdGrd}
+             , cd_sn = #{cdSn}
+             , use_yn = #{useYn}
+             , mdfr = #{mdfr}
+             , mdfcn_dt = NOW()
+        WHERE cd = #{originCd}
+    </update>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.26
+        내 용 : 상위코드가 수정됨에 따라 하위코드의 상위코드값 변경
+    -->
+    <update id="updateUpCd" parameterType="CodeManageVO">
+        UPDATE cd_mng
+           SET up_cd = #{cd}
+         WHERE up_cd = #{originCd}
+    </update>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.23
+        내 용 : 코드 삭제
+    -->
+    <delete id="deleteCd" parameterType="String">
+        WITH RECURSIVE CodeHierarchy AS (
+            SELECT cd
+                 , up_cd
+              FROM cd_mng
+             WHERE cd = #{cd}
+         UNION ALL
+            SELECT cm.cd
+                 , cm.up_cd
+              FROM cd_mng cm
+              JOIN CodeHierarchy ch
+                ON cm.up_cd = ch.cd
+        )
+        DELETE FROM cd_mng WHERE cd IN (SELECT cd FROM CodeHierarchy)
+    </delete>
+
+    <!--  공통코드 관리(관리자 페이지 Tree 호출 전용)  -->
+    <sql id="selectNode">
+        SELECT cd       AS id
+             , up_cd    AS up_id
+             , cd_nm    AS nm
+          FROM cd_mng
+    </sql>
+    <select id="findByTopNode" resultType="HierachyVO">
+        <include refid="selectNode" />
+         WHERE up_cd IS NULL
+      ORDER BY cd_sn
+    </select>
+    <select id="findChildNode" parameterType="String" resultType="HierachyVO">
+        <include refid="selectNode" />
+        WHERE up_cd = #{id}
+        ORDER BY cd_sn
+    </select>
+
+    <!--
+        작성자 : 박정하
+        작성일 : 2024.05.10
+        내 용 : 공통 코드 정보 수정 (hierachyVO 사용)
+    -->
+    <update id="codeUpdateByHierachy" parameterType="CodeManageVO">
+        UPDATE cd_mng
+        SET up_cd = #{upCd}
+          , cd_grd = #{cdGrd}
+          , cd_sn = #{cdSn}
+          , mdfr = #{mdfr}
+          , mdfcn_dt = NOW()
+        WHERE cd = #{cd}
+    </update>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/common/Idgen-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/common/Idgen-SQL.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작성자 : takensoft
+    작성일 : 2024.01.01
+    내  용 : idgen 관련 mapper
+-->
+<mapper namespace="com.takensoft.common.idgen.dao.IdgenMapper">
+
+    <!--
+        작 성 자 : takensoft
+        작 성 일 : 2024.01.01
+        내    용 : 테이블명으로 시퀀스 조회
+    -->
+    <select id="selectNextId" parameterType="String" resultType="IdgenVO">
+        SELECT aftr_id
+          FROM cmmn_idgn
+         WHERE tbl_nm = #{tblNm}
+    </select>
+
+    <!--
+        작 성 자 : takensoft
+        작 성 일 : 2024.04.01
+        내    용 : 시퀀스 등록 및 수정
+    -->
+    <insert id="upsertSeqNmg" parameterType="IdgenVO">
+        INSERT INTO cmmn_idgn (
+            tbl_nm
+            , aftr_id
+        ) VALUES (
+            #{tblNm}
+            , #{aftrId}
+        )
+        ON CONFLICT (tbl_nm)
+        DO UPDATE
+        SET aftr_id = #{aftrId}
+    </insert>
+
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/common/file-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/common/file-SQL.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.takensoft.common.file.dao.FileDAO">
+    <!-- 파일 resultMap -->
+    <resultMap id="fileMap" type="HashMap">
+        <result property="fileId" column="file_id" />
+        <result property="fileMngId" column="file_mng_id" />
+        <result property="fileNm" column="file_nm" />
+        <result property="maskNm" column="mask_nm" />
+        <result property="fileType" column="file_type" />
+        <result property="absltPath" column="abslt_path" />
+        <result property="partPath" column="part_path" />
+        <result property="extnNm" column="extn_nm" />
+        <result property="fileSz" column="file_sz" />
+        <result property="rgtr" column="rgtr" />
+        <result property="regDt" column="reg_dt" />
+    </resultMap>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.03.26
+    내   용 : 파일 등록
+    -->
+    <insert id="fileInsert" parameterType="HashMap">
+        INSERT INTO cmmn_file (
+            file_mng_id
+            , file_nm
+            , mask_nm
+            , file_type
+            , abslt_path
+            , part_path
+            , extn_nm
+            , file_sz
+            , rgtr
+            , reg_dt
+        ) VALUES (
+            #{fileMngId}
+            , #{fileNm}
+            , #{maskNm}
+            , #{fileType}
+            , #{absltPath}
+            , #{partPath}
+            , #{extnNm}
+            , #{fileSz}
+            , #{rgtr}
+            , now()
+        )
+    </insert>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.03.26
+    내   용 : 파일 목록 조회
+    -->
+    <select id="fileSelectList" parameterType="String" resultMap="fileMap">
+        SELECT file_id
+             , file_mng_id
+             , file_nm
+             , mask_nm
+             , file_type
+             , abslt_path
+             , part_path
+             , extn_nm
+             , file_sz
+             , rgtr
+             , reg_dt
+        FROM cmmn_file
+        WHERE file_mng_id = #{fileMngId}
+        ORDER BY file_id ASC
+    </select>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.03.27
+    내   용 : 파일 삭제
+    -->
+    <delete id="fileDelete" parameterType="HashMap">
+        DELETE
+        FROM cmmn_file
+        WHERE file_id = #{fileId}
+    </delete>
+
+    <!--
+    작 성 자 : 방선주
+    작 성 일 : 2024.05.21
+    내   용 : 파일 단일 조회
+    -->
+    <select id="fileSelectOne" parameterType="Integer" resultType="FileVO">
+        SELECT file_id
+             , file_mng_id
+             , file_nm
+             , mask_nm
+             , file_type
+             , abslt_path
+             , part_path
+             , extn_nm
+             , file_sz
+             , rgtr
+             , reg_dt
+        FROM cmmn_file
+        WHERE file_id = #{fileId}
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/common/fileManage-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/common/fileManage-SQL.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.takensoft.common.file.dao.FileMngDAO">
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.03.26
+    내   용 : 파일매니저 등록
+    -->
+    <insert id="fileMngInsert" parameterType="HashMap">
+        INSERT INTO cmmn_file_mng (
+            file_mng_id
+            , rgtr
+            , reg_dt
+        ) VALUES (
+            #{fileMngId}
+            , #{rgtr}
+            , now()
+        )
+    </insert>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.03.27
+    내   용 : 파일매니저 수정
+    -->
+    <update id="fileMngUpadate" parameterType="HashMap">
+        UPDATE cmmn_file_mng
+           SET mdfr = #{mdfr}
+             , mdfcn_dt = now()
+         WHERE file_mng_id = #{fileMngId}
+    </update>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.03.27
+    내   용 : 파일매니저 삭제
+    -->
+    <delete id="fileMngDelete" parameterType="HashMap">
+        DELETE
+        FROM cmmn_file_mng
+        WHERE file_mng_id = #{fileMngId}
+    </delete>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/contsType/contsType-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/contsType/contsType-SQL.xml
@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작성자 : takensoft
+    작성일 : 2024.04.17
+    내 용 : 콘텐츠 유형 관리 관련
+-->
+<mapper namespace="com.takensoft.cms.contsType.dao.ContsTypeDAO">
+
+    <!-- 콘텐츠 조회(라우터 조회용 - 권한포함) -->
+    <resultMap id="contsAuthrtMap" type="ContsAuthrtVO">
+        <result property="contsId" column="conts_id" />
+<!--        <result property="menuId" column="menu_id" />-->
+        <result property="contsKornNm" column="conts_korn_nm" />
+        <result property="contsEngNm" column="conts_eng_nm" />
+        <result property="pageCrs" column="page_crs" />
+        <result property="mngrPageCrs" column="mngr_page_crs" />
+        <result property="compnCrs" column="compn_crs" />
+        <collection property="authrtList" ofType="MenuAuthorVO">
+            <result property="authrtCd" column="authrt_cd" />
+            <result property="menuId" column="menu_id" />
+            <result property="inqAuthrt" column="inq_authrt" />
+            <result property="regAuthrt" column="reg_authrt" />
+            <result property="mdfcnAuthrt" column="mdfcn_authrt" />
+            <result property="delAuthrt" column="del_authrt" />
+            <result property="fileDwnldAuthrt" column="file_dwnld_authrt" />
+        </collection>
+    </resultMap>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.17
+        내 용 : 콘텐츠 유형 등록
+    -->
+    <insert id="save" parameterType="ContsTypeVO">
+        INSERT INTO conts_type_mng (
+            conts_id
+            , conts_korn_nm
+            , conts_eng_nm
+            , page_crs
+            , mngr_page_crs
+            , compn_crs
+            , expsr_yn
+            , use_yn
+            , sys_pvsn_yn
+            , rgtr
+            , reg_dt
+        ) VALUES (
+            #{contsId}
+            , #{contsKornNm}
+            , #{contsEngNm}
+            , #{pageCrs}
+            , #{mngrPageCrs}
+            , #{compnCrs}
+            , #{expsrYn}
+            , 'Y'
+            , '1'
+            , #{rgtr}
+            , NOW()
+        )
+    </insert>
+
+    <!--
+       작성자 : takensoft
+       작성일 : 2024.04.17
+       내 용 : 콘텐츠 유형 수정
+   -->
+    <update id="update" parameterType="ContsTypeVO">
+        UPDATE conts_type_mng
+           SET conts_korn_nm = #{contsKornNm}
+             , conts_eng_nm = #{contsEngNm}
+             , page_crs = #{pageCrs}
+             , mngr_page_crs = #{mngrPageCrs}
+             , compn_crs = #{compnCrs}
+             , expsr_yn = #{expsrYn}
+             , use_yn = #{useYn}
+             , mdfr = #{mdfr}
+             , mdfcn_dt = NOW()
+         WHERE conts_id = #{contsId}
+    </update>
+
+   <sql id="selectContsType">
+        SELECT conts_id
+             , conts_korn_nm
+             , conts_eng_nm
+             , page_crs
+             , mngr_page_crs
+             , compn_crs
+             , expsr_yn
+             , use_yn
+             , sys_pvsn_yn
+             , rgtr
+             , to_char(reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , mdfr
+             , to_char(mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+          FROM conts_type_mng
+   </sql>
+
+    <!-- 검색 조건 -->
+    <sql id="selectRequirement">
+        <if test="searchText != null and searchText != ''">
+            AND conts_korn_nm LIKE '%' || #{searchText} || '%'
+        </if>
+    </sql>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.17
+        내 용 : 콘텐츠 유형 목록 조회
+    -->
+    <select id="findAll" parameterType="Pagination" resultType="ContsTypeVO">
+        <include refid="selectContsType" />
+        WHERE use_yn = 'Y'
+        <include refid="selectRequirement" />
+        ORDER BY conts_id DESC
+        OFFSET #{limitStart} LIMIT #{recordSize}
+    </select>
+
+    <!--
+       작성자 : takensoft
+       작성일 : 2024.04.17
+       내 용 : 콘텐츠 유형 목록 조회(사용자 등록 항목[sys_pvsn_yn = 0])
+   -->
+    <select id="findByContsTypeSys" parameterType="ContsTypeVO" resultType="ContsTypeVO">
+        <include refid="selectContsType" />
+        WHERE use_yn = 'Y'
+--           AND sys_pvsn_yn = '0'
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.17
+        내 용 : 콘텐츠 유형 상세 조회
+    -->
+    <select id="findByContsType" parameterType="String" resultType="ContsTypeVO">
+        <include refid="selectContsType" />
+        WHERE conts_id = #{contsId}
+    </select>
+
+    <!--
+        작성자 : 박정하
+        작성일 : 2024.04.23
+        내 용 : 콘텐츠 유형 목록 갯수(관리자 페이지용)
+    -->
+    <select id="findAllCnt" parameterType="Pagination" resultType="Integer">
+        SELECT COUNT(conts_id)
+          FROM conts_type_mng
+         WHERE use_yn = 'Y'
+        <include refid="selectRequirement" />
+    </select>
+
+    <!--
+        작성자 : 박정하
+        작성일 : 2024.04.29
+        내 용 : 콘텐츠 유형 목록 조회 (메뉴 노출 건만 - 사용자 등록 항목[sys_pvsn_yn = 1])
+    -->
+    <select id="findAllByExpsr" parameterType="ContsTypeVO" resultType="ContsTypeVO">
+        <include refid="selectContsType" />
+        WHERE use_yn = 'Y'
+        AND expsr_yn = 'Y'
+<!--        <if test="sysPvsnYn != null and sysPvsnYn != ''">-->
+<!--            AND sys_pvsn_yn = #{sysPvsnYn}-->
+<!--        </if>-->
+        <choose>
+            <when test="sysPvsnYn != null and sysPvsnYn != ''">
+                ORDER BY conts_id ASC
+            </when>
+            <otherwise>
+                ORDER BY conts_id DESC
+            </otherwise>
+        </choose>
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.05.02
+        내 용 : 콘텐츠 조회(권한 포함)
+    -->
+    <select id="findByContsAuthrt" resultMap="contsAuthrtMap">
+        SELECT ctm.conts_id
+             , ctm.conts_korn_nm
+             , ctm.conts_eng_nm
+             , ctm.page_crs
+             , ctm.compn_crs
+             , mi.menu_id
+             , mai.authrt_cd
+             , mai.inq_authrt
+             , mai.reg_authrt
+             , mai.mdfcn_authrt
+             , mai.del_authrt
+             , mai.file_dwnld_authrt
+          FROM ( SELECT conts_id
+                      , conts_korn_nm
+                      , conts_eng_nm
+                      , page_crs
+                      , compn_crs
+                   FROM conts_type_mng
+                  WHERE use_yn = 'Y'
+                    AND page_crs IS NOT NULL
+                    AND page_crs != ''
+
+              UNION ALL
+
+                 SELECT conts_id
+                      , conts_korn_nm
+                      , concat('adm', conts_eng_nm) AS conts_eng_nm
+                      , mngr_page_crs AS page_crs
+                      , compn_crs
+                   FROM conts_type_mng
+                  WHERE use_yn = 'Y'
+                    AND mngr_page_crs IS NOT NULL
+                    AND mngr_page_crs != ''
+              ) ctm
+     LEFT JOIN menu_info mi
+            ON ctm.conts_id = mi.menu_type_ctgry
+     LEFT JOIN menu_authrt_info mai
+            ON mi.menu_id = mai.menu_id
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/dept/dept-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/dept/dept-SQL.xml
@@ -0,0 +1,343 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작성자 : takensoft
+    작성일 : 2024.04.24
+    내 용 : 부서 관련
+-->
+<mapper namespace="com.takensoft.cms.dept.dao.DeptDAO">
+    <!-- 부서 정보 resultMap(권한포함) -->
+    <resultMap id="deptMap" type="DeptVO">
+        <result property="deptId" column="dept_id" />
+        <result property="upDeptId" column="up_dept_id" />
+        <result property="deptNm" column="dept_nm" />
+        <result property="upDeptNm" column="up_dept_nm" />
+        <result property="deptExpln" column="dept_expln" />
+        <result property="deptGrd" column="dept_grd" />
+        <result property="deptSn" column="dept_sn" />
+        <result property="useYn" column="use_yn" />
+        <result property="rgtr" column="rgtr" />
+        <result property="regDt" column="reg_dt" />
+        <result property="mdfr" column="mdfr" />
+        <result property="mdfcnDt" column="mdfcn_dt" />
+        <collection property="authrtList" column="{deptId = dept_id}" javaType="java.util.ArrayList" ofType="DeptAuthrtVO" select="findByDeptAuthrt" />
+    </resultMap>
+
+    <!-- 부서, 권한 매핑 -->
+    <resultMap id="authMap" type="DeptAuthrtVO">
+        <result property="deptId" column="dept_id" />
+        <result property="authrtCd" column="authrt_cd" />
+        <result property="rgtr" column="rgtr" />
+        <result property="regDt" column="reg_dt" />
+    </resultMap>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.25
+        내 용 : 부서 등록
+    -->
+    <insert id="save" parameterType="DeptVO">
+        INSERT INTO dept_info (
+            dept_id
+            , up_dept_id
+            , dept_nm
+            , dept_expln
+            , dept_grd
+            , dept_sn
+            , use_yn
+            , rgtr
+            , reg_dt
+        ) VALUES (
+            #{deptId}
+            , #{upDeptId}
+            , #{deptNm}
+            , #{deptExpln}
+            , #{deptGrd}
+            , #{deptSn}
+            , 'Y'
+            , #{rgtr}
+            , NOW()
+        )
+    </insert>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.25
+        내 용 : 부서 권한 등록
+    -->
+    <insert id="authrtSave" parameterType="DeptAuthrtVO">
+        INSERT INTO dept_authrt_info (
+            authrt_cd
+            , dept_id
+            , rgtr
+            , reg_dt
+        ) VALUES (
+            #{authrtCd}
+            , #{deptId}
+            , #{rgtr}
+            , NOW()
+        )
+    </insert>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.29
+        내 용 : 부서 사용자 등록
+    -->
+    <insert id="deptMbrSave" parameterType="DeptMbrVO">
+        INSERT INTO dept_mbr_info (
+            dept_id
+            , mbr_id
+            , rgtr
+            , reg_dt
+        ) VALUES (
+            #{deptId}
+            , #{mbrId}
+            , #{rgtr}
+            , NOW()
+        )
+    </insert>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.25
+        내 용 : 부서 깊이(레벨) 조회
+    -->
+    <select id="findByDeptGrd" parameterType="String" resultType="Integer">
+        SELECT dept_grd
+          FROM dept_info
+         WHERE dept_id = #{upDeptId}
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.25
+        내 용 : 부서 순서 조회
+    -->
+    <select id="findByDeptSn" parameterType="String" resultType="Integer">
+        SELECT COALESCE(MAX(dept_sn), 0)
+          FROM dept_info
+         WHERE use_yn = 'Y'
+         <choose>
+             <when test="upDeptId != null and upDeptId != ''">
+           AND up_dept_id = #{upDeptId}
+             </when>
+             <otherwise>
+           AND up_dept_id IS NULL
+             </otherwise>
+         </choose>
+    </select>
+
+    <!--  부서 관리(관리자 페이지 Tree 호출용)   -->
+    <sql id="selecteNode">
+        SELECT dept_id AS id
+             , up_dept_id AS up_id
+             , dept_nm AS nm
+          FROM dept_info
+    </sql>
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.25
+        내 용 : 상위 부서 조회
+    -->
+    <select id="findByTopNode" resultType="HierachyVO">
+        <include refid="selecteNode" />
+        WHERE up_dept_id IS NULL
+          AND use_yn = 'Y'
+     ORDER BY dept_sn
+    </select>
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.25
+        내 용 : 하위 부서 조회
+    -->
+    <select id="findChildNode" parameterType="String" resultType="HierachyVO">
+        <include refid="selecteNode" />
+        WHERE up_dept_id = #{id}
+          AND use_yn = 'Y'
+     ORDER BY dept_sn
+    </select>
+    <!--  부서 관리(관리자 페이지 Tree 호출용)   -->
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.26
+        내 용 : 부서정보 조회
+    -->
+    <select id="findByDept" parameterType="String" resultMap="deptMap">
+        SELECT di.dept_id
+             , di.up_dept_id
+             , di.dept_nm
+             , di2.dept_nm AS up_dept_nm
+             , di.dept_expln
+             , di.dept_grd
+             , di.dept_sn
+             , di.use_yn
+             , di.rgtr
+             , TO_CHAR(di.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , di.mdfr
+             , TO_CHAR(di.mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+          FROM dept_info di
+     LEFT JOIN dept_info di2
+            ON di.up_dept_id = di2.dept_id
+         WHERE di.dept_id = #{deptId}
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.26
+        내 용 : 부서 권한 정보 조회
+    -->
+    <select id="findByDeptAuthrt" parameterType="DeptVO" resultMap="authMap">
+        SELECT dai.authrt_cd
+             , dai.dept_id
+             , dai.rgtr
+             , TO_CHAR(dai.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+          FROM dept_authrt_info dai
+         WHERE dai.dept_id = #{deptId}
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.26
+        내 용 : 부서정보 수정
+    -->
+    <update id="update" parameterType="DeptVO">
+        UPDATE dept_info
+           SET up_dept_id = #{upDeptId}
+             , dept_nm = #{deptNm}
+             , dept_expln = #{deptExpln}
+             , dept_grd = #{deptGrd}
+             , dept_sn = #{deptSn}
+             , use_yn = #{useYn}
+             , mdfr = #{mdfr}
+             , mdfcn_dt = NOW()
+         WHERE dept_id = #{deptId}
+    </update>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.26
+        내 용 : 부서권한 삭제
+    -->
+    <delete id="deleteAuth" parameterType="String">
+        DELETE
+          FROM dept_authrt_info
+         WHERE dept_id = #{deptId}
+    </delete>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.26
+        내 용 : 부서 사용자 등록을 위한 사용자 정보 목록 조회 (부서에 등록되지 않은 사용자 목록)
+    -->
+    <select id="findByMber" parameterType="Map" resultType="DeptMbrVO">
+        SELECT mi.mbr_id
+             , mi.lgn_id
+             , mi.mbr_nm
+             , mi.ncnm
+             , mi.eml
+             , mi.mbl_telno
+          FROM mbr_info mi
+         WHERE NOT EXISTS (
+            SELECT 1
+              FROM dept_mbr_info dmi
+             WHERE dmi.mbr_id = mi.mbr_id
+         )
+           AND mi.use_yn = 'Y'
+           AND mi.mbr_stts = '1'
+         <if test="searchText != null and searchText != ''">
+           AND mi.mbr_nm LIKE '%' || #{searchText}  || '%'
+         </if>
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.26
+        내 용 : 부서에 등록된 사용자 목록 조회
+    -->
+    <select id="findByDeptMber" parameterType="String" resultType="DeptMbrVO">
+        SELECT dmi.dept_id
+             , mi.mbr_id
+             , mi.lgn_id
+             , mi.mbr_nm
+             , mi.ncnm
+             , mi.eml
+             , mi.mbl_telno
+             , dmi.rgtr
+             , TO_CHAR(dmi.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+          FROM dept_mbr_info dmi
+     LEFT JOIN mbr_info mi
+            ON dmi.mbr_id = mi.mbr_id
+         WHERE dmi.dept_id = #{deptId}
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.26
+        내 용 : 상위,하위 부서 삭제
+    -->
+    <update id="deleteDept" parameterType="String">
+        WITH RECURSIVE DeptHierarchy AS (
+            SELECT dept_id
+                 , up_dept_id
+              FROM dept_info
+             WHERE dept_id = #{deptId}
+         UNION ALL
+            SELECT di.dept_id
+                 , di.up_dept_id
+              FROM dept_info di
+              JOIN DeptHierarchy dh
+                ON di.up_dept_id = dh.dept_id
+        )
+        UPDATE dept_info SET use_yn = 'N' WHERE dept_id IN (SELECT dept_id FROM DeptHierarchy);
+    </update>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.26
+        내 용 : 상위, 하위 부서 삭제에 따른 부서의 사용자 삭제
+    -->
+    <delete id="deleteDeptInDeptMbr" parameterType="String">
+         WITH RECURSIVE DeptHierarchy AS (
+            SELECT dept_id
+                 , up_dept_id
+              FROM dept_info
+             WHERE dept_id = #{deptId}
+         UNION ALL
+            SELECT di.dept_id
+                 , di.up_dept_id
+              FROM dept_info di
+              JOIN DeptHierarchy dh
+                ON di.up_dept_id = dh.dept_id
+        )
+        DELETE FROM dept_mbr_info WHERE dept_id IN (SELECT dept_id FROM DeptHierarchy);
+    </delete>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.26
+        내 용 : 부서에 등록된 사용자 제거
+    -->
+    <delete id="deleteDeptMbr" parameterType="Map">
+        DELETE
+          FROM dept_mbr_info
+         WHERE 1 = 1
+           AND mbr_id = #{mbrId}
+    </delete>
+
+    <!--
+        작성자 : 박정하
+        작성일 : 2024.05.10
+        내 용 : 부서 정보 수정 (hierachyVO 사용)
+    -->
+    <update id="deptUpdateByHierachy" parameterType="DeptVO">
+        UPDATE dept_info
+        SET up_dept_id = #{upDeptId}
+          , dept_grd = #{deptGrd}
+          , dept_sn = #{deptSn}
+          , mdfr = #{mdfr}
+          , mdfcn_dt = NOW()
+        WHERE dept_id = #{deptId}
+    </update>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/entDscsnAply/entDscsnAply-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/entDscsnAply/entDscsnAply-SQL.xml
@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.takensoft.portal.entDscsnAply.dao.EntDscsnAplyDAO">
+    <!-- 기업상담신청 resultMap -->
+    <resultMap id="entDscsnAplyMap" type="EntDscsnAplyVO">
+        <result property="entDscsnAplyId" column="ent_dscsn_aply_id" />
+        <result property="entNm" column="ent_nm" />
+        <result property="aplcntNm" column="aplcnt_nm" />
+        <result property="telno" column="telno" />
+        <result property="eml" column="eml" />
+        <result property="aplyCn" column="aply_cn" />
+        <result property="fileMngId" column="file_mng_id" />
+        <result property="actnPic" column="actn_pic" />
+        <result property="actnDt" column="actn_dt" />
+        <result property="rmrk" column="rmrk" />
+        <result property="prcsStts" column="prcs_stts" />
+        <result property="useYn" column="use_yn" />
+        <result property="aplcntIp" column="aplcnt_ip" />
+        <result property="regDt" column="reg_dt" />
+        <result property="mbrNm" column="mbr_nm" />
+    </resultMap>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.04.02
+    내   용 : 기업상담신청 등록
+    -->
+    <insert id="entDscsnAplyInsert" parameterType="HashMap">
+        INSERT INTO ent_dscsn_aply (
+            ent_dscsn_aply_id
+            , ent_nm
+            , aplcnt_nm
+            , telno
+            , eml
+            , aply_cn
+            , file_mng_id
+            , actn_pic
+            , actn_dt
+            , rmrk
+            , prcs_stts
+            , use_yn
+            , aplcnt_ip
+            , reg_dt
+        ) VALUES (
+            #{entDscsnAplyId}
+            , #{entNm}
+            , #{aplcntNm}
+            , #{telno}
+            , #{eml}
+            , #{aplyCn}
+            , #{fileMngId}
+            , #{actnPic}
+            , #{actnDt}::timestamp
+            , #{rmrk}
+            , null
+            , 'Y'
+            , #{aplcntIp}
+            , now()
+        )
+    </insert>
+
+    <!-- SELECT SQL -->
+    <sql id="selectItem">
+        SELECT eda.ent_dscsn_aply_id
+             , eda.ent_nm
+             , eda.aplcnt_nm
+             , eda.telno
+             , eda.eml
+             , eda.aply_cn
+             , eda.file_mng_id
+             , eda.actn_pic
+             , to_char(eda.actn_dt, 'YYYY-MM-DD HH24:MI') AS actn_dt
+             , eda.rmrk
+             , eda.prcs_stts
+             , eda.use_yn
+             , eda.aplcnt_ip
+             , to_char(eda.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , mi.mbr_nm
+          FROM ent_dscsn_aply AS eda
+     LEFT JOIN mbr_info AS mi
+            ON eda.actn_pic = mi.mbr_id
+           AND mi.use_yn = 'Y'
+         WHERE eda.use_yn = 'Y'
+    </sql>
+
+    <sql id="selectRequirement">
+        <if test="searchText != null and searchText != ''">
+            AND ent_nm LIKE '%' || #{searchText} || '%'
+        </if>
+        <if test="cateValue != null and cateValue != ''">
+            <choose>
+                <when test='cateValue == "S"'>
+                    AND prcs_stts IS NULL
+                </when>
+                <otherwise>
+                    AND prcs_stts = #{cateValue}
+                </otherwise>
+            </choose>
+        </if>
+    </sql>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.04.02
+    내   용 : 기업상담신청 목록 조회
+    -->
+    <select id="entDscsnAplyList" parameterType="Pagination" resultMap="entDscsnAplyMap">
+        SELECT ent_dscsn_aply_id
+             , ent_nm
+             , aplcnt_nm
+             , telno
+             , eml
+             , aply_cn
+             , file_mng_id
+             , actn_pic
+             , actn_dt
+             , rmrk
+             , prcs_stts
+             , use_yn
+             , aplcnt_ip
+             , reg_dt
+             , mbr_nm
+        FROM (
+            <include refid="selectItem" />
+            <if test='isAdmin != "Y"'>
+                AND actn_pic = #{mbrId}
+            </if>
+        ) AS datas
+        WHERE TRUE
+        <include refid="selectRequirement" />
+        ORDER BY reg_dt DESC
+        OFFSET #{limitStart} LIMIT #{recordSize}
+    </select>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.04.02
+    내   용 : 기업상담신청 목록 총 개수 조회
+    -->
+    <select id="entDscsnAplyListCount" parameterType="Pagination" resultType="int">
+        SELECT COUNT(ent_dscsn_aply_id)
+        FROM (
+            <include refid="selectItem" />
+            <if test='isAdmin != "Y"'>
+                AND actn_pic = #{mbrId}
+            </if>
+        ) AS datas
+        WHERE TRUE
+        <include refid="selectRequirement" />
+    </select>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.04.02
+    내   용 : 기업상담신청 상세 조회
+    -->
+    <select id="entDscsnAplyDetail" parameterType="String" resultMap="entDscsnAplyMap">
+        <include refid="selectItem" />
+        AND ent_dscsn_aply_id = #{entDscsnAplyId}
+    </select>
+
+    <!--
+    작성자 : 박정하
+    작성일자 : 2024-04-02
+    내용 : 기업상담신청 수정
+    -->
+    <update id="entDscsnAplyUpdate" parameterType="HashMap">
+        UPDATE ent_dscsn_aply
+        SET actn_pic = #{actnPic},
+            actn_dt = now(),
+            rmrk = #{rmrk},
+            prcs_stts = #{prcsStts}
+        WHERE ent_dscsn_aply_id = #{entDscsnAplyId}
+    </update>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.04.04
+    내   용 : 기업상담신청 1시간 이내 동일 아이피 등록 개수
+    -->
+    <select id="entDscsnAplyCountByOneHourWriteSameIp" parameterType="string" resultType="HashMap">
+        SELECT COALESCE(count(0), 0) AS writecount,
+               '1 HOUR'::interval - (now() - MIN(reg_dt)) AS lastdatetime
+        FROM ent_dscsn_aply
+        WHERE aplcnt_ip = #{aplcntIp}
+          AND reg_dt > now() - '1 HOUR'::interval
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/entInfo/bplc-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/entInfo/bplc-SQL.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.takensoft.portal.entInfo.dao.BplcDAO">
+    <!-- 기업주요사업장 resultMap -->
+    <resultMap id="bplcMap" type="HashMap">
+        <result property="bplcId" column="bplc_id" />
+        <result property="entId" column="ent_id" />
+        <result property="wrkrCnt" column="wrkr_cnt" />
+        <result property="bplcAddr" column="bplc_addr" />
+        <result property="useYn" column="use_yn" />
+        <result property="rgtr" column="rgtr" />
+        <result property="regDt" column="reg_dt" />
+        <result property="mdfr" column="mdfr" />
+        <result property="mdfcnDt" column="mdfcn_dt" />
+        <result property="bplcNm" column="bplc_nm" />
+        <result property="mainPrdt" column="main_prdt" />
+        <result property="bplcSiar" column="bplc_siar" />
+        <result property="fctryArea" column="fctry_area" />
+        <result property="bplcSiarUnit" column="bplc_siar_unit" />
+        <result property="fctryAreaUnit" column="fctry_area_unit" />
+    </resultMap>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.06.10
+    내   용 : 기업주요사업장 등록
+    -->
+    <insert id="bplcInsert" parameterType="BplcVO">
+        INSERT INTO ent_main_bplc (
+            ent_id
+            , wrkr_cnt
+            , bplc_addr
+            , use_yn
+            , rgtr
+            , reg_dt
+            , bplc_nm
+            , main_prdt
+            , bplc_siar
+            , fctry_area
+            , bplc_siar_unit
+            , fctry_area_unit
+        ) VALUES (
+            #{entId}
+            , #{wrkrCnt}
+            , #{bplcAddr}
+            , 'Y'
+            , #{rgtr}
+            , now()
+            , #{bplcNm}
+            , #{mainPrdt}
+            , #{bplcSiar}
+            , #{fctryArea}
+            , #{bplcSiarUnit}
+            , #{fctryAreaUnit}
+        )
+    </insert>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.06.10
+    내   용 : 기업주요사업장 수정
+    -->
+    <update id="bplcUpdate" parameterType="BplcVO">
+        UPDATE ent_main_bplc
+           SET wrkr_cnt = #{wrkrCnt}
+             , bplc_addr = #{bplcAddr}
+             , use_yn = #{useYn}
+             , mdfr = #{mdfr}
+             , mdfcn_dt = now()
+             , bplc_nm = #{bplcNm}
+             , main_prdt = #{mainPrdt}
+             , bplc_siar = #{bplcSiar}
+             , fctry_area = #{fctryArea}
+             , bplc_siar_unit = #{bplcSiarUnit}
+             , fctry_area_unit = #{fctryAreaUnit}
+        WHERE bplc_id = #{bplcId}
+    </update>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.06.10
+    내   용 : 기업주요사업장 삭제
+    -->
+    <update id="bplcUpdateByEntInfoId" parameterType="EntInfoVO">
+        UPDATE ent_main_bplc
+           SET use_yn = 'N',
+               mdfr = #{mdfr},
+               mdfcn_dt = now()
+         WHERE ent_id = #{entId}
+    </update>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/entInfo/entInfo-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/entInfo/entInfo-SQL.xml
@@ -0,0 +1,417 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.takensoft.portal.entInfo.dao.EntInfoDAO">
+    <!-- 기업정보 resultMap -->
+    <resultMap id="entInfoMap" type="EntInfoVO">
+        <result property="entId" column="ent_id" />
+        <result property="entNm" column="ent_nm" />
+        <result property="brno" column="brno" />
+        <result property="rprsvNm" column="rprsv_nm" />
+        <result property="lctnAdmdsp" column="lctn_admdsp" />
+        <result property="lctnSsg" column="lctn_ssg" />
+        <result property="bplcSiar" column="bplc_siar" />
+        <result property="bplcSiarUnit" column="bplc_siar_unit" />
+        <result property="fctryArea" column="fctry_area" />
+        <result property="fctryAreaUnit" column="fctry_area_unit" />
+        <result property="ksicUpCd" column="ksic_up_cd" />
+        <result property="ksicCd" column="ksic_cd" />
+        <result property="ksicNm" column="ksic_nm" />
+        <result property="mainPrdct" column="main_prdct" />
+        <result property="entCrdt" column="ent_crdt" />
+        <result property="fndnDt" column="fndn_dt" />
+        <result property="wrkrCnt" column="wrkr_cnt" />
+        <result property="rmrk" column="rmrk" />
+        <result property="useYn" column="use_yn" />
+        <result property="rgtr" column="rgtr" />
+        <result property="regDt" column="reg_dt" />
+        <result property="mdfr" column="mdfr" />
+        <result property="mdfcnDt" column="mdfcn_dt" />
+        <result property="mvnInten" column="mvn_inten" />
+        <result property="mouInten" column="mou_inten" />
+        <result property="fileMngId" column="file_mng_id" />
+        <collection property="bplcList" column="{entId = ent_id}" javaType="java.util.ArrayList" ofType="BplcVO" select="selectBplcList" />
+    </resultMap>
+
+    <!-- 기업주요사업장 resultMap -->
+    <resultMap id="bplcMap" type="BplcVO">
+        <result property="bplcId" column="bplc_id" />
+        <result property="entId" column="ent_id" />
+        <result property="wrkrCnt" column="wrkr_cnt" />
+        <result property="bplcAddr" column="bplc_addr" />
+        <result property="useYn" column="use_yn" />
+        <result property="rgtr" column="rgtr" />
+        <result property="regDt" column="reg_dt" />
+        <result property="mdfr" column="mdfr" />
+        <result property="mdfcnDt" column="mdfcn_dt" />
+        <result property="bplcSiarUnit" column="bplc_siar_unit" />
+        <result property="fctryAreaUnit" column="fctry_area_unit" />
+    </resultMap>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.03.20
+    내   용 : 기업정보 등록
+    -->
+    <insert id="entInfoInsert" parameterType="EntInfoVO">
+        INSERT INTO ent_info (
+            ent_id
+            , ent_nm
+            , brno
+            , rprsv_nm
+            , lctn_admdsp
+            , lctn_ssg
+            , bplc_siar
+            , bplc_siar_unit
+            , fctry_area
+            , fctry_area_unit
+            , ksic_up_cd
+            , ksic_cd
+            , ksic_nm
+            , main_prdct
+            , ent_crdt
+            , fndn_dt
+            , wrkr_cnt
+            , rmrk
+            , file_mng_id
+            , use_yn
+            , rgtr
+            , reg_dt
+        ) VALUES (
+            #{entId}
+            , #{entNm}
+            , #{brno}
+            , #{rprsvNm}
+            , #{lctnAdmdsp}
+            , #{lctnSsg}
+            , #{bplcSiar}
+            , #{bplcSiarUnit}
+            , #{fctryArea}
+            , #{fctryAreaUnit}
+            , #{ksicUpCd}
+            , #{ksicCd}
+            , #{ksicNm}
+            , #{mainPrdct}
+            , #{entCrdt}
+            , #{fndnDt}::timestamp
+            , #{wrkrCnt}
+            , #{rmrk}
+            , #{fileMngId}
+            , 'Y'
+            , #{rgtr}
+            , now()
+        )
+    </insert>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.03.21
+    내   용 : 사업자등록번호 중복 검사
+    -->
+    <select id="selectCntByCheckBrno" resultType="int">
+        SELECT count(brno)
+          FROM ent_info
+         WHERE use_yn = 'Y'
+           AND brno = #{brno}
+    </select>
+
+    <!-- SELECT SQL -->
+    <sql id="selectItem">
+        SELECT ei.ent_id
+             , ei.ent_nm
+             , ei.brno
+             , ei.rprsv_nm
+             , ei.lctn_admdsp
+             , ei.lctn_ssg
+             , ei.bplc_siar
+             , ei.bplc_siar_unit
+             , ei.fctry_area
+             , ei.fctry_area_unit
+             , ei.ksic_up_cd
+             , ei.ksic_cd
+             , ei.ksic_nm
+             , ei.main_prdct
+             , ei.ent_crdt
+             , to_char(ei.fndn_dt, 'YYYY-MM-DD') AS fndn_dt
+             , ei.wrkr_cnt
+             , ei.rmrk
+             , ei.file_mng_id
+             , ei.use_yn
+             , ei.rgtr
+             , to_char(ei.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , ei.mdfr
+             , to_char(ei.mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+             , (SELECT mvn_inten <include refid="searchIvstDscsn" />) AS mvn_inten
+             , (SELECT mou_inten <include refid="searchIvstDscsn" />) AS mou_inten
+          FROM ent_info AS ei
+    </sql>
+
+    <sql id="selectRequirement">
+        <if test="searchText != null and searchText != ''">
+            <choose>
+                <when test="searchType != null and searchType != ''">
+                    <if test="searchType == 'ent_nm'">
+                        AND ent_nm LIKE '%' || #{searchText} || '%'
+                    </if>
+                    <if test="searchType == 'rprsv_nm'">
+                        AND rprsv_nm LIKE '%' || #{searchText} || '%'
+                    </if>
+                    <if test="searchType == 'brno'">
+                        AND brno LIKE '%' || #{searchText} || '%'
+                    </if>
+                </when>
+                <otherwise>
+                    AND ( ent_nm LIKE '%' || #{searchText} || '%'
+                       OR rprsv_nm LIKE '%' || #{searchText} || '%'
+                       OR brno LIKE '%' || #{searchText} || '%')
+                </otherwise>
+            </choose>
+        </if>
+    </sql>
+    <sql id="searchCate">
+        <if test="mvnInten != null and mvnInten != ''">
+            AND mvn_inten = #{mvnInten}
+        </if>
+        <if test="mouInten != null and mouInten != ''">
+            AND mou_inten = #{mouInten}
+        </if>
+    </sql>
+
+    <sql id="searchIvstDscsn">
+        FROM ivst_dscsn AS id
+       WHERE id.use_yn = 'Y'
+         AND id.ent_id = ei.ent_id
+    ORDER BY id.reg_dt DESC
+       LIMIT 1
+    </sql>
+
+    <sql id="selectListInner">
+        SELECT ei.ent_id
+             , ei.ent_nm
+             , ei.brno
+             , ei.rprsv_nm
+             , ei.lctn_admdsp
+             , ei.lctn_ssg
+             , ei.bplc_siar
+             , ei.bplc_siar_unit
+             , ei.fctry_area
+             , ei.fctry_area_unit
+             , ei.ksic_up_cd
+             , ei.ksic_cd
+             , ei.ksic_nm
+             , ei.main_prdct
+             , ei.ent_crdt
+             , ei.fndn_dt
+             , ei.wrkr_cnt
+             , ei.rmrk
+             , ei.file_mng_id
+             , ei.use_yn
+             , ei.rgtr
+             , ei.reg_dt
+             , ei.mdfr
+             , ei.mdfcn_dt
+             , (SELECT mvn_inten <include refid="searchIvstDscsn" />) AS mvn_inten
+             , (SELECT mou_inten <include refid="searchIvstDscsn" />) AS mou_inten
+          FROM ent_info AS ei
+         WHERE ei.use_yn = 'Y'
+    </sql>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.03.21
+    내   용 : 기업정보 목록 조회
+    -->
+    <select id="entInfoSelectList" parameterType="HashMap" resultMap="entInfoMap">
+        SELECT ent_id
+             , ent_nm
+             , brno
+             , rprsv_nm
+             , lctn_admdsp
+             , lctn_ssg
+             , bplc_siar
+             , bplc_siar_unit
+             , fctry_area
+             , fctry_area_unit
+             , ksic_up_cd
+             , ksic_cd
+             , ksic_nm
+             , main_prdct
+             , ent_crdt
+             , to_char(fndn_dt, 'YYYY-MM-DD') AS fndn_dt
+             , wrkr_cnt
+             , rmrk
+             , file_mng_id
+             , use_yn
+             , to_char(reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , mdfr
+             , to_char(mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+             , mvn_inten
+             , mou_inten
+        FROM (
+            <include refid="selectListInner" />
+            <include refid="selectRequirement" />
+        ) AS datas
+        WHERE TRUE
+        <include refid="searchCate" />
+        ORDER BY ent_id DESC
+        OFFSET #{limitStart} LIMIT #{recordSize}
+    </select>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.03.21
+    내   용 : 기업정보 목록 총 개수 조회
+    -->
+    <select id="entInfoSelectListCount" parameterType="HashMap" resultType="int">
+        SELECT count(ent_id)
+        FROM (
+            SELECT ent_id
+                 , (SELECT mvn_inten <include refid="searchIvstDscsn" />)
+                 , (SELECT mou_inten <include refid="searchIvstDscsn" />)
+              FROM ent_info AS ei
+             WHERE ei.use_yn = 'Y'
+            <include refid="selectRequirement" />
+        ) AS datas
+        WHERE TRUE
+        <include refid="searchCate" />
+    </select>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.03.21
+    내   용 : 기업정보 상세 조회
+    -->
+    <select id="selectEntInfoDetail" parameterType="String" resultMap="entInfoMap">
+        <include refid="selectItem" />
+       WHERE ei.use_yn = 'Y'
+         AND ei.ent_id = #{entId}
+    </select>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024-06-10
+    내   용 : 기업주요사업장 목록 조회
+    -->
+    <select id="selectBplcList" parameterType="BplcVO" resultMap="bplcMap">
+        SELECT bplc_id
+             , ent_id
+             , wrkr_cnt
+             , bplc_addr
+             , use_yn
+             , rgtr
+             , to_char(reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , mdfr
+             , to_char(mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+             , bplc_nm
+             , main_prdt
+             , bplc_siar
+             , fctry_area
+             , bplc_siar_unit
+             , fctry_area_unit
+          FROM ent_main_bplc
+         WHERE use_yn = #{useYn}
+           AND ent_id = #{entId}
+      ORDER BY bplc_id
+    </select>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.03.22
+    내   용 : 기업정보 수정
+    -->
+    <update id="entInfoUpdate" parameterType="EntInfoVO">
+        UPDATE ent_info
+           SET ent_nm = #{entNm}
+             , brno = #{brno}
+             , rprsv_nm = #{rprsvNm}
+             , lctn_admdsp = #{lctnAdmdsp}
+             , lctn_ssg = #{lctnSsg}
+             , bplc_siar = #{bplcSiar}
+             , bplc_siar_unit = #{bplcSiarUnit}
+             , fctry_area = #{fctryArea}
+             , fctry_area_unit = #{fctryAreaUnit}
+             , ksic_up_cd = #{ksicUpCd}
+             , ksic_cd = #{ksicCd}
+             , ksic_nm = #{ksicNm}
+             , main_prdct = #{mainPrdct}
+             , ent_crdt = #{entCrdt}
+             , fndn_dt = #{fndnDt}::timestamp
+             , wrkr_cnt = #{wrkrCnt}
+             , rmrk = #{rmrk}
+             , file_mng_id = #{fileMngId}
+             , mdfr = #{mdfr}
+             , mdfcn_dt = now()
+         WHERE ent_id = #{entId}
+    </update>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.03.22
+    내   용 : 기업정보 삭제
+    -->
+    <update id="entInfoDelete" parameterType="EntInfoVO">
+        UPDATE ent_info
+           SET use_yn = 'N',
+               mdfr = #{mdfr},
+               mdfcn_dt = now()
+         WHERE ent_id = #{entId}
+    </update>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.05.13
+    내   용 : 팝업 목록 조회
+    -->
+    <select id="selectCompanyInfoListByNew" resultMap="entInfoMap">
+        <include refid="selectItem" />
+        WHERE ei.use_yn = 'Y'
+     ORDER BY ei.reg_dt DESC
+        LIMIT 5
+    </select>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.06.26
+    내   용 : 기업정보 목록 조회 (엑셀 다운로드 용)
+    -->
+    <select id="entInfoSelectListAll" parameterType="HashMap" resultType="HashMap">
+        SELECT ent_nm
+             , brno
+             , rprsv_nm
+             , (SELECT cd_nm FROM cd_mng WHERE cd = lctn_admdsp) || ' ' || lctn_ssg AS lctn
+             , bplc_siar || (SELECT cd_nm FROM cd_mng WHERE cd = bplc_siar_unit) AS bplc_siar
+             , fctry_area || (SELECT cd_nm FROM cd_mng WHERE cd = fctry_area_unit) AS fctry_area
+             , '(' || ksic_up_cd || ksic_cd || ') ' || ksic_nm AS ksic
+             , main_prdct
+             , ent_crdt
+             , to_char(fndn_dt, 'YYYY-MM-DD') AS fndn_dt
+             , wrkr_cnt || '' AS wrkr_cnt
+             , mvn_inten
+             , mou_inten
+             , rmrk
+        FROM (<include refid="selectListInner" />) AS datas
+        WHERE TRUE
+        <if test="mvnInten != null and mvnInten != ''">
+            AND mvn_inten = #{mvnInten}
+        </if>
+        <if test="mouInten != null and mouInten != ''">
+            AND mou_inten = #{mouInten}
+        </if>
+        <if test="ksicUpCd != null and ksicUpCd != ''">
+            AND ksic_up_cd = #{ksicUpCd}
+        </if>
+        ORDER BY ent_nm
+    </select>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.06.26
+    내   용 : 상위업종코드 목록 조회 (엑셀 다운로드 용)
+    -->
+    <select id="ksicUpCdList" parameterType="String" resultType="String">
+        SELECT ksic_up_cd
+        FROM ent_info
+        WHERE use_yn = 'Y'
+        GROUP BY ksic_up_cd
+        ORDER BY ksic_up_cd
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/invtDscsn/invtDscsn-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/invtDscsn/invtDscsn-SQL.xml
@@ -0,0 +1,246 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.takensoft.portal.ivstDscsn.dao.IvstDscsnDAO">
+    <!-- 투자상담 resultMap -->
+    <resultMap id="ivstDscsnMap" type="IvstDscsnVO">
+        <result property="ivstDscsnId" column="ivst_dscsn_id" />
+        <result property="entId" column="ent_id" />
+        <result property="ttl" column="ttl" />
+        <result property="dt" column="dt" />
+        <result property="plc" column="plc" />
+        <result property="prtpnt" column="prtpnt" />
+        <result property="dscsnPbofc" column="dscsn_pbofc" />
+        <result property="mainCn" column="main_cn" />
+        <result property="fileMngId" column="file_mng_id" />
+        <result property="mvnInten" column="mvn_inten" />
+        <result property="mouInten" column="mou_inten" />
+        <result property="dscsnOtln" column="dscsn_otln" />
+        <result property="useYn" column="use_yn" />
+        <result property="rgtr" column="rgtr" />
+        <result property="regDt" column="reg_dt" />
+        <result property="mdfr" column="mdfr" />
+        <result property="mdfcnDt" column="mdfcn_dt" />
+        <result property="entNm" column="ent_nm" />
+    </resultMap>
+
+    <!--
+    작성자 : 박정하
+    작성일자 : 2024-03-20
+    내용 : 투자상담 등록
+    -->
+    <insert id="ivstDscsnInsert" parameterType="IvstDscsnVO">
+        INSERT INTO ivst_dscsn (
+            ivst_dscsn_id
+            , ent_id
+            , ttl
+            , dt
+            , plc
+            , prtpnt
+            , dscsn_pbofc
+            , main_cn
+            , file_mng_id
+            , mvn_inten
+            , mou_inten
+            , dscsn_otln
+            , use_yn
+            , rgtr
+            , reg_dt
+        ) VALUES (
+            #{ivstDscsnId}
+            , #{entId}
+            , #{ttl}
+            , #{dt}::timestamp
+            , #{plc}
+            , #{prtpnt}
+            , #{dscsnPbofc}
+            , #{mainCn}
+            , #{fileMngId}
+            , #{mvnInten}
+            , #{mouInten}
+            , #{dscsnOtln}
+            , 'Y'
+            , #{rgtr}
+            , now()
+        )
+    </insert>
+
+    <!-- SELECT SQL -->
+    <sql id="selectItem">
+        SELECT id.ivst_dscsn_id
+             , id.ent_id
+             , id.ttl
+             , to_char(id.dt, 'YYYY-MM-DD') AS dt
+             , id.plc
+             , id.prtpnt
+             , id.dscsn_pbofc
+             , id.main_cn
+             , id.file_mng_id
+             , id.mvn_inten
+             , id.mou_inten
+             , id.dscsn_otln
+             , id.use_yn
+             , id.rgtr
+             , to_char(id.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , id.mdfr
+             , to_char(id.mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+             , ei.ent_nm
+          from ivst_dscsn AS id
+     LEFT JOIN ent_info AS ei
+            ON id.ent_id = ei.ent_id
+    </sql>
+
+    <sql id="selectRequirement">
+        <if test="searchText != null and searchText != ''">
+            <choose>
+                <when test="searchType != null and searchType != ''">
+                    <if test="searchType == 'ent_nm'">
+                        AND ei.ent_nm LIKE '%' || #{searchText} || '%'
+                    </if>
+                    <if test="searchType == 'ttl'">
+                        AND id.ttl LIKE '%' || #{searchText} || '%'
+                    </if>
+                </when>
+                <otherwise>
+                    AND (
+                        ei.ent_nm LIKE '%' || #{searchText} || '%'
+                    OR
+                        id.ttl LIKE '%' || #{searchText} || '%'
+                    )
+                </otherwise>
+            </choose>
+        </if>
+        <if test="cateId == 'ent_id' and cateValue != null and cateValue != ''">
+            AND ei.ent_id = #{cateValue}
+        </if>
+        <if test="mvnInten != null and mvnInten != ''">
+            AND id.mvn_inten = #{mvnInten}
+        </if>
+        <if test="mouInten != null and mouInten != ''">
+            AND id.mou_inten = #{mouInten}
+        </if>
+    </sql>
+
+    <!--
+    작성자 : 박정하
+    작성일자 : 2024-03-26
+    내용 : 투자상담 목록 조회
+    -->
+    <select id="ivstDscsnList" resultMap="ivstDscsnMap">
+        SELECT id.ivst_dscsn_id
+             , ei.ent_nm
+             , id.ent_id
+             , id.ttl
+             , id.dt
+             , id.plc
+             , id.prtpnt
+             , id.dscsn_pbofc
+             , id.main_cn
+             , id.file_mng_id
+             , id.mvn_inten
+             , id.mou_inten
+             , id.dscsn_otln
+             , id.use_yn
+             , id.rgtr
+             , to_char(id.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , id.mdfr
+             , to_char(id.mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+          FROM ivst_dscsn AS id
+     LEFT JOIN ent_info AS ei
+            ON id.ent_id = ei.ent_id
+         WHERE id.use_yn = 'Y'
+        <include refid="selectRequirement" />
+      ORDER BY id.reg_dt DESC
+        OFFSET #{limitStart} LIMIT #{recordSize}
+    </select>
+
+    <!--
+    작성자 : 박정하
+    작성일자 : 2024-03-26
+    내용 : 투자상담 목록 총 개수 조회
+    -->
+    <select id="ivstDscsnListCount" resultType="int">
+        SELECT count(*)
+        FROM ivst_dscsn AS id
+        LEFT JOIN ent_info AS ei
+        ON id.ent_id = ei.ent_id
+        WHERE id.use_yn = 'Y'
+        <include refid="selectRequirement" />
+    </select>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.03.26
+    내   용 : 투자상담 상세 조회
+    -->
+    <select id="selectIvstDscsnDetail" parameterType="String" resultMap="ivstDscsnMap">
+        <include refid="selectItem" />
+         WHERE id.use_yn = 'Y'
+           AND id.ivst_dscsn_id = #{ivstDscsnId}
+    </select>
+
+    <!--
+    작성자 : 박정하
+    작성일자 : 2024-03-27
+    내용 : 투자상담 수정
+    -->
+    <update id="ivstDscsnUpdate" parameterType="IvstDscsnVO">
+        UPDATE ivst_dscsn
+        SET ent_id = #{entId}
+            , ttl = #{ttl}
+            , dt = #{dt}::timestamp
+            , plc = #{plc}
+            , prtpnt = #{prtpnt}
+            , dscsn_pbofc = #{dscsnPbofc}
+            , main_cn = #{mainCn}
+            , file_mng_id = #{fileMngId}
+            , mvn_inten = #{mvnInten}
+            , mou_inten = #{mouInten}
+            , dscsn_otln = #{dscsnOtln}
+            , use_yn = #{useYn}
+            , mdfr = #{mdfr}
+            , mdfcn_dt = now()
+        WHERE ivst_dscsn_id = #{ivstDscsnId}
+    </update>
+
+    <!--
+    작성자 : 박정하
+    작성일자 : 2024-03-28
+    내용 : 투자상담 최근 1건 조회
+    -->
+    <select id="ivstDscsnByNewOne" parameterType="IvstDscsnVO" resultMap="ivstDscsnMap">
+        <include refid="selectItem" />
+        where id.use_yn = 'Y'
+          AND id.ent_id = #{entId}
+     order by id.reg_dt DESC
+        LIMIT 1;
+    </select>
+
+    <!--
+    작성자 : 박정하
+    작성일자 : 2024-06-12
+    내용 : 투자상담 목록 조회 (기업정보 삭제용)
+    -->
+    <select id="ivstDscsnListByIvstDscsnId" resultMap="ivstDscsnMap">
+        SELECT ivst_dscsn_id
+             , ent_id
+             , ttl
+             , dt
+             , plc
+             , prtpnt
+             , dscsn_pbofc
+             , main_cn
+             , file_mng_id
+             , mvn_inten
+             , mou_inten
+             , dscsn_otln
+             , use_yn
+             , rgtr
+             , to_char(reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , mdfr
+             , to_char(mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+          FROM ivst_dscsn
+         WHERE use_yn = 'Y'
+           AND ent_id = #{ent_Id}
+      ORDER BY reg_dt DESC
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/main/adminMain-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/main/adminMain-SQL.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.05.29
+    내   용 : 메인 통계 관련
+-->
+<mapper namespace="com.takensoft.cms.main.dao.MainDAO">
+    <!--                              관리자 메인페이지 통계정보 관련                              -->
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.28
+        내   용 : 신규회원 가입자 수
+    -->
+    <select id="selectCntnNewCnt">
+        SELECT count(mbr_id)
+        FROM mbr_info
+        WHERE to_char(reg_dt, 'YYYY-MM-DD') > to_char((now() + '-7 days'), 'YYYY-MM-DD')
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.28
+        내   용 : 오늘 방문자 수
+    -->
+    <select id="selectCntnDayCnt">
+        SELECT SUM(COALESCE(cntn_nope, 0))
+        FROM user_cntn_stats
+        WHERE cntn_yr = to_char(now(), 'YYYY')
+          AND cntn_mm = to_char(now(), 'MM')
+          AND cntn_day = to_char(now(), 'DD')
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.28
+        내   용 : 이번달 방문자 수
+    -->
+    <select id="selectCntnMmCnt">
+        SELECT SUM(COALESCE(cntn_nope, 0))
+        FROM user_cntn_stats
+        WHERE cntn_yr = to_char(now(), 'YYYY')
+          AND cntn_mm = to_char(now(), 'MM')
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.28
+        내   용 : 총 방문자 수
+    -->
+    <select id="selectCntnTotalCnt">
+        SELECT SUM(COALESCE(cntn_nope, 0))
+        FROM user_cntn_stats
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.28
+        내   용 : 방문자 접속 통계
+    -->
+    <select id="findByMonthCntnStats" parameterType="HashMap">
+        SELECT ai.dates
+             , array_agg(authrt_nm) AS authrt_nm
+             , array_agg(COALESCE(ucs.cntn_nope, 0)) AS cntn_nope
+        FROM (SELECT generate_series((now() + '-10 days') , now(), '1 day'::interval)::date AS dates, authrt_cd, authrt_nm FROM authrt_info WHERE use_yn = 'Y') AS ai
+        LEFT JOIN (SELECT authrt_cd, to_date(concat(cntn_yr,cntn_mm,cntn_day), 'YYYYMMDD') AS cntn_date, cntn_nope FROM user_cntn_stats) AS ucs
+        ON dates = ucs.cntn_date
+        AND ai.authrt_cd = ucs.authrt_cd
+        GROUP BY ai.dates
+        ORDER BY dates
+    </select>
+    <!--                              // 관리자 메인페이지 통계정보 관련                           -->
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.06.14
+        내   용 : 기업상담신청 알림
+    -->
+    <select id="findAplyToasts" parameterType="HashMap">
+        SELECT '신규등록' AS name
+             , COALESCE(count(ent_dscsn_aply_id), 0) AS count
+          FROM ent_dscsn_aply AS eda
+         WHERE use_yn = 'Y'
+           AND prcs_stts IS NULL
+        UNION ALL
+        SELECT '변경요청' AS name
+             , COALESCE(count(ent_dscsn_aply_id), 0) AS count
+          FROM ent_dscsn_aply AS eda
+         WHERE use_yn = 'Y'
+           AND prcs_stts = 'C'
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/main/governmentMain-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/main/governmentMain-SQL.xml
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.05.29
+    내   용 : 메인 통계 관련
+-->
+<mapper namespace="com.takensoft.portal.main.dao.GovernmentMainDAO">
+    <!--                              공무원 메인페이지 통계정보 관련                              -->
+    <!-- SELECT SQL -->
+    <sql id="selectItem">
+        <if test="searchKeyword != null and searchText != ''">
+            <if test="searchKeyword == 'day'">
+                , stats_date::DATE AS stats_date
+            </if>
+            <if test="searchKeyword == 'month'">
+                , to_char(DATE_TRUNC('month', stats_date), 'YYYY-MM') AS stats_date
+            </if>
+            <if test="searchKeyword == 'year'">
+                , to_char(DATE_TRUNC('year', stats_date), 'YYYY') AS stats_date
+            </if>
+        </if>
+    </sql>
+    <sql id="groupItem">
+        <if test="searchKeyword != null and searchText != ''">
+            GROUP BY true::boolean
+            <if test="searchKeyword == 'day'">
+                , stats_date::DATE
+            </if>
+            <if test="searchKeyword == 'month'">
+                , to_char(DATE_TRUNC('month', stats_date), 'YYYY-MM')
+            </if>
+            <if test="searchKeyword == 'year'">
+                , to_char(DATE_TRUNC('year', stats_date), 'YYYY')
+            </if>
+        </if>
+    </sql>
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.06.03
+        내   용 : 공무원 메인페이지 통계정보 조회 : 분류별 통계
+    -->
+    <select id="selectCategoryStats" parameterType="HashMap">
+        SELECT sum(ei_cnt) AS "새 기업정보 수"
+        , sum(eda_cnt) AS "새 기업상담신청 수"
+        , sum(rm_cnt) AS "새 검토사항 수"
+        , sum(id_cnt) AS "새 투자상담 수"
+        <include refid="selectItem" />
+        FROM (
+            SELECT generate_series AS stats_date
+            , COALESCE(ei.count, 0) AS ei_cnt
+            , COALESCE(eda.count, 0) AS eda_cnt
+            , COALESCE(rm.count, 0) AS rm_cnt
+            , COALESCE(id.count, 0) AS id_cnt
+            FROM (SELECT GENERATE_SERIES(
+                <if test="searchKeyword != null and searchText != ''">
+                    <if test="searchKeyword == 'day'">
+                        (now() + '-30 days')::DATE
+                    </if>
+                    <if test="searchKeyword == 'month'">
+                        (now() + '-1 year')::DATE
+                    </if>
+                    <if test="searchKeyword == 'year'">(
+                        select MIN(min)
+                            from (
+                                (select MIN(reg_dt)::DATE FROM ent_info WHERE use_yn = 'Y') union all
+                                (select MIN(reg_dt)::DATE FROM ent_dscsn_aply WHERE use_yn = 'Y') union all
+                                (select MIN(reg_dt)::DATE FROM rvw_mttr WHERE use_yn = 'Y') union all
+                                (select MIN(reg_dt)::DATE FROM ivst_dscsn WHERE use_yn = 'Y')
+                            ) as since
+                        )
+                    </if>
+                </if>
+            , NOW(), '1 day'::INTERVAL)::date) AS date
+            LEFT JOIN (SELECT reg_dt::DATE, COUNT(ent_id) FROM ent_info WHERE use_yn = 'Y' GROUP BY reg_dt::DATE) AS ei
+            ON date.generate_series = ei.reg_dt
+            LEFT JOIN (SELECT reg_dt::DATE, COUNT(ent_dscsn_aply_id) FROM ent_dscsn_aply WHERE use_yn = 'Y' GROUP BY reg_dt::DATE) AS eda
+            ON date.generate_series = eda.reg_dt
+            LEFT JOIN (SELECT reg_dt::DATE, COUNT(rvw_mttr_id) FROM rvw_mttr WHERE use_yn = 'Y' GROUP BY reg_dt::DATE) AS rm
+            ON date.generate_series = rm.reg_dt
+            LEFT JOIN (SELECT reg_dt::DATE, COUNT(ivst_dscsn_id) FROM ivst_dscsn WHERE use_yn = 'Y' GROUP BY reg_dt::DATE) AS id
+            ON date.generate_series = id.reg_dt
+            ORDER BY date.generate_series
+        ) AS datas
+        <include refid="groupItem" />
+        ORDER BY stats_date
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.06.03
+        내   용 : 공무원 메인페이지 통계정보 조회 : 상담신청 통계
+    -->
+    <select id="selectEntDscsnAplyStats" parameterType="HashMap">
+        SELECT SUM(coalesce) AS "새 상담신청 수"
+        <include refid="selectItem" />
+        FROM (
+            SELECT stats_date
+                 , COALESCE(eda.count, 0)
+            FROM (SELECT GENERATE_SERIES::DATE AS stats_date
+                  FROM GENERATE_SERIES(
+                        <if test="searchKeyword != null and searchText != ''">
+                            <if test="searchKeyword == 'day'">
+                                (now() + '-30 days')::DATE
+                            </if>
+                            <if test="searchKeyword == 'month'">
+                                (now() + '-1 year')::DATE
+                            </if>
+                            <if test="searchKeyword == 'year'">
+                                (select MIN(reg_dt) FROM ent_dscsn_aply WHERE use_yn = 'Y')
+                            </if>
+                        </if>
+                        , NOW()::DATE, '1 day'::INTERVAL)) as date
+            LEFT JOIN (
+                SELECT COUNT(ent_dscsn_aply_id)
+                     , reg_dt::DATE AS reg_dt
+                  FROM ent_dscsn_aply
+                 WHERE use_yn = 'Y'
+              GROUP BY reg_dt::DATE
+        ) AS eda
+        ON date.stats_date = eda.reg_dt
+        ORDER BY stats_date) AS datas
+        <include refid="groupItem" />
+        ORDER BY stats_date
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.06.03
+        내   용 : 공무원 메인페이지 통계정보 조회 : 검토사항 통계
+    -->
+    <select id="selectRvwMttrStats" parameterType="HashMap">
+        SELECT SUM(coalesce) AS "새 검토사항 수"
+        <include refid="selectItem" />
+        FROM (
+        SELECT stats_date
+        , COALESCE(eda.count, 0)
+        FROM (SELECT GENERATE_SERIES::DATE AS stats_date
+        FROM GENERATE_SERIES(
+        <if test="searchKeyword != null and searchText != ''">
+            <if test="searchKeyword == 'day'">
+                (now() + '-30 days')::DATE
+            </if>
+            <if test="searchKeyword == 'month'">
+                (now() + '-1 year')::DATE
+            </if>
+            <if test="searchKeyword == 'year'">
+                (select MIN(reg_dt) FROM ent_dscsn_aply WHERE use_yn = 'Y')
+            </if>
+        </if>
+        , NOW()::DATE, '1 day'::INTERVAL)) as date
+        LEFT JOIN (
+            SELECT COUNT(rvw_mttr_id)
+            , reg_dt::DATE AS reg_dt
+            FROM rvw_mttr
+            WHERE use_yn = 'Y'
+            GROUP BY reg_dt::DATE
+        ) AS eda
+        ON date.stats_date = eda.reg_dt
+        ORDER BY stats_date) AS datas
+        <include refid="groupItem" />
+        ORDER BY stats_date
+    </select>
+    <!--                              // 공무원 메인페이지 통계정보 관련                           -->
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/mber/admMbr-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/mber/admMbr-SQL.xml
@@ -0,0 +1,309 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.06.21
+    내   용 : 회원정보 관련
+-->
+<mapper namespace="com.takensoft.cms.mber.dao.AdmMbrDAO">
+    <!-- 회원정보 resultMap(권한 포함) -->
+    <resultMap id="mbrMap" type="AdmMbrDTO">
+        <result property="mbrId" column="mbr_id" />
+        <result property="lgnId" column="lgn_id" />
+        <result property="mbrNm" column="mbr_nm" />
+        <result property="ncnm" column="ncnm" />
+        <result property="pswd" column="pswd" />
+        <result property="mblTelno" column="mbl_telno" />
+        <result property="telno" column="telno" />
+        <result property="eml" column="eml" />
+        <result property="zip" column="zip" />
+        <result property="addr" column="addr" />
+        <result property="daddr" column="daddr" />
+        <result property="mbrStts" column="mbr_stts" />
+        <result property="useYn" column="use_yn" />
+        <result property="cntrlDt" column="cntrl_dt" />
+        <result property="cntrlRsn" column="cntrl_rsn" />
+        <result property="smsRcptnAgreYn" column="sms_rcptn_agre_yn" />
+        <result property="emlRcptnAgreYn" column="eml_rcptn_agre_yn" />
+        <result property="prvcRlsYn" column="prvc_rls_yn" />
+        <result property="mbrType" column="mbr_type" />
+        <result property="pswdChgDt" column="pswd_chg_dt" />
+        <result property="frstRegIp" column="frst_reg_ip" />
+        <result property="sysPvsnYn" column="sys_pvsn_yn" />
+        <result property="rgtr" column="rgtr" />
+        <result property="regDt" column="reg_dt" />
+        <result property="mdfr" column="mdfr" />
+        <result property="mdfcnDt" column="mdfcn_dt" />
+        <collection property="authorList" column="{mbrId = mbr_id}" javaType="java.util.ArrayList" ofType="MberAuthorVO" select="mbrAuthorList" />
+    </resultMap>
+
+    <!-- 회원 권한 매핑 -->
+    <resultMap id="authMap" type="MberAuthorVO">
+        <result property="mbrId" column="mbr_id" />
+        <result property="authrtNm" column="authrt_nm" />
+        <result property="authrtCd" column="authrt_cd" />
+        <result property="rgtr" column="rgtr" />
+        <result property="regDt" column="reg_dt" />
+    </resultMap>
+
+    <sql id="selectMbr">
+        SELECT mi.mbr_id
+             , mi.lgn_id
+             , mi.mbr_nm
+             , mi.ncnm
+             , mi.pswd
+             , mi.mbl_telno
+             , mi.telno
+             , mi.eml
+             , mi.zip
+             , mi.addr
+             , mi.daddr
+             , mi.mbr_stts
+             , mi.use_yn
+             , TO_CHAR(mi.cntrl_dt, 'YYYY-MM-DD') AS cntrl_dt
+             , mi.cntrl_rsn
+             , mi.sms_rcptn_agre_yn
+             , mi.eml_rcptn_agre_yn
+             , mi.prvc_rls_yn
+             , mi.mbr_type
+             , TO_CHAR(mi.pswd_chg_dt, 'YYYY-MM-DD HH24:MI') AS pswd_chg_dt
+             , mi.frst_reg_ip
+             , mi.sys_pvsn_yn
+             , mi.rgtr
+             , TO_CHAR(mi.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , mi.mdfr
+             , TO_CHAR(mi.mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+        FROM mbr_info AS mi
+    </sql>
+
+    <sql id="selectRequirement">
+        <if test="searchText != null and searchText != ''">
+            <choose>
+                <when test="searchType != null and searchType != ''">
+                    <if test="searchType == 'lgn_id'">
+                        AND mi.lgn_id LIKE '%' || #{searchText} || '%'
+                    </if>
+                    <if test="searchType == 'mbr_nm'">
+                        AND mi.mbr_nm LIKE '%' || #{searchText} || '%'
+                    </if>
+                </when>
+                <otherwise>
+                    AND (
+                    mi.lgn_id LIKE '%' || #{searchText} || '%'
+                    OR
+                    mi.mbr_nm LIKE '%' || #{searchText} || '%'
+                    )
+                </otherwise>
+            </choose>
+        </if>
+    </sql>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.06.21
+        내   용 : 회원정보 목록 개수 조회
+    -->
+    <select id="mbrListCnt" resultType="int">
+        SELECT COUNT(mi.mbr_id)
+          FROM mbr_info AS mi
+     LEFT JOIN mbr_authrt_info AS mai
+            ON mi.mbr_id = mai.mbr_id
+         WHERE mi.use_yn = 'Y'
+        <if test="cateId == 'authrt_cd' and cateValue != null and cateValue != ''">
+            AND mai.authrt_cd = #{cateValue}
+        </if>
+        <include refid="selectRequirement" />
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.06.21
+        내   용 : 회원정보 목록 조회
+    -->
+    <select id="mbrList" resultMap="mbrMap">
+        <include refid="selectMbr" />
+        LEFT JOIN mbr_authrt_info AS mai
+               ON mi.mbr_id = mai.mbr_id
+            WHERE mi.use_yn = 'Y'
+        <if test="cateId == 'authrt_cd' and cateValue != null and cateValue != ''">
+            AND mai.authrt_cd = #{cateValue}
+        </if>
+        <include refid="selectRequirement" />
+         ORDER BY mi.reg_dt DESC
+           OFFSET #{limitStart} LIMIT #{recordSize}
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.06.21
+        내   용 : 회원 권한 조회
+    -->
+    <select id="mbrAuthorList" parameterType="MberVO" resultMap="authMap">
+        SELECT mai.mbr_id
+             , ai.authrt_nm
+             , mai.authrt_cd
+             , mai.rgtr
+             , TO_CHAR(mai.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+          FROM mbr_authrt_info AS mai
+     LEFT JOIN authrt_info AS ai
+            ON mai.authrt_cd = ai.authrt_cd
+           AND ai.use_yn = 'Y'
+         WHERE mai.mbr_id = #{mbrId}
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.06.21
+        내   용 : 회원정보 상세 조회
+    -->
+    <select id="mbrDetail" parameterType="String" resultMap="mbrMap">
+        <include refid="selectMbr" />
+        WHERE mi.use_yn = 'Y'
+          AND mi.mbr_id = #{mbrId}
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.06.21
+        내   용 : 회원정보 수정
+    -->
+    <update id="updateMbr" parameterType="JoinDTO">
+        UPDATE mbr_info
+        SET mbr_nm = #{mbrNm}
+          , ncnm = #{ncnm}
+          , mbl_telno = #{mblTelno}
+          , telno = #{telno}
+          , eml = #{eml}
+          , zip = #{zip}
+          , addr = #{addr}
+          , daddr = #{daddr}
+          , mbr_stts = #{mbrStts}
+          , use_yn = #{useYn}
+          , cntrl_dt = #{cntrlDt}::timestamp
+          , cntrl_rsn = #{cntrlRsn}
+          , sms_rcptn_agre_yn = #{smsRcptnAgreYn}
+          , eml_rcptn_agre_yn = #{emlRcptnAgreYn}
+          , prvc_rls_yn = #{prvcRlsYn}
+          , mbr_type = #{mbrType}
+          , sys_pvsn_yn = #{sysPvsnYn}
+          , mdfr = #{mdfr}
+          , mdfcn_dt = NOW()
+        WHERE mbr_id = #{mbrId}
+    </update>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.06.21
+        내   용 : 회원 권한 삭제
+    -->
+    <delete id="deleteAuthorListByMbrId" parameterType="String">
+        DELETE
+        FROM mbr_authrt_info
+       WHERE mbr_id = #{mbrId}
+    </delete>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.06.21
+        내   용 : 회원 권한 등록
+    -->
+    <insert id="insertAuthor" parameterType="MberAuthorVO">
+        INSERT INTO mbr_authrt_info (
+            mbr_id
+          , authrt_cd
+          , rgtr
+          , reg_dt
+        ) VALUES (
+            #{mbrId}
+            , #{authrtCd}
+            , #{rgtr}
+            , NOW()
+        )
+    </insert>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.06.21
+        내   용 : 회원정보 등록
+    -->
+    <insert id="mbrInsert" parameterType="JoinDTO">
+        INSERT INTO mbr_info (
+            mbr_id
+            , lgn_id
+            , mbr_nm
+            , ncnm
+            , pswd
+            , mbl_telno
+            , telno
+            , eml
+            , zip
+            , addr
+            , daddr
+            , mbr_stts
+            , use_yn
+            , cntrl_dt
+            , cntrl_rsn
+            , sms_rcptn_agre_yn
+            , eml_rcptn_agre_yn
+            , prvc_rls_yn
+            , mbr_type
+            , pswd_chg_dt
+            , frst_reg_ip
+            , sys_pvsn_yn
+            , rgtr
+            , reg_dt
+        ) VALUES (
+            #{mbrId}
+            , #{lgnId}
+            , #{mbrNm}
+            , #{ncnm}
+            , #{pswd}
+            , #{mblTelno}
+            , #{telno}
+            , #{eml}
+            , #{zip}
+            , #{addr}
+            , #{daddr}
+            , #{mbrStts}
+            , 'Y'
+            , #{cntrlDt}::timestamp
+            , #{cntrlRsn}
+            , #{smsRcptnAgreYn}
+            , #{emlRcptnAgreYn}
+            , #{prvcRlsYn}
+            , 'S'
+            , NOW()
+            , #{frstRegIp}
+            , 'Y'
+            , #{rgtr}
+            , NOW()
+        )
+    </insert>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.07.03
+        내   용 : 아이디 찾기 (로그인 아이디)
+    -->
+    <select id="lgnIdSearch" parameterType="MberVO" resultType="String">
+        SELECT lgn_id
+          FROM mbr_info
+         WHERE mbr_nm = #{mbrNm}
+           AND eml = #{eml}
+           AND use_yn = 'Y'
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.07.03
+        내   용 : 아이디 찾기 (멤버 아이디)
+    -->
+    <select id="mbrIdSearch" parameterType="AdmMbrDTO" resultType="String">
+        SELECT mbr_id
+        FROM mbr_info
+        WHERE lgn_id = #{lgnId}
+          AND mbr_nm = #{mbrNm}
+          AND eml = #{eml}
+          AND use_yn = 'Y'
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/mber/lgnHstry-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/mber/lgnHstry-SQL.xml
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작성자 : takensoft
+    작성일 : 2024.04.09
+    내 용 : 로그인 이력 관련
+-->
+<mapper namespace="com.takensoft.cms.mber.dao.LgnHstryDAO">
+    <!-- 로그인 이력 resultMap -->
+    <resultMap id="lgnHstryMap" type="LgnHstryVO">
+        <result property="lgnId" column="lgn_id" />
+        <result property="lgnType" column="lgn_type" />
+        <result property="cntnDt" column="cntn_dt" />
+        <result property="cntnIp" column="cntn_ip" />
+        <result property="cntnOperSys" column="cntn_oper_sys" />
+        <result property="deviceNm" column="device_nm" />
+        <result property="brwsrNm" column="brwsr_nm" />
+    </resultMap>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.11
+        내 용 : 로그인 이력 등록
+    -->
+    <insert id="save" parameterType="LgnHstryVO">
+        INSERT INTO lgn_hstry (
+            lgn_id
+            , lgn_type
+            , cntn_dt
+            , cntn_ip
+            , cntn_oper_sys
+            , device_nm
+            , brwsr_nm
+        ) VALUES (
+            #{lgnId}
+            , #{lgnType}
+            , NOW()
+            , #{cntnIp}
+            , #{cntnOperSys}
+            , #{deviceNm}
+            , #{brwsrNm}
+        )
+    </insert>
+
+    <!-- SELECT SQL -->
+    <sql id="selectItem">
+        SELECT lh.lgn_id
+             , lh.lgn_type
+             , TO_CHAR(lh.cntn_dt, 'YYYY-MM-DD HH24:MI') AS cntn_dt
+             , lh.cntn_ip
+             , lh.cntn_oper_sys
+             , lh.device_nm
+             , lh.brwsr_nm
+        FROM lgn_hstry AS lh
+    </sql>
+
+    <sql id="selectRequirement">
+        <if test="startDt != null and startDt != ''">
+            AND lh.cntn_dt >= #{startDt}::timestamp
+        </if>
+        <if test="endDt != null and endDt != ''">
+            AND #{endDt}::timestamp >= lh.cntn_dt
+        </if>
+        <if test="searchText != null and searchText != ''">
+            <choose>
+                <when test="searchType != null and searchType != ''">
+                    <if test="searchType == 'lgnType'">
+                        lh.lgn_type = (SELECT CASE cm.cd_nm
+                            WHEN '관리자' THEN '0'
+                            WHEN '사용자' THEN '1'
+                            ELSE ''
+                            END
+                            FROM cd_mng AS cm
+                            WHERE cm.use_yn = 'Y'
+                            AND cm.up_cd = 'lgnHstryType'
+                            AND cm.cd_nm LIKE '%' || #{searchText} || '%')
+                    </if>
+                    <if test="searchType == 'lgnId'">
+                        AND lh.lgn_id LIKE '%' || #{searchText} || '%'
+                    </if>
+                </when>
+                <otherwise>
+                    AND (
+                        lh.lgn_type = (SELECT CASE cm.cd_nm
+                            WHEN '관리자' THEN '0'
+                            WHEN '사용자' THEN '1'
+                            ELSE ''
+                            END
+                            FROM cd_mng AS cm
+                            WHERE cm.use_yn = 'Y'
+                            AND cm.up_cd = 'lgnHstryType'
+                            AND cm.cd_nm LIKE '%' || #{searchText} || '%')
+                    OR
+                        lh.lgn_id LIKE '%' || #{searchText} || '%'
+                    )
+                </otherwise>
+            </choose>
+        </if>
+    </sql>
+    <!-- // SELECT SQL -->
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.24
+        내   용 : 로그인 이력 개수
+    -->
+    <select id="selectLgnHstryListCnt" parameterType="Pagination" resultType="Integer">
+        SELECT COUNT(lgn_hstry_id)
+        FROM lgn_hstry AS lh
+        WHERE true
+        <include refid="selectRequirement" />
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.24
+        내   용 : 로그인 이력 조회
+    -->
+    <select id="selectLgnHstryList" parameterType="Pagination" resultMap="lgnHstryMap">
+        <include refid="selectItem" />
+        WHERE true
+        <include refid="selectRequirement" />
+        ORDER BY cntn_dt DESC
+        LIMIT #{recordSize} OFFSET #{limitStart}
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/mber/mber-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/mber/mber-SQL.xml
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작성자 : takensoft
+    작성일 : 2024.04.03
+    내 용 : 회원정보 관련
+-->
+<mapper namespace="com.takensoft.cms.mber.dao.MberDAO">
+    <!-- 회원 정보 resultMap(권한 포함) -->
+    <resultMap id="mberMap" type="MberVO">
+        <result property="mbrId" column="mbr_id" />
+        <result property="lgnId" column="lgn_id" />
+        <result property="mbrNm" column="mbr_nm" />
+        <result property="ncnm" column="ncnm" />
+        <result property="pswd" column="pswd" />
+        <result property="mblTelno" column="mbl_telno" />
+        <result property="telno" column="telno" />
+        <result property="eml" column="eml" />
+        <result property="zip" column="zip" />
+        <result property="addr" column="addr" />
+        <result property="daddr" column="daddr" />
+        <result property="mbrStts" column="mbr_stts" />
+        <result property="useYn" column="use_yn" />
+        <result property="cntrlDt" column="cntrl_dt" />
+        <result property="cntrlRsn" column="cntrl_rsn" />
+        <result property="smsRcptnAgreYn" column="sms_rcptn_agre_yn" />
+        <result property="emlRcptnAgreYn" column="eml_rcptn_agre_yn" />
+        <result property="prvcRlsYn" column="prvc_rls_yn" />
+        <result property="mbrType" column="mbr_type" />
+        <result property="pswdChgDt" column="pswd_chg_dt" />
+        <result property="frstRegIp" column="frst_reg_ip" />
+        <result property="sysPvsnYn" column="sys_pvsn_yn" />
+        <result property="rgtr" column="rgtr" />
+        <result property="regDt" column="reg_dt" />
+        <result property="mdfr" column="mdfr" />
+        <result property="mdfcnDt" column="mdfcn_dt" />
+        <collection property="authorList" column="{mbrId = mbr_id}" javaType="java.util.ArrayList" ofType="MberAuthorVO" select="findByMberAuthor" />
+    </resultMap>
+
+    <!-- 회원, 권한 매핑 -->
+    <resultMap id="authMap" type="MberAuthorVO">
+        <result property="mbrId" column="mbr_id" />
+        <result property="authrtNm" column="authrt_nm" />
+        <result property="authrtCd" column="authrt_cd" />
+        <result property="rgtr" column="rgtr" />
+        <result property="regDt" column="reg_dt" />
+    </resultMap>
+
+    <sql id="selectMber">
+        SELECT mi.mbr_id
+             , mi.lgn_id
+             , mi.mbr_nm
+             , mi.ncnm
+             , mi.pswd
+             , mi.mbl_telno
+             , mi.telno
+             , mi.eml
+             , mi.zip
+             , mi.addr
+             , mi.daddr
+             , mi.mbr_stts
+             , mi.use_yn
+             , TO_CHAR(mi.cntrl_dt, 'YYYY-MM-DD') AS cntrl_dt
+             , mi.cntrl_rsn
+             , mi.sms_rcptn_agre_yn
+             , mi.eml_rcptn_agre_yn
+             , mi.prvc_rls_yn
+             , mi.mbr_type
+             , TO_CHAR(mi.pswd_chg_dt, 'YYYY-MM-DD HH24:MI') AS pswd_chg_dt
+             , mi.frst_reg_ip
+             , mi.sys_pvsn_yn
+             , mi.rgtr
+             , TO_CHAR(mi.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , mi.mdfr
+             , TO_CHAR(mi.mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+        FROM mbr_info mi
+    </sql>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.03
+        내 용 : 회원정보 조회 [security 용]
+    -->
+    <select id="findByMberSecurity" parameterType="String" resultMap="mberMap">
+        <include refid="selectMber" />
+        WHERE mi.lgn_id = #{lgnId}
+        AND mi.use_yn = 'Y'
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.03
+        내 용 : 로그인 아이디 중복 확인
+    -->
+    <select id="findByCheckLoginId" parameterType="String" resultType="boolean">
+        SELECT COUNT(lgn_id)
+          FROM mbr_info
+         WHERE lgn_id = #{lgnId}
+           AND use_yn = 'Y'
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.03
+        내 용 : 회원가입
+    -->
+    <insert id="save" parameterType="JoinDTO">
+        INSERT INTO mbr_info (
+            mbr_id
+            , lgn_id
+            , mbr_nm
+            , ncnm
+            , pswd
+            , mbl_telno
+            , telno
+            , eml
+            , zip
+            , addr
+            , daddr
+            , mbr_stts
+            , use_yn
+            , cntrl_dt
+            , cntrl_rsn
+            , sms_rcptn_agre_yn
+            , eml_rcptn_agre_yn
+            , prvc_rls_yn
+            , mbr_type
+            , pswd_chg_dt
+            , frst_reg_ip
+            , sys_pvsn_yn
+            , rgtr
+            , reg_dt
+        ) VALUES (
+            #{mbrId}
+            , #{lgnId}
+            , #{mbrNm}
+            , #{ncnm}
+            , #{pswd}
+            , #{mblTelno}
+            , #{telno}
+            , #{eml}
+            , #{zip}
+            , #{addr}
+            , #{daddr}
+            , #{mbrStts}
+            , 'Y'
+            , #{cntrlDt}::timestamp
+            , #{cntrlRsn}
+            , #{smsRcptnAgreYn}
+            , #{emlRcptnAgreYn}
+            , #{prvcRlsYn}
+            , 'S'
+            , NOW()
+            , #{frstRegIp}
+            , 'Y'
+            , #{rgtr}
+            , NOW()
+        )
+    </insert>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.03
+        내 용 : 회원 권한 등록
+    -->
+    <insert id="authorSave" parameterType="MberAuthorVO">
+        INSERT INTO mbr_authrt_info (
+            mbr_id
+            , authrt_cd
+            , rgtr
+            , reg_dt
+        ) VALUES (
+            #{mbrId}
+            , #{authrtCd}
+            , #{rgtr}
+            , NOW()
+        )
+    </insert>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.15
+        내 용 : 비밀번호 변경
+    -->
+    <update id="updatePassword" parameterType="PasswordDTO">
+        UPDATE mbr_info
+        SET pswd = #{newPswd}
+        WHERE mbr_id = #{mbrId}
+    </update>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.15
+        내 용 : 회원정보 조회
+    -->
+    <select id="findByMber" parameterType="String" resultMap="mberMap">
+        <include refid="selectMber" />
+        WHERE mi.mbr_id = #{mbrId}
+        AND mi.use_yn = 'Y'
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.03
+        내 용 : 회원 권한 정보 조회
+    -->
+    <select id="findByMberAuthor" parameterType="MberVO" resultMap="authMap">
+        SELECT mai.mbr_id
+             , mai.authrt_cd
+             , mai.rgtr
+             , TO_CHAR(mai.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+        FROM mbr_authrt_info mai
+        WHERE mai.mbr_id = #{mbrId}
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/mber/refresh-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/mber/refresh-SQL.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작성자 : takensoft
+    작성일 : 2024.04.04
+    내 용 : 토큰 관련
+-->
+<mapper namespace="com.takensoft.cms.mber.dao.RefreshTokenDAO">
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.04
+        내 용 : refresh token 등록
+    -->
+    <insert id="save" parameterType="RefreshVO">
+        INSERT INTO mbr_refresh (
+            mbr_id
+            , token
+            , expry_dt
+            , use_ip
+        ) VALUES (
+            #{mbrId}
+            , #{token}
+            , #{expryDt}
+            , #{useIp}
+        )
+    </insert>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.04
+        내 용 : refresh token 삭제
+    -->
+    <delete id="deleteByRefresh" parameterType="RefreshVO">
+        DELETE
+          FROM mbr_refresh
+         WHERE mbr_id = #{mbrId}
+           AND use_ip like #{useIp} || '%'
+    </delete>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.05
+        내 용 : 기한 만료된 refresh token 삭제 [ Schedule 용 ]
+    -->
+    <delete id="cleanExpiredRefreshTokens">
+        DELETE
+          FROM mbr_refresh
+         WHERE expry_dt &lt;= NOW()
+    </delete>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.17
+        내 용 : refresh token 유무 확인
+    -->
+    <select id="findByCheckRefresh" parameterType="RefreshVO" resultType="boolean">
+        SELECT EXISTS (
+            SELECT 1
+              FROM mbr_refresh
+             WHERE mbr_id = #{mbrId}
+               AND use_ip = #{useIp}
+        ) AS result
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/menu/menu-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/menu/menu-SQL.xml
@@ -0,0 +1,488 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작성자 : takensoft
+    작성일 : 2024.04.08
+    내 용 : 메뉴 관련
+-->
+<mapper namespace="com.takensoft.cms.menu.dao.MenuDAO">
+    <!-- 메뉴 정보 resultMap(권한포함) -->
+    <resultMap id="menuMap" type="MenuVO">
+        <result property="menuId" column="menu_id" />
+        <result property="upMenuId" column="up_menu_id" />
+        <result property="upMenuNm" column="up_menu_nm" />
+        <result property="menuNm" column="menu_nm" />
+        <result property="menuExpln" column="menu_expln" />
+        <result property="menuGrd" column="menu_grd" />
+        <result property="menuSn" column="menu_sn" />
+        <result property="menuType" column="menu_type" />
+        <result property="menuTypeCtgry" column="menu_type_ctgry" />
+        <result property="linkUrl" column="link_url" />
+        <result property="linkType" column="link_type" />
+        <result property="dgstfnExmnUseYn" column="dgstfn_exmn_use_yn" />
+        <result property="menuExpsrYn" column="menu_expsr_yn" />
+        <result property="menuUser" column="menu_user" />
+        <result property="useYn" column="use_yn" />
+        <result property="rgtr" column="rgtr" />
+        <result property="rgtrNm" column="rgtr_nm" />
+        <result property="regDt" column="reg_dt" />
+        <result property="mdfr" column="mdfr" />
+        <result property="mdfrNm" column="mdfr_nm" />
+        <result property="mdfcnDt" column="mdfcn_dt" />
+        <result property="sysPvsnYn" column="sys_pvsn_yn" />
+    </resultMap>
+
+
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.08
+        내 용 : 메뉴 등록
+    -->
+    <insert id="save" parameterType="MenuVO">
+        INSERT INTO menu_info (
+            menu_id
+            , up_menu_id
+            , menu_nm
+            , menu_expln
+            , menu_grd
+            , menu_sn
+            , menu_type
+            , menu_type_ctgry
+            , link_url
+            , link_type
+            , dgstfn_exmn_use_yn
+            , menu_expsr_yn
+            , menu_user
+            , use_yn
+            , rgtr
+            , reg_dt
+            , sys_pvsn_yn
+        ) VALUES (
+            #{menuId}
+            , #{upMenuId}
+            , #{menuNm}
+            , #{menuExpln}
+            , #{menuGrd}
+            , #{menuSn}
+            , #{menuType}
+            , #{menuTypeCtgry}
+            , #{linkUrl}
+            , #{linkType}
+            , #{dgstfnExmnUseYn}
+            , #{menuExpsrYn}
+            , #{menuUser}
+            , 'Y'
+            , #{rgtr}
+            , NOW()
+            , #{sysPvsnYn}
+        )
+    </insert>
+
+    <!--
+       작성자 : takensoft
+       작성일 : 2024.04.08
+       내 용 : 메뉴별 권한 등록
+   -->
+    <insert id="menuAuthrtSave" parameterType="MenuAuthorVO">
+        INSERT INTO menu_authrt_info (
+            authrt_cd
+            , menu_id
+            , inq_authrt
+            , reg_authrt
+            , mdfcn_authrt
+            , del_authrt
+            , file_dwnld_authrt
+            , reg_dt
+        ) VALUES (
+            #{authrtCd}
+            , #{menuId}
+            <choose>
+                <when test="authrtCd == 'ROLE_ADMIN'">
+                    , 'Y'
+                    , 'Y'
+                    , 'Y'
+                    , 'Y'
+                    , 'Y'
+                </when>
+                <otherwise>
+                    , 'N'
+                    , 'N'
+                    , 'N'
+                    , 'N'
+                    , 'N'
+                </otherwise>
+            </choose>
+            , NOW()
+        )
+    </insert>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.08
+        내 용 : 메뉴별 만족도 등록
+    -->
+    <insert id="saveMenuStsfdg" parameterType="MenuStsfdgVO">
+        INSERT INTO menu_dgstfn (
+            menu_dgstfn_id
+            , menu_id
+            , rspns_five
+            , rspns_four
+            , rspns_three
+            , rspns_two
+            , rspns_one
+            , opnn
+            , reg_ip
+            , rgtr
+            , reg_dt
+        ) VALUES (
+            #{menuDgstfnId}
+            , #{menuId}
+            , #{rspnsFive}
+            , #{rspnsFour}
+            , #{rspnsThree}
+            , #{rspnsTwo}
+            , #{rspnsOne}
+            , #{opnn}
+            , #{regIp}
+            , #{rgtr}
+            , NOW()
+        )
+    </insert>
+
+    <sql id="selectMenu">
+        SELECT mi.menu_id
+             , mi.up_menu_id
+             , (SELECT mi2.menu_nm FROM menu_info AS mi2 WHERE mi2.menu_id = mi.up_menu_id) AS up_menu_nm
+             , mi.menu_nm
+             , mi.menu_expln
+             , mi.menu_grd
+             , mi.menu_sn
+             , mi.menu_type
+             , mi.menu_type_ctgry
+             , mi.link_url
+             , mi.link_type
+             , mi.dgstfn_exmn_use_yn
+             , mi.menu_expsr_yn
+             , mi.menu_user
+             , mi.use_yn
+             , mi.rgtr
+             , (SELECT mbr.mbr_nm FROM mbr_info AS mbr WHERE mbr.mbr_id = mi.rgtr) AS rgtr_nm
+             , TO_CHAR (mi.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , mi.mdfr
+             , (SELECT mbr.mbr_nm FROM mbr_info AS mbr WHERE mbr.mbr_id = mi.mdfr) AS mdfr_nm
+             , TO_CHAR (mi.mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+          FROM menu_info AS mi
+    </sql>
+
+    <!--
+       작성자 : takensoft
+       작성일 : 2024.04.08
+       내 용 : 최상위 메뉴 조회 [관리자용]
+   -->
+    <select id="findTopMenu" resultType="MenuVO">
+        <include refid="selectMenu" />
+         WHERE up_menu_id IS NULL
+      ORDER BY menu_sn
+    </select>
+
+    <!--
+       작성자 : takensoft
+       작성일 : 2024.04.08
+       내 용 : 하위 메뉴 조회 [관리자용]
+   -->
+    <select id="findChildMenus" parameterType="String" resultType="MenuVO">
+        <include refid="selectMenu" />
+         WHERE up_menu_id = #{menuId}
+      ORDER BY menu_sn
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.15
+        내 용 : 메뉴 전체 조회(최상위 메뉴 제외-> grd:0)
+    -->
+    <select id="findExceptTopMenu" resultType="MenuVO">
+        <include refid="selectMenu" />
+        WHERE menu_grd != 0
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.08
+        내 용 : 메뉴 상세 조회
+    -->
+    <select id="findByMenu" parameterType="String" resultMap="menuMap">
+        <include refid="selectMenu" />
+         WHERE menu_id = #{menuId}
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.08
+        내 용 : 메뉴 깊이 조회
+    -->
+    <select id="findByMenuGrd" parameterType="String" resultType="Integer">
+        SELECT menu_grd
+          FROM menu_info
+         WHERE menu_id = #{upMenuId}
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.08
+        내 용 : 메뉴 순서 조회
+   -->
+    <select id="findByMenuSn" parameterType="String" resultType="Integer">
+        SELECT COALESCE(MAX(menu_sn), 0)
+          FROM menu_info
+         WHERE use_yn = 'Y'
+         <choose>
+             <when test="upMenuId != null and upMenuId != ''">
+           AND up_menu_id = #{upMenuId}
+             </when>
+             <otherwise>
+           AND up_menu_id IS NULL
+             </otherwise>
+         </choose>
+    </select>
+
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.15
+        내 용 : 메뉴 수정
+    -->
+    <update id="update" parameterType="MenuVO">
+        UPDATE menu_info
+           SET up_menu_id = #{upMenuId}
+             , menu_nm = #{menuNm}
+             , menu_expln = #{menuExpln}
+             , menu_grd = #{menuGrd}
+             , menu_sn = #{menuSn}
+             , menu_type = #{menuType}
+             , menu_type_ctgry = #{menuTypeCtgry}
+             , link_url = #{linkUrl}
+             , link_type = #{linkType}
+             , dgstfn_exmn_use_yn = #{dgstfnExmnUseYn}
+             , menu_expsr_yn = #{menuExpsrYn}
+             , menu_user = #{menuUser}
+             , use_yn = #{useYn}
+             , mdfr = #{mdfr}
+             , mdfcn_dt = NOW()
+         WHERE menu_id = #{menuId}
+    </update>
+
+    <!--  메뉴 관리(관리자 페이지 Tree 호출용)   -->
+    <sql id="selecteNode">
+        SELECT menu_id AS id
+             , up_menu_id AS up_id
+             , menu_nm AS nm
+        FROM menu_info
+    </sql>
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.25
+        내 용 : 상위 메뉴 조회
+    -->
+    <select id="findByTopNode" resultType="HierachyVO">
+        <include refid="selecteNode" />
+        WHERE up_menu_id IS NULL
+        AND use_yn = 'Y'
+        ORDER BY menu_sn
+    </select>
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.04.25
+        내 용 : 하위 메뉴 조회
+    -->
+    <select id="findChildNode" parameterType="String" resultType="HierachyVO">
+        <include refid="selecteNode" />
+        WHERE up_menu_id = #{id}
+        AND use_yn = 'Y'
+        ORDER BY menu_sn
+    </select>
+    <!--  메뉴 관리(관리자 페이지 Tree 호출용)   -->
+
+    <!--
+        작성자 : 박정하
+        작성일 : 2024.04.29
+        내 용 : 상위,하위 메뉴 삭제
+    -->
+    <update id="deleteMenu" parameterType="MenuVO">
+        WITH RECURSIVE MenuHierarchy AS (
+            SELECT menu_id
+                 , up_menu_id
+            FROM menu_info
+            WHERE menu_id = #{menuId}
+            UNION ALL
+            SELECT di.menu_id
+                 , di.up_menu_id
+            FROM menu_info di
+            JOIN MenuHierarchy dh
+            ON di.up_menu_id = dh.menu_id
+        )
+        UPDATE menu_info
+        SET use_yn = 'N'
+            , mdfr = #{mdfr}
+            , mdfcn_dt = NOW()
+        WHERE menu_id IN (SELECT menu_id FROM MenuHierarchy);
+    </update>
+
+    <!--
+       작성자 : 박정하
+       작성일 : 2024.05.02
+       내 용 : 상위 메뉴 조회 [관리자용]
+   -->
+    <select id="findUpMenuId" parameterType="String" resultType="String">
+        SELECT up_menu_id AS menuId
+        FROM menu_info
+        WHERE menu_id = #{menuId}
+    </select>
+
+    <!--
+       작성자 : 박정하
+       작성일 : 2024.05.02
+       내 용 : 메뉴 권한 수정
+   -->
+    <update id="updateMenuAuthrt" parameterType="HashMap">
+        UPDATE menu_authrt_info
+        SET inq_authrt = #{inqAuthrt}
+          , reg_authrt = #{regAuthrt}
+          , mdfcn_authrt = #{mdfcnAuthrt}
+          , del_authrt = #{delAuthrt}
+          , file_dwnld_authrt = #{fileDwnldAuthrt}
+          , mdfr = #{mdfr}
+          , mdfcn_dt = NOW()
+        WHERE authrt_cd = #{authrtCd}
+        AND menu_id = #{id}
+    </update>
+
+
+    <!--                                    홈페이지 메뉴 호출 전용                                    -->
+    <!--
+        작성자 : takensoft
+        작성일 : 2024.05.09
+        내 용 : 최상위 메뉴 조회(라우터 포함)
+    -->
+    <select id="findByMenuWithRouter" resultType="SysMenuVO">
+        SELECT mi.menu_id
+             , mi.up_menu_id
+             , mi.menu_nm
+             , COALESCE(ctm.page_crs, bm.page_crs, mi.link_url, '') AS router_url
+             , mi.link_type
+             , mi.menu_type
+             , mi.menu_type_ctgry
+          FROM menu_info mi
+     LEFT JOIN ( SELECT conts_id
+                    <choose>
+                        <when test="menuType == 'adm'">
+                            , mngr_page_crs AS page_crs
+                        </when>
+                        <otherwise>
+                            , page_crs
+                        </otherwise>
+                    </choose>
+                   FROM conts_type_mng
+                ) ctm
+            ON mi.menu_type_ctgry = ctm.conts_id
+           AND mi.menu_type = 'conts'
+     LEFT JOIN ( SELECT bm.bbs_mng_id
+                    <choose>
+                        <when test="menuType == 'adm'">
+                            , br.mngr_page_crs AS page_crs
+                        </when>
+                        <otherwise>
+                            , br.page_crs
+                        </otherwise>
+                    </choose>
+                   FROM bbs_mng bm
+              LEFT JOIN bbs_router br
+                     ON bm.bbs_mng_id = br.bbs_mng_id
+                    AND br.expsr_yn = 'Y') bm
+            ON mi.menu_type_ctgry = bm.bbs_mng_id
+           AND mi.menu_type = 'bbs'
+         WHERE mi.up_menu_id = #{menuId}
+           AND mi.use_yn = 'Y'
+           AND mi.menu_expsr_yn = 'Y'
+           AND ( NOT EXISTS ( SELECT 1
+                                FROM menu_authrt_info mai
+                               WHERE mai.menu_id = mi.menu_id
+                               <if test="roles != null and roles.size() > 0">
+                                 AND mai.authrt_cd IN
+                                <foreach item="role" collection="roles" open="(" separator="," close=")">
+                                    #{role}
+                                </foreach>
+                               </if>
+                             ) OR EXISTS ( SELECT 1
+                                             FROM menu_authrt_info mai
+                                            WHERE mai.menu_id = mi.menu_id
+                                              AND mai.inq_authrt = 'Y'
+                                            <if test="roles != null and roles.size() > 0">
+                                              AND mai.authrt_cd IN
+                                             <foreach item="role" collection="roles" open="(" separator="," close=")">
+                                                #{role}
+                                             </foreach>
+                                            </if>
+                                         )
+                )
+        ORDER BY mi.menu_sn
+    </select>
+
+    <!--                                    홈페이지 메뉴 호출 전용                                    -->
+
+    <!--
+        작성자 : 박정하
+        작성일 : 2024.05.10
+        내 용 : 메뉴 정보 수정 (hierachyVO 사용)
+    -->
+    <update id="menuUpdateByHierachy" parameterType="DeptVO">
+        UPDATE menu_info
+        SET up_menu_id = #{upMenuId}
+          , menu_grd = #{menuGrd}
+          , menu_sn = #{menuSn}
+          , mdfr = #{mdfr}
+          , mdfcn_dt = NOW()
+        WHERE menu_id = #{menuId}
+    </update>
+
+    <!--
+        작성자 : 박정하
+        작성일 : 2024.05.17
+        내 용 : 메뉴 수정 (콘텐츠 유형)
+    -->
+    <update id="updateByContsId" parameterType="ContsTypeVO">
+        UPDATE menu_info
+        SET menu_type = null
+          , menu_type_ctgry = null
+          , mdfr = #{mdfr}
+          , mdfcn_dt = NOW()
+        WHERE menu_type_ctgry = #{contsId}
+    </update>
+
+    <!--
+       작성자 : 방선주
+       작성일 : 2024.06.07
+       내 용 : 게시판 관리에서 게시판 삭제 시 게시판 메뉴 미노출로 변경 (MENU_000000000000032 강제 적용)
+   -->
+    <update id="bbsMngMenuDelete" parameterType="MenuVO">
+        UPDATE menu_info
+        SET
+            use_yn = #{useYn}
+          , mdfr = #{mdfr}
+          , mdfcn_dt = NOW()
+        WHERE up_menu_id = 'MENU_000000000000032'
+          AND menu_type_ctgry = #{menuTypeCtgry}
+    </update>
+
+    <!--
+       작성자 : 박정하
+       작성일 : 2024.07.18
+       내 용 : 메뉴 개수 조회 (접속 통계용)
+   -->
+    <select id="findAllCnt" parameterType="HashMap" resultType="int">
+        SELECT COUNT(menu_id)
+          FROM menu_info
+         WHERE use_yn = 'Y'
+           AND up_menu_id = #{menuMainDepth}
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/menu/menuAuthor-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/menu/menuAuthor-SQL.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작성자 : 박정하
+    작성일 : 2024.05.07
+    내 용 : 메뉴 권한 관련
+-->
+<mapper namespace="com.takensoft.cms.menu.dao.MenuAuthorDAO">
+    <!-- 메뉴 권한 정보 resultMap -->
+    <resultMap id="menuAuthrtMap" type="HashMap">
+        <result property="name" column="name" />
+        <result property="menuId" column="menu_id" />
+        <result property="upMenuId" column="up_menu_id" />
+        <result property="menuNm" column="menu_nm" />
+        <result property="inqAuthrt" column="inq_authrt" />
+        <result property="regAuthrt" column="reg_authrt" />
+        <result property="mdfcnAuthrt" column="mdfcn_authrt" />
+        <result property="delAuthrt" column="del_authrt" />
+        <result property="fileDwnldAuthrt" column="file_dwnld_authrt" />
+    </resultMap>
+
+    <!--
+       작성자 : takensoft
+       작성일 : 2024.04.08
+       내 용 : 메뉴별 권한 등록
+   -->
+    <insert id="menuAuthrtSave" parameterType="MenuAuthorVO">
+        INSERT INTO menu_authrt_info (
+        authrt_cd
+        , menu_id
+        , inq_authrt
+        , reg_authrt
+        , mdfcn_authrt
+        , del_authrt
+        , file_dwnld_authrt
+        , reg_dt
+        ) VALUES (
+        #{authrtCd}
+        , #{menuId}
+        <choose>
+            <when test="authrtCd == 'ROLE_ADMIN'">
+                , 'Y'
+                , 'Y'
+                , 'Y'
+                , 'Y'
+                , 'Y'
+            </when>
+            <otherwise>
+                , 'N'
+                , 'N'
+                , 'N'
+                , 'N'
+                , 'N'
+            </otherwise>
+        </choose>
+        , NOW()
+        )
+    </insert>
+
+    <!--
+       작성자 : 박정하
+       작성일 : 2024.05.02
+       내 용 : 메뉴 권한 수정
+   -->
+    <update id="updateMenuAuthrt" parameterType="HashMap">
+        UPDATE menu_authrt_info
+        SET inq_authrt = #{inqAuthrt}
+          , reg_authrt = #{regAuthrt}
+          , mdfcn_authrt = #{mdfcnAuthrt}
+          , del_authrt = #{delAuthrt}
+          , file_dwnld_authrt = #{fileDwnldAuthrt}
+          , mdfr = #{mdfr}
+          , mdfcn_dt = NOW()
+        WHERE authrt_cd = #{authrtCd}
+          AND menu_id = #{menuId}
+    </update>
+
+    <!--
+       작성자 : 박정하
+       작성일 : 2024.05.02
+       내 용 : 메뉴 권한 조회
+    -->
+    <select id="findAll" parameterType="String" resultMap="menuAuthrtMap">
+        WITH RECURSIVE menu_tree AS (
+            SELECT mi.*
+                 , '' || mi.menu_nm AS name
+              FROM menu_info mi
+             WHERE up_menu_id IS NULL UNION ALL
+            SELECT mi.*
+                 , mt.name || ' > ' || mi.menu_nm AS name
+              FROM menu_tree mt
+        INNER JOIN menu_info mi
+                ON mt.menu_id = mi.up_menu_id
+        )
+        SELECT mt.name
+             , mt.menu_id
+             , mt.up_menu_id
+             , mt.menu_nm
+             , mai.inq_authrt
+             , mai.reg_authrt
+             , mai.mdfcn_authrt
+             , mai.del_authrt
+             , mai.file_dwnld_authrt
+          FROM menu_tree mt
+     LEFT JOIN menu_authrt_info mai
+            ON mt.menu_id = mai.menu_id
+           AND mai.authrt_cd = #{authrtCd}
+         WHERE mt.use_yn = 'Y'
+        <if test="authrtCd != 'ROLE_ADMIN'">
+           AND mt.sys_pvsn_yn = '1'
+        </if>
+      ORDER BY mt.name
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/popup/popup-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/popup/popup-SQL.xml
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.05.13
+    내   용 : 팝업 관련
+-->
+<mapper namespace="com.takensoft.cms.popup.dao.PopupDAO">
+    <!-- 팝업 resultMap -->
+    <resultMap id="popupMap" type="PopupVO">
+        <result property="popupId" column="popup_id" />
+        <result property="popupTtl" column="popup_ttl" />
+        <result property="bgngDt" column="bgng_dt" />
+        <result property="endDt" column="end_dt" />
+        <result property="wdthLen" column="wdth_len" />
+        <result property="vrtcLen" column="vrtc_len" />
+        <result property="popupType" column="popup_type" />
+        <result property="popupUseYn" column="popup_use_yn" />
+        <result property="vdoUrl" column="vdo_url" />
+        <result property="linkUrl" column="link_url" />
+        <result property="fileMngId" column="file_mng_id" />
+        <result property="sn" column="sn" />
+        <result property="pageType" column="page_type" />
+        <result property="useYn" column="use_yn" />
+        <result property="rgtr" column="rgtr" />
+        <result property="regDt" column="reg_dt" />
+        <result property="mdfr" column="mdfr" />
+        <result property="mdfcnDt" column="mdfcn_dt" />
+        <result property="mbrNm" column="mbr_nm" />
+    </resultMap>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.13
+        내   용 : 팝업 등록
+    -->
+    <insert id="insertPopup" parameterType="PopupVO" useGeneratedKeys="true" keyProperty="popupId">
+        INSERT INTO popup_mng (
+            popup_id
+            , popup_ttl
+            , bgng_dt
+            , end_dt
+            , wdth_len
+            , vrtc_len
+            , popup_type
+            , popup_use_yn
+            , vdo_url
+            , link_url
+            , file_mng_id
+            , sn
+            , page_type
+            , use_yn
+            , rgtr
+            , reg_dt
+        ) VALUES (
+            #{popupId}
+            , #{popupTtl}
+            , #{bgngDt}::timestamp
+            , #{endDt}::timestamp
+            , #{wdthLen}
+            , #{vrtcLen}
+            , #{popupType}
+            , #{popupUseYn}
+            , #{vdoUrl}
+            , #{linkUrl}
+            , #{fileMngId}
+            , #{sn}
+            , #{pageType}
+            , 'Y'
+            , #{rgtr}
+            , NOW()
+        )
+    </insert>
+
+    <!-- SELECT SQL -->
+    <sql id="selectItem">
+        SELECT pm.popup_id
+             , pm.popup_ttl
+             , TO_CHAR(pm.bgng_dt, 'YYYY-MM-DD HH24:MI') AS bgng_dt
+             , TO_CHAR(pm.end_dt, 'YYYY-MM-DD HH24:MI') AS end_dt
+             , pm.wdth_len
+             , pm.vrtc_len
+             , pm.popup_type
+             , pm.popup_use_yn
+             , pm.vdo_url
+             , pm.link_url
+             , pm.file_mng_id
+             , pm.sn
+             , pm.page_type
+             , pm.use_yn
+             , pm.rgtr
+             , TO_CHAR(pm.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , pm.mdfr
+             , TO_CHAR(pm.mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+             , mi.mbr_nm
+          FROM popup_mng AS pm
+     LEFT JOIN mbr_info AS mi
+            ON pm.rgtr = mi.mbr_id
+    </sql>
+
+    <sql id="selectRequirement">
+        <if test="searchText != null and searchText != ''">
+            <choose>
+                <when test="searchType != null and searchType != ''">
+                    <if test="searchType == 'popup_ttl'">
+                        AND pm.popup_ttl LIKE '%' || #{searchText} || '%'
+                    </if>
+                    <if test="searchType == 'mbr_nm'">
+                        AND mi.mbr_nm LIKE '%' || #{searchText} || '%'
+                    </if>
+                </when>
+                <otherwise>
+                    AND (
+                        pm.popup_ttl LIKE '%' || #{searchText} || '%'
+                    OR
+                        mi.mbr_nm LIKE '%' || #{searchText} || '%'
+                    )
+                </otherwise>
+            </choose>
+        </if>
+    </sql>
+    <!-- // SELECT SQL -->
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.13
+        내   용 : 팝업 목록 개수
+    -->
+    <select id="selectPopupListCnt" parameterType="Pagination" resultType="Integer">
+        SELECT COUNT(popup_id)
+        FROM popup_mng AS pm
+        LEFT JOIN mbr_info AS mi
+        ON pm.rgtr = mi.mbr_id
+        WHERE pm.use_yn = 'Y'
+        <include refid="selectRequirement" />
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.13
+        내   용 : 팝업 목록 조회
+    -->
+    <select id="selectPopupList" parameterType="Pagination" resultMap="popupMap">
+        <include refid="selectItem" />
+        WHERE pm.use_yn = 'Y'
+        <include refid="selectRequirement" />
+        ORDER BY reg_dt DESC
+        LIMIT #{recordSize} OFFSET #{limitStart}
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.13
+        내   용 : 팝업 상세 조회
+    -->
+    <select id="selectPopupDetail" parameterType="PopupVO" resultMap="popupMap">
+        <include refid="selectItem" />
+        WHERE pm.popup_id = #{popupId}
+          AND pm.use_yn = 'Y'
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.13
+        내   용 : 팝업 수정
+    -->
+    <update id="updatePopup" parameterType="PopupVO">
+        UPDATE popup_mng
+        SET popup_ttl = #{popupTtl}
+          , bgng_dt = #{bgngDt}::timestamp
+          , end_dt = #{endDt}::timestamp
+          , wdth_len = #{wdthLen}
+          , vrtc_len = #{vrtcLen}
+          , popup_type = #{popupType}
+          , popup_use_yn = #{popupUseYn}
+          , vdo_url = #{vdoUrl}
+          , link_url = #{linkUrl}
+          , file_mng_id = #{fileMngId}
+          , sn = #{sn}
+          , page_type = #{pageType}
+          , use_yn = #{useYn}
+          , mdfr = #{mdfr}
+          , mdfcn_dt = NOW()
+        WHERE popup_id = #{popupId}
+    </update>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.22
+        내   용 : 팝업 목록 조회 (팝업창 띄우는 용도)
+    -->
+    <select id="selectPopupListByPage" parameterType="String" resultMap="popupMap">
+        <include refid="selectItem" />
+        WHERE pm.use_yn = 'Y'
+        AND pm.popup_use_yn = 'Y'
+        AND pm.page_type = #{pageType}
+        AND now() >= pm.bgng_dt::timestamp
+        AND pm.end_dt::timestamp >= now()
+        ORDER BY reg_dt DESC
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.23
+        내   용 : 매일 자정에 종료일이 지난 팝업 사용여부 변경
+    -->
+    <update id="cleanExpiredPopups">
+        UPDATE popup_mng
+        SET popup_use_yn = 'N'
+          , mdfr = null
+          , mdfcn_dt = NOW()
+        WHERE end_dt &lt;= NOW()
+    </update>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.28
+        내   용 : 팝업 최신 목록 조회 (최신글 5건 출력)
+    -->
+    <select id="selectPopupListByNew" resultMap="popupMap">
+        <include refid="selectItem" />
+        WHERE pm.use_yn = 'Y'
+        ORDER BY pm.reg_dt DESC
+        LIMIT 5
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/prvcInqHstry/prvcInqHstry-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/prvcInqHstry/prvcInqHstry-SQL.xml
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.05.22
+    내   용 : 개인정보 조회 이력 관련
+-->
+<mapper namespace="com.takensoft.cms.prvcInqHstry.dao.PrvcInqHstryDAO">
+    <!-- 개인정보 조회 이력 resultMap -->
+    <resultMap id="prvcInqHstryMap" type="PrvcInqHstryVO">
+        <result property="inqHstryId" column="inq_hstry_id" />
+        <result property="inqTrprId" column="inq_trpr_id" />
+        <result property="inqRsn" column="inq_rsn" />
+        <result property="inqIp" column="inq_ip" />
+        <result property="rdr" column="rdr" />
+        <result property="inqDt" column="inq_dt" />
+        <result property="mbrNm" column="mbr_nm" />
+        <result property="lgnId" column="lgn_id" />
+    </resultMap>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.22
+        내   용 : 개인정보조회 이력 등록
+    -->
+    <insert id="insertPrvcInqHstry" parameterType="PrvcInqHstryVO">
+        INSERT INTO prvc_inq_hstry (
+            inq_trpr_id
+            , inq_rsn
+            , inq_ip
+            , rdr
+            , inq_dt
+        ) VALUES (
+            #{inqTrprId}
+            , #{inqRsn}
+            , #{inqIp}
+            , #{rdr}
+            , now()
+        )
+    </insert>
+
+    <!-- SELECT SQL -->
+    <sql id="selectItem">
+        SELECT pih.inq_hstry_id
+             , pih.inq_trpr_id
+             , pih.inq_rsn
+             , pih.inq_ip
+             , pih.rdr
+             , TO_CHAR(pih.inq_dt, 'YYYY-MM-DD HH24:MI') AS inq_dt
+             , mi.mbr_nm
+             , (SELECT lgn_id FROM mbr_info WHERE pih.inq_trpr_id = mbr_id) AS lgn_id
+        FROM prvc_inq_hstry AS pih
+        LEFT JOIN mbr_info AS mi
+        ON pih.rdr = mi.mbr_id
+    </sql>
+
+    <sql id="selectRequirement">
+        <if test="startDt != null and startDt != ''">
+            AND pih.inq_dt >= #{startDt}::timestamp
+        </if>
+        <if test="endDt != null and endDt != ''">
+            AND #{endDt}::timestamp >= pih.inq_dt
+        </if>
+        <if test="searchText != null and searchText != ''">
+            <choose>
+                <when test="searchType != null and searchType != ''">
+                    <if test="searchType == 'inqRdr'">
+                        AND mi.mbr_nm LIKE '%' || #{searchText} || '%'
+                    </if>
+                    <if test="searchType == 'inqTrprId'">
+                        AND pih.inq_trpr_id IN (select mbr_id
+                        from mbr_info
+                        where lgn_id LIKE '%' || #{searchText} || '%')
+                    </if>
+                </when>
+                <otherwise>
+                    AND (
+                        mi.mbr_nm LIKE '%' || #{searchText} || '%'
+                    OR
+                        pih.inq_trpr_id IN (select mbr_id
+                        from mbr_info
+                        where lgn_id LIKE '%' || #{searchText} || '%')
+                    )
+                </otherwise>
+            </choose>
+        </if>
+    </sql>
+    <!-- // SELECT SQL -->
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.27
+        내   용 : 개인정보조회 이력 개수
+    -->
+    <select id="selectPrvcInqHstryListCnt" parameterType="Pagination" resultType="Integer">
+        SELECT COUNT(pih.inq_hstry_id)
+        FROM prvc_inq_hstry AS pih
+        LEFT JOIN mbr_info AS mi
+        ON pih.rdr = mi.mbr_id
+        WHERE true
+        <include refid="selectRequirement" />
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.27
+        내   용 : 개인정보조회 이력 조회
+    -->
+    <select id="selectPrvcInqHstryList" parameterType="Pagination" resultMap="prvcInqHstryMap">
+        <include refid="selectItem" />
+        WHERE true
+        <include refid="selectRequirement" />
+        ORDER BY pih.inq_dt DESC
+        LIMIT #{recordSize} OFFSET #{limitStart}
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.05.27
+        내   용 : 개인정보조회 이력 상세 조회
+    -->
+    <select id="selectPrvcInqHstryDetail" parameterType="Integer" resultMap="prvcInqHstryMap">
+        <include refid="selectItem" />
+        WHERE pih.inq_hstry_id = #{inqHstryId}
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/rvwMttr/rvwMttr-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/rvwMttr/rvwMttr-SQL.xml
@@ -0,0 +1,294 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+    작성자 : 박정하
+    작성일 : 2024.03.29
+    내 용 : 검토사항 관련
+-->
+<mapper namespace="com.takensoft.portal.rvwMttr.dao.RvwMttrDAO">
+    <!-- 검토사항 resultMap -->
+    <resultMap id="rvwMttrMap" type="RvwMttrVO">
+        <result property="rvwMttrId" column="rvw_mttr_id" />
+        <result property="ivstDscsnId" column="ivst_dscsn_id" />
+        <result property="type" column="type" />
+        <result property="clr" column="clr" />
+        <result property="rcptDt" column="rcpt_dt" />
+        <result property="rcptCn" column="rcpt_cn" />
+        <result property="useYn" column="use_yn" />
+        <result property="rgtr" column="rgtr" />
+        <result property="regDt" column="reg_dt" />
+        <result property="mdfr" column="mdfr" />
+        <result property="mdfcnDt" column="mdfcn_dt" />
+        <result property="entId" column="ent_Id" />
+        <result property="entNm" column="ent_nm" />
+        <result property="ttl" column="ttl" />
+        <result property="clrNm" column="clr_nm" />
+        <result property="nowPrgrsCrs" column="now_prgrs_crs" />
+        <result property="fileMngId" column="file_mng_id" />
+        <result property="mainCn" column="main_cn" />
+        <collection property="prgrsList" column="{rvwMttrId = rvw_mttr_id}" javaType="java.util.ArrayList" ofType="RvwMttrPrgrsVO" select="selectRvwMttrPrgrsList" />
+    </resultMap>
+
+    <!-- 검토사항진행 resultMap -->
+    <resultMap id="rvwMttrPrgrsMap" type="RvwMttrPrgrsVO">
+        <result property="rvwMttrPrgrsId" column="rvw_mttr_prgrs_id" />
+        <result property="rvwMttrId" column="rvw_mttr_id" />
+        <result property="picId" column="pic_id" />
+        <result property="prgrsCrs" column="prgrs_crs" />
+        <result property="prgrsDt" column="prgrs_dt" />
+        <result property="sprtMthd" column="sprt_mthd" />
+        <result property="rgtr" column="rgtr" />
+        <result property="regDt" column="reg_dt" />
+        <result property="mdfr" column="mdfr" />
+        <result property="mdfcnDt" column="mdfcn_dt" />
+        <result property="picNm" column="pic_nm" />
+    </resultMap>
+
+    <!--
+    작성자 : 박정하
+    작성일자 : 2024-03-29
+    내용 : 검토사항 등록
+    -->
+    <insert id="rvwMttrInsert" parameterType="RvwMttrVO">
+        INSERT INTO rvw_mttr (
+            rvw_mttr_id
+            , ivst_dscsn_id
+            , type
+            , clr
+            , rcpt_dt
+            , rcpt_cn
+            , use_yn
+            , rgtr
+            , reg_dt
+            , file_mng_id
+        ) VALUES (
+            #{rvwMttrId}
+            , #{ivstDscsnId}
+            , #{type}
+            , #{clr}
+            , #{rcptDt}::timestamp
+            , #{rcptCn}
+            , 'Y'
+            , #{rgtr}
+            , now()
+            , #{fileMngId}
+        )
+    </insert>
+
+    <!-- 검색 조건 -->
+    <sql id="selectRequirement">
+        <if test="searchText != null and searchText != ''">
+            <choose>
+                <when test="searchType != null and searchType != ''">
+                    <if test="searchType == 'ent_nm'">
+                        AND ei.ent_nm LIKE '%' || #{searchText} || '%'
+                    </if>
+                    <if test="searchType == 'ttl'">
+                        AND id.ttl LIKE '%' || #{searchText} || '%'
+                    </if>
+                </when>
+                <otherwise>
+                    AND (
+                        ei.ent_nm LIKE '%' || #{searchText} || '%'
+                    OR
+                        id.ttl LIKE '%' || #{searchText} || '%'
+                    )
+                </otherwise>
+            </choose>
+        </if>
+        <if test="cateId == 'ivst_dscsn_id' and cateValue != null and cateValue != ''">
+            AND rm.ivst_dscsn_id = #{cateValue}
+        </if>
+        <if test="type != null and type != ''">
+            AND rm.type = #{type}
+        </if>
+    </sql>
+
+    <!--
+    작성자 : 박정하
+    작성일자 : 2024-03-29
+    내용 : 검토사항 목록 조회
+    -->
+    <select id="rvwMttrSelectList" resultMap="rvwMttrMap">
+        SELECT
+            rvw_mttr_id
+            , ivst_dscsn_id
+            , type
+            , clr
+            , to_char(rcpt_dt, 'YYYY-MM-DD HH24:MI') AS rcpt_dt
+            , rcpt_cn
+            , use_yn
+            , rgtr
+            , to_char(reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+            , mdfr
+            , to_char(mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+            , ttl
+            , ent_id
+            , ent_nm
+            , now_prgrs_crs
+            , file_mng_id
+        FROM (
+            SELECT rm.rvw_mttr_id
+            , rm.ivst_dscsn_id
+            , rm.type
+            , rm.clr
+            , rm.rcpt_dt
+            , rm.rcpt_cn
+            , rm.use_yn
+            , rm.rgtr
+            , rm.reg_dt
+            , rm.mdfr
+            , rm.mdfcn_dt
+            , id.ttl
+            , ei.ent_id
+            , ei.ent_nm
+            , (select rmp.prgrs_crs
+                from rvw_mttr_prgrs AS rmp
+                where rmp.rvw_mttr_id = rm.rvw_mttr_id
+                order by rmp.reg_dt DESC
+                limit 1 ) AS now_prgrs_crs
+            , rm.file_mng_id
+            FROM rvw_mttr AS rm
+            LEFT JOIN ivst_dscsn AS id
+            ON rm.ivst_dscsn_id = id.ivst_dscsn_id
+            LEFT JOIN ent_info AS ei
+            ON id.ent_id = ei.ent_id
+            WHERE rm.use_yn = 'Y'
+            <include refid="selectRequirement" />
+        ) AS datas
+        WHERE TRUE
+        <if test="prgrsCrs != null and prgrsCrs != ''">
+            AND now_prgrs_crs = #{prgrsCrs}
+        </if>
+        ORDER BY rvw_mttr_id DESC
+        OFFSET #{limitStart} LIMIT #{recordSize}
+    </select>
+
+    <!--
+    작성자 : 박정하
+    작성일자 : 2024-03-29
+    내용 : 검토사항 목록 총 개수 조회
+    -->
+    <select id="rvwMttrSelectListCount" resultType="int">
+        SELECT count(*)
+          FROM rvw_mttr AS rm
+     LEFT JOIN ivst_dscsn AS id
+            ON rm.ivst_dscsn_id = id.ivst_dscsn_id
+     LEFT JOIN ent_info AS ei
+            ON id.ent_id = ei.ent_id
+         WHERE rm.use_yn = 'Y'
+        <include refid="selectRequirement" />
+    </select>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024-06-04
+    내   용 : 검토사항 상세 조회
+    -->
+    <select id="selectRvwMttrDetail" parameterType="String" resultMap="rvwMttrMap">
+        SELECT  rm.rvw_mttr_id
+              , rm.type
+              , rm.clr
+              , to_char(rm.rcpt_dt, 'YYYY-MM-DD') AS rcpt_dt
+              , rm.rcpt_cn
+              , rm.use_yn
+              , rm.rgtr
+              , to_char(rm.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+              , rm.mdfr
+              , to_char(rm.mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+              , rm.ivst_dscsn_id
+              , ei.ent_id
+              , ei.ent_nm
+              , id.ttl
+              , mi.mbr_nm AS clr_nm
+              , rm.file_mng_id
+              , id.main_cn
+           FROM rvw_mttr AS rm
+      LEFT JOIN ivst_dscsn AS id
+             ON rm.ivst_dscsn_id = id.ivst_dscsn_id
+      LEFT JOIN ent_info AS ei
+             ON id.ent_id = ei.ent_id
+      LEFT JOIN mbr_info AS mi
+             ON rm.clr = mi.mbr_id
+          WHERE rm.use_yn = 'Y'
+            AND rm.rvw_mttr_id = #{rvwMttrId}
+    </select>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024-06-04
+    내   용 : 검토사항진행 목록 조회
+    -->
+    <select id="selectRvwMttrPrgrsList" parameterType="RvwMttrVO" resultMap="rvwMttrPrgrsMap">
+        SELECT rmp.rvw_mttr_prgrs_id
+             , rmp.rvw_mttr_id
+             , rmp.pic_id
+             , mi.mbr_nm AS pic_nm
+             , rmp.prgrs_crs
+             , to_char(rmp.prgrs_dt, 'YYYY-MM-DD') AS prgrs_dt
+             , rmp.sprt_mthd
+             , rmp.rgtr
+             , to_char(rmp.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , rmp.mdfr
+             , to_char(rmp.mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+          FROM rvw_mttr_prgrs AS rmp
+     LEFT JOIN mbr_info AS mi
+            ON rmp.pic_id = mi.mbr_id
+         WHERE rmp.rvw_mttr_id = #{rvwMttrId}
+      ORDER BY prgrs_dt, rvw_mttr_prgrs_id
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.04.01
+        내   용 : 검토사항 수정
+    -->
+    <update id="rvwMttrUpdate" parameterType="RvwMttrVO">
+        UPDATE rvw_mttr
+        SET ivst_dscsn_id = #{ivstDscsnId}
+            , type = #{type}
+            , clr = #{clr}
+            , rcpt_dt = #{rcptDt}::timestamp
+            , rcpt_cn = #{rcptCn}
+            , use_yn = #{useYn}
+            , mdfr = #{mdfr}
+            , mdfcn_dt = now()
+            , file_mng_id = #{fileMngId}
+        WHERE rvw_mttr_id = #{rvwMttrId}
+    </update>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.04.01
+        내   용 : 검토사항 삭제
+    -->
+    <update id="rvwMttrDelete" parameterType="RvwMttrVO">
+        UPDATE rvw_mttr
+        SET use_yn = 'N'
+        WHERE rvw_mttr_id = #{rvwMttrId}
+    </update>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.06.12
+        내   용 : 검토사항 목록 조회 (검토사항 삭제용)
+    -->
+    <select id="rvwMttrListByIvstDscsnId" resultMap="rvwMttrMap">
+        SELECT rm.rvw_mttr_id
+             , rm.ivst_dscsn_id
+             , rm.type
+             , rm.clr
+             , to_char(rm.rcpt_dt, 'YYYY-MM-DD HH24:MI') AS rcpt_dt
+             , rm.rcpt_cn
+             , rm.use_yn
+             , rm.rgtr
+             , to_char(rm.reg_dt, 'YYYY-MM-DD HH24:MI') AS reg_dt
+             , rm.mdfr
+             , to_char(rm.mdfcn_dt, 'YYYY-MM-DD HH24:MI') AS mdfcn_dt
+             , rm.file_mng_id
+          FROM rvw_mttr AS rm
+         WHERE rm.use_yn = 'Y'
+           AND rm.ivst_dscsn_id = #{ivst_dscsn_id}
+      ORDER BY rm.rvw_mttr_id DESC
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/rvwMttr/rvwMttrPrgrs-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/rvwMttr/rvwMttrPrgrs-SQL.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.takensoft.portal.rvwMttr.dao.RvwMttrPrgrsDAO">
+    <!-- 검토사항진행 resultMap -->
+    <resultMap id="rvwMttrPrgrsMap" type="HashMap">
+        <result property="rvwMttrPrgrsId" column="rvw_mttr_prgrs_id" />
+        <result property="rvwMttrId" column="rvw_mttr_id" />
+        <result property="picId" column="pic_id" />
+        <result property="mbrNm" column="mbr_nm" />
+        <result property="prgrsCrs" column="prgrs_crs" />
+        <result property="prgrsDt" column="prgrs_dt" />
+        <result property="sprtMthd" column="sprt_mthd" />
+        <result property="rgtr" column="rgtr" />
+        <result property="regDt" column="reg_dt" />
+        <result property="mdfr" column="mdfr" />
+        <result property="mdfcnDt" column="mdfcn_dt" />
+    </resultMap>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.04.25
+    내   용 : 검토사항진행 등록
+    -->
+    <insert id="prgrsInsert" parameterType="RvwMttrPrgrsVO">
+        INSERT INTO rvw_mttr_prgrs (
+            rvw_mttr_id
+            , pic_id
+            , prgrs_crs
+            , prgrs_dt
+            , sprt_mthd
+            , rgtr
+            , reg_dt
+        ) VALUES (
+            #{rvwMttrId}
+            , #{picId}
+            , #{prgrsCrs}
+            , #{prgrsDt}::timestamp
+            , #{sprtMthd}
+            , #{rgtr}
+            , now()
+        )
+    </insert>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024.04.25
+    내   용 : 검토사항진행 수정
+    -->
+    <update id="prgrsUpdate" parameterType="RvwMttrPrgrsVO">
+        UPDATE rvw_mttr_prgrs
+        SET pic_id = #{picId}
+            , prgrs_crs = #{prgrsCrs}
+            , prgrs_dt = #{prgrsDt}::timestamp
+            , sprt_mthd = #{sprtMthd}
+            , mdfr = #{mdfr}
+            , mdfcn_dt = now()
+        WHERE rvw_mttr_prgrs_id = #{rvwMttrPrgrsId}
+    </update>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024-04-01
+    내   용 : 검토사항진행 삭제
+    -->
+    <delete id="prgrsDelete" parameterType="int">
+        DELETE
+        FROM rvw_mttr_prgrs
+        WHERE rvw_mttr_prgrs_id = #{rvwMttrPrgrsId}
+    </delete>
+
+    <!--
+    작 성 자 : 박정하
+    작 성 일 : 2024-06-04
+    내   용 : 검토사항진행 삭제 (검토사항 삭제용)
+    -->
+    <delete id="prgrsDeleteForRvwMttr" parameterType="String">
+        DELETE
+        FROM rvw_mttr_prgrs
+        WHERE rvw_mttr_id = #{rvwMttrId}
+    </delete>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
build/resources/main/mybatis/mapper/statistics/statistics-SQL.xml (added)
+++ build/resources/main/mybatis/mapper/statistics/statistics-SQL.xml
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.takensoft.portal.statistics.dao.StatisticsDAO">
+    <sql id="intenMid">
+            , ksic_up_cd
+            , ksic_cd
+         from ent_info as ei
+    left join ivst_dscsn as id
+           on ei.ent_id = id.ent_id
+          AND id.reg_dt::DATE >= #{startDt}::TIMESTAMP
+          AND #{endDt}::TIMESTAMP >= id.reg_dt::DATE
+          and id.use_yn = 'Y'
+    </sql>
+
+    <sql id="intenBot">
+        where ei.use_yn = 'Y'
+          AND ei.reg_dt::DATE >= #{startDt}::TIMESTAMP
+          AND #{endDt}::TIMESTAMP >= ei.reg_dt::DATE
+     group by ksic_up_cd, ksic_cd
+    </sql>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.06.13
+        내   용 : 분류별 통계 조회
+    -->
+    <select id="categoryStatistics" resultType="HashMap">
+        SELECT datas.ksic_up_cd
+             , datas.ksic_cd
+             , ent_cnt
+             , id_cnt
+             , mvn.mvn_cnt
+             , mou.mou_cnt
+        FROM (
+            SELECT ksic_up_cd
+                 , ksic_cd
+                 , COUNT(ei.ent_id) AS ent_cnt
+                 , COUNT(id.ivst_dscsn_id) AS id_cnt
+              FROM ent_info AS ei
+         LEFT JOIN ivst_dscsn AS id
+                ON ei.ent_id = id.ent_id
+               AND id.use_yn='y'
+               AND id.reg_dt::DATE >= #{startDt}::TIMESTAMP
+               AND #{endDt}::TIMESTAMP >= id.reg_dt::DATE
+             WHERE ei.use_yn = 'Y'
+               AND ei.reg_dt::DATE >= #{startDt}::TIMESTAMP
+               AND #{endDt}::TIMESTAMP >= ei.reg_dt::DATE
+          GROUP BY ksic_up_cd, ksic_cd
+        ) AS datas
+        LEFT JOIN (SELECT COUNT(ivst_dscsn_id) AS mvn_cnt <include refid="intenMid" /> AND mvn_inten = '1' <include refid="intenBot" />) AS mvn
+        ON datas.ksic_up_cd = mvn.ksic_up_cd
+        AND datas.ksic_cd = mvn.ksic_cd
+        LEFT JOIN (SELECT COUNT(ivst_dscsn_id) AS mou_cnt <include refid="intenMid" /> AND mou_inten = '1' <include refid="intenBot" />) AS mou
+        ON datas.ksic_up_cd = mou.ksic_up_cd
+        AND datas.ksic_cd = mou.ksic_cd
+        ORDER BY datas.ksic_up_cd, datas.ksic_cd
+    </select>
+
+    <sql id="selectConsultation">
+        SELECT COUNT(rvw_mttr_prgrs_id) AS cnt
+        FROM rvw_mttr_prgrs AS rmp
+        LEFT JOIN rvw_mttr AS imp
+        ON imp.rvw_mttr_id = rmp.rvw_mttr_id
+        WHERE imp.type = rm.type
+    </sql>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.06.13
+        내   용 : 검토사항 통계 조회
+    -->
+    <select id="rvwMttrStatistics" resultType="HashMap">
+        SELECT cm.cd AS type
+            , COALESCE(count, 0) AS count
+            , COALESCE(before, 0) AS before
+            , COALESCE(progress, 0) AS progress
+            , COALESCE(complete, 0) AS complete
+        FROM cd_mng AS cm
+        LEFT JOIN (
+            SELECT rm.type
+                 , COUNT(ormp.rvw_mttr_prgrs_id) AS count
+                 , (<include refid="selectConsultation" /> and prgrs_crs = '0') AS before
+                 , (<include refid="selectConsultation" /> and prgrs_crs = '1') AS progress
+                 , (<include refid="selectConsultation" /> and prgrs_crs = '2') AS complete
+            FROM rvw_mttr AS rm
+            LEFT JOIN rvw_mttr_prgrs AS ormp
+            ON rm.rvw_mttr_id = ormp.rvw_mttr_id
+            WHERE rm.use_yn = 'Y'
+            AND rm.reg_dt::DATE >= #{startDt}::TIMESTAMP
+            AND #{endDt}::TIMESTAMP >= rm.reg_dt::DATE
+            GROUP BY rm.type
+        ) AS datas
+        ON cm.cd = datas.type
+        WHERE up_cd = 'rvwMttrType'
+    </select>
+
+    <!--
+        작 성 자 : 박정하
+        작 성 일 : 2024.06.14
+        내   용 : 상담신청 통계 조회
+    -->
+    <select id="consultationStatistics" resultType="HashMap">
+        SELECT years
+             , months
+             , days
+             , SUM(aply_cnt) AS aply_cnt
+             , SUM(complete_cnt) AS complete_cnt
+        FROM (
+            SELECT TO_CHAR(dates, 'YYYY') AS years
+                 , TO_CHAR(dates, 'MM') AS months
+                 , TO_CHAR(dates, 'DD') AS days
+                 , COALESCE(aply.cnt, 0) AS aply_cnt
+                 , COALESCE(complete.cnt, 0) AS complete_cnt
+            FROM generate_series(#{startDt}::TIMESTAMP, #{endDt}::TIMESTAMP, '1 day'::interval) AS dates
+            LEFT JOIN (
+                SELECT COUNT(ent_dscsn_aply_id) AS cnt
+                     , reg_dt::DATE
+                FROM ent_dscsn_aply AS eda
+                WHERE use_yn = 'Y'
+                GROUP BY reg_dt::DATE
+            ) AS aply
+            ON dates::DATE = aply.reg_dt
+            LEFT JOIN (
+                SELECT COUNT(ent_dscsn_aply_id) AS cnt
+                     , actn_dt::DATE
+                FROM ent_dscsn_aply AS eda
+                WHERE use_yn = 'Y'
+                AND prcs_stts = 'E'
+                GROUP BY actn_dt::DATE
+            ) AS complete
+            ON dates::DATE = complete.actn_dt
+        ) AS datas
+        GROUP BY years, months, days
+        ORDER BY years, months, days
+    </select>
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
gradle/libs.versions.toml (added)
+++ gradle/libs.versions.toml
@@ -0,0 +1,58 @@
+# This file was generated by the Gradle 'init' task.
+# https://docs.gradle.org/current/userguide/platforms.html#sub::toml-dependencies-format
+
+[versions]
+com-github-ben-manes-caffeine-caffeine = "2.9.3"
+com-oracle-database-jdbc-ojdbc10 = "19.16.0.0"
+io-jsonwebtoken-jjwt-api = "0.12.5"
+io-jsonwebtoken-jjwt-impl = "0.12.5"
+io-jsonwebtoken-jjwt-jackson = "0.12.5"
+mysql-mysql-connector-java = "8.0.23"
+org-apache-commons-commons-lang3 = "3.14.0"
+org-apache-poi-poi-ooxml = "4.1.2"
+org-bgee-log4jdbc-log4j2-log4jdbc-log4j2-jdbc4 = "1.16"
+org-egovframe-rte-org-egovframe-rte-fdl-idgnr = "4.2.0"
+org-egovframe-rte-org-egovframe-rte-fdl-property = "4.2.0"
+org-egovframe-rte-org-egovframe-rte-psl-dataaccess = "4.2.0"
+org-egovframe-rte-org-egovframe-rte-ptl-mvc = "4.2.0"
+org-hibernate-hibernate-entitymanager = "5.6.15.Final"
+org-hsqldb-hsqldb = "2.7.2"
+org-mariadb-jdbc-mariadb-java-client = "2.6.2"
+org-mybatis-spring-boot-mybatis-spring-boot-starter = "2.2.2"
+org-postgresql-postgresql = "42.6.0"
+org-projectlombok-lombok = "1.18.28"
+org-springframework-boot-spring-boot-devtools = "2.7.12"
+org-springframework-boot-spring-boot-starter-cache = "2.7.12"
+org-springframework-boot-spring-boot-starter-security = "3.2.4"
+org-springframework-boot-spring-boot-starter-test = "2.7.12"
+org-springframework-boot-spring-boot-starter-thymeleaf = "2.7.12"
+org-springframework-boot-spring-boot-starter-validation = "2.7.12"
+org-springframework-boot-spring-boot-starter-web = "2.7.12"
+
+[libraries]
+com-github-ben-manes-caffeine-caffeine = { module = "com.github.ben-manes.caffeine:caffeine", version.ref = "com-github-ben-manes-caffeine-caffeine" }
+com-oracle-database-jdbc-ojdbc10 = { module = "com.oracle.database.jdbc:ojdbc10", version.ref = "com-oracle-database-jdbc-ojdbc10" }
+io-jsonwebtoken-jjwt-api = { module = "io.jsonwebtoken:jjwt-api", version.ref = "io-jsonwebtoken-jjwt-api" }
+io-jsonwebtoken-jjwt-impl = { module = "io.jsonwebtoken:jjwt-impl", version.ref = "io-jsonwebtoken-jjwt-impl" }
+io-jsonwebtoken-jjwt-jackson = { module = "io.jsonwebtoken:jjwt-jackson", version.ref = "io-jsonwebtoken-jjwt-jackson" }
+mysql-mysql-connector-java = { module = "mysql:mysql-connector-java", version.ref = "mysql-mysql-connector-java" }
+org-apache-commons-commons-lang3 = { module = "org.apache.commons:commons-lang3", version.ref = "org-apache-commons-commons-lang3" }
+org-apache-poi-poi-ooxml = { module = "org.apache.poi:poi-ooxml", version.ref = "org-apache-poi-poi-ooxml" }
+org-bgee-log4jdbc-log4j2-log4jdbc-log4j2-jdbc4 = { module = "org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4", version.ref = "org-bgee-log4jdbc-log4j2-log4jdbc-log4j2-jdbc4" }
+org-egovframe-rte-org-egovframe-rte-fdl-idgnr = { module = "org.egovframe.rte:org.egovframe.rte.fdl.idgnr", version.ref = "org-egovframe-rte-org-egovframe-rte-fdl-idgnr" }
+org-egovframe-rte-org-egovframe-rte-fdl-property = { module = "org.egovframe.rte:org.egovframe.rte.fdl.property", version.ref = "org-egovframe-rte-org-egovframe-rte-fdl-property" }
+org-egovframe-rte-org-egovframe-rte-psl-dataaccess = { module = "org.egovframe.rte:org.egovframe.rte.psl.dataaccess", version.ref = "org-egovframe-rte-org-egovframe-rte-psl-dataaccess" }
+org-egovframe-rte-org-egovframe-rte-ptl-mvc = { module = "org.egovframe.rte:org.egovframe.rte.ptl.mvc", version.ref = "org-egovframe-rte-org-egovframe-rte-ptl-mvc" }
+org-hibernate-hibernate-entitymanager = { module = "org.hibernate:hibernate-entitymanager", version.ref = "org-hibernate-hibernate-entitymanager" }
+org-hsqldb-hsqldb = { module = "org.hsqldb:hsqldb", version.ref = "org-hsqldb-hsqldb" }
+org-mariadb-jdbc-mariadb-java-client = { module = "org.mariadb.jdbc:mariadb-java-client", version.ref = "org-mariadb-jdbc-mariadb-java-client" }
+org-mybatis-spring-boot-mybatis-spring-boot-starter = { module = "org.mybatis.spring.boot:mybatis-spring-boot-starter", version.ref = "org-mybatis-spring-boot-mybatis-spring-boot-starter" }
+org-postgresql-postgresql = { module = "org.postgresql:postgresql", version.ref = "org-postgresql-postgresql" }
+org-projectlombok-lombok = { module = "org.projectlombok:lombok", version.ref = "org-projectlombok-lombok" }
+org-springframework-boot-spring-boot-devtools = { module = "org.springframework.boot:spring-boot-devtools", version.ref = "org-springframework-boot-spring-boot-devtools" }
+org-springframework-boot-spring-boot-starter-cache = { module = "org.springframework.boot:spring-boot-starter-cache", version.ref = "org-springframework-boot-spring-boot-starter-cache" }
+org-springframework-boot-spring-boot-starter-security = { module = "org.springframework.boot:spring-boot-starter-security", version.ref = "org-springframework-boot-spring-boot-starter-security" }
+org-springframework-boot-spring-boot-starter-test = { module = "org.springframework.boot:spring-boot-starter-test", version.ref = "org-springframework-boot-spring-boot-starter-test" }
+org-springframework-boot-spring-boot-starter-thymeleaf = { module = "org.springframework.boot:spring-boot-starter-thymeleaf", version.ref = "org-springframework-boot-spring-boot-starter-thymeleaf" }
+org-springframework-boot-spring-boot-starter-validation = { module = "org.springframework.boot:spring-boot-starter-validation", version.ref = "org-springframework-boot-spring-boot-starter-validation" }
+org-springframework-boot-spring-boot-starter-web = { module = "org.springframework.boot:spring-boot-starter-web", version.ref = "org-springframework-boot-spring-boot-starter-web" }
 
gradle/wrapper/gradle-wrapper.jar (Binary) (added)
+++ gradle/wrapper/gradle-wrapper.jar
Binary file is not shown
 
gradle/wrapper/gradle-wrapper.properties (added)
+++ gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,7 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
+networkTimeout=10000
+validateDistributionUrl=true
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
 
gradlew (added)
+++ gradlew
@@ -0,0 +1,251 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+
+##############################################################################
+#
+#   Gradle start up script for POSIX generated by Gradle.
+#
+#   Important for running:
+#
+#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+#       noncompliant, but you have some other compliant shell such as ksh or
+#       bash, then to run this script, type that shell name before the whole
+#       command line, like:
+#
+#           ksh Gradle
+#
+#       Busybox and similar reduced shells will NOT work, because this script
+#       requires all of these POSIX shell features:
+#         * functions;
+#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+#         * compound commands having a testable exit status, especially «case»;
+#         * various built-in commands including «command», «set», and «ulimit».
+#
+#   Important for patching:
+#
+#   (2) This script targets any POSIX shell, so it avoids extensions provided
+#       by Bash, Ksh, etc; in particular arrays are avoided.
+#
+#       The "traditional" practice of packing multiple parameters into a
+#       space-separated string is a well documented source of bugs and security
+#       problems, so this is (mostly) avoided, by progressively accumulating
+#       options in "$@", and eventually passing that to Java.
+#
+#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+#       see the in-line comments for details.
+#
+#       There are tweaks for specific operating systems such as AIX, CygWin,
+#       Darwin, MinGW, and NonStop.
+#
+#   (3) This script is generated from the Groovy template
+#       https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+#       within the Gradle project.
+#
+#       You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+    APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no leading path
+    [ -h "$app_path" ]
+do
+    ls=$( ls -ld "$app_path" )
+    link=${ls#*' -> '}
+    case $link in             #(
+      /*)   app_path=$link ;; #(
+      *)    app_path=$APP_HOME$link ;;
+    esac
+done
+
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+    echo "$*"
+} >&2
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in                #(
+  CYGWIN* )         cygwin=true  ;; #(
+  Darwin* )         darwin=true  ;; #(
+  MSYS* | MINGW* )  msys=true    ;; #(
+  NONSTOP* )        nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD=$JAVA_HOME/jre/sh/java
+    else
+        JAVACMD=$JAVA_HOME/bin/java
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD=java
+    if ! command -v java >/dev/null 2>&1
+    then
+        die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+    case $MAX_FD in #(
+      max*)
+        # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+        # shellcheck disable=SC2039,SC3045
+        MAX_FD=$( ulimit -H -n ) ||
+            warn "Could not query maximum file descriptor limit"
+    esac
+    case $MAX_FD in  #(
+      '' | soft) :;; #(
+      *)
+        # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+        # shellcheck disable=SC2039,SC3045
+        ulimit -n "$MAX_FD" ||
+            warn "Could not set maximum file descriptor limit to $MAX_FD"
+    esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+#   * args from the command line
+#   * the main class name
+#   * -classpath
+#   * -D...appname settings
+#   * --module-path (only if needed)
+#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+    APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+    CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+    JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    for arg do
+        if
+            case $arg in                                #(
+              -*)   false ;;                            # don't mess with options #(
+              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath
+                    [ -e "$t" ] ;;                      #(
+              *)    false ;;
+            esac
+        then
+            arg=$( cygpath --path --ignore --mixed "$arg" )
+        fi
+        # Roll the args list around exactly as many times as the number of
+        # args, so each arg winds up back in the position where it started, but
+        # possibly modified.
+        #
+        # NB: a `for` loop captures its iteration list before it begins, so
+        # changing the positional parameters here affects neither the number of
+        # iterations, nor the values presented in `arg`.
+        shift                   # remove old arg
+        set -- "$@" "$arg"      # push replacement arg
+    done
+fi
+
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command:
+#   * DEFAULT_JVM_OPTS, JAVA_OPTS, 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 (added)
+++ gradlew.bat
@@ -0,0 +1,94 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem      https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+@rem SPDX-License-Identifier: Apache-2.0
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
 
pom.xml (deleted)
--- pom.xml
@@ -1,224 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<groupId>com.takensoft</groupId>
-	<artifactId>cms</artifactId>
-	<packaging>jar</packaging>
-	<version>1.0.0</version>
-	<name>cms</name>
-	<url>http://www.egovframe.go.kr</url>
-
-	<licenses>
-        <license>
-            <name>The Apache Software License, Version 2.0</name>
-            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-        </license>
-    </licenses>
-
-	<parent>
-		<groupId>org.springframework.boot</groupId>
-		<artifactId>spring-boot-starter-parent</artifactId>
-		<version>2.7.12</version>
-	</parent>
-
-	<properties>
-	    <spring.maven.artifact.version>5.3.27</spring.maven.artifact.version>
-		<org.egovframe.rte.version>4.2.0</org.egovframe.rte.version>
-	</properties>
-
-	<repositories>
-        <repository>
-            <id>mvn2s</id>
-            <url>https://repo1.maven.org/maven2/</url>
-            <releases>
-                <enabled>true</enabled>
-            </releases>
-            <snapshots>
-                <enabled>true</enabled>
-            </snapshots>
-        </repository>
-        <repository>
-			<id>egovframe</id>
-			<url>https://maven.egovframe.go.kr/maven/</url>
-			<releases>
-				<enabled>true</enabled>
-			</releases>
-			<snapshots>
-				<enabled>false</enabled>
-			</snapshots>
-		</repository>
-    </repositories>
-
-	<dependencies>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-web</artifactId>
-			<exclusions>
-				<exclusion>
-					<groupId>org.springframework.boot</groupId>
-					<artifactId>spring-boot-starter-logging</artifactId>
-				</exclusion>
-			</exclusions>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-thymeleaf</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-validation</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-devtools</artifactId>
-			<optional>true</optional>
-		</dependency>
-
-		<!-- 표준프레임워크 실행환경 -->
-        <dependency>
-		    <groupId>org.egovframe.rte</groupId>
-		    <artifactId>org.egovframe.rte.ptl.mvc</artifactId>
-		    <version>${org.egovframe.rte.version}</version>
-        </dependency>
-        <dependency>
-		    <groupId>org.egovframe.rte</groupId>
-		    <artifactId>org.egovframe.rte.psl.dataaccess</artifactId>
-		    <version>${org.egovframe.rte.version}</version>
-        </dependency>
-        <dependency>
-			<groupId>org.egovframe.rte</groupId>
-			<artifactId>org.egovframe.rte.fdl.idgnr</artifactId>
-			<version>${org.egovframe.rte.version}</version>
-		</dependency>
-       	<dependency>
-			<groupId>org.egovframe.rte</groupId>
-			<artifactId>org.egovframe.rte.fdl.property</artifactId>
-			<version>${org.egovframe.rte.version}</version>
-		</dependency>
-
-		<dependency>
-			<groupId>org.hsqldb</groupId>
-			<artifactId>hsqldb</artifactId>
-			<version>2.7.2</version>
-			<classifier>jdk8</classifier>
-		</dependency>
-		<dependency>
-			<groupId>org.projectlombok</groupId>
-			<artifactId>lombok</artifactId>
-			<version>1.18.28</version>
-			<optional>true</optional>
-		</dependency>
-		<dependency>
-			<groupId>org.hibernate</groupId>
-			<artifactId>hibernate-entitymanager</artifactId>
-			<version>5.6.15.Final</version>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-test</artifactId>
-			<scope>test</scope>
-		</dependency>
-
-		<!--                                           추가                                           -->
-		<dependency>
-			<groupId>org.mybatis.spring.boot</groupId>
-			<artifactId>mybatis-spring-boot-starter</artifactId>
-			<version>2.2.2</version>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-security</artifactId>
-			<version>3.2.4</version>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-cache</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.github.ben-manes.caffeine</groupId>
-			<artifactId>caffeine</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>mysql</groupId>
-			<artifactId>mysql-connector-java</artifactId>
-			<version>8.0.23</version>
-		</dependency>
-		<dependency>
-			<groupId>org.mariadb.jdbc</groupId>
-			<artifactId>mariadb-java-client</artifactId>
-			<version>2.6.2</version>
-		</dependency>
-
-		<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
-		<dependency>
-			<groupId>org.postgresql</groupId>
-			<artifactId>postgresql</artifactId>
-			<version>42.6.0</version>
-		</dependency>
-
-		<dependency>
-			<groupId>org.bgee.log4jdbc-log4j2</groupId>
-			<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
-			<version>1.16</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.poi</groupId>
-			<artifactId>poi-ooxml</artifactId>
-			<version>4.1.2</version>
-		</dependency>
-		<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-api -->
-		<dependency>
-			<groupId>io.jsonwebtoken</groupId>
-			<artifactId>jjwt-api</artifactId>
-			<version>0.12.5</version>
-		</dependency>
-		<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-impl -->
-		<dependency>
-			<groupId>io.jsonwebtoken</groupId>
-			<artifactId>jjwt-impl</artifactId>
-			<version>0.12.5</version>
-			<scope>runtime</scope>
-		</dependency>
-		<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-jackson -->
-		<dependency>
-			<groupId>io.jsonwebtoken</groupId>
-			<artifactId>jjwt-jackson</artifactId>
-			<version>0.12.5</version>
-			<scope>runtime</scope>
-		</dependency>
-
-		<!--                                           추가                                           -->
-		<!-- HTML 엔티티를 처리 관련 https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
-		<dependency>
-			<groupId>org.apache.commons</groupId>
-			<artifactId>commons-lang3</artifactId>
-			<version>3.14.0</version>
-		</dependency>
-
-		<!-- oracle  추가 -->
-		<dependency>
-			<groupId>com.oracle.database.jdbc</groupId>
-			<artifactId>ojdbc10</artifactId>
-			<version>19.16.0.0</version>
-		</dependency>
-	</dependencies>
-
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.springframework.boot</groupId>
-				<artifactId>spring-boot-maven-plugin</artifactId>
-				<configuration>
-					<excludes>
-						<exclude>
-							<groupId>org.projectlombok</groupId>
-							<artifactId>lombok</artifactId>
-						</exclude>
-					</excludes>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
-
-</project>
 
settings.gradle (added)
+++ settings.gradle
@@ -0,0 +1,5 @@
+/*
+ * This file was generated by the Gradle 'init' task.
+ */
+
+rootProject.name = 'cms'
src/main/java/com/takensoft/cms/accesCtrl/service/AccesCtrlService.java
--- src/main/java/com/takensoft/cms/accesCtrl/service/AccesCtrlService.java
+++ src/main/java/com/takensoft/cms/accesCtrl/service/AccesCtrlService.java
@@ -2,7 +2,7 @@
 
 import com.takensoft.cms.accesCtrl.vo.AccesCtrlVO;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
src/main/java/com/takensoft/cms/accesCtrl/service/Impl/SystemAccesCtrlServiceImpl.java
--- src/main/java/com/takensoft/cms/accesCtrl/service/Impl/SystemAccesCtrlServiceImpl.java
+++ src/main/java/com/takensoft/cms/accesCtrl/service/Impl/SystemAccesCtrlServiceImpl.java
@@ -9,7 +9,7 @@
 import org.springframework.stereotype.Service;
 import org.springframework.util.AntPathMatcher;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import java.util.List;
 import java.util.Map;
 
src/main/java/com/takensoft/cms/accesCtrl/service/SystemAccesCtrlService.java
--- src/main/java/com/takensoft/cms/accesCtrl/service/SystemAccesCtrlService.java
+++ src/main/java/com/takensoft/cms/accesCtrl/service/SystemAccesCtrlService.java
@@ -1,6 +1,6 @@
 package com.takensoft.cms.accesCtrl.service;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import java.util.Map;
 
 /**
src/main/java/com/takensoft/cms/accesCtrl/web/AccesCtrlController.java
--- src/main/java/com/takensoft/cms/accesCtrl/web/AccesCtrlController.java
+++ src/main/java/com/takensoft/cms/accesCtrl/web/AccesCtrlController.java
@@ -2,7 +2,9 @@
 
 import com.takensoft.cms.accesCtrl.service.AccesCtrlService;
 import com.takensoft.cms.accesCtrl.vo.AccesCtrlVO;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
@@ -11,15 +13,17 @@
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import java.nio.charset.Charset;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-
 /**
- * @author  : takensoft
- * @since   : 2024.04.01
+ * @author takensoft
+ * @since 2024.04.01
+ * @modification
+ *     since    |    author    | description
+ *  2024.04.01  |  takensoft   | 최초 등록
  *
  * 접근 제어 관련 컨트롤러
  */
@@ -29,6 +33,7 @@
 @RequestMapping(value = "/admin/accesCtrl")
 public class AccesCtrlController {
 
+    private final ResponseUtil resUtil;
     private final AccesCtrlService accesCtrlService;
 
     /**
@@ -47,18 +52,10 @@
         int saveResult = (int) result.get("result");
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(saveResult > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 등록 처리되었습니다.");
-            responseData.setData(result);
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
         }
     }
 
@@ -77,13 +74,7 @@
         // 접근제어 목록 관련 정보 조회
         Map<String, Object> result = accesCtrlService.findAll(params);
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -101,13 +92,7 @@
         Map<String, Object> result = accesCtrlService.findByAccesCtrl(accesCtrlVO.getAcsCntrlId());
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -125,17 +110,10 @@
         int result = accesCtrlService.accesCtrlUpdate(accesCtrlVO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 수정 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("수정에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
 
@@ -154,17 +132,10 @@
         int result = accesCtrlService.accesCtrlUpdate(accesCtrlVO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 삭제 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("삭제에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_DELETE_FAIL);
         }
     }
 }
(파일 끝에 줄바꿈 문자 없음)
src/main/java/com/takensoft/cms/accesCtrl/web/SystemAccesCtrlController.java
--- src/main/java/com/takensoft/cms/accesCtrl/web/SystemAccesCtrlController.java
+++ src/main/java/com/takensoft/cms/accesCtrl/web/SystemAccesCtrlController.java
@@ -2,7 +2,9 @@
 
 import com.takensoft.cms.accesCtrl.service.AccesCtrlService;
 import com.takensoft.cms.accesCtrl.service.SystemAccesCtrlService;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
@@ -14,7 +16,7 @@
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import java.nio.charset.Charset;
 import java.util.Map;
 
@@ -31,7 +33,7 @@
 public class SystemAccesCtrlController {
 
     private final SystemAccesCtrlService systemAccesCtrlService;
-
+    private final ResponseUtil resUtil;
     /**
      * @author takensoft
      * @since 2024.05.20
@@ -48,11 +50,7 @@
         // 응답 처리
         HttpHeaders headers = new HttpHeaders();
         headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("검증");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
 }
src/main/java/com/takensoft/cms/author/web/AuthorController.java
--- src/main/java/com/takensoft/cms/author/web/AuthorController.java
+++ src/main/java/com/takensoft/cms/author/web/AuthorController.java
@@ -4,7 +4,9 @@
 import com.takensoft.cms.author.service.AuthorService;
 import com.takensoft.cms.author.vo.AuthorVO;
 import com.takensoft.common.exception.IdDuplicationException;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
@@ -21,10 +23,12 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-
 /**
- * @author  : takensoft
- * @since   : 2024.04.01
+ * @author takensoft
+ * @since 2024.04.01
+ * @modification
+ *     since    |    author    | description
+ *  2024.04.01  |  takensoft   | 최초 등록
  *
  * 권한 정보 관련 컨트롤러
  */
@@ -34,6 +38,7 @@
 @RequestMapping("/admin/auth")
 public class AuthorController {
 
+    private final ResponseUtil resUtil;
     private final AuthorService authorService;
 
     /**
@@ -50,28 +55,17 @@
         // 권한 코드 중복 검사
         boolean isExistence = authorService.findByCheckAuthorCode(authorVO);
 
-        // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
 
         if(isExistence) {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("이미 존재하는 권한코드입니다.");
-            log.error("이미 존재하는 권한코드입니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_DUPLICATION_CODE);
         }
         // 권한 등록
         int result = authorService.authorSave(authorVO);
-
+        // 응답 처리
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 등록 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
         }
     }
 
@@ -89,13 +83,7 @@
         // 권한 목록 조회
         Map<String, Object> result = authorService.findAllAuthor(params);
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -116,13 +104,7 @@
         result.put("authrt", authrt);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -136,19 +118,13 @@
      */
     @PostMapping("/updateProc.json")
     public ResponseEntity<?> updateProc(@RequestBody AuthorVO authorVO) throws Exception {
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         
         // 권한 코드의 변경 사항이 있을 때만 코드 중복 검사 진행
         if(authorVO.getOriginAuthrtCd() != null && !authorVO.getOriginAuthrtCd().equals("") && !authorVO.getOriginAuthrtCd().equals(authorVO.getAuthrtCd())) {
             // 권한 코드 중복 검사
             boolean isExistence = authorService.findByCheckAuthorCode(authorVO);
             if(isExistence) {
-                responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-                responseData.setMessage("이미 존재하는 권한코드입니다.");
-                log.error("이미 존재하는 권한코드입니다.");
-                return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+                return resUtil.errorRes(MessageCode.COMMON_DUPLICATION_CODE);
             }
         }
         
@@ -157,13 +133,9 @@
 
         // 응답 처리
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 수정 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("수정에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
 
@@ -182,17 +154,10 @@
         int result = authorService.authorUpdate(authorVO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 삭제 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("삭제에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_DELETE_FAIL);
         }
     }
 
@@ -209,12 +174,6 @@
     public ResponseEntity<?> findAllSystem() throws Exception {
         List<AuthorVO> result = authorService.findAllSystem();
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 }
src/main/java/com/takensoft/cms/bbs/web/BbsCnController.java
--- src/main/java/com/takensoft/cms/bbs/web/BbsCnController.java
+++ src/main/java/com/takensoft/cms/bbs/web/BbsCnController.java
@@ -8,7 +8,9 @@
 import com.takensoft.cms.bbs.vo.CmntVO;
 import com.takensoft.common.file.service.FileService;
 import com.takensoft.common.file.vo.FileVO;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
@@ -18,7 +20,7 @@
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.OutputStream;
@@ -27,10 +29,12 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-
 /**
- * @author  : 하석형
- * @since   : 2024.05.09
+ * @author 하석형
+ * @since 2024.05.09
+ * @modification
+ *     since    |    author    | description
+ *  2024.05.09  |    하석형     | 최초 등록
  *
  * 게시판 내용 관련 컨트롤러
  */
@@ -40,6 +44,7 @@
 @RequestMapping(value="/sys/bbsCn")
 public class BbsCnController {
 
+    private final ResponseUtil resUtil;
     private final BbsCnService bbsCnService;
     private final BbsMngService bbsMngService;
     private final FileService fileService;
@@ -95,19 +100,14 @@
         int insertResult = (int) result.get("result");
 
         if (insertResult > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 등록되었습니다.");
-            responseData.setData(result);
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else if (insertResult == -1){
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
+            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
+            responseData.setStatusText(HttpStatus.INTERNAL_SERVER_ERROR);
             responseData.setMessage("아래의 금지어가 포함되어 있습니다.\n* " + result.get("word"));
             return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
-
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
         }
     }
 
@@ -126,13 +126,7 @@
         Map<String, Object> result = bbsCnService.findAllBbsCn(params);
 
         // 응답처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -172,13 +166,7 @@
         result.put("nextBbsCn", nextBbsCn);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
 //    /**
@@ -231,19 +219,15 @@
         headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
         ResponseData responseData = new ResponseData();
         if (updateResult > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 게시글이 수정 되었습니다.");
-            responseData.setData(params.get("bbsId"));
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else if (updateResult == -1){
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
+            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
+            responseData.setStatusText(HttpStatus.INTERNAL_SERVER_ERROR);
             responseData.setMessage("아래의 금지어가 포함되어 있습니다.\n* " + result.get("word"));
             return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
 
         } else {
-            responseData.setStatus(HttpStatus.BAD_REQUEST);
-            responseData.setMessage("게시글 수정에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.BAD_REQUEST);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
 
@@ -258,22 +242,15 @@
      */
     @PostMapping("/deleteProc.json")
     public ResponseEntity<?> deleteProc(@RequestBody BbsCnVO bbsCnVO) throws Exception {
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
 
         // 게시판 내용 수정
         int result = bbsCnService.deleteBbsCn(bbsCnVO);
 
         // 응답 처리
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 삭제 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("삭제에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_DELETE_FAIL);
         }
     }
     /**
@@ -287,22 +264,15 @@
      */
     @PostMapping("/updateVwCnt.json")
     public ResponseEntity<?> updateVwCnt(@RequestBody HashMap<String, Object> params) throws Exception {
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         
         // 조회수 증가
         int result = bbsCnService.updateVwCnt(params);
 
         // 응답 처리
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 조회수가 증가되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("조회수 증가에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
 
@@ -365,19 +335,14 @@
 
 
         if(insertResult > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 등록 처리되었습니다.");
-            responseData.setData(result);
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else if (insertResult == -1){
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
+            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
+            responseData.setStatusText(HttpStatus.INTERNAL_SERVER_ERROR);
             responseData.setMessage("아래의 금지어가 포함되어 있습니다.\n* " + result.get("word"));
             return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
-
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
         }
     }
     /**
@@ -401,19 +366,14 @@
         int updateResult = (int) result.get("result");
 
         if(updateResult > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 수정 처리되었습니다.");
-            responseData.setData(result);
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else if (updateResult == -1){
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
+            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
+            responseData.setStatusText(HttpStatus.INTERNAL_SERVER_ERROR);
             responseData.setMessage("아래의 금지어가 포함되어 있습니다.\n* " + result.get("word"));
             return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
-
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("수정에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
     /**
@@ -428,22 +388,14 @@
     @PostMapping("/ansDeleteProc.json")
     public ResponseEntity<?> ansDeleteProc(@RequestBody BbsCnVO bbsCnVO) throws Exception {
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
 
 //        int result = 1;
         int result = bbsCnService.deleteAns(bbsCnVO);
 
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 삭제 처리되었습니다.");
-            responseData.setData(result);
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("삭제에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_DELETE_FAIL);
         }
     }
     /**
@@ -461,12 +413,6 @@
         List<BbsCnVO> result = bbsCnService.findFiveNotice(bbsCn);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 }
(파일 끝에 줄바꿈 문자 없음)
src/main/java/com/takensoft/cms/bbs/web/BbsMngController.java
--- src/main/java/com/takensoft/cms/bbs/web/BbsMngController.java
+++ src/main/java/com/takensoft/cms/bbs/web/BbsMngController.java
@@ -8,7 +8,9 @@
 import com.takensoft.cms.codeManage.service.CodeManageService;
 import com.takensoft.cms.codeManage.vo.CodeManageVO;
 import com.takensoft.common.HierachyVO;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
@@ -22,10 +24,12 @@
 
 import java.nio.charset.Charset;
 import java.util.*;
-
 /**
- * @author  : 박정하
- * @since   : 2024.05.08
+ * @author 박정하
+ * @since 2024.05.08
+ * @modification
+ *     since    |    author    | description
+ *  2024.05.08  |    박정하     | 최초 등록
  *
  * 게시판 관리 관련 컨트롤러
  */
@@ -35,6 +39,7 @@
 @RequestMapping(value="/admin/bbsMng")
 public class BbsMngController {
 
+    private final ResponseUtil resUtil;
     private final BbsMngService bbsMngService;
     private final BbsTypeMngService bbsTypeMngService;
     private final CodeManageService codeManageService;
@@ -50,11 +55,6 @@
      */
     @PostMapping("/saveProc.json")
     public ResponseEntity<?> saveProc(@RequestBody BbsMngVO bbsMngVO) throws Exception {
-        // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-
         // 게시판 관리 아이디 중복 검사 (아이디 입력 삭제로 미사용)
         /*boolean isExistence = bbsMngService.bbsMngIdCheck(bbsMngVO);
         if(isExistence) {
@@ -62,19 +62,14 @@
             responseData.setMessage("이미 존재하는 게시판 아이디입니다.");
             return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
         }*/
-
         // 게시판 관리 등록
         HashMap<String, Object> result = bbsMngService.saveBbsMng(bbsMngVO);
         int insertResult = (int) result.get("result");
+        // 응답 처리
         if(insertResult > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 등록 처리되었습니다.");
-            responseData.setData(result);
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
         }
     }
 
@@ -93,13 +88,7 @@
         Map<String, Object> result = bbsMngService.findAllBbsMng(params);
 
         // 응답처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -117,13 +106,7 @@
         List<BbsMngVO> result = bbsMngService.findAllByMenuMng();
 
         // 응답처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -153,13 +136,7 @@
         result.put("pageTypeList", pageType);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -173,22 +150,15 @@
      */
     @PostMapping("/updateProc.json")
     public ResponseEntity<?> updateProc(@RequestBody BbsMngVO bbsMngVO) throws Exception {
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
 
         // 게시판 관리 수정
         int result = bbsMngService.updateBbsMng(bbsMngVO);
 
         // 응답 처리
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 수정 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("수정에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
 
@@ -203,22 +173,15 @@
      */
     @PostMapping("/deleteProc.json")
     public ResponseEntity<?> deleteProc(@RequestBody BbsMngVO bbsMngVO) throws Exception {
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
 
         // 게시판 관리 수정
         int result = bbsMngService.deleteBbsMng(bbsMngVO);
 
         // 응답 처리
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 삭제 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("삭제에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_DELETE_FAIL);
         }
     }
 }
(파일 끝에 줄바꿈 문자 없음)
src/main/java/com/takensoft/cms/bbs/web/BbsTypeMngController.java
--- src/main/java/com/takensoft/cms/bbs/web/BbsTypeMngController.java
+++ src/main/java/com/takensoft/cms/bbs/web/BbsTypeMngController.java
@@ -2,7 +2,9 @@
 
 import com.takensoft.cms.bbs.service.BbsTypeMngService;
 import com.takensoft.cms.bbs.vo.BbsTypeMngVO;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
@@ -15,10 +17,12 @@
 
 import java.nio.charset.Charset;
 import java.util.*;
-
 /**
- * @author  : 박정하
- * @since   : 2024.05.08
+ * @author 박정하
+ * @since 2024.05.08
+ * @modification
+ *     since    |    author    | description
+ *  2024.05.08  |    박정하     | 최초 등록
  *
  * 게시판 유형 관리 관련 컨트롤러
  */
@@ -26,6 +30,8 @@
 @RequiredArgsConstructor
 @RequestMapping(value="/admin/bbsTypeMng")
 public class BbsTypeMngController {
+
+    private final ResponseUtil resUtil;
     private final BbsTypeMngService bbsTypeMngService;
 
     /**
@@ -48,14 +54,9 @@
         headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
         ResponseData responseData = new ResponseData();
         if(insertResult > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 등록 처리되었습니다.");
-            responseData.setData(result);
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
         }
     }
 
@@ -74,12 +75,6 @@
         Map<String, Object> result = bbsTypeMngService.findAllBbsTypeMng(bbsTypeMngVO);
 
         // 응답처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 }
src/main/java/com/takensoft/cms/bbs/web/CmntController.java
--- src/main/java/com/takensoft/cms/bbs/web/CmntController.java
+++ src/main/java/com/takensoft/cms/bbs/web/CmntController.java
@@ -2,7 +2,9 @@
 
 import com.takensoft.cms.bbs.service.CmntService;
 import com.takensoft.cms.bbs.vo.CmntVO;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
@@ -18,10 +20,12 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-
 /**
- * @author  : 방선주
- * @since   : 2024.05.27
+ * @author 방선주
+ * @since 2024.05.27
+ * @modification
+ *     since    |    author    | description
+ *  2024.05.27  |    방선주     | 최초 등록
  *
  * 게시판 댓글 관련 Controller
  */
@@ -32,7 +36,7 @@
 public class CmntController {
 
     private final CmntService cmntService;
-
+    private final ResponseUtil resUtil;
     /**
      * @author  방선주
      * @since   2024.05.27
@@ -56,22 +60,19 @@
         int insertResult = (int) result.get("result");
 
         if(insertResult > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 등록 처리되었습니다.");
-            responseData.setData(result);
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else if (insertResult == -1) {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
+            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
+            responseData.setStatusText(HttpStatus.INTERNAL_SERVER_ERROR);
             responseData.setMessage("아래의 금지어가 포함되어 있습니다.\n* " + result.get("word"));
             return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
         } else if (insertResult == -2){
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
+            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
+            responseData.setStatusText(HttpStatus.INTERNAL_SERVER_ERROR);
             responseData.setMessage("로그인 후 이용 가능합니다.");
             return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
         }
 
     }
@@ -94,13 +95,7 @@
         result.put("cmntList", cmntList);
 
         // 응답처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
 
     }
 
@@ -126,19 +121,14 @@
 
         // 응답처리
         if(updateResult > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 수정 처리되었습니다.");
-            responseData.setData(result);
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else if (updateResult == -1){
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
+            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
+            responseData.setStatusText(HttpStatus.INTERNAL_SERVER_ERROR);
             responseData.setMessage("아래의 금지어가 포함되어 있습니다.\n* " + result.get("word"));
             return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
-
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
 
     }
@@ -158,13 +148,7 @@
         int result = cmntService.deleteCmnt(cmntVO);
 
         // 응답처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 삭제가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
 
     }
 
src/main/java/com/takensoft/cms/bbs/web/WordMngController.java
--- src/main/java/com/takensoft/cms/bbs/web/WordMngController.java
+++ src/main/java/com/takensoft/cms/bbs/web/WordMngController.java
@@ -2,7 +2,9 @@
 
 import com.takensoft.cms.bbs.service.WordMngService;
 import com.takensoft.cms.bbs.vo.WordMngVO;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
@@ -18,20 +20,22 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-
 /**
- * @author  : 방선주
- * @since   : 2024.05.31
+ * @author 방선주
+ * @since 2024.05.31
+ * @modification
+ *     since    |    author    | description
+ *  2024.05.31  |    방선주     | 최초 등록
  *
  * 금지 단어 관리 Controller
  */
-
 @RestController
 @RequiredArgsConstructor
 @Slf4j
 @RequestMapping(value="/wordMng")
 public class WordMngController {
 
+    private final ResponseUtil resUtil;
     private final WordMngService wordMngService;
 
     /**
@@ -45,23 +49,13 @@
      */
     @PostMapping("/saveProc.json")
     public ResponseEntity<?> saveProc(@RequestBody HashMap<String, Object> wordList) throws Exception {
-        // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-
         // 금지어 등록
         int result = wordMngService.saveWords(wordList);
-
+        // 응답 처리
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 등록 처리되었습니다.");
-            responseData.setData(result);
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
         }
     }
     @PostMapping("/findAll.json")
@@ -74,33 +68,20 @@
         result.put("words", wordsList);
 
         // 응답처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     @PostMapping("/deleteProc.json")
     public ResponseEntity<?> deleteProc(@RequestBody HashMap<String, Object> params) throws Exception {
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
 
         // 금지어 삭제
         int result = wordMngService.deleteWords(params);
 
         // 응답 처리
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 삭제 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("삭제에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_DELETE_FAIL);
         }
     }
 }
src/main/java/com/takensoft/cms/cntnStats/dto/CntnStatsDTO.java
--- src/main/java/com/takensoft/cms/cntnStats/dto/CntnStatsDTO.java
+++ src/main/java/com/takensoft/cms/cntnStats/dto/CntnStatsDTO.java
@@ -25,5 +25,6 @@
     /**
      * 권한 목록
      */
+    @Builder.Default
     private List<String> mbrAuthList = new ArrayList<String>();
 }
src/main/java/com/takensoft/cms/cntnStats/web/CntnStatsController.java
--- src/main/java/com/takensoft/cms/cntnStats/web/CntnStatsController.java
+++ src/main/java/com/takensoft/cms/cntnStats/web/CntnStatsController.java
@@ -4,7 +4,9 @@
 import com.takensoft.cms.cntnStats.dto.CntnStatsExcelDTO;
 import com.takensoft.cms.cntnStats.service.CntnStatsService;
 import com.takensoft.common.excel.service.ExcelService;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
@@ -13,13 +15,15 @@
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
 import java.nio.charset.Charset;
 import java.util.*;
-
 /**
- * @author  : takensoft
- * @since   : 2024.05.23
+ * @author takensoft
+ * @since 2024.05.23
+ * @modification
+ *     since    |    author    | description
+ *  2024.05.23  |  takensoft   | 최초 등록
  *
  * 접속 통계 관련 컨트롤러
  */
@@ -30,6 +34,7 @@
 public class CntnStatsController {
     private final CntnStatsService cntnStatsService;
     private final ExcelService excelService;
+    private final ResponseUtil resUtil;
 
     /**
      * @author takensoft
@@ -45,18 +50,10 @@
         int result = cntnStatsService.cntnStatsSave(cntnStatsDTO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 등록 처리되었습니다.");
-            responseData.setData(result);
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
         }
     }
 
@@ -75,13 +72,7 @@
         HashMap<String, Object> result = cntnStatsService.userCntnStatsSelect(params);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -99,13 +90,7 @@
         HashMap<String, Object> result = cntnStatsService.menuCntnStatsSelect(params);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -123,13 +108,7 @@
         HashMap<String, Object> result = cntnStatsService.bbsCntnStatsSelect(params);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
src/main/java/com/takensoft/cms/codeManage/web/CodeManageController.java
--- src/main/java/com/takensoft/cms/codeManage/web/CodeManageController.java
+++ src/main/java/com/takensoft/cms/codeManage/web/CodeManageController.java
@@ -2,8 +2,10 @@
 
 import com.takensoft.cms.codeManage.service.CodeManageService;
 import com.takensoft.cms.codeManage.vo.CodeManageVO;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
 import com.takensoft.common.HierachyVO;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
@@ -23,6 +25,15 @@
  *
  * 공통코드 정보 관련 컨트롤러
  */
+/**
+ * @author takensoft
+ * @since 2024.04.09
+ * @modification
+ *     since    |    author    | description
+ *  2024.04.09  |  takensoft   | 최초 등록
+ *
+ * 공통코드 정보 관련 컨트롤러
+ */
 @RestController
 @RequiredArgsConstructor
 @Slf4j
@@ -30,6 +41,7 @@
 public class CodeManageController {
 
     private final CodeManageService codeManageService;
+    private final ResponseUtil resUtil;
 
     /**
      * @author takensoft
@@ -46,27 +58,16 @@
         boolean isExistence = codeManageService.findByCheckCd(codeManageVO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-
         if(isExistence) {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("이미 존재하는 코드입니다.");
-            log.error("이미 존재하는 코드입니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_DUPLICATION_CODE);
         }
 
         // 코드 등록
         int result = codeManageService.cdSave(codeManageVO);
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 등록 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
         }
     }
 
@@ -89,13 +90,7 @@
         result.put("newCode", new CodeManageVO());
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -116,13 +111,7 @@
         result.put("code", code);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -146,10 +135,7 @@
             // 코드 중복 검사
             boolean isExistence = codeManageService.findByCheckCd(codeManageVO);
             if(isExistence) {
-                responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-                responseData.setMessage("이미 존재하는 코드입니다.");
-                log.error("이미 존재하는 코드입니다.");
-                return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+                return resUtil.errorRes(MessageCode.COMMON_DUPLICATION_CODE);
             }
         }
         // 코드 수정
@@ -157,13 +143,9 @@
 
         // 응답 처리
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 수정 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("수정에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
 
@@ -182,17 +164,10 @@
         int result = codeManageService.cdDelete(codeManageVO.getCd());
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 삭제 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("삭제에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_DELETE_FAIL);
         }
     }
 
@@ -214,13 +189,7 @@
         result.put("code", code);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -242,13 +211,9 @@
         headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
         ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 수정 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("수정에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
 }
(파일 끝에 줄바꿈 문자 없음)
src/main/java/com/takensoft/cms/contsType/web/ContsTypeController.java
--- src/main/java/com/takensoft/cms/contsType/web/ContsTypeController.java
+++ src/main/java/com/takensoft/cms/contsType/web/ContsTypeController.java
@@ -2,7 +2,9 @@
 
 import com.takensoft.cms.contsType.service.ContsTypeService;
 import com.takensoft.cms.contsType.vo.ContsTypeVO;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
@@ -15,10 +17,12 @@
 
 import java.nio.charset.Charset;
 import java.util.*;
-
 /**
- * @author  : takensoft
- * @since   : 2024.04.17
+ * @author takensoft
+ * @since 2024.04.17
+ * @modification
+ *     since    |    author    | description
+ *  2024.04.17  |  takensoft   | 최초 등록
  *
  * 콘텐츠 유형 관리 관련 컨트롤러
  */
@@ -27,6 +31,7 @@
 @RequestMapping(value = "/admin/contsType")
 public class ContsTypeController {
     private final ContsTypeService contsTypeService;
+    private final ResponseUtil resUtil;
 
     /**
      * @author takensoft
@@ -44,18 +49,10 @@
         int insertResult = (int) result.get("result");
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(insertResult > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 등록 처리되었습니다.");
-            responseData.setData(result);
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
         }
     }
 
@@ -74,17 +71,10 @@
         int result = contsTypeService.contsUpdate(contsTypeVO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 수정 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("수정에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
 
@@ -103,13 +93,7 @@
         Map<String, Object> result = contsTypeService.findAll(params);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -126,13 +110,7 @@
         ContsTypeVO result = contsTypeService.findByContsType(contsTypeVO.getContsId());
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -150,17 +128,10 @@
         int result = contsTypeService.contsUpdate(contsTypeVO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 삭제 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("삭제에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_DELETE_FAIL);
         }
     }
 
@@ -179,12 +150,6 @@
         List<ContsTypeVO> result = contsTypeService.findAllByExpsr(contsTypeVO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 }
src/main/java/com/takensoft/cms/contsType/web/SystemContsTypeController.java
--- src/main/java/com/takensoft/cms/contsType/web/SystemContsTypeController.java
+++ src/main/java/com/takensoft/cms/contsType/web/SystemContsTypeController.java
@@ -3,7 +3,9 @@
 import com.takensoft.cms.contsType.service.ContsTypeService;
 import com.takensoft.cms.contsType.vo.ContsAuthrtVO;
 import com.takensoft.cms.contsType.vo.ContsTypeVO;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
@@ -14,10 +16,12 @@
 
 import java.nio.charset.Charset;
 import java.util.List;
-
 /**
- * @author  : takensoft
- * @since   : 2024.04.17
+ * @author takensoft
+ * @since 2024.04.17
+ * @modification
+ *     since    |    author    | description
+ *  2024.04.17  |  takensoft   | 최초 등록
  *
  * 콘텐츠 유형 관리 관련 컨트롤러
  */
@@ -27,6 +31,7 @@
 @RequestMapping(value = "/sys/contsType")
 public class SystemContsTypeController {
 
+    private final ResponseUtil resUtil;
     private final ContsTypeService contsTypeService;
 
     /**
@@ -42,13 +47,7 @@
         List<ContsTypeVO> result = contsTypeService.findByContsTypeSys(contsTypeVO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -64,12 +63,6 @@
         List<ContsAuthrtVO> result = contsTypeService.findByContsAuthrt();
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 }
src/main/java/com/takensoft/cms/dept/web/DeptController.java
--- src/main/java/com/takensoft/cms/dept/web/DeptController.java
+++ src/main/java/com/takensoft/cms/dept/web/DeptController.java
@@ -6,7 +6,9 @@
 import com.takensoft.cms.dept.vo.DeptMbrVO;
 import com.takensoft.cms.dept.vo.DeptVO;
 import com.takensoft.common.HierachyVO;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
@@ -19,10 +21,12 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-
 /**
- * @author  : takensoft
- * @since   : 2024.04.24
+ * @author takensoft
+ * @since 2024.04.24
+ * @modification
+ *     since    |    author    | description
+ *  2024.04.24  |  takensoft   | 최초 등록
  *
  * 부서 정보 관련 컨트롤러
  */
@@ -32,6 +36,7 @@
 @RequestMapping("/admin/dept")
 public class DeptController {
 
+    private final ResponseUtil resUtil;
     private final DeptService deptService;
     private final AuthorService authorService;
 
@@ -51,19 +56,10 @@
         int insertResult = (int) result.get("insertResult");
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-
         if(insertResult > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 등록 처리되었습니다.");
-            responseData.setData(result);
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
         }
     }
 
@@ -82,18 +78,10 @@
         int result = deptService.deptMbrSave(deptMbrVO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 등록 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
         }
     }
 
@@ -119,13 +107,7 @@
         result.put("newDept", new DeptVO());
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -143,13 +125,7 @@
         Map<String, Object> result = deptService.findByDept(params);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -167,18 +143,10 @@
         int result = deptService.deptUpdate(deptVO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 수정 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("수정에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
 
@@ -197,18 +165,10 @@
         int result = deptService.deptDelete(deptVO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 삭제 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("삭제에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_DELETE_FAIL);
         }
     }
 
@@ -227,18 +187,10 @@
         int result = deptService.deptMbrDelete(deptMbrList);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 등록 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_DELETE_FAIL);
         }
     }
 
@@ -257,13 +209,7 @@
         Map<String, Object> result = deptService.findByMbr(params);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -281,17 +227,10 @@
         int result = deptService.updateList(deptList);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 수정 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("수정에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
 }
src/main/java/com/takensoft/cms/main/web/MainController.java
--- src/main/java/com/takensoft/cms/main/web/MainController.java
+++ src/main/java/com/takensoft/cms/main/web/MainController.java
@@ -1,7 +1,9 @@
 package com.takensoft.cms.main.web;
 
 import com.takensoft.cms.main.service.MainService;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import org.springframework.cache.CacheManager;
 import org.springframework.http.HttpHeaders;
@@ -14,12 +16,14 @@
 
 import java.nio.charset.Charset;
 import java.util.*;
-
 /**
- * @author  : 박정하
- * @since   : 2024.05.29
+ * @author 박정하
+ * @since 2024.05.29
+ * @modification
+ *     since    |    author    | description
+ *  2024.05.29  |    박정하     | 최초 등록
  *
- * 메인 관련 컨트롤러
+ * 메인 관련 Controller
  */
 @RestController
 @RequiredArgsConstructor
@@ -27,6 +31,7 @@
 public class MainController {
     private final MainService mainService;
     private final CacheManager cacheManager; // 캐시를 관리하기 위한 CacheManager 인스턴스
+    private final ResponseUtil resUtil;
 
     /**
      * @author takensoft
@@ -43,13 +48,7 @@
         Map<String, Object> result = mainService.selectAdminMain();
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -72,13 +71,12 @@
             for(String nm : cacheManager.getCacheNames()) {
                 cacheManager.getCache(nm).clear();
             }
-            responseData.setStatus(HttpStatus.OK);
+            responseData.setStatus(HttpStatus.OK.value());
+            responseData.setStatusText(HttpStatus.OK);
             responseData.setMessage("정상적으로 처리되었습니다.");
             return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
         } catch (Exception e) {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("적용에 실패했습니다.\n관리자에게 문의해주시기 바랍니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
 
@@ -96,12 +94,6 @@
         List<HashMap<String, Object>> result = mainService.findAplyToasts();
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 }
(파일 끝에 줄바꿈 문자 없음)
src/main/java/com/takensoft/cms/mber/dto/AdmMbrDTO.java
--- src/main/java/com/takensoft/cms/mber/dto/AdmMbrDTO.java
+++ src/main/java/com/takensoft/cms/mber/dto/AdmMbrDTO.java
@@ -132,5 +132,6 @@
     /**
      * 권한 정보
      */
+    @Builder.Default
     private List<MberAuthorVO> authorList = new ArrayList<MberAuthorVO>();
 }
src/main/java/com/takensoft/cms/mber/dto/JoinDTO.java
--- src/main/java/com/takensoft/cms/mber/dto/JoinDTO.java
+++ src/main/java/com/takensoft/cms/mber/dto/JoinDTO.java
@@ -141,5 +141,6 @@
     /**
      * 권한 정보
      */
+    @Builder.Default
     private List<MberAuthorVO> authorList = new ArrayList<MberAuthorVO>();
 }
src/main/java/com/takensoft/cms/mber/service/AdmMbrService.java
--- src/main/java/com/takensoft/cms/mber/service/AdmMbrService.java
+++ src/main/java/com/takensoft/cms/mber/service/AdmMbrService.java
@@ -4,7 +4,7 @@
 import com.takensoft.cms.mber.dto.JoinDTO;
 import com.takensoft.cms.mber.vo.MberVO;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import java.util.HashMap;
 
 /**
src/main/java/com/takensoft/cms/mber/service/Impl/AdmMbrServiceImpl.java
--- src/main/java/com/takensoft/cms/mber/service/Impl/AdmMbrServiceImpl.java
+++ src/main/java/com/takensoft/cms/mber/service/Impl/AdmMbrServiceImpl.java
@@ -19,7 +19,7 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import java.util.HashMap;
 import java.util.List;
 
src/main/java/com/takensoft/cms/mber/service/Impl/MberServiceImpl.java
--- src/main/java/com/takensoft/cms/mber/service/Impl/MberServiceImpl.java
+++ src/main/java/com/takensoft/cms/mber/service/Impl/MberServiceImpl.java
@@ -19,7 +19,7 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import java.util.HashMap;
 
 /**
src/main/java/com/takensoft/cms/mber/service/Impl/RefreshTokenServiceImpl.java
--- src/main/java/com/takensoft/cms/mber/service/Impl/RefreshTokenServiceImpl.java
+++ src/main/java/com/takensoft/cms/mber/service/Impl/RefreshTokenServiceImpl.java
@@ -17,9 +17,9 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.Cookie;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
src/main/java/com/takensoft/cms/mber/service/MberService.java
--- src/main/java/com/takensoft/cms/mber/service/MberService.java
+++ src/main/java/com/takensoft/cms/mber/service/MberService.java
@@ -4,7 +4,7 @@
 import com.takensoft.cms.mber.dto.PasswordDTO;
 import com.takensoft.cms.mber.vo.MberVO;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import java.util.*;
 
 /**
src/main/java/com/takensoft/cms/mber/service/RefreshTokenService.java
--- src/main/java/com/takensoft/cms/mber/service/RefreshTokenService.java
+++ src/main/java/com/takensoft/cms/mber/service/RefreshTokenService.java
@@ -2,8 +2,8 @@
 
 import com.takensoft.cms.mber.vo.RefreshVO;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 
 /**
  * @author  : takensoft
src/main/java/com/takensoft/cms/mber/web/AdmMbrController.java
--- src/main/java/com/takensoft/cms/mber/web/AdmMbrController.java
+++ src/main/java/com/takensoft/cms/mber/web/AdmMbrController.java
@@ -7,7 +7,9 @@
 import com.takensoft.cms.mber.service.MberService;
 import com.takensoft.cms.mber.vo.MberVO;
 import com.takensoft.common.exception.IdDuplicationException;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
@@ -19,16 +21,18 @@
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.beans.factory.annotation.Value;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 import java.nio.charset.Charset;
 import java.util.*;
-
 /**
- * @author  : 박정하
- * @since   : 2024.06.21
+ * @author 박정하
+ * @since 2024.06.21
+ * @modification
+ *     since    |    author    | description
+ *  2024.06.21  |    박정하     | 최초 등록
  *
- * 회원정보 관련 컨트롤러
+ * 회원정보 관련 Controller
  */
 @RestController
 @RequiredArgsConstructor
@@ -36,7 +40,7 @@
 public class AdmMbrController {
     private final AdmMbrService admMbrService;
     private final MberService mbrService;
-
+    private final ResponseUtil resUtil;
     /**
      * @author 박정하
      * @since 2024.06.21
@@ -51,13 +55,7 @@
         HashMap<String, Object> result = admMbrService.mbrList(params);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -80,17 +78,10 @@
         int result = mbrService.updatePassword(passwordDTO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 초기화 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("초기화에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_UNKNOWN_ERROR);
         }
     }
 
@@ -109,13 +100,7 @@
         AdmMbrDTO result = admMbrService.mbrDetail(admMbrDTO.getMbrId());
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 회원정보 상세 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -132,17 +117,10 @@
         int result = admMbrService.updateMbr(admMbrDTO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 수정되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("수정에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
 
@@ -161,17 +139,10 @@
         int result = admMbrService.updateMbr(admMbrDTO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 삭제되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("삭제에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_DELETE_FAIL);
         }
     }
     
@@ -194,10 +165,7 @@
         // 아이디 중복 검사
         boolean isExistence = mbrService.findByCheckLoginId(joinDTO.getLgnId());
         if(isExistence) {
-//            throw new IdDuplicationException("이미 존재하는 아이디입니다.");
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("이미 존재하는 아이디입니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.SIGNUP_ID_TAKEN);
         }
 
         // 회원 가입 진행
@@ -205,14 +173,9 @@
         int insertResult = (int) result.get("insertResult");
 
         if(insertResult > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 회원가입 처리되었습니다.");
-            responseData.setData(result);
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.SIGNUP_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("회원가입에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_UNKNOWN_ERROR);
         }
     }
 
@@ -234,14 +197,9 @@
         headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
         ResponseData responseData = new ResponseData();
         if(result != null) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 조회 처리되었습니다.");
-            responseData.setData(result);
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("입력하신 정보와 일치하는 회원이 존재하지 않습니다.\n다시 시도하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.LOGIN_USER_NOT_FOUND);
         }
     }
 
@@ -264,14 +222,9 @@
         headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
         ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 조회 처리되었습니다.");
-            responseData.setData(result);
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("입력하신 정보와 일치하는 회원이 존재하지 않습니다.\n다시 시도하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.LOGIN_USER_NOT_FOUND);
         }
     }
 }
(파일 끝에 줄바꿈 문자 없음)
src/main/java/com/takensoft/cms/mber/web/LgnHstryController.java
--- src/main/java/com/takensoft/cms/mber/web/LgnHstryController.java
+++ src/main/java/com/takensoft/cms/mber/web/LgnHstryController.java
@@ -1,7 +1,9 @@
 package com.takensoft.cms.mber.web;
 
 import com.takensoft.cms.mber.service.LgnHstryService;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
@@ -14,18 +16,21 @@
 
 import java.nio.charset.Charset;
 import java.util.HashMap;
-
 /**
- * @author  : 박정하
- * @since   : 2024.05.24
+ * @author 박정하
+ * @since 2024.05.24
+ * @modification
+ *     since    |    author    | description
+ *  2024.05.24  |    박정하     | 최초 등록
  *
- * 로그인 이력 관련 컨트롤러
+ * 로그인 이력 관련 Controller
  */
 @RestController
 @RequiredArgsConstructor
 @RequestMapping(value = "/admin/lgnHstry")
 public class LgnHstryController {
     private final LgnHstryService lgnHstryService;
+    private final ResponseUtil resUtil;
 
     /**
      * @author 박정하
@@ -41,12 +46,6 @@
         HashMap<String, Object> result = lgnHstryService.lgnHstryList(params);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 }
(파일 끝에 줄바꿈 문자 없음)
src/main/java/com/takensoft/cms/mber/web/MberController.java
--- src/main/java/com/takensoft/cms/mber/web/MberController.java
+++ src/main/java/com/takensoft/cms/mber/web/MberController.java
@@ -5,7 +5,9 @@
 import com.takensoft.cms.mber.service.MberService;
 import com.takensoft.cms.mber.vo.MberVO;
 import com.takensoft.common.exception.IdDuplicationException;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
@@ -14,14 +16,16 @@
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 import java.nio.charset.Charset;
 import java.util.HashMap;
-
 /**
- * @author  : takensoft
- * @since   : 2024.04.01
+ * @author takensoft
+ * @since 2024.04.01
+ * @modification
+ *     since    |    author    | description
+ *  2024.04.01  |  takensoft   | 최초 등록
  *
  * 회원 정보 관련 컨트롤러
  */
@@ -31,6 +35,7 @@
 @RequestMapping(value = "/mbr")
 public class MberController {
     private final MberService mberService;
+    private final ResponseUtil resUtil;
 
     /**
      * @author takensoft
@@ -47,13 +52,7 @@
         MberVO result = mberService.findByMbr(params);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 회원정보 상세 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -71,17 +70,10 @@
         boolean isExistence = mberService.passwordCheck(passwordDTO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(isExistence) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 수정 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(isExistence, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("비밀번호를 확인하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
 }
(파일 끝에 줄바꿈 문자 없음)
src/main/java/com/takensoft/cms/mber/web/RefreshTokenController.java
--- src/main/java/com/takensoft/cms/mber/web/RefreshTokenController.java
+++ src/main/java/com/takensoft/cms/mber/web/RefreshTokenController.java
@@ -2,7 +2,9 @@
 
 
 import com.takensoft.cms.mber.service.RefreshTokenService;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
@@ -12,14 +14,16 @@
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.Cookie;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import java.nio.charset.Charset;
-
 /**
- * @author  : takensoft
- * @since   : 2024.04.01
+ * @author takensoft
+ * @since 2024.04.01
+ * @modification
+ *     since    |    author    | description
+ *  2024.04.01  |  takensoft   | 최초 등록
  *
  * RefreshToken 정보 관련 컨트롤러
  */
@@ -28,6 +32,7 @@
 @Slf4j
 public class RefreshTokenController {
 
+    private final ResponseUtil resUtil;
     private final RefreshTokenService refreshTokenService;
 
     /**
@@ -51,13 +56,9 @@
             cookie.setPath("/"); // 쿠키 적용 범위
             cookie.setHttpOnly(true);
             res.addCookie(cookie);
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 로그아웃 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.LOGOUT_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("로그아웃에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_UNKNOWN_ERROR);
         }
     }
 
@@ -77,11 +78,10 @@
         headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
         ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 발급 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
+            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
+            responseData.setStatusText(HttpStatus.INTERNAL_SERVER_ERROR);
             responseData.setMessage("로그인을 다시해주시기 바랍니다.");
             return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
         }
src/main/java/com/takensoft/cms/menu/web/MenuAuthorController.java
--- src/main/java/com/takensoft/cms/menu/web/MenuAuthorController.java
+++ src/main/java/com/takensoft/cms/menu/web/MenuAuthorController.java
@@ -2,7 +2,9 @@
 
 import com.takensoft.cms.author.vo.AuthorVO;
 import com.takensoft.cms.menu.service.MenuAuthorService;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
@@ -16,19 +18,21 @@
 import java.nio.charset.Charset;
 import java.util.HashMap;
 import java.util.List;
-
 /**
- * @author  : 박정하
- * @since   : 2024.05.07
+ * @author 박정하
+ * @since 2024.05.07
+ * @modification
+ *     since    |    author    | description
+ *  2024.05.07  |    박정하     | 최초 등록
  *
- * 메뉴 권한 정보 관련 컨트롤러
+ * 메뉴 권한 정보 관련 Controller
  */
 @RestController
 @RequiredArgsConstructor
 @RequestMapping(value = "/admin/menuAuthor")
 public class MenuAuthorController {
     private final MenuAuthorService menuAuthorService;
-
+    private final ResponseUtil resUtil;
     /**
      * @author 박정하
      * @since 2024.05.02
@@ -43,13 +47,7 @@
         List<HashMap<String, Object>> result = menuAuthorService.findAll(authorVO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 메뉴 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -67,17 +65,10 @@
         int result = menuAuthorService.updateMenuAuthrtProc(params);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 메뉴 권한 수정 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("메뉴 권한 수정에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
 }
src/main/java/com/takensoft/cms/menu/web/MenuController.java
--- src/main/java/com/takensoft/cms/menu/web/MenuController.java
+++ src/main/java/com/takensoft/cms/menu/web/MenuController.java
@@ -7,7 +7,9 @@
 import com.takensoft.cms.menu.service.MenuService;
 import com.takensoft.cms.menu.vo.MenuVO;
 import com.takensoft.common.HierachyVO;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
@@ -21,8 +23,11 @@
 import java.util.List;
 
 /**
- * @author  : takensoft
- * @since   : 2024.04.01
+ * @author takensoft
+ * @since 2024.04.01
+ * @modification
+ *     since    |    author    | description
+ *  2024.04.01  |  takensoft   | 최초 등록
  *
  * 메뉴 정보 관련 컨트롤러
  */
@@ -32,6 +37,7 @@
 @RequestMapping(value = "/admin/menu")
 public class MenuController {
 
+    private final ResponseUtil resUtil;
     private final MenuService menuService;
     private final CodeManageService codeManageService;
 
@@ -50,17 +56,10 @@
         int result = menuService.menuSave(menuVO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 메뉴 등록이 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("메뉴 등록에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
         }
     }
 
@@ -87,13 +86,7 @@
         result.put("codeList", codeList);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 메뉴 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -110,13 +103,7 @@
         // 메뉴 조회
         MenuVO result = menuService.findByMenu(menuVO.getMenuId());
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 메뉴 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -138,13 +125,9 @@
         headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
         ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 메뉴 수정 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("메뉴 수정에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
 
@@ -168,13 +151,9 @@
         ResponseData responseData = new ResponseData();
 
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 삭제 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("삭제에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_DELETE_FAIL);
         }
     }
 
@@ -197,13 +176,9 @@
         headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
         ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 수정 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("수정에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
 }
src/main/java/com/takensoft/cms/menu/web/SystemMenuController.java
--- src/main/java/com/takensoft/cms/menu/web/SystemMenuController.java
+++ src/main/java/com/takensoft/cms/menu/web/SystemMenuController.java
@@ -5,7 +5,9 @@
 import com.takensoft.cms.menu.vo.MenuVO;
 import com.takensoft.cms.menu.vo.SysMenuVO;
 import com.takensoft.common.HierachyVO;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
@@ -20,10 +22,12 @@
 import java.nio.charset.Charset;
 import java.util.HashMap;
 import java.util.List;
-
 /**
- * @author  : takensoft
- * @since   : 2024.04.30
+ * @author takensoft
+ * @since 2024.04.30
+ * @modification
+ *     since    |    author    | description
+ *  2024.04.30  |  takensoft   | 최초 등록
  *
  * 메뉴 정보 관련 컨트롤러(사용자단용)
  */
@@ -34,7 +38,7 @@
 public class SystemMenuController {
 
     private final MenuService menuService;
-
+    private final ResponseUtil resUtil;
     /**
      * @author takensoft
      * @since 2024.04.30
@@ -51,13 +55,7 @@
         result.put("menuList", menuList);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 메뉴 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
 }
src/main/java/com/takensoft/cms/popup/web/PopupController.java
--- src/main/java/com/takensoft/cms/popup/web/PopupController.java
+++ src/main/java/com/takensoft/cms/popup/web/PopupController.java
@@ -3,7 +3,9 @@
 import com.takensoft.cms.popup.service.PopupService;
 import com.takensoft.cms.popup.vo.PopupVO;
 import com.takensoft.common.file.service.FileService;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
@@ -14,12 +16,14 @@
 
 import java.nio.charset.Charset;
 import java.util.*;
-
 /**
- * @author  : 박정하
- * @since   : 2024.05.13
+ * @author 박정하
+ * @since 2024.05.13
+ * @modification
+ *     since    |    author    | description
+ *  2024.05.13  |    박정하     | 최초 등록
  *
- * 팝업 관련 컨트롤러
+ * 팝업 관련 Controller
  */
 @RestController
 @RequiredArgsConstructor
@@ -27,6 +31,7 @@
 public class PopupController {
     private final PopupService popupService;
     private final FileService fileService;
+    private final ResponseUtil resUtil;
 
     /**
      * @author 박정하
@@ -43,18 +48,10 @@
         int insertResult = (int) result.get("insertResult");
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(insertResult > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 등록 처리되었습니다.");
-            responseData.setData(result);
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
         }
     }
 
@@ -72,13 +69,7 @@
         HashMap<String, Object> result = popupService.popupList(params);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -102,13 +93,7 @@
         result.put("fileList", fileList);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -125,17 +110,10 @@
         int result = popupService.popupUpdate(popupVO, multipartFileList);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 수정 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("수정에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
 
@@ -153,17 +131,10 @@
         int result = popupService.popupDelete(popupVO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 삭제 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("삭제에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_DELETE_FAIL);
         }
     }
 
@@ -181,12 +152,6 @@
         List<PopupVO> result = popupService.popupListByPage(popupVO.getPageType());
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 }
(파일 끝에 줄바꿈 문자 없음)
src/main/java/com/takensoft/cms/popup/web/SysPopupController.java
--- src/main/java/com/takensoft/cms/popup/web/SysPopupController.java
+++ src/main/java/com/takensoft/cms/popup/web/SysPopupController.java
@@ -3,7 +3,9 @@
 import com.takensoft.cms.popup.service.PopupService;
 import com.takensoft.cms.popup.vo.PopupVO;
 import com.takensoft.common.file.service.FileService;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
@@ -18,12 +20,14 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
-
 /**
- * @author  : 박정하
- * @since   : 2024.05.27
+ * @author 박정하
+ * @since 2024.05.27
+ * @modification
+ *     since    |    author    | description
+ *  2024.05.27  |    박정하     | 최초 등록
  *
- * 팝업 관련 컨트롤러
+ * 팝업 관련 Controller
  */
 @RestController
 @RequiredArgsConstructor
@@ -31,6 +35,7 @@
 public class SysPopupController {
     private final PopupService popupService;
     private final FileService fileService;
+    private final ResponseUtil resUtil;
 
     /**
      * @author 박정하
@@ -46,13 +51,7 @@
         List<PopupVO> result = popupService.popupListByPage(popupVO.getPageType());
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -76,12 +75,6 @@
         result.put("fileList", fileList);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 }
src/main/java/com/takensoft/cms/prvcInqHstry/service/Impl/PrvcInqHstryServiceImpl.java
--- src/main/java/com/takensoft/cms/prvcInqHstry/service/Impl/PrvcInqHstryServiceImpl.java
+++ src/main/java/com/takensoft/cms/prvcInqHstry/service/Impl/PrvcInqHstryServiceImpl.java
@@ -13,7 +13,7 @@
 import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
 import org.springframework.stereotype.Service;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import java.util.HashMap;
 import java.util.List;
 
src/main/java/com/takensoft/cms/prvcInqHstry/service/PrvcInqHstryService.java
--- src/main/java/com/takensoft/cms/prvcInqHstry/service/PrvcInqHstryService.java
+++ src/main/java/com/takensoft/cms/prvcInqHstry/service/PrvcInqHstryService.java
@@ -2,7 +2,7 @@
 
 import com.takensoft.cms.prvcInqHstry.vo.PrvcInqHstryVO;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import java.util.HashMap;
 
 /**
src/main/java/com/takensoft/cms/prvcInqHstry/web/PrvcInqHstryController.java
--- src/main/java/com/takensoft/cms/prvcInqHstry/web/PrvcInqHstryController.java
+++ src/main/java/com/takensoft/cms/prvcInqHstry/web/PrvcInqHstryController.java
@@ -2,7 +2,9 @@
 
 import com.takensoft.cms.prvcInqHstry.service.PrvcInqHstryService;
 import com.takensoft.cms.prvcInqHstry.vo.PrvcInqHstryVO;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
@@ -10,21 +12,24 @@
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import java.nio.charset.Charset;
 import java.util.*;
-
 /**
- * @author  : 박정하
- * @since   : 2024.05.22
+ * @author 박정하
+ * @since 2024.05.22
+ * @modification
+ *     since    |    author    | description
+ *  2024.05.22  |    박정하     | 최초 등록
  *
- * 개인정보 조회 이력 관련 컨트롤러
+ * 개인정보 조회 이력 관련 Controller
  */
 @RestController
 @RequiredArgsConstructor
 @RequestMapping(value = "/admin/prvcInqHstry")
 public class PrvcInqHstryController {
     private final PrvcInqHstryService prvcInqHstryService;
+    private final ResponseUtil resUtil;
 
     /**
      * @author 박정하
@@ -40,17 +45,10 @@
         int result = prvcInqHstryService.prvcInqHstryInsert(request, prvcInqHstryVO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 등록 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
         }
     }
 
@@ -68,13 +66,7 @@
         HashMap<String, Object> result = prvcInqHstryService.prvcInqHstryList(params);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -91,12 +83,6 @@
         PrvcInqHstryVO result = prvcInqHstryService.prvcInqHstryDetail(prvcInqHstryVO.getInqHstryId());
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 }
(파일 끝에 줄바꿈 문자 없음)
src/main/java/com/takensoft/cms/search/web/SearchController.java
--- src/main/java/com/takensoft/cms/search/web/SearchController.java
+++ src/main/java/com/takensoft/cms/search/web/SearchController.java
@@ -3,7 +3,9 @@
 import com.takensoft.cms.search.service.SearchService;
 import com.takensoft.cms.search.vo.SearchResultVO;
 import com.takensoft.cms.search.vo.SearchVO;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
@@ -13,12 +15,14 @@
 import org.springframework.web.bind.annotation.*;
 
 import java.nio.charset.Charset;
-
 /**
- * @author  : 하석형
- * @since   : 2024.06.12
+ * @author 하석형
+ * @since 2024.06.12
+ * @modification
+ *     since    |    author    | description
+ *  2024.06.12  |    하석형     | 최초 등록
  *
- * 통합 검색 관련 컨트롤러
+ * 통합 검색 관련 Controller
  */
 @RestController
 @RequiredArgsConstructor
@@ -27,6 +31,7 @@
 public class SearchController {
 
     private final SearchService searchService;
+    private final ResponseUtil resUtil;
 
     /**
      * @author 하석형
@@ -42,12 +47,6 @@
         SearchResultVO result = searchService.searchAll(searchVO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 }
(파일 끝에 줄바꿈 문자 없음)
 
src/main/java/com/takensoft/common/config/MessageConfig.java (added)
+++ src/main/java/com/takensoft/common/config/MessageConfig.java
@@ -0,0 +1,60 @@
+package com.takensoft.common.config;
+
+import jakarta.validation.constraints.NotNull;
+import net.rakugakibox.util.YamlResourceBundle;
+import org.springframework.context.MessageSource;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.support.ResourceBundleMessageSource;
+
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * @author  : takensoft
+ * @since   : 2025.01.22
+ * @modification
+ *     since    |    author    | description
+ *  2025.01.22  |  takensoft   | 최초 등록
+ *
+ * Spring의 다국어 메시지 처리를 위한 설정 Config
+ */
+@Configuration
+public class MessageConfig {
+
+    /**
+     * ResourceBundleMessageSource를 확장하여 YAML 형식의 메시지를 지원하는 내부 정적 클래스
+     */
+    private static class YamlMessageSource extends ResourceBundleMessageSource {
+        /**
+         * @param basename - 메시지 번들의 기본 이름
+         * @param locale - 로케일 정보
+         * @return 해당 로케일의 ResourceBundle 객체
+         * @throws MissingResourceException - 해당 리소스를 찾지 못할 경우 예외 발생
+         *
+         * YAML 형식의 메시지 번들 호출
+         */
+        @NotNull
+        @Override
+        protected ResourceBundle doGetBundle(@NotNull String basename, @NotNull Locale locale) throws MissingResourceException {
+            return ResourceBundle.getBundle(basename, locale, YamlResourceBundle.Control.INSTANCE);
+        }
+    }
+
+    /**
+     * @return MessageSource 객체
+     *
+     * YAML 메시지 소스를 설정
+     */
+    @Bean
+    public MessageSource messageSource() {
+        YamlMessageSource messageSource = new YamlMessageSource();
+                          messageSource.setBasename("message/messages");    // 메시지 찾을 위치
+                          messageSource.setDefaultEncoding("UTF-8");        // 인코딩
+                          messageSource.setAlwaysUseMessageFormat(true);    // 메시지 포멧 규칙
+                          messageSource.setUseCodeAsDefaultMessage(true);   // 메시지를 못찾으면 그 자체를 디폴트 메시지로 사용
+                          messageSource.setFallbackToSystemLocale(true);    // 특정 로케일에 대한 파일을 발견하지 못 할 경우, 시스템 로케일로 폴백
+        return messageSource;
+    }
+}
src/main/java/com/takensoft/common/config/SecurityConfig.java
--- src/main/java/com/takensoft/common/config/SecurityConfig.java
+++ src/main/java/com/takensoft/common/config/SecurityConfig.java
@@ -7,8 +7,8 @@
 import com.takensoft.common.filter.JWTFilter;
 import com.takensoft.common.filter.LoginFilter;
 import com.takensoft.common.util.CommonUtils;
-import com.takensoft.common.util.CustomAccessDenieHandler;
-import com.takensoft.common.util.CustomAuthenticationEntryPoint;
+import com.takensoft.common.exception.CustomAccessDenieHandler;
+import com.takensoft.common.exception.CustomAuthenticationEntryPoint;
 import com.takensoft.common.util.JWTUtil;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
@@ -24,7 +24,7 @@
 import org.springframework.web.cors.CorsConfiguration;
 import org.springframework.web.cors.CorsConfigurationSource;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import java.util.Collections;
 
 /**
@@ -117,9 +117,9 @@
         );
 
         http.authorizeHttpRequests((auth) -> auth
-                .antMatchers("/", "/mbr/**", "/company/**", "/refresh/**", "/sys/**").permitAll() // 회원관련, 시스템 제공 관련, 기업용페이지는 누구나 접근 가능
-                .antMatchers("/admin/**").hasRole("ADMIN") // 관리자 페이지는 ADMIN 권한을 가진 사용자만 접근 가능
-                .antMatchers("/editFileUpload/**", "/fileUpload/**").permitAll() // 에디터 파일 업로드
+                .requestMatchers("/", "/mbr/**", "/company/**", "/refresh/**", "/sys/**").permitAll() // 회원관련, 시스템 제공 관련, 기업용페이지는 누구나 접근 가능
+                .requestMatchers("/admin/**").hasRole("ADMIN") // 관리자 페이지는 ADMIN 권한을 가진 사용자만 접근 가능
+                .requestMatchers("/editFileUpload/**", "/fileUpload/**").permitAll() // 에디터 파일 업로드
                 .anyRequest().authenticated() // 그 외에는 로그인한 사용자만 접근 가능
 //                .anyRequest().permitAll() // 모든 사용자 접근 가능
         );
src/main/java/com/takensoft/common/config/WebConfig.java
--- src/main/java/com/takensoft/common/config/WebConfig.java
+++ src/main/java/com/takensoft/common/config/WebConfig.java
@@ -5,7 +5,7 @@
 import org.springframework.web.filter.CommonsRequestLoggingFilter;
 import org.springframework.web.filter.ForwardedHeaderFilter;
 
-import javax.servlet.Filter;
+import jakarta.servlet.Filter;
 
 @Configuration
 public class WebConfig {
src/main/java/com/takensoft/common/excel/service/ExcelService.java
--- src/main/java/com/takensoft/common/excel/service/ExcelService.java
+++ src/main/java/com/takensoft/common/excel/service/ExcelService.java
@@ -7,7 +7,7 @@
 import com.takensoft.portal.rvwMttr.dto.RvwMttrExcelDTO;
 import com.takensoft.portal.rvwMttr.dto.RvwMttrPrgrsExcelDTO;
 
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
 import java.util.List;
 
 public interface ExcelService {
src/main/java/com/takensoft/common/excel/service/Impl/ExcelServiceImpl.java
--- src/main/java/com/takensoft/common/excel/service/Impl/ExcelServiceImpl.java
+++ src/main/java/com/takensoft/common/excel/service/Impl/ExcelServiceImpl.java
@@ -19,7 +19,7 @@
 import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Service;
 
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.util.*;
 
src/main/java/com/takensoft/common/exception/CustomAccessDenieHandler.java (added)
+++ src/main/java/com/takensoft/common/exception/CustomAccessDenieHandler.java
@@ -0,0 +1,43 @@
+package com.takensoft.common.exception;
+
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.web.access.AccessDeniedHandler;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+
+/**
+ * @author takensoft
+ * @since 2025.01.22
+ * @modification
+ *     since    |    author    | description
+ *  2025.01.22  |  takensoft   | 최초 등록
+ *
+ * AccessDeniedHandler - 접근이 거부된 사용자의 요청을 처리하는 클래스
+ *
+ * 접근이 거부된 사용자의 요청을 처리하고, 필요한 에러 응답을 반환하는 역할을 하는 클래스
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class CustomAccessDenieHandler implements AccessDeniedHandler {
+
+    /**
+     * @param req - HTTP 요청 객체
+     * @param res - HTTP 응답 객체
+     * @param ade - 접근 거부 예외
+     * @throws IOException - 입출력 예외 발생 시
+     * @throws ServletException - 서블릿 예외 발생 시
+     *
+     * 접근이 거부된 사용자가 요청을 보냈을 때 실행
+     */
+    @Override
+    public void handle(HttpServletRequest req, HttpServletResponse res, AccessDeniedException ade) throws IOException, ServletException {
+        FilterExceptionHandler.accesDenie(res, ade);
+    }
+}(파일 끝에 줄바꿈 문자 없음)
 
src/main/java/com/takensoft/common/exception/CustomAccessDeniedException.java (added)
+++ src/main/java/com/takensoft/common/exception/CustomAccessDeniedException.java
@@ -0,0 +1,28 @@
+package com.takensoft.common.exception;
+
+/**
+ * @author takensoft
+ * @since 2025.01.22
+ * @modification
+ *     since    |    author    | description
+ *  2025.01.22  |  takensoft   | 최초 등록
+ *
+ * RuntimeException - 실행 중 발생하는 예외를 처리하는 기본 클래스
+ *
+ * 접근 권한이 없는 경우 발생하는 예외
+ */
+public class CustomAccessDeniedException extends RuntimeException {
+
+    public CustomAccessDeniedException() {
+
+    }
+
+    public CustomAccessDeniedException(String message) {
+        super(message);
+    }
+
+    public CustomAccessDeniedException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+}
 
src/main/java/com/takensoft/common/exception/CustomAuthenticationEntryPoint.java (added)
+++ src/main/java/com/takensoft/common/exception/CustomAuthenticationEntryPoint.java
@@ -0,0 +1,45 @@
+package com.takensoft.common.exception;
+
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.AuthenticationEntryPoint;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+
+/**
+ * @author takensoft
+ * @since 2025.01.22
+ * @modification
+ *     since    |    author    | description
+ *  2025.01.22  |  takensoft   | 최초 등록
+ *
+ * AuthenticationEntryPoint - 인증되지 않은 사용자의 요청을 처리하는 인터페이스
+ *
+ * 인증되지 않은 사용자의 요청을 처리하는 클래스
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint {
+
+    /**
+     * @param req - HTTP 요청 객체
+     * @param res - HTTP 응답 객체
+     * @param ae - 인증 예외
+     * @throws IOException - 입출력 예외 발생 시
+     * @throws ServletException - 서블릿 예외 발생 시
+     *
+     * 인증되지 않은 사용자가 요청을 보냈을 때 실행
+     */
+    @Override
+    public void commence(HttpServletRequest req, HttpServletResponse res, AuthenticationException ae) throws IOException, ServletException {
+        log.info("Requester IP: {}", req.getRemoteAddr()); // 요청자의 IP 주소 로그 출력
+        log.info("Request URI: {}", req.getRequestURI()); // 요청 URI 로그 출력
+        FilterExceptionHandler.authenticationEntryPoint(res, ae);
+    }
+}
 
src/main/java/com/takensoft/common/exception/CustomBadRequestException.java (added)
+++ src/main/java/com/takensoft/common/exception/CustomBadRequestException.java
@@ -0,0 +1,28 @@
+package com.takensoft.common.exception;
+
+/**
+ * @author takensoft
+ * @since 2025.01.22
+ * @modification
+ *     since    |    author    | description
+ *  2025.01.22  |  takensoft   | 최초 등록
+ *
+ * RuntimeException - 실행 중 발생하는 예외를 처리하는 기본 클래스
+ *
+ * 사용자의 잘못된 요청 시 발생하는 예외
+ */
+public class CustomBadRequestException extends RuntimeException {
+
+    public CustomBadRequestException() {
+
+    }
+
+    public CustomBadRequestException(String message) {
+        super(message);
+    }
+
+    public CustomBadRequestException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+}
 
src/main/java/com/takensoft/common/exception/CustomDeleteFailException.java (added)
+++ src/main/java/com/takensoft/common/exception/CustomDeleteFailException.java
@@ -0,0 +1,26 @@
+package com.takensoft.common.exception;
+
+/**
+ * @author takensoft
+ * @since 2025.01.22
+ * @modification
+ *     since    |    author    | description
+ *  2025.01.22  |  takensoft   | 최초 등록
+ *
+ * RuntimeException - 실행 중 발생하는 예외를 처리하는 기본 클래스
+ *
+ * 삭제 실패 시 발생하는 예외
+ */
+public class CustomDeleteFailException extends RuntimeException {
+
+    public CustomDeleteFailException() {
+    }
+
+    public CustomDeleteFailException(String message) {
+        super(message);
+    }
+
+    public CustomDeleteFailException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}(파일 끝에 줄바꿈 문자 없음)
 
src/main/java/com/takensoft/common/exception/CustomIdTakenException.java (added)
+++ src/main/java/com/takensoft/common/exception/CustomIdTakenException.java
@@ -0,0 +1,28 @@
+package com.takensoft.common.exception;
+
+/**
+ * @author takensoft
+ * @since 2025.01.22
+ * @modification
+ *     since    |    author    | description
+ *  2025.01.22  |  takensoft   | 최초 등록
+ *
+ * RuntimeException - 실행 중 발생하는 예외를 처리하는 기본 클래스
+ *
+ * 회원가입 시 아이디 중복으로 발생하는 예외
+ */
+public class CustomIdTakenException extends RuntimeException {
+
+    public CustomIdTakenException() {
+
+    }
+
+    public CustomIdTakenException(String message) {
+        super(message);
+    }
+
+    public CustomIdTakenException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+}(파일 끝에 줄바꿈 문자 없음)
 
src/main/java/com/takensoft/common/exception/CustomInsertFailException.java (added)
+++ src/main/java/com/takensoft/common/exception/CustomInsertFailException.java
@@ -0,0 +1,26 @@
+package com.takensoft.common.exception;
+
+/**
+ * @author takensoft
+ * @since 2025.01.22
+ * @modification
+ *     since    |    author    | description
+ *  2025.01.22  |  takensoft   | 최초 등록
+ *
+ * RuntimeException - 실행 중 발생하는 예외를 처리하는 기본 클래스
+ *
+ * 등록 실패 시 발생하는 예외
+ */
+public class CustomInsertFailException extends RuntimeException {
+
+    public CustomInsertFailException() {
+    }
+
+    public CustomInsertFailException(String message) {
+        super(message);
+    }
+
+    public CustomInsertFailException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}(파일 끝에 줄바꿈 문자 없음)
 
src/main/java/com/takensoft/common/exception/CustomNotFoundException.java (added)
+++ src/main/java/com/takensoft/common/exception/CustomNotFoundException.java
@@ -0,0 +1,26 @@
+package com.takensoft.common.exception;
+
+/**
+ * @author takensoft
+ * @since 2025.01.22
+ * @modification
+ *     since    |    author    | description
+ *  2025.01.22  |  takensoft   | 최초 등록
+ *
+ * RuntimeException - 실행 중 발생하는 예외를 처리하는 기본 클래스
+ *
+ * 존재하지 않는 정보 또는 데이터를 조회할 때 발생하는 예외
+ */
+public class CustomNotFoundException extends RuntimeException {
+
+    public CustomNotFoundException() {
+
+    }
+    public CustomNotFoundException(String message) {
+        super(message);
+    }
+
+    public CustomNotFoundException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
 
src/main/java/com/takensoft/common/exception/CustomPasswordComparisonException.java (added)
+++ src/main/java/com/takensoft/common/exception/CustomPasswordComparisonException.java
@@ -0,0 +1,27 @@
+package com.takensoft.common.exception;
+
+/**
+ * @author takensoft
+ * @since 2025.01.22
+ * @modification
+ *     since    |    author    | description
+ *  2025.01.22  |  takensoft   | 최초 등록
+ *
+ * RuntimeException - 실행 중 발생하는 예외를 처리하는 기본 클래스
+ *
+ * 비밀번호 비교 시 다를 경우 발생하는 예외
+ */
+public class CustomPasswordComparisonException extends RuntimeException {
+
+    public CustomPasswordComparisonException() {
+
+    }
+
+    public CustomPasswordComparisonException(String message) {
+        super(message);
+    }
+
+    public CustomPasswordComparisonException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
 
src/main/java/com/takensoft/common/exception/CustomUpdateFailException.java (added)
+++ src/main/java/com/takensoft/common/exception/CustomUpdateFailException.java
@@ -0,0 +1,26 @@
+package com.takensoft.common.exception;
+
+/**
+ * @author takensoft
+ * @since 2025.01.22
+ * @modification
+ *     since    |    author    | description
+ *  2025.01.22  |  takensoft   | 최초 등록
+ *
+ * RuntimeException - 실행 중 발생하는 예외를 처리하는 기본 클래스
+ *
+ * 수정 실패 시 발생하는 예외
+ */
+public class CustomUpdateFailException extends RuntimeException {
+
+    public CustomUpdateFailException() {
+    }
+
+    public CustomUpdateFailException(String message) {
+        super(message);
+    }
+
+    public CustomUpdateFailException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}(파일 끝에 줄바꿈 문자 없음)
 
src/main/java/com/takensoft/common/exception/FilterExceptionHandler.java (added)
+++ src/main/java/com/takensoft/common/exception/FilterExceptionHandler.java
@@ -0,0 +1,186 @@
+package com.takensoft.common.exception;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.takensoft.common.message.MessageCode;
+import com.takensoft.common.util.ResponseData;
+import io.jsonwebtoken.ExpiredJwtException;
+import io.jsonwebtoken.security.SignatureException;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.MessageSource;
+import org.springframework.context.i18n.LocaleContextHolder;
+import org.springframework.http.MediaType;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.authentication.*;
+import org.springframework.security.authorization.AuthorizationDeniedException;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+
+/**
+ * @author takensoft
+ * @since 2025.01.22
+ * @modification
+ *     since    |    author    | description
+ *  2025.01.22  |  takensoft   | 최초 등록
+ *
+ * Filter에서 발생하는 예외를 처리하고, 적절한 에러 코드와 메시지를 클라이언트에게 응답하는 클래스
+ */
+@Component
+@Slf4j
+public class FilterExceptionHandler {
+
+    private static ObjectMapper objectMapper;
+    private static MessageSource messageSource;
+
+    /**
+     * @param objectMapper - ObjectMapper 인스턴스
+     *
+     * FilterExceptionHandler 생성자
+     */
+    public FilterExceptionHandler(ObjectMapper objectMapper, MessageSource messageSource) {
+        this.objectMapper = objectMapper;
+        this.messageSource = messageSource;
+    }
+
+    /**
+     * @param e - 처리할 예외 객체
+     *
+     * 예외를 로그로 출력
+     */
+    private static void logError(Exception e) {
+        StackTraceElement[] stackTrace = e.getStackTrace();
+        if(stackTrace.length > 0) {
+            StackTraceElement origin = stackTrace[0]; // 예외가 발생한 첫 번째 위치
+            log.error("[ {} ] - {} ({} [{}]번째 행)",
+                    e.getClass().getSimpleName(),
+                    e.getMessage(),
+                    origin.getFileName(),
+                    origin.getLineNumber()
+            );
+        } else {
+            log.error("[ {} ] - {}", e.getClass().getSimpleName(), e.getMessage());
+        }
+        e.printStackTrace();
+    }
+
+    /**
+     * @param res - HTTP 응답 객체
+     * @param messageCode - 발생한 메시지 정보
+     * @throws IOException - 입출력 예외 발생 시
+     *
+     * 응답 객체에 에러 정보를 JSON 형식으로 작성하여 반환
+     */
+    private static void errorRes(HttpServletResponse res, MessageCode messageCode) throws IOException {
+        /*
+         * Accept-Language가 header에 있으면 해당 언어에 맞게 호출 [ ko: 한국어, en: 영어 ]
+         * header에 Accept-Language가 없다면 한국어를 기본으로함.
+         * 다국어 메시지 적용
+         */
+        String message = messageSource.getMessage(messageCode.getMessageKey(), null, LocaleContextHolder.getLocale());
+        
+        // 반환 정보
+        ResponseData responseData = new ResponseData();
+                     responseData.setStatus(messageCode.getStatus().value());
+                     responseData.setStatusText(messageCode.getStatus());
+                     responseData.setMessage(message);
+
+        res.setContentType(MediaType.APPLICATION_JSON_VALUE);
+        res.setStatus(messageCode.getStatus().value());
+        res.getOutputStream().write(objectMapper.writeValueAsBytes(responseData));
+    }
+
+    /**
+     * @param res - HTTP 응답 객체
+     * @param e - 발생한 예외 객체
+     * @throws IOException - 입출력 예외 발생 시
+     *
+     * 공통 예외 처리 메서드
+     */
+    public static void handleException(HttpServletResponse res, Exception e) throws IOException {
+        logError(e);
+        MessageCode messageCode = getMessageCode(e);
+        errorRes(res, messageCode);
+    }
+
+    /**
+     * @param e - 예외 객체
+     * @return 대응되는 MessageCode
+     *
+     * 예외 유형에 따른 MessageCode 매핑
+     */
+    private static MessageCode getMessageCode(Exception e) {
+        if (e instanceof InternalAuthenticationServiceException) {
+            return MessageCode.LOGIN_USER_NOT_FOUND;
+        } else if (e instanceof BadCredentialsException) {
+            return MessageCode.LOGIN_INVALID_CREDENTIALS;
+        } else if (e instanceof AuthenticationCredentialsNotFoundException) {
+            return MessageCode.LOGIN_AUTHENTICATION_REQUIRED;
+        } else if (e instanceof LockedException) {
+            return MessageCode.LOGIN_ACCOUNT_LOCKED;
+        } else if (e instanceof DisabledException) {
+            return MessageCode.LOGIN_ACCOUNT_DISABLED;
+        } else if (e instanceof AccountExpiredException) {
+            return MessageCode.LOGIN_ACCOUNT_EXPIRED;
+        } else if (e instanceof CredentialsExpiredException) {
+            return MessageCode.LOGIN_CREDENTIALS_EXPIRED;
+        } else if (e instanceof ExpiredJwtException) {
+            return MessageCode.JWT_EXPIRED;
+        } else if (e instanceof SignatureException) {
+            return MessageCode.JWT_SIGNATURE_INVALID;
+        } else if (e instanceof InsufficientAuthenticationException) {
+            return MessageCode.JWT_INSUFFICIENT_AUTHENTICATION;
+        } else if (e instanceof AccessDeniedException) {
+            return MessageCode.ACCESS_DENIED;
+        } else if (e instanceof AuthorizationDeniedException) {
+            return MessageCode.ACCESS_DENIED;
+        } else {
+            return MessageCode.COMMON_UNKNOWN_ERROR;
+        }
+    }
+
+    /**
+     * @param res - HTTP 응답 객체
+     * @param ae - 인증 예외 객체
+     * @throws IOException - 입출력 예외 발생 시
+     *
+     * 로그인 오류가 발생한 경우
+     */
+    public static void loginError(HttpServletResponse res, AuthenticationException ae) throws IOException {
+        handleException(res, ae);
+    }
+
+    /**
+     * @param res - HTTP 응답 객체
+     * @param e - JWT 관련 예외 객체
+     * @throws IOException - 입출력 예외 발생 시
+     *
+     * JWT 오류가 발생한 경우
+     */
+    public static void jwtError(HttpServletResponse res, Exception e) throws IOException {
+        handleException(res, e);
+    }
+
+    /**
+     * @param res - HTTP 응답 객체
+     * @param ade - 접근 거부 예외 객체
+     * @throws IOException - 입출력 예외 발생 시
+     *
+     * 접근이 거부된 경우
+     */
+    public static void accesDenie(HttpServletResponse res, AccessDeniedException ade) throws IOException {
+        handleException(res, ade);
+    }
+
+    /**
+     * @param res - HTTP 응답 객체
+     * @param ae - 인증 예외 객체
+     * @throws IOException - 입출력 예외 발생 시
+     *
+     * 인증 예외가 발생한 경우
+     */
+    public static void authenticationEntryPoint(HttpServletResponse res, AuthenticationException ae) throws IOException{
+        handleException(res, ae);
+    }
+}(파일 끝에 줄바꿈 문자 없음)
 
src/main/java/com/takensoft/common/exception/GlobalExceptionHandler.java (added)
+++ src/main/java/com/takensoft/common/exception/GlobalExceptionHandler.java
@@ -0,0 +1,257 @@
+package com.takensoft.common.exception;
+
+import com.takensoft.common.message.MessageCode;
+import com.takensoft.common.util.ResponseUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.dao.DataAccessException;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.servlet.resource.NoResourceFoundException;
+
+import java.net.UnknownHostException;
+
+/**
+ * @author takensoft
+ * @since 2025.01.22
+ * @modification
+ *     since    |    author    | description
+ *  2025.01.22  |  takensoft   | 최초 등록
+ *
+ * 스프링 MVC 컨트롤러에서 발생하는 예외를 처리하는 공통 클래스
+ */
+@RestControllerAdvice
+@Slf4j
+@RequiredArgsConstructor
+public class GlobalExceptionHandler {
+
+    private final ResponseUtil resUtil;
+
+
+    /**
+     * @param e - 처리할 예외 객체
+     *
+     * 예외를 로그로 출력
+     */
+    private void logError(Exception e) {
+        StackTraceElement[] stackTrace = e.getStackTrace();
+        if(stackTrace.length > 0) {
+            StackTraceElement origin = stackTrace[0]; // 예외가 발생한 첫 번째 위치
+            log.error("[ {} ] - {} ({} [{}]번째 행)",
+                    e.getClass().getSimpleName(),
+                    e.getMessage(),
+                    origin.getFileName(),
+                    origin.getLineNumber()
+            );
+        } else {
+            log.error("[ {} ] - {}", e.getClass().getSimpleName(), e.getMessage());
+        }
+        e.printStackTrace();
+    }
+
+    /**
+     * @param dae - DataAccessException 예외 객체
+     * @return 유효성 검사 실패에 대한 HTTP 응답
+     *
+     * SQL 예외 처리
+     */
+    @ExceptionHandler(DataAccessException.class)
+    public ResponseEntity<?> handleDataAccessException(DataAccessException dae) {
+        logError(dae);
+//        String msg = dae.getMessage().toLowerCase();
+//        if(msg.contains("null value")) {
+//            return resUtil.errorRes(MessageCode.SQL_NULL_VALUE);
+//        } else if(msg.contains("duplicate key")) {
+//            return resUtil.errorRes(MessageCode.SQL_DUPLICATE_KEY);
+//        }
+        return resUtil.errorRes(MessageCode.COMMON_UNKNOWN_ERROR);
+    }
+
+    /**
+     * @param mave - MethodArgumentNotValidException 예외 객체
+     * @return 유효성 검사 실패에 대한 HTTP 응답
+     *
+     * 유효성 검증에 실패한 경우
+     */
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    public ResponseEntity<?> handleValidationException(MethodArgumentNotValidException mave) {
+        logError(mave);
+        String message = mave.getBindingResult().getFieldErrors().stream()
+                .findFirst()
+                .map(error -> error.getDefaultMessage())
+                .orElse("유효성 검증에 실패했습니다.");
+        return resUtil.errorRes(HttpStatus.BAD_REQUEST, message);
+    }
+
+    /**
+     * @param ne - NullPointerException 예외 객체
+     * @return NullPointerException에 대한 HTTP 응답
+     *
+     * NullPointerException이 발생한 경우
+     */
+    @ExceptionHandler(NullPointerException.class)
+    public ResponseEntity<?> handleNullPointerException(NullPointerException ne) {
+        logError(ne);
+        return resUtil.errorRes(MessageCode.COMMON_NULL_POINT);
+    }
+
+    /**
+     * @param ie - IllegalArgumentException 예외 객체
+     * @return IllegalArgumentException에 대한 HTTP 응답
+     *
+     * IllegalArgumentException이 발생한 경우
+     */
+    @ExceptionHandler(IllegalArgumentException.class)
+    public ResponseEntity<?> handleIllegalArgumentException(IllegalArgumentException ie) {
+        logError(ie);
+        return resUtil.errorRes(MessageCode.COMMON_ILLEGAL_ARGUMENT);
+    }
+
+    /**
+     * @param nrfe - NoResourceFoundException 예외 객체
+     * @return NoResourceFoundException 대한 HTTP 응답
+     *
+     * NoResourceFoundException이 발생한 경우
+     */
+    @ExceptionHandler(NoResourceFoundException.class)
+    public ResponseEntity<?> handleNoResourceFoundException(NoResourceFoundException nrfe) {
+        logError(nrfe);
+        return resUtil.errorRes(MessageCode.COMMON_BAD_REQUEST);
+    }
+
+    /**
+     * @param hrmnse - HttpRequestMethodNotSupportedException 예외 객체
+     * @return HttpRequestMethodNotSupportedException 대한 HTTP 응답
+     *
+     * HttpRequestMethodNotSupportedException이 발생한 경우
+     */
+    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
+    public ResponseEntity<?> handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException hrmnse) {
+        logError(hrmnse);
+        return resUtil.errorRes(MessageCode.COMMON_METHOD_NOT_ALLOWED);
+    }
+
+    /**
+     * @param cite - CustomIdTakenException 예외 객체
+     * @return CustomIdTakenException에 대한 HTTP 응답
+     *
+     * CustomIdTakenException이 발생한 경우
+     */
+    @ExceptionHandler(CustomIdTakenException.class)
+    public ResponseEntity<?> handleCustomIdTakenException(CustomIdTakenException cite) {
+        logError(cite);
+        return resUtil.errorRes(MessageCode.SIGNUP_ID_TAKEN);
+    }
+
+    /**
+     * @param cbre - CustomBadRequestException 예외 객체
+     * @return CustomBadRequestException에 대한 HTTP 응답
+     *
+     * CustomBadRequestException이 발생한 경우
+     */
+    @ExceptionHandler(CustomBadRequestException.class)
+    public ResponseEntity<?> handleCustomBadRequestException(CustomBadRequestException cbre) {
+        logError(cbre);
+        return resUtil.errorRes(MessageCode.COMMON_BAD_REQUEST);
+    }
+
+    /**
+     * @param cade - CustomAccessDeniedException 예외 객체
+     * @return CustomAccessDeniedException에 대한 HTTP 응답
+     *
+     * CustomAccessDeniedException이 발생한 경우
+     */
+    @ExceptionHandler(CustomAccessDeniedException.class)
+    public ResponseEntity<?> handleCustomAccessDeniedException(CustomAccessDeniedException cade) {
+        logError(cade);
+        return resUtil.errorRes(MessageCode.ACCESS_DENIED);
+    }
+
+    /**
+     * @param cpce - CustomPasswordComparisonException 예외 객체
+     * @return CustomPasswordComparisonException에 대한 HTTP 응답
+     *
+     * CustomPasswordComparisonException이 발생한 경우
+     */
+    @ExceptionHandler(CustomPasswordComparisonException.class)
+    public ResponseEntity<?> handleCustomPasswordComparisonException(CustomPasswordComparisonException cpce) {
+        logError(cpce);
+        return resUtil.errorRes(MessageCode.LOGIN_INVALID_CREDENTIALS);
+    }
+
+    /**
+     * @param cfe - CustomNotFoundException 예외 객체
+     * @return CustomNotFoundException에 대한 HTTP 응답
+     *
+     * CustomNotFoundException 발생한 경우
+     */
+    @ExceptionHandler(CustomNotFoundException.class)
+    public ResponseEntity<?> handleNotFoundException(CustomNotFoundException cfe) {
+        logError(cfe);
+        return resUtil.errorRes(MessageCode.COMMON_NOT_FOUND);
+    }
+
+    /**
+     * @param cife - CustomInsertFailException 예외 객체
+     * @return CustomInsertFailException에 대한 HTTP 응답
+     *
+     * CustomInsertFailException이 발생한 경우
+     */
+    @ExceptionHandler(CustomInsertFailException.class)
+    public ResponseEntity<?> handleCustomInsertFailException(CustomInsertFailException cife) {
+        logError(cife);
+        return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
+    }
+
+    /**
+     * @param cufe - CustomUpdateFailException 예외 객체
+     * @return CustomUpdateFailException에 대한 HTTP 응답
+     *
+     * CustomUpdateFailException이 발생한 경우
+     */
+    @ExceptionHandler(CustomUpdateFailException.class)
+    public ResponseEntity<?> handleCustomUpdateFailException(CustomUpdateFailException cufe) {
+        logError(cufe);
+        return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
+    }
+
+    /**
+     * @param cdfe - CustomDeleteFailException 예외 객체
+     * @return CustomDeleteFailException에 대한 HTTP 응답
+     *
+     * CustomDeleteFailException 발생한 경우
+     */
+    @ExceptionHandler(CustomDeleteFailException.class)
+    public ResponseEntity<?> handleCustomDeleteFailException(CustomDeleteFailException cdfe) {
+        logError(cdfe);
+        return resUtil.errorRes(MessageCode.COMMON_DELETE_FAIL);
+    }
+
+    /**
+     * @param ukhe - UnknownHostException 예외 객체
+     * @return UnknownHostException에 대한 HTTP 응답
+     *
+     * UnknownHostException 발생한 경우
+     */
+    @ExceptionHandler(UnknownHostException.class)
+    public ResponseEntity<?> handleUnknownHostException(UnknownHostException ukhe) {
+        logError(ukhe);
+        return resUtil.errorRes(MessageCode.NETWORK_UNKNOWN_HOST);
+    }
+
+    /**
+     * @param e - Exception 예외 객체
+     * @return 기타 예외에 대한 HTTP 응답
+     *
+     * 그 외 모든 예외가 발생한 경우
+     */
+    @ExceptionHandler(Exception.class)
+    public ResponseEntity<?> handleException(Exception e) {
+        logError(e);
+        return resUtil.errorRes(MessageCode.COMMON_UNKNOWN_ERROR);
+    }
+}
src/main/java/com/takensoft/common/file/web/FileController.java
--- src/main/java/com/takensoft/common/file/web/FileController.java
+++ src/main/java/com/takensoft/common/file/web/FileController.java
@@ -12,8 +12,8 @@
 import org.springframework.web.multipart.MultipartHttpServletRequest;
 import org.springframework.web.multipart.MultipartRequest;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import java.io.*;
 import java.net.URLEncoder;
 import java.time.LocalDateTime;
src/main/java/com/takensoft/common/filter/AccesFilter.java
--- src/main/java/com/takensoft/common/filter/AccesFilter.java
+++ src/main/java/com/takensoft/common/filter/AccesFilter.java
@@ -11,10 +11,10 @@
 import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
 import org.springframework.web.filter.OncePerRequestFilter;
 
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.time.LocalDateTime;
 import java.util.List;
src/main/java/com/takensoft/common/filter/JWTFilter.java
--- src/main/java/com/takensoft/common/filter/JWTFilter.java
+++ src/main/java/com/takensoft/common/filter/JWTFilter.java
@@ -16,10 +16,10 @@
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.web.filter.OncePerRequestFilter;
 
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.time.LocalDateTime;
 import java.util.List;
src/main/java/com/takensoft/common/filter/LoginFilter.java
--- src/main/java/com/takensoft/common/filter/LoginFilter.java
+++ src/main/java/com/takensoft/common/filter/LoginFilter.java
@@ -22,10 +22,10 @@
 import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
 import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
 
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.time.LocalDateTime;
 import java.util.List;
 
src/main/java/com/takensoft/common/message/MessageCode.java (added)
+++ src/main/java/com/takensoft/common/message/MessageCode.java
@@ -0,0 +1,67 @@
+package com.takensoft.common.message;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.springframework.http.HttpStatus;
+
+/**
+ * @author takensoft
+ * @since 2025.01.22
+ * @modification
+ *     since    |    author    | description
+ *  2025.01.22  |  takensoft   | 최초 등록
+ *
+ * 시스템에서 발생할 수 있는 코드 메시지들을 정의
+ */
+@AllArgsConstructor
+@Getter
+public enum MessageCode {
+    // 공통
+    COMMON_SUCCESS("common.success", HttpStatus.OK), // 처리 성공
+    COMMON_UNKNOWN_ERROR("common.unknown", HttpStatus.INTERNAL_SERVER_ERROR), // 일반적인 오류 발생
+    COMMON_BAD_REQUEST("common.bad_request", HttpStatus.BAD_REQUEST), // 잘못된 요청
+    COMMON_NULL_POINT("common.null_point", HttpStatus.BAD_REQUEST), // NullPointer 발생
+    COMMON_ILLEGAL_ARGUMENT("common.illegal_argument", HttpStatus.BAD_REQUEST), // IllegalArgument 발생
+    COMMON_NOT_FOUND("common.not_found", HttpStatus.NOT_FOUND), // 정보가 존재 하지 않음
+    COMMON_METHOD_NOT_ALLOWED("common.method_not_allowed", HttpStatus.METHOD_NOT_ALLOWED), // 지원하지 않는 HTTP 메서드
+    COMMON_INSERT_FAIL("common.insert_fail", HttpStatus.INTERNAL_SERVER_ERROR), // 등록 실패 시
+    COMMON_UPDATE_FAIL("common.update_fail", HttpStatus.INTERNAL_SERVER_ERROR), // 수정 실패 시
+    COMMON_DELETE_FAIL("common.delete_fail", HttpStatus.INTERNAL_SERVER_ERROR), // 삭제 실패 시
+    COMMON_PAYLOAD_TOO_LARGE("common.payload_too_large",HttpStatus.PAYLOAD_TOO_LARGE), //파일 용량 초과 시
+    COMMON_DUPLICATION_CODE("common.duplication_code",HttpStatus.INTERNAL_SERVER_ERROR), //중복 코드
+    COMMON_DUPLICATION_DATA("common.duplication_data",HttpStatus.INTERNAL_SERVER_ERROR), //중복 데이터
+
+    //네트워크 관련
+    NETWORK_UNKNOWN_HOST("network.unknown_host", HttpStatus.BAD_REQUEST), // 알 수 없는 호스트
+    
+    // SQL 관련
+    SQL_NULL_VALUE("sql.null_value", HttpStatus.BAD_REQUEST), // Null 값 위반
+    SQL_DUPLICATE_KEY("sql.duplicate_key", HttpStatus.CONFLICT), // 중복 키 위반
+    SQL_DATA_INTEGRITY("sql.data_integrity", HttpStatus.BAD_REQUEST), // 데이터 무결성 위반
+    SQL_UNKNOWN("sql.unknown", HttpStatus.INTERNAL_SERVER_ERROR), // 알 수 없는 SQL 에러
+
+    // jwt 관련
+    JWT_EXPIRED("jwt.expired", HttpStatus.UNAUTHORIZED), // JWT 토큰 만료
+    JWT_SIGNATURE_INVALID("jwt.signature_invalid", HttpStatus.UNAUTHORIZED), // JWT 서명 오류
+    JWT_INSUFFICIENT_AUTHENTICATION("jwt.insufficient_authentication", HttpStatus.FORBIDDEN), // 인증 정보 부족
+
+    // 접근 관련
+    ACCESS_DENIED("access.denied", HttpStatus.FORBIDDEN), // 권한 없음
+    UNAUTHORIZED_ACCESS("access.unauthorized", HttpStatus.UNAUTHORIZED), // 잘못된 접근
+
+    // 사용자 관련
+    SIGNUP_SUCCESS("user.signup.success", HttpStatus.OK),    // 회원가입 성공
+    SIGNUP_ID_TAKEN("user.signup.id_taken", HttpStatus.CONFLICT),   // 아이디 중복
+    SIGNUP_EMAIL_TAKEN("user.signup.email_taken", HttpStatus.CONFLICT), // 이메일 중복
+    LOGIN_USER_NOT_FOUND("user.login.user_not_found", HttpStatus.NOT_FOUND), // 사용자가 존재 하지 않는 경우
+    LOGIN_INVALID_CREDENTIALS("user.login.invalid_credentials", HttpStatus.UNAUTHORIZED), // 비밀번호 불일치
+    LOGIN_AUTHENTICATION_REQUIRED("user.login.authentication_required", HttpStatus.FORBIDDEN), // 인증 거부
+    LOGIN_ACCOUNT_LOCKED("user.login.account_locked", HttpStatus.LOCKED), // 계정 잠김 상태
+    LOGIN_ACCOUNT_DISABLED("user.login.account_disabled", HttpStatus.FORBIDDEN), // 계정 비활성화
+    LOGIN_ACCOUNT_EXPIRED("user.login.account_expired", HttpStatus.FORBIDDEN), // 계정 만료
+    LOGIN_CREDENTIALS_EXPIRED("user.login.credentials_expired", HttpStatus.FORBIDDEN), // 비밀번호 유효기간 만료
+    LOGOUT_SUCCESS("user.logout.success", HttpStatus.OK); // 로그아웃 성공
+
+    private final String messageKey;   //  메시지
+    private final HttpStatus status;    // HTTP 상태
+}(파일 끝에 줄바꿈 문자 없음)
src/main/java/com/takensoft/common/util/CommonUtils.java
--- src/main/java/com/takensoft/common/util/CommonUtils.java
+++ src/main/java/com/takensoft/common/util/CommonUtils.java
@@ -2,7 +2,7 @@
 
 import org.springframework.stereotype.Component;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 
 
src/main/java/com/takensoft/common/util/CustomAccessDenieHandler.java (deleted)
--- src/main/java/com/takensoft/common/util/CustomAccessDenieHandler.java
@@ -1,50 +0,0 @@
-package com.takensoft.common.util;
-
-import com.takensoft.common.config.CommonConfig;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.security.access.AccessDeniedException;
-import org.springframework.security.web.access.AccessDeniedHandler;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.time.LocalDateTime;
-
-/**
- * @author  : takensoft
- * @since   : 2024.04.05
- *
- * 인가(권한) 에러
- * AccessDeniedHandler를 커스텀하여 접근 거부된 요청에 대한 처리
- */
-@Component
-@Slf4j
-@RequiredArgsConstructor
-public class CustomAccessDenieHandler implements AccessDeniedHandler {
-
-    private final CommonConfig commonConfig;
-
-    @Override
-    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
-        // 접근 거부 예외에 대한 로그 출력
-        log.error("Access Denied Exception: {}", accessDeniedException.getMessage());
-
-        // 접근 거부 에러 응답을 위한 객체 생성
-        ErrorResponse errorResponse = new ErrorResponse();
-        errorResponse.setMessage("Access Denied"); // 에러 응답 메시지 설정
-        errorResponse.setPath(request.getRequestURI()); // 요청 경로 설정
-        errorResponse.setError(HttpStatus.FORBIDDEN.getReasonPhrase()); // 에러 메시지 설정
-        errorResponse.setStatus(HttpStatus.FORBIDDEN.value()); // 에러 상태 코드 설정
-        errorResponse.setTimestamp(LocalDateTime.now()); // 응답 시간 설정
-
-        // 응답 헤더 설정 및 json 응답 전송
-        response.setContentType(MediaType.APPLICATION_JSON_VALUE);
-        response.setStatus(HttpStatus.FORBIDDEN.value());
-        response.getOutputStream().write(commonConfig.getObjectMapper().writeValueAsBytes(errorResponse));
-    }
-}
 
src/main/java/com/takensoft/common/util/CustomAuthenticationEntryPoint.java (deleted)
--- src/main/java/com/takensoft/common/util/CustomAuthenticationEntryPoint.java
@@ -1,55 +0,0 @@
-package com.takensoft.common.util;
-
-import com.takensoft.common.config.CommonConfig;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.web.AuthenticationEntryPoint;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.time.LocalDateTime;
-
-/**
- * @author  : takensoft
- * @since   : 2024.04.05
- *
- * 인증 에러
- * AuthenticationEntryPoint 커스텀하여 인증이 실패한 경우에 대한 처리
- */
-@Component
-@Slf4j
-@RequiredArgsConstructor
-public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint {
-
-    private final CommonConfig commonConfig;
-
-    @Override
-    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
-        // 사용자의 요청이 인증되지 않았을 때 로그 출력
-        log.info("Unauthorized user request: {}", authException.getMessage());
-        // 요청자의 IP 주소 로그 출력
-        log.info("Requester IP: {}", request.getRemoteAddr());
-        // 요청 URI 로그 출력
-        log.info("Request URI: {}", request.getRequestURI());
-
-        // 접근 거부 에러 응답을 위한 객체 생성
-        ErrorResponse errorResponse = new ErrorResponse();
-        errorResponse.setMessage("Token expired"); // 에러 응답 메시지 설정
-//        errorResponse.setMessage("인증에러 발생: " + authException.getMessage()); // 에러 응답 메시지 설정
-        errorResponse.setPath(request.getRequestURI()); // 요청 경로 설정
-        errorResponse.setError(HttpStatus.UNAUTHORIZED.getReasonPhrase()); // 오류 원인 설정
-        errorResponse.setStatus(HttpStatus.UNAUTHORIZED.value()); // 상태 코드 설정
-        errorResponse.setTimestamp(LocalDateTime.now()); // 응답 시간 설정
-
-        // 응답 헤더 설정 및 json 응답 전송
-        response.setContentType(MediaType.APPLICATION_JSON_VALUE);
-        response.setStatus(HttpStatus.UNAUTHORIZED.value());
-        response.getOutputStream().write(commonConfig.getObjectMapper().writeValueAsBytes(errorResponse));
-    }
-}
src/main/java/com/takensoft/common/util/JWTUtil.java
--- src/main/java/com/takensoft/common/util/JWTUtil.java
+++ src/main/java/com/takensoft/common/util/JWTUtil.java
@@ -13,7 +13,7 @@
 
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
-import javax.servlet.http.Cookie;
+import jakarta.servlet.http.Cookie;
 import java.nio.charset.StandardCharsets;
 import java.util.*;
 
src/main/java/com/takensoft/common/util/ResponseData.java
--- src/main/java/com/takensoft/common/util/ResponseData.java
+++ src/main/java/com/takensoft/common/util/ResponseData.java
@@ -1,7 +1,11 @@
 package com.takensoft.common.util;
 
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
 import lombok.Data;
 import org.springframework.http.HttpStatus;
+
+import java.time.LocalDateTime;
 
 /**
  * @author takensoft
@@ -11,13 +15,26 @@
 @Data
 public class ResponseData {
 
-    private HttpStatus status;
+    /*private HttpStatus status;
     private String message;
-    private Object data;
+    private Object data;*/
+
+    private int status;                 // 상태 코드
+    private HttpStatus statusText;      // 상태 메시지
+    private String message;             // 전달 메시지
+    private Object data;                // 전달 데이터
+
+    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
+    private LocalDateTime resTime;      // 응답 시간
 
     public ResponseData() {
-        this.status = HttpStatus.BAD_REQUEST;
+        /*this.status = HttpStatus.BAD_REQUEST;
         this.data = null;
+        this.message = null;*/
+        this.status = 0;
+        this.statusText = null;
         this.message = null;
+        this.data = null;
+        this.resTime = LocalDateTime.now();
     }
 }
 
src/main/java/com/takensoft/common/util/ResponseUtil.java (added)
+++ src/main/java/com/takensoft/common/util/ResponseUtil.java
@@ -0,0 +1,96 @@
+package com.takensoft.common.util;
+
+
+import com.takensoft.common.message.MessageCode;
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.MessageSource;
+import org.springframework.context.i18n.LocaleContextHolder;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+
+import java.nio.charset.Charset;
+
+/**
+ * @author  : takensoft
+ * @since   : 2025.01.22
+ * @modification
+ *     since    |    author    | description
+ *  2025.01.22  |  takensoft   | 최초 등록
+ *
+ * HTTP 응답 처리를 위한 유틸리티
+ */
+@Component
+@RequiredArgsConstructor
+public class ResponseUtil {
+
+    private final MessageSource messageSource;
+
+    /**
+     * @return JSON 응답을 위한 HttpHeaders 객체
+     *
+     * HTTp 해더 생성성
+     */
+    private static HttpHeaders createHeaders() {
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
+        return headers;
+    }
+
+    /**
+     * @param messageCode - 메시지 코드
+     * @return 다국어 메시지
+     *
+     * 다국어 메시지 호출
+     */
+    private String getMessage(MessageCode messageCode) {
+        return messageSource.getMessage(messageCode.getMessageKey(), null, LocaleContextHolder.getLocale());
+    }
+
+    /**
+     * @param data    - 응답 데이터
+     * @param messageCode - 응답 메시지 코드
+     * @return 성공 응답 결과
+     * 
+     * 성공 응답 생성
+     */
+    public ResponseEntity<?> successRes(Object data, MessageCode messageCode) {
+        ResponseData responseData = new ResponseData();
+                     responseData.setStatus(messageCode.getStatus().value());
+                     responseData.setStatusText(messageCode.getStatus());
+                     responseData.setMessage(getMessage(messageCode));
+                     responseData.setData(data);
+        return new ResponseEntity<>(responseData, createHeaders(), HttpStatus.OK);
+    }
+
+    /**
+     * @param status  - HTTP 상태 코드
+     * @param message - 에러 메시지
+     * @return 에러 응답 결과
+     * 
+     * 에러 응답 생성
+     */
+    public ResponseEntity<?> errorRes(HttpStatus status, String message) {
+        ResponseData responseData = new ResponseData();
+                     responseData.setStatus(status.value());
+                     responseData.setStatusText(status);
+                     responseData.setMessage(message);
+        return new ResponseEntity<>(responseData, createHeaders(), status);
+    }
+
+    /**
+     * @param messageCode - 응답 메시지 코드
+     * @return 에러 응답 결과
+     *
+     * 에러 응답 생성
+     */
+    public ResponseEntity<?> errorRes(MessageCode messageCode) {
+        ResponseData responseData = new ResponseData();
+                     responseData.setStatus(messageCode.getStatus().value());
+                     responseData.setStatusText(messageCode.getStatus());
+                     responseData.setMessage(getMessage(messageCode));
+        return new ResponseEntity<>(responseData, createHeaders(), messageCode.getStatus());
+    }
+}
src/main/java/com/takensoft/portal/entDscsnAply/service/EntDscsnAplyService.java
--- src/main/java/com/takensoft/portal/entDscsnAply/service/EntDscsnAplyService.java
+++ src/main/java/com/takensoft/portal/entDscsnAply/service/EntDscsnAplyService.java
@@ -4,7 +4,7 @@
 import com.takensoft.portal.entDscsnAply.vo.EntDscsnAplyVO;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import java.util.*;
 
 /**
src/main/java/com/takensoft/portal/entDscsnAply/service/Impl/EntDscsnAplyServiceImpl.java
--- src/main/java/com/takensoft/portal/entDscsnAply/service/Impl/EntDscsnAplyServiceImpl.java
+++ src/main/java/com/takensoft/portal/entDscsnAply/service/Impl/EntDscsnAplyServiceImpl.java
@@ -18,7 +18,7 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import java.io.IOException;
 import java.util.*;
 
src/main/java/com/takensoft/portal/entDscsnAply/web/EntDscsnAplyController.java
--- src/main/java/com/takensoft/portal/entDscsnAply/web/EntDscsnAplyController.java
+++ src/main/java/com/takensoft/portal/entDscsnAply/web/EntDscsnAplyController.java
@@ -1,7 +1,9 @@
 package com.takensoft.portal.entDscsnAply.web;
 
 import com.takensoft.common.file.service.FileService;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import com.takensoft.portal.entDscsnAply.service.EntDscsnAplyService;
 import com.takensoft.portal.entDscsnAply.vo.EntDscsnAplyVO;
 import lombok.RequiredArgsConstructor;
@@ -11,21 +13,24 @@
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 import java.nio.charset.Charset;
 import java.util.*;
-
 /**
- * @author  : 박정하
- * @since   : 2024.04.02
+ * @author 박정하
+ * @since 2024.04.02
+ * @modification
+ *     since    |    author    | description
+ *  2024.04.02  |    박정하     | 최초 등록
  *
- * 기업상담신청 관련 컨트롤러
+ * 기업상담신청 관련 Controller
  */
 @RestController
 @RequiredArgsConstructor
 public class EntDscsnAplyController {
     private final EntDscsnAplyService entDscsnAplyService;
     private final FileService fileService;
+    private final ResponseUtil resUtil;
 
     /**
      * @author 박정하
@@ -46,22 +51,17 @@
         headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
         ResponseData responseData = new ResponseData();
         if (insertResult > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 문의 등록되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else if(insertResult < 0) {
-            responseData.setStatus(HttpStatus.PAYLOAD_TOO_LARGE);
-            responseData.setMessage("업로드 가능한 파일 용량 제한을 초과했습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.PAYLOAD_TOO_LARGE);
+            return resUtil.errorRes(MessageCode.COMMON_PAYLOAD_TOO_LARGE);
         } else {
             if (result.containsKey("writeCount") && result.containsKey("lastDatetime")) {
-                responseData.setStatus(HttpStatus.TOO_MANY_REQUESTS);
+                responseData.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());
+                responseData.setStatusText(HttpStatus.TOO_MANY_REQUESTS);
                 responseData.setMessage("주어진 시간 동안 너무 많은 문의를 등록했습니다. " + result.get("lastDatetime") + " 후에 재시도하세요.");
                 return new ResponseEntity<>(responseData, headers, HttpStatus.TOO_MANY_REQUESTS);
             } else {
-                responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-                responseData.setMessage("문의 등록에 실패하였습니다.\n담당자에게 문의하세요.");
-                return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+                return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
             }
         }
     }
@@ -80,13 +80,7 @@
         Map<String, Object> result = entDscsnAplyService.entDscsnAplyList(request, params);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 기업상담신청 목록 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -103,13 +97,7 @@
         EntDscsnAplyVO result = entDscsnAplyService.entDscsnAplyDetail(entDscsnAplyVO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 기업상담신청 상세 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -130,17 +118,11 @@
         headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
         ResponseData responseData = new ResponseData();
         if (result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else if(result < 0) {
-            responseData.setStatus(HttpStatus.PAYLOAD_TOO_LARGE);
-            responseData.setMessage("업로드 가능한 파일 용량 제한을 초과했습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.PAYLOAD_TOO_LARGE);
+            return resUtil.errorRes(MessageCode.COMMON_PAYLOAD_TOO_LARGE);
         } else {
-            responseData.setStatus(HttpStatus.BAD_REQUEST);
-            responseData.setMessage("요청 적용에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.BAD_REQUEST);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
 }
(파일 끝에 줄바꿈 문자 없음)
src/main/java/com/takensoft/portal/entInfo/web/EntInfoController.java
--- src/main/java/com/takensoft/portal/entInfo/web/EntInfoController.java
+++ src/main/java/com/takensoft/portal/entInfo/web/EntInfoController.java
@@ -2,7 +2,9 @@
 
 import com.takensoft.common.excel.service.ExcelService;
 import com.takensoft.common.exception.IdDuplicationException;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import com.takensoft.portal.entInfo.dto.BplcExcelDTO;
 import com.takensoft.portal.entInfo.dto.EntInfoExcelDTO;
 import com.takensoft.portal.entInfo.service.EntInfoService;
@@ -15,15 +17,17 @@
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
 import java.nio.charset.Charset;
 import java.util.*;
-
 /**
- * @author  : 박정하
- * @since   : 2024.03.20
+ * @author 박정하
+ * @since 2024.03.20
+ * @modification
+ *     since    |    author    | description
+ *  2024.03.20  |    박정하     | 최초 등록
  *
- * 기업정보 관련 컨트롤러
+ * 기업정보 관련 Controller
  */
 @RestController
 @RequiredArgsConstructor
@@ -31,6 +35,7 @@
 public class EntInfoController {
     private final EntInfoService entInfoService;
     private final ExcelService excelService;
+    private final ResponseUtil resUtil;
 
     /**
      * @author 박정하
@@ -44,17 +49,11 @@
     @PostMapping(path = "/insertProc.file")
     public ResponseEntity<?> insertProc(@RequestPart EntInfoVO entInfoVO, @RequestPart(required = false) List<MultipartFile> insertFileList) throws Exception {
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
 
         // 사업자등록번호 중복 검사
         int isExistence = entInfoService.selectCntByCheckBrno(entInfoVO.getBrno());
         if (isExistence > 0) {
-            // throw new IdDuplicationException("이미 존재하는 사업자등록번호입니다.");
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("이미 존재하는 사업자등록번호입니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_DUPLICATION_DATA);
         }
 
         // 기업정보 등록
@@ -62,18 +61,11 @@
         int insertResult = (int) result.get("result");
 
         if(insertResult > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 등록 처리되었습니다.");
-            responseData.setData(result);
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else if(insertResult < 0) {
-            responseData.setStatus(HttpStatus.PAYLOAD_TOO_LARGE);
-            responseData.setMessage("업로드 가능한 파일 용량 제한을 초과했습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.PAYLOAD_TOO_LARGE);
+            return resUtil.errorRes(MessageCode.COMMON_PAYLOAD_TOO_LARGE);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
         }
     }
 
@@ -91,13 +83,7 @@
         Map<String, Object> result = entInfoService.entInfoSelectList(params);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 기업정보 목록 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -114,13 +100,7 @@
         HashMap<String, Object> result = entInfoService.entInfoDetail(entInfoVO);
         
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 기업정보 상세 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -134,35 +114,21 @@
      */
     @PostMapping(path = "/updateProc.file")
     public ResponseEntity<?> updateProc(@RequestPart EntInfoVO entInfoVO, @RequestPart(required = false) List<MultipartFile> insertFileList) throws Exception {
-        // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-
-        // 사업자등록번호 중복 검사
+       // 사업자등록번호 중복 검사
         if (entInfoVO.getIsBrnoChange()) {
             int isExistence = entInfoService.selectCntByCheckBrno(entInfoVO.getBrno());
             if (isExistence > 0) {
-//            throw new IdDuplicationException("이미 존재하는 사업자등록번호입니다.");
-                responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-                responseData.setMessage("이미 존재하는 사업자등록번호입니다.");
-                return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+                return resUtil.errorRes(MessageCode.COMMON_DUPLICATION_DATA);
             }
         }
-
+        // 응답 처리
         int result = entInfoService.entInfoUpdate(entInfoVO, insertFileList);
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 기업정보 수정 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else if(result < 0) {
-            responseData.setStatus(HttpStatus.PAYLOAD_TOO_LARGE);
-            responseData.setMessage("업로드 가능한 파일 용량 제한을 초과했습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.PAYLOAD_TOO_LARGE);
+            return resUtil.errorRes(MessageCode.COMMON_PAYLOAD_TOO_LARGE);
         } else {
-            responseData.setStatus(HttpStatus.BAD_REQUEST);
-            responseData.setMessage("기업정보 등록 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.BAD_REQUEST);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
 
@@ -180,17 +146,10 @@
         int result = entInfoService.entInfoDelete(entInfoVO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 기업정보가 삭제 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("기업정보 삭제에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_DELETE_FAIL);
         }
     }
 
src/main/java/com/takensoft/portal/ivstDscsn/web/IvstDscsnController.java
--- src/main/java/com/takensoft/portal/ivstDscsn/web/IvstDscsnController.java
+++ src/main/java/com/takensoft/portal/ivstDscsn/web/IvstDscsnController.java
@@ -1,7 +1,9 @@
 package com.takensoft.portal.ivstDscsn.web;
 
 import com.takensoft.common.excel.service.ExcelService;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import com.takensoft.portal.ivstDscsn.dto.IvstDscsnExcelDTO;
 import com.takensoft.portal.ivstDscsn.service.IvstDscsnService;
 import com.takensoft.portal.ivstDscsn.vo.IvstDscsnVO;
@@ -12,15 +14,17 @@
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
 import java.nio.charset.Charset;
 import java.util.*;
-
 /**
- * @author  : 박정하
- * @since   : 2024.03.26
+ * @author 박정하
+ * @since 2024.03.26
+ * @modification
+ *     since    |    author    | description
+ *  2024.03.26  |    박정하     | 최초 등록
  *
- * 투자상담 관련 컨트롤러
+ * 투자상담 관련 Controller
  */
 @RestController
 @RequiredArgsConstructor
@@ -28,6 +32,7 @@
 public class IvstDscsnController {
     private final IvstDscsnService ivstDscsnService;
     private final ExcelService excelService;
+    private final ResponseUtil resUtil;
 
     /**
      * @author 박정하
@@ -48,18 +53,11 @@
         headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
         ResponseData responseData = new ResponseData();
         if (insertResult > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 투자상담 등록되었습니다.");
-            responseData.setData(result);
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else if(insertResult < 0) {
-            responseData.setStatus(HttpStatus.PAYLOAD_TOO_LARGE);
-            responseData.setMessage("업로드 가능한 파일 용량 제한을 초과했습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.PAYLOAD_TOO_LARGE);
+            return resUtil.errorRes(MessageCode.COMMON_PAYLOAD_TOO_LARGE);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("투자상담 등록에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
         }
     }
 
@@ -77,13 +75,7 @@
         Map<String, Object> result = ivstDscsnService.ivstDscsnList(params);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 투자상담 목록 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -100,13 +92,7 @@
         IvstDscsnVO result = ivstDscsnService.ivstDscsnDetail(ivstDscsnVO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 투자상담 상세 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -127,17 +113,11 @@
         headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
         ResponseData responseData = new ResponseData();
         if (result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 투자상담 수정 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else if(result < 0) {
-            responseData.setStatus(HttpStatus.PAYLOAD_TOO_LARGE);
-            responseData.setMessage("업로드 가능한 파일 용량 제한을 초과했습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.PAYLOAD_TOO_LARGE);
+            return resUtil.errorRes(MessageCode.COMMON_PAYLOAD_TOO_LARGE);
         } else {
-            responseData.setStatus(HttpStatus.BAD_REQUEST);
-            responseData.setMessage("투자상담 수정에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.BAD_REQUEST);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
 
@@ -155,17 +135,10 @@
         int result = ivstDscsnService.ivstDscsnDelete(ivstDscsnVO);
 
         // 응답처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if (result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 투자상담 삭제 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.BAD_REQUEST);
-            responseData.setMessage("투자상담 삭제에 실패했습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.BAD_REQUEST);
+            return resUtil.errorRes(MessageCode.COMMON_DELETE_FAIL);
         }
     }
 
src/main/java/com/takensoft/portal/main/web/GovernmentMainController.java
--- src/main/java/com/takensoft/portal/main/web/GovernmentMainController.java
+++ src/main/java/com/takensoft/portal/main/web/GovernmentMainController.java
@@ -1,6 +1,8 @@
 package com.takensoft.portal.main.web;
 
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import com.takensoft.portal.main.service.GovernmentMainService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.HttpHeaders;
@@ -14,19 +16,21 @@
 
 import java.nio.charset.Charset;
 import java.util.*;
-
 /**
- * @author  : 박정하
- * @since   : 2024.05.29
+ * @author 박정하
+ * @since 2024.05.29
+ * @modification
+ *     since    |    author    | description
+ *  2024.05.29  |    박정하     | 최초 등록
  *
- * 메인 관련 컨트롤러
+ * 메인 관련 Controller
  */
 @RestController
 @RequiredArgsConstructor
 @RequestMapping(value = "/government/main")
 public class GovernmentMainController {
     private final GovernmentMainService governmentMainService;
-
+    private final ResponseUtil resUtil;
     /**
      * @author 박정하
      * @since 2024.05.29
@@ -42,12 +46,6 @@
         Map<String, Object> result = governmentMainService.selectGovernmentMain(params);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 }
(파일 끝에 줄바꿈 문자 없음)
src/main/java/com/takensoft/portal/rvwMttr/web/RvwMttrController.java
--- src/main/java/com/takensoft/portal/rvwMttr/web/RvwMttrController.java
+++ src/main/java/com/takensoft/portal/rvwMttr/web/RvwMttrController.java
@@ -1,7 +1,9 @@
 package com.takensoft.portal.rvwMttr.web;
 
 import com.takensoft.common.excel.service.ExcelService;
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import com.takensoft.portal.rvwMttr.dto.RvwMttrExcelDTO;
 import com.takensoft.portal.rvwMttr.dto.RvwMttrPrgrsExcelDTO;
 import com.takensoft.portal.rvwMttr.service.RvwMttrService;
@@ -14,15 +16,17 @@
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
 import java.nio.charset.Charset;
 import java.util.*;
-
 /**
- * @author  : 박정하
- * @since   : 2024.03.29
+ * @author 박정하
+ * @since 2024.03.29
+ * @modification
+ *     since    |    author    | description
+ *  2024.03.29  |    박정하     | 최초 등록
  *
- * 검토사항 관련 컨트롤러
+ * 검토사항 관련 Controller
  */
 @RestController
 @RequiredArgsConstructor
@@ -30,6 +34,7 @@
 public class RvwMttrController {
     private final RvwMttrService rvwMttrService;
     private final ExcelService excelService;
+    private final ResponseUtil resUtil;
 
     /**
      * @author 박정하
@@ -46,22 +51,12 @@
         int insertResult = (int)result.get("result");
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if(insertResult > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 검토사항 등록 처리되었습니다.");
-            responseData.setData(result);
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else if(insertResult < 0) {
-            responseData.setStatus(HttpStatus.PAYLOAD_TOO_LARGE);
-            responseData.setMessage("업로드 가능한 파일 용량 제한을 초과했습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.PAYLOAD_TOO_LARGE);
+            return resUtil.errorRes(MessageCode.COMMON_PAYLOAD_TOO_LARGE);
         } else {
-            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
-            responseData.setMessage("검토사항 등록에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
+            return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
         }
     }
 
@@ -79,13 +74,7 @@
         Map<String, Object> result = rvwMttrService.rvwMttrSelectList(params);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 검토사항 목록 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -102,13 +91,7 @@
         Map<String, Object> result = rvwMttrService.rvwMttrDetail(rvwMttrVO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 검토사항 상세 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -125,17 +108,10 @@
         int result = rvwMttrService.rvwMttrUpdate(rvwMttrVO, insertFileList);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if (result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 검토사항 수정 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.BAD_REQUEST);
-            responseData.setMessage("검토사항 수정에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.BAD_REQUEST);
+            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
         }
     }
 
@@ -154,17 +130,10 @@
         int result = rvwMttrService.rvwMttrDelete(rvwMttrVO);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
         if (result > 0) {
-            responseData.setStatus(HttpStatus.OK);
-            responseData.setMessage("정상적으로 검토사항 삭제 처리되었습니다.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
         } else {
-            responseData.setStatus(HttpStatus.BAD_REQUEST);
-            responseData.setMessage("검토사항 삭제에 실패하였습니다.\n담당자에게 문의하세요.");
-            return new ResponseEntity<>(responseData, headers, HttpStatus.BAD_REQUEST);
+            return resUtil.errorRes(MessageCode.COMMON_DELETE_FAIL);
         }
     }
 
src/main/java/com/takensoft/portal/statistics/web/StatisticsController.java
--- src/main/java/com/takensoft/portal/statistics/web/StatisticsController.java
+++ src/main/java/com/takensoft/portal/statistics/web/StatisticsController.java
@@ -1,6 +1,8 @@
 package com.takensoft.portal.statistics.web;
 
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import com.takensoft.portal.statistics.service.StatisticsService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.HttpHeaders;
@@ -16,19 +18,21 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-
 /**
- * @author  : 박정하
- * @since   : 2024.06.13
+ * @author 박정하
+ * @since 2024.06.13
+ * @modification
+ *     since    |    author    | description
+ *  2024.06.13  |    박정하     | 최초 등록
  *
- * 통계 관련 컨트롤러
+ * 통계 관련 Controller
  */
 @RestController
 @RequiredArgsConstructor
 @RequestMapping(value = "/government/statistics")
 public class StatisticsController {
     private final StatisticsService statisticsService;
-
+    private final ResponseUtil resUtil;
     /**
      * @author 박정하
      * @since 2024.06.13
@@ -43,13 +47,7 @@
         List<HashMap<String, Object>> result = statisticsService.categoryStatistics(params);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -66,13 +64,7 @@
         Map<String, Object> result = statisticsService.rvwMttrStatistics(params);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 
     /**
@@ -89,12 +81,6 @@
         List<HashMap<String, Object>> result = statisticsService.consultationStatistics(params);
 
         // 응답 처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 }
(파일 끝에 줄바꿈 문자 없음)
src/main/java/com/takensoft/ums/web/UmsController.java
--- src/main/java/com/takensoft/ums/web/UmsController.java
+++ src/main/java/com/takensoft/ums/web/UmsController.java
@@ -1,6 +1,8 @@
 package com.takensoft.ums.web;
 
+import com.takensoft.common.message.MessageCode;
 import com.takensoft.common.util.ResponseData;
+import com.takensoft.common.util.ResponseUtil;
 import com.takensoft.ums.service.UmsService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -15,10 +17,12 @@
 import java.nio.charset.Charset;
 import java.util.HashMap;
 import java.util.Map;
-
 /**
- * @author  : 방선주
- * @since   : 2024.06.25
+ * @author 방선주
+ * @since 2024.06.25
+ * @modification
+ *     since    |    author    | description
+ *  2024.06.25  |    방선주     | 최초 등록
  *
  * UmsController - 문자 메시지 전송을 위한 컨트롤러
  */
@@ -28,6 +32,7 @@
 @RequestMapping(value="/ums")
 public class UmsController {
 
+    private final ResponseUtil resUtil;
     private final UmsService umsService;
 
     // 문자 메시지 테이블 확인
@@ -38,12 +43,6 @@
         Map<String, Object> result = umsService.save();
 
         // 응답처리
-        HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
-        ResponseData responseData = new ResponseData();
-        responseData.setStatus(HttpStatus.OK);
-        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
-        responseData.setData(result);
-        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
+        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
     }
 }
(파일 끝에 줄바꿈 문자 없음)
 
src/main/resources/message/messages_en.yml (added)
+++ src/main/resources/message/messages_en.yml
@@ -0,0 +1,55 @@
+# 공통 에러
+common:
+  success: "Successfully processed."
+  unknown: "An error has occurred."
+  bad_request: "Bad request."
+  null_point: "A null value occurred."
+  illegal_argument: "Invalid argument provided."
+  method_not_allowed: "Unsupported HTTP method."
+  not_found: "No information found."
+  insert_fail: "Registration failed."
+  update_fail: "Edit failed."
+  delete_fail: "Deletion failed."
+  payload_too_large : "File size limit exceeded."
+  duplication_code: "This code already exists."
+  duplication_data: "This data already exists."
+
+
+# 네트워크 관련
+network:
+  unknown_host: "Request to an unknown host."
+
+# SQL 관련
+sql:
+  null_value: "Null value violation in SQL query."
+  duplicate_key: "Duplicate key violation in SQL query."
+  data_integrity: "Data integrity violation in SQL query."
+  unknown: "An unknown SQL error occurred."
+
+# jwt 인증 관련
+jwt:
+  expired: "Login session has expired."
+  signature_invalid: "Invalid token type."
+  insufficient_authentication: "Insufficient authentication information."
+
+# 접근 관련
+access:
+  denied: "Access is denied."
+  unauthorized: "Unauthorized access."
+
+# 사용자 관련
+user:
+  signup:
+    id_taken: "The userid is already in use."
+    email_taken: "The email is already in use."
+    success: "Registration completed successfully."
+  login:
+    user_not_found: "User information does not exist."
+    invalid_credentials: "Incorrect password."
+    authentication_required: "Authentication request was denied."
+    account_locked: "Account is locked."
+    account_disabled: "Account is disabled."
+    account_expired: "Account has expired."
+    credentials_expired: "Password has expired."
+  logout:
+    success: "You have been logged out."(파일 끝에 줄바꿈 문자 없음)
 
src/main/resources/message/messages_ko.yml (added)
+++ src/main/resources/message/messages_ko.yml
@@ -0,0 +1,55 @@
+# 공통
+common:
+  success: "정상 처리되었습니다."
+  unknown: "오류가 발생했습니다."
+  bad_request: "잘못된 요청입니다."
+  null_point: "Null 값이 발생했습니다."
+  illegal_argument: "잘못된 인자가 전달되었습니다."
+  method_not_allowed: "지원하지 않는 HTTP 메서드입니다."
+  not_found: "정보를 찾을 수 없습니다."
+  insert_fail: "등록에 실패했습니다."
+  update_fail: "수정에 실패했습니다."
+  delete_fail: "삭제에 실패했습니다."
+  payload_too_large: "파일 용량 제한을 초과했습니다."
+  duplication_code: "이미 존재하는 코드입니다."
+  duplication_data: "이미 존재하는 정보입니다."
+
+# 네트워크 관련
+network:
+  unknown_host: "알 수 없는 호스트에 대한 요청입니다."
+
+
+# SQL 관련
+sql:
+  null_value: "SQL Query에서 NULL 값이 발생했습니다."
+  duplicate_key: "SQL Query에서 중복 키가 발생했습니다."
+  data_integrity: "SQL Query에서 데이터 무결성을 위반했습니다."
+  unknown: "SQL Query 오류가 발생했습니다."
+
+# jwt 인증 관련
+jwt:
+  expired: "로그인 시간이 만료되었습니다."
+  signature_invalid: "잘못된 토큰 유형입니다."
+  insufficient_authentication: "인증 정보가 부족합니다."
+
+# 접근 관련
+access:
+  denied: "접근 권한이 없습니다."
+  unauthorized: "잘못된 접근입니다."
+
+# 사용자 관련
+user:
+  signup:
+    id_taken: "이미 사용중인 아이디입니다."
+    email_taken: "이미 사용중인 이메일입니다."
+    success: "회원가입이 정상처리 되었습니다."
+  login:
+    user_not_found: "회원정보가 존재하지 않습니다."
+    invalid_credentials: "비밀번호가 일치하지 않습니다."
+    authentication_required: "인증 요구가 거부되었습니다."
+    account_locked: "계정이 잠겼습니다."
+    account_disabled: "계정이 비활성화 되어있습니다."
+    account_expired: "계정 유효기간이 만료되었습니다."
+    credentials_expired: "계정 비밀번호 유효기간이 만료되었습니다."
+  logout:
+    success: "로그아웃 되었습니다."
Add a comment
List