박정하 박정하 05-16
250516 박정하 변경사항 수정
@fdad3b0367d7074592a5ac5dac66cccd04402d00
client/resources/css/common/common.css
--- client/resources/css/common/common.css
+++ client/resources/css/common/common.css
@@ -1,155 +1,276 @@
-*{
-    padding: 0; margin: 0;  color: #000;
-    font-family: "Pretendard-R"; box-sizing: border-box;
+* {
+  padding: 0;
+  margin: 0;
+  color: #000;
+  font-family: "Pretendard-R";
+  box-sizing: border-box;
 }
-html{font-size: 10px;}
 
-a{text-decoration: none; display: block;}
-li{list-style: none;}
-button{border: 0; background: none; cursor: pointer;}
-input{border: 0; flex-shrink: 0; outline: 0;}
-input::placeholder{color: #999999;}
-input[type="checkbox"]{
-    width: 15px;
-    height: 15px;
+html {
+  font-size: 10px;
+}
+
+a {
+  text-decoration: none;
+  display: block;
+}
+
+li {
+  list-style: none;
+}
+
+button {
+  border: 0;
+  background: none;
+  cursor: pointer;
+}
+
+input {
+  border: 0;
+  flex-shrink: 0;
+  outline: 0;
+}
+
+input::placeholder {
+  color: #999999;
+}
+
+input[type="checkbox"] {
+  width: 15px;
+  height: 15px;
 }
 
 
 input[readonly] {
-    background-color: #f6f6f6 !important; 
-    color: #999;
+  background-color: #f6f6f6 !important;
+  color: #999;
 }
-select{background-color: transparent ;}
-select:focus {border: 0; outline: 0;}
-textarea{resize: none;}
+
+select {
+  background-color: transparent;
+}
+
+select:focus {
+  border: 0;
+  outline: 0;
+}
+
+textarea {
+  resize: none;
+}
 
 
-.w130{width: 130px;}
-.w1500{width: 1500px; margin: 0 auto;}
-.wfull{width: -webkit-fill-available;}
+.w130 {
+  width: 130px;
+}
+
+.w1500 {
+  width: 1500px;
+  margin: 0 auto;
+}
+
+.wfull {
+  width: -webkit-fill-available;
+}
 
 
 @media screen and (max-width: 1500px) {
-    .w1500{width: auto; }
+  .w1500 {
+    width: auto;
   }
-.flex{display: flex;}
-.align-center{align-items: center;}
-.flex-end{
-    display: flex;
-    justify-content: end;
-}
-.flex-center{
-    display: flex;
-    justify-content: center;
-}
-.flex-sp-bw{
-    display: flex;
-    justify-content: space-between;
 }
 
-.mt-5{margin-top: 5px;}
-.mt-20{margin-top: 20px;}
-.mt-40{margin-top: 40px;}
-
-.mb-5{margin-bottom: 5px;}
-.mb-10{margin-bottom: 10px;}
-.mb-15{margin-bottom: 15px;}
-.mb-20{margin-bottom: 20px;}
-.mb-25{margin-bottom: 25px;}
-.mb-30{margin-bottom: 30px;}
-.mb-40{margin-bottom: 40px;}
-.mb-50{margin-bottom: 50px;}
-.mb-60{margin-bottom: 60px;}
-.mb-110{margin-bottom: 110px;}
-
-
-.btn-group button{
-    width: 130px;
-    padding: 15px 0px;
-    border-radius: 10px;
-    font-size: 20px;
-   
+.flex {
+  display: flex;
 }
-.btn-group-small .button{
-    padding: 10px 25px;
-    border-radius: 5px;
+
+.align-center {
+  align-items: center;
+}
+
+.flex-end {
+  display: flex;
+  justify-content: end;
+}
+
+.flex-center {
+  display: flex;
+  justify-content: center;
+}
+
+.flex-sp-bw {
+  display: flex;
+  justify-content: space-between;
+}
+
+.mt-5 {
+  margin-top: 5px;
+}
+
+.mt-20 {
+  margin-top: 20px;
+}
+
+.mt-40 {
+  margin-top: 40px;
+}
+
+.mb-5 {
+  margin-bottom: 5px;
+}
+
+.mb-10 {
+  margin-bottom: 10px;
+}
+
+.mb-15 {
+  margin-bottom: 15px;
+}
+
+.mb-20 {
+  margin-bottom: 20px;
+}
+
+.mb-25 {
+  margin-bottom: 25px;
+}
+
+.mb-30 {
+  margin-bottom: 30px;
+}
+
+.mb-40 {
+  margin-bottom: 40px;
+}
+
+.mb-50 {
+  margin-bottom: 50px;
+}
+
+.mb-60 {
+  margin-bottom: 60px;
+}
+
+.mb-110 {
+  margin-bottom: 110px;
+}
+
+
+.btn-group button {
+  width: 130px;
+  padding: 15px 0px;
+  border-radius: 10px;
+  font-size: 20px;
+
+}
+
+.btn-group-small .button {
+  padding: 10px 25px;
+  border-radius: 5px;
+  font-size: 16px;
+  font-family: "Pretendard-M";
+  cursor: pointer;
+
+  p {
     font-size: 16px;
     font-family: "Pretendard-M";
-    cursor: pointer;
-    p{
-        font-size: 16px;
-    font-family: "Pretendard-M";
-    }
+  }
 }
 
-.button, button{
-    &.red-line{
-        border: 1px solid #ce3e48;
-        color: #ce3e48;
+.button,
+button {
+  &.red-line {
+    border: 1px solid #ce3e48;
+    color: #ce3e48;
+  }
+
+  &.blue-line {
+    border: 1px solid #275cbd;
+    color: #275cbd;
+  }
+
+  &.blue-line-bg {
+    border: 1px solid #007ac3;
+    background-color: #eff5f9;
+    color: #0271b3;
+
+    p {
+      color: #0271b3;
     }
-    &.blue-line{
-        border: 1px solid #275cbd;
-        color: #275cbd;
+  }
+
+  &.green-line {
+    border: 1px solid #32b31d;
+    color: #2d9b1b;
+  }
+
+  &.gray-line {
+    border: 1px solid #636364;
+    color: #000;
+  }
+
+  &.gray-bg {
+    background-color: #636364;
+    color: #fff;
+  }
+
+  &.gray-line-bg {
+    border: 1px solid #636364;
+    background-color: #f9f9f9;
+    color: #000;
+  }
+
+  &.pink-line-bg {
+    border: 1px solid #a5067b;
+    background-color: #f7ebf4;
+    color: #a5067b;
+
+    p {
+      color: #a5067b;
     }
-    &.blue-line-bg{
-        border: 1px solid #007ac3;
-        background-color: #eff5f9;
-        color: #0271b3;
-        p{
-            color: #0271b3;
-        }
+  }
+
+  &.gradient {
+    position: relative;
+    background: linear-gradient(132deg, #3e355c, #763954);
+    color: #fff;
+    padding-right: 20px;
+
+    &::after {
+      content: '';
+      background-image: url(../../images/icon/down.png);
+      width: 15px;
+      height: 15px;
+      display: block;
+      position: absolute;
+      right: 17px;
+      top: 20px;
     }
-    &.green-line{
-        border: 1px solid #32b31d;
-        color: #2d9b1b;
-    }
-    &.gray-line{
-        border: 1px solid #636364;
-        color: #000;
-    }
-    &.gray-bg{
-        background-color: #636364;
-        color: #fff;
-    }
-    &.gray-line-bg{
-        border: 1px solid #636364;
-        background-color: #f9f9f9;
-        color: #000;
-    }
-    &.pink-line-bg{
-        border: 1px solid #a5067b;
-        background-color: #f7ebf4;
-        color: #a5067b;
-        p{
-            color: #a5067b;
-        }
-    }
-    &.gradient{
-        position: relative;
-        background: linear-gradient(132deg, #3e355c, #763954);
-        color: #fff;
-        padding-right: 20px;
-        &::after{
-            content: '';
-            background-image: url(../../images/icon/down.png);
-            width: 15px;
-            height: 15px;
-            display: block;
-            position: absolute;
-            right: 17px;
-            top: 20px;
-        }
-    }
+  }
 }
 
-    /* 닫기 버튼 스타일 */
+/* 닫기 버튼 스타일 */
 
-    button.closebtn {
-        font-size: 20px;
-        width: 40px;
-        height: 40px;
-        background-color: #000;
-        color: white;
-        border: none;
-        border-radius: 50px;
-    }
+button.closebtn {
+  font-size: 20px;
+  width: 40px;
+  height: 40px;
+  background-color: #000;
+  color: white;
+  border: none;
+  border-radius: 50px;
+}
+
+
+/* 텍스트 정렬 */
+.txt-left {
+  text-align: left;
+}
+
+.txt-center {
+  text-align: center;
+}
+
+.txt-right {
+  text-align: right;
+}
(파일 끝에 줄바꿈 문자 없음)
client/resources/css/user/sub.css
--- client/resources/css/user/sub.css
+++ client/resources/css/user/sub.css
@@ -1,730 +1,771 @@
 .hr {
-    background-color: #eeeeee;
-    margin: 10px 0;
-    width: 100%;
-    height: 1px;
+  background-color: #eeeeee;
+  margin: 10px 0;
+  width: 100%;
+  height: 1px;
 }
+
 .hr.pink {
-    background-color: rgba(194, 61, 71, 0.1);
-    margin: 10px 0;
-    width: 100%;
-    height: 1px;
+  background-color: rgba(194, 61, 71, 0.1);
+  margin: 10px 0;
+  width: 100%;
+  height: 1px;
 }
+
 @media screen and (max-width: 1500px) {
-    .content{width: auto !important; }
+  .content {
+    width: auto !important;
   }
+}
+
 .content {
-    width: 1500px;
-    margin: 0 auto;
-    padding-bottom: 27rem;
-    padding-top: 56px;
+  width: 1500px;
+  margin: 0 auto;
+  padding-bottom: 27rem;
+  padding-top: 56px;
 
-    h2 {
-        font-family: "HAPPINESS-SANS-title";
-        font-size: 40px;
+  h2 {
+    font-family: "HAPPINESS-SANS-title";
+    font-size: 40px;
+  }
+
+  h3 {
+    font-family: "Pretendard-B";
+    font-size: 25px;
+    position: relative;
+    padding-left: 20px;
+    margin-bottom: 20px;
+
+    &::before {
+      content: '';
+      background: url(../../images/icon/subtitle.png);
+      width: 7px;
+      top: 6px;
+      left: 0;
+      height: 17px;
+      display: block;
+      position: absolute;
+    }
+  }
+
+  .gopage {
+    font-family: "Pretendard-L";
+    font-size: 17px;
+    text-align: right;
+
+  }
+
+  .gopage::after {
+    content: '\2192';
+    font-size: 18px;
+  }
+
+  /* pagination */
+  .pagination {
+    button {
+      width: 40px;
+      height: 40px;
+      margin: 0 4px;
+      border: 1px solid #f0f1f4;
+      background-color: #fff;
+      border-radius: 50px;
     }
 
-    h3 {
-        font-family: "Pretendard-B";
-        font-size: 25px;
-        position: relative;
-        padding-left: 20px;
-        margin-bottom: 20px;
-
-        &::before {
-            content: '';
-            background: url(../../images/icon/subtitle.png);
-            width: 7px;
-            top: 6px;
-            left: 0;
-            height: 17px;
-            display: block;
-            position: absolute;
-        }
+    button.page-number {
+      font-size: 20px;
+      color: #555555;
+      width: 40px;
+      height: 40px;
+      background-color: #f0f1f4;
+      border-radius: 50px;
     }
 
-    .gopage {
-        font-family: "Pretendard-L";
+    button.page-number.clicked {
+      background-color: #ce3e48;
+      color: #fff;
+    }
+
+    .anticon {
+      svg {
         font-size: 17px;
-        text-align: right;
 
+        path {
+          color: #636364;
+        }
+      }
     }
-
-    .gopage::after {
-        content: '\2192';
-        font-size: 18px;
-    }
-
-
-    /* pagination */
-    .pagination {
-        button {
-            width: 40px;
-            height: 40px;
-            margin: 0 4px;
-            border: 1px solid #f0f1f4;
-            background-color: #fff;
-            border-radius: 50px;
-        }
-
-        button.page-number {
-            font-size: 20px;
-            color: #555555;
-            width: 40px;
-            height: 40px;
-            background-color: #f0f1f4;
-            border-radius: 50px;
-        }
-
-        button.page-number.clicked {
-            background-color: #ce3e48;
-            color: #fff;
-        }
-
-        .anticon {
-            svg {
-                font-size: 17px;
-
-                path {
-                    color: #636364;
-                }
-            }
-
-
-        }
-    }
-
-
-
+  }
 }
 
 .sub-title-area {
-    display: flex;
-    justify-content: space-between;
-    align-items: flex-end;
+  display: flex;
+  justify-content: space-between;
+  align-items: flex-end;
 }
 
 .breadcrumb-list {
-    ul {
-        display: flex;
-        align-items: center;
-        gap: 15px;
+  ul {
+    display: flex;
+    align-items: center;
+    gap: 15px;
+  }
+
+  li {
+    font-size: 16px;
+
+    p {
+      font-size: 16px;
+      color: #000;
+      font-family: "Pretendard-L";
+      margin-left: 5px;
     }
 
-    li {
-        font-size: 16px;
-
-        p {
-            font-size: 16px;
-            color: #000;
-            font-family: "Pretendard-L";
-            margin-left: 5px;
-        }
-
-        &:first-child {
-            display: flex;
-            align-items: center;
-        }
-
-        &:last-child {
-            font-family: "Pretendard-SB";
-        }
+    &:first-child {
+      display: flex;
+      align-items: center;
     }
+
+    &:last-child {
+      font-family: "Pretendard-SB";
+    }
+  }
 }
 
 
 .btn-group {
-    gap: 10px;
+  gap: 10px;
 
-    button.cancel {
-        width: 130px;
-        background-color: #f9f9f9;
-        border: 1px solid #636364;
+  button.cancel {
+    width: 130px;
+    background-color: #f9f9f9;
+    border: 1px solid #636364;
+  }
+
+  button.register {
+    width: 130px;
+    background-color: #ce3e48;
+    color: #fff;
+
+    a,
+    span {
+      color: #fff;
     }
-
-    button.register {
-        width: 130px;
-        background-color: #ce3e48;
-        color: #fff;
-
-        a, span {
-            color: #fff;
-        }
-    }
+  }
 }
 
-form, .form {
-    margin: 0 auto;
+form,
+.form {
+  margin: 0 auto;
+  border: 1px solid #dddddd;
+  border-radius: 20px;
+
+  input {
+    padding: 0 15px;
+    height: 50px;
     border: 1px solid #dddddd;
-    border-radius: 20px;
+    border-radius: 5px;
+    font-size: 16px;
+    width: inherit;
+  }
 
-    input {
-        padding: 0 15px;
-        height: 50px;
-        border: 1px solid #dddddd;
-        border-radius: 5px;
-        font-size: 16px;
-        width: inherit;
+  dd {
+    display: flex;
+    align-items: center;
+
+    p {
+      font-size: 20px;
+      font-family: "Pretendard-L";
+      line-height: 30px;
     }
 
-    dd {
-        display: flex;
-        align-items: center;
-
-        p {
-            font-size: 20px;
-            font-family: "Pretendard-L";
-            line-height: 30px;
-        }
-
-        span {
-            font-size: 20px;
-            font-family: "Pretendard-SB";
-        }
+    span {
+      font-size: 20px;
+      font-family: "Pretendard-SB";
     }
+  }
 
-    label {
-        position: relative;
-        width: 200px;
-        font-size: 18px;
-        flex-shrink: 0;
+  label {
+    position: relative;
+    width: 200px;
+    font-size: 18px;
+    flex-shrink: 0;
 
-        &.require::after {
-            position: absolute;
-            top: 5px;
-            padding-left: 3px;
-            content: "*";
-            color: #df2d2d;
-        }
+    &.require::after {
+      position: absolute;
+      top: 5px;
+      padding-left: 3px;
+      content: "*";
+      color: #df2d2d;
     }
-
-
+  }
 }
 
 /* 카테고리 */
 .category {
+  display: flex;
+  gap: 5px;
+
+  .category-item {
     display: flex;
-    gap: 5px;
+    justify-content: space-between;
+    margin-bottom: 10px;
+  }
 
-    .category-item {
-        display: flex;
-        justify-content: space-between;
-        margin-bottom: 10px;
+  li {
+    width: fit-content;
+    border-radius: 3px;
+    padding: 5px 10px;
+    font-family: "Pretendard-SB" !important;
+    font-size: 14px;
+
+    &:nth-child(odd) {
+      color: #a5067b;
+      border: 1px solid #a5067b;
     }
 
-    li {
-        width: fit-content;
-        border-radius: 3px;
-        padding: 5px 10px;
-        font-family: "Pretendard-SB" !important;
-        font-size: 14px;
-
-        &:nth-child(odd) {
-            color: #a5067b;
-            border: 1px solid #a5067b;
-        }
-
-        &:nth-child(even) {
-            color: #007ac3;
-            border: 1px solid #007ac3;
-        }
-
-        button {
-            margin-left: 15px;
-        }
+    &:nth-child(even) {
+      color: #007ac3;
+      border: 1px solid #007ac3;
     }
+
+    button {
+      margin-left: 15px;
+    }
+  }
 }
 
 /* 로그인 */
 .login-form {
-    width: 600px;
-    padding: 50px 60px;
-    dd{display: block;}
+  width: 600px;
+  padding: 50px 60px;
+
+  dd {
+    display: block;
+  }
+
+  label {
+    color: #666;
+    font-size: 16px;
+    display: block;
+    margin-bottom: 6px;
+  }
+
+  button {
+    font-size: 22px;
+    font-family: "Pretendard-B";
+    background: linear-gradient(132deg, #3e355c, #763954);
+    width: 100%;
+    padding: 19px 0;
+    border-radius: 15px;
+    margin-top: 10px;
+
+    img {
+      margin: 0 12px 0 0;
+    }
+
+    span {
+      color: #fff;
+    }
+  }
+
+  input {
+    width: -webkit-fill-available;
+  }
+
+  .check-area {
+    display: flex;
+
+    input {
+      margin-right: 5px;
+    }
+
     label {
-        color: #666;
-        font-size: 16px;
-        display: block;
-        margin-bottom: 6px;
+      width: auto;
     }
-
-    button {
-        font-size: 22px;
-        font-family: "Pretendard-B";
-        background: linear-gradient(132deg, #3e355c, #763954);
-        width: 100%;
-        padding: 19px 0;
-        border-radius: 15px;
-        margin-top: 10px;
-
-        img {
-            margin: 0 12px 0 0;
-        }
-
-        span {
-            color: #fff;
-        }
-    }
-    input{width: -webkit-fill-available;}
-    .check-area {
-        display: flex;
-        input {
-            margin-right: 5px;
-        }
-        label{width: auto;}
-    }
+  }
 }
 
 /* 내정보 */
 .info-form,
 .pwchange-form {
-
-    padding: 30px 50px;
-
+  padding: 30px 50px;
 }
 
 .pwchange-form {
-    input {
-        width: 40%;
-    }
+  input {
+    width: 40%;
+  }
 }
 
 .invalid-feedback.border {
-    display: flex;
-    align-items: center;
-    gap: 4px;
-    background-color: #fbf1f2 !important;
-    border: 1px solid #ce3e48 !important;
-    border-radius: 20px;
-    padding: 8px 24px;
-    margin-left: 20px !important;
+  display: flex;
+  align-items: center;
+  gap: 4px;
+  background-color: #fbf1f2 !important;
+  border: 1px solid #ce3e48 !important;
+  border-radius: 20px;
+  padding: 8px 24px;
+  margin-left: 20px !important;
 
-    span {
-        font-size: 14px !important;
-        color: #e22d2d;
-        font-family: "Pretendard-EL" !important;
-    }
+  span {
+    font-size: 14px !important;
+    color: #e22d2d;
+    font-family: "Pretendard-EL" !important;
+  }
 }
 
 .info-form {
-    dd {
-        img {
-            margin-right: 17px;
-        }
-
-        span {
-            width: 118px;
-        }
-        .ck-content{font-size: 20px;     font-family: "Pretendard-L";}
+  dd {
+    img {
+      margin-right: 17px;
     }
+
+    span {
+      width: 118px;
+    }
+
+    .ck-content {
+      font-size: 20px;
+      font-family: "Pretendard-L";
+    }
+  }
 }
 
 /* 통합검색 */
 .search-form {
-    dl {
-        padding: 35px 75px;
+  dl {
+    padding: 35px 75px;
 
-        dd {
-            display: flex;
-            align-items: center;
+    dd {
+      display: flex;
+      align-items: center;
 
-            p {
-                font-size: 18px;
-                font-family: "Pretendard-SB";
-                width: 180px;
-                flex-shrink: 0;
-            }
+      p {
+        font-size: 18px;
+        font-family: "Pretendard-SB";
+        width: 180px;
+        flex-shrink: 0;
+      }
 
-            input[type="text"] {
-                background-color: #f6f6f6;
-                border: 0;
-            }
-        }
-        dd.category-dd{
-            ul{
-                flex-wrap: wrap;
-            max-height: 80px;
-            width: 100%;
-            overflow-y: auto;
-            overflow-x: hidden;
-            }
-
-        }
-        .mark {
-            width: fit-content;
-            margin: 0 11px;
-        }
-
+      input[type="text"] {
+        background-color: #f6f6f6;
+        border: 0;
+      }
     }
 
-    background-image: linear-gradient(#fff, #fff),
-    linear-gradient(-45deg, #ca3e49, #3f355c);
-    background-origin: border-box;
-    background-clip: content-box,
-    border-box;
-    border: 3px solid transparent;
-    border-radius: 32px;
+    dd.category-dd {
+      ul {
+        flex-wrap: wrap;
+        max-height: 80px;
+        width: 100%;
+        overflow-y: auto;
+        overflow-x: hidden;
+      }
+    }
 
+    .mark {
+      width: fit-content;
+      margin: 0 11px;
+    }
+  }
 
-    .btn-group {
-        display: flex;
-        justify-content: center;
+  background-image: linear-gradient(#fff, #fff),
+  linear-gradient(-45deg, #ca3e49, #3f355c);
+  background-origin: border-box;
+  background-clip: content-box,
+  border-box;
+  border: 3px solid transparent;
+  border-radius: 32px;
 
-        button {
-            display: flex;
-            align-items: center;
-            justify-content: center;
-            gap: 10px;
-            width: 140px;
-            font-family: "Pretendard-B";
-            font-size: 16px;
-            border-radius: 30px;
+  .btn-group {
+    display: flex;
+    justify-content: center;
 
-            &.reset {
-                border: 1px solid #ccc;
-            }
+    button {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      gap: 10px;
+      width: 140px;
+      font-family: "Pretendard-B";
+      font-size: 16px;
+      border-radius: 30px;
 
-            &.search {
-                background: linear-gradient(132deg, #3e355c, #763954);
+      &.reset {
+        border: 1px solid #ccc;
+      }
 
-                p {
-                    color: #fff;
-                }
-            }
+      &.search {
+        background: linear-gradient(132deg, #3e355c, #763954);
+
+        p {
+          color: #fff;
         }
+      }
     }
+  }
 
-    ul {
-        display: flex;
-        gap: 15px;
+  ul {
+    display: flex;
+    gap: 15px;
+  }
+
+  li {
+    display: flex;
+    align-items: center;
+    width: 175px;
+    gap: 12px;
+
+    label {
+      cursor: pointer;
     }
-
-    li {
-        display: flex;
-        align-items: center;
-        width: 175px;
-        gap: 12px;
-        label{cursor: pointer;}
-    }
-
-
-
-
+  }
 }
 
 .select-box {
-    width: 106px;
-    height: 30px;
-    border: 1px solid #cccccc;
-    border-radius: 5px;
-    flex-shrink: 0;
-    line-height: 30px;
-    margin-left: 30px;
+  width: 106px;
+  height: 30px;
+  border: 1px solid #cccccc;
+  border-radius: 5px;
+  flex-shrink: 0;
+  line-height: 30px;
+  margin-left: 30px;
 
-    select {
-        background: url(../../images/icon/select.png) calc(100% - 5px) center no-repeat;
-        width: 100%;
-        padding: 5px 30px 5px 10px;
-        border: 0;
-        font-size: 14px;
-        -o-appearance: none;
-  -webkit-appearance: none;
-  -moz-appearance: none;
-  appearance: none;
-  outline: 0 none;
-    }
-    select::-ms-expand { 
-        display: none;
-        
-    }
-    select option {
-        padding: 3px 0;
-      }
-    
+  select {
+    background: url(../../images/icon/select.png) calc(100% - 5px) center no-repeat;
+    width: 100%;
+    padding: 5px 30px 5px 10px;
+    border: 0;
+    font-size: 14px;
+    -o-appearance: none;
+    -webkit-appearance: none;
+    -moz-appearance: none;
+    appearance: none;
+    outline: 0 none;
+  }
+
+  select::-ms-expand {
+    display: none;
+
+  }
+
+  select option {
+    padding: 3px 0;
+  }
+
 }
 
 .search-result {
-    margin-top: 40px;
+  .float-div {
+    position: absolute;
+    top: 1rem;
+    left: 1rem;
+    z-index: 5;
+    padding: 5px 10px;
+    border-width: 1px;
+    border-style: solid;
+    border-radius: 3px;
+    background-color: #FFFFFF;
+  }
 
+  .float-txt {
+    color: inherit;
+    font-size: 14px;
+    font-family: "Pretendard-SB" !important;
+  }
 
+  .result-list-wrap:nth-child(odd) .float-div {
+    color: #a5067b;
+    border: 1px solid #a5067b;
+  }
 
-    .resultext {
-        .main-img {
-            width: 320px;
-            height: 220px;
-            border-radius: 24px;
-        }
-
-        display: flex;
-        align-items: center;
-
-        p {
-            width: max-content;
-            font-family: "Pretendard-L";
-            font-size: 17px;
-
-            b {
-                color: #ce3e48;
-            }
-        }
-
-        img {
-            object-fit: contain;
-        }
-    }
-
-    .result-box {
-        display: flex;
-        justify-content: space-between;
-        border: 1px solid #ddd;
-        border-radius: 24px;
-        padding: 30px;
-        margin-bottom: 30px;
-        cursor: pointer;
-        .main-img{
-            width: 320px;
-            height: 220px;
-            border-radius: 24px;
-            flex-shrink: 0;
-            img{
-                width: 100%;
-                height: 100%;
-                border-radius: 24px;
-                object-fit: contain;
-            }
-        }
-    }
-
-    .text-box {
-        cursor: pointer;
-        p,
-        li {
-            font-family: "Pretendard-L";
-
-        }
-
-        .text {
-            width: 1048px;
-            font-size: 16px;
-            color: #555555;
-            overflow: hidden;
-            /* Hide any overflow */
-            text-overflow: ellipsis;
-            /* Add an ellipsis at the end */
-            display: -webkit-box;
-            -webkit-line-clamp: 2;
-            /* Limit to 2 lines */
-            -webkit-box-orient: vertical;
-            margin-bottom: 20px;
-        }
-
-        h5 {
-            font-family: "Pretendard-B";
-            font-size: 25px;
-            margin-bottom: 20px;
-
-        }
-
-        .address {
-            font-size: 20px;
-            margin-bottom: 18px;
-        }
-
-        .date {
-            ul {
-                display: flex;
-                gap: 20px;
-            }
-
-            li {
-                font-size: 17px;
-
-                b {
-                    margin-left: 5px;
-                }
-            }
-        }
-    }
-
-    .tabs {
-        .tab-box {
-            display: flex;
-            justify-content: end;
-            gap: 25px;
-        }
-
-        .tab-title {
-            display: flex;
-            align-items: center;
-            gap: 13px;
-
-            p {
-                cursor: pointer;
-                font-family: "HAPPINESS-SANS-REGULAR";
-                color: #cccccc;
-                font-size: 17px;
-
-                b {
-                    color: #cccccc;
-                }
-            }
-
-        }
-
-        .tab-title.active p {
-            color: #000;
-
-            b {
-                color: #ff4141;
-
-            }
-
-        }
-
-        .tab-content {
-            .content-wrap {
-                margin-top: -23px;
-            }
-
-            .box-wrap {
-                width: 454px;
-                height: 370px;
-
-                .box {
-                    background-image: linear-gradient(#fff, #fff),
-                        linear-gradient(-45deg, #fff, #fff);
-                    background-origin: border-box;
-                    background-clip: content-box, border-box;
-                    border: 3px solid transparent;
-                    border-radius: 32px;
-                }
-
-                .box:hover {
-                    background-image: linear-gradient(#fff, #fff),
-                        linear-gradient(-45deg, #ca3e49, #3d355d);
-                }
-
-                .tab-image {
-                    width: 100%;
-                    height: 297px;
-                    object-fit: cover;
-                    border-radius: 30px;
-                }
-
-            }
-
-        }
-
-    }
-
-    .list-wrap {
-        border-top: 2px solid #000;
-
-        &>li {
-            border-bottom: 2px solid #eeeeee;
-            padding: 30px 10px;
-        }
-    }
-    .no-results{
-        text-align: center;
-        padding: 60px 0;
-        border-bottom: 1px solid #ddd;
-        border-top: 1px solid #ddd;
-
-    }
-    .no-results p:first-of-type {
-        font-size: 32px;
-        font-family: "Pretendard-B";
-        margin-top: 45px;
-    }
-
-    .no-results p:last-of-type {
-        font-size: 18px;
-        line-height: 30px;
-        font-family: "Pretendard-L";
-        margin-top: 30px;
-    }
+  .result-list-wrap:nth-child(even) .float-div {
+    color: #007ac3;
+    border: 1px solid #007ac3;
+  }
 }
 
+.search-result {
+  margin-top: 40px;
 
+  .resultext {
+    .main-img {
+      width: 320px;
+      height: 220px;
+      border-radius: 24px;
+    }
+
+    display: flex;
+    align-items: center;
+
+    p {
+      width: max-content;
+      font-family: "Pretendard-L";
+      font-size: 17px;
+
+      b {
+        color: #ce3e48;
+      }
+    }
+
+    img {
+      object-fit: cover;
+    }
+  }
+
+  .result-box {
+    display: flex;
+    justify-content: space-between;
+    border: 1px solid #ddd;
+    border-radius: 24px;
+    padding: 30px;
+    margin-bottom: 30px;
+    cursor: pointer;
+
+    .main-img {
+      position: relative;
+      width: 320px;
+      height: 220px;
+      border-radius: 24px;
+      flex-shrink: 0;
+
+      img {
+        width: 100%;
+        height: 100%;
+        border-radius: 24px;
+        object-fit: cover;
+      }
+    }
+  }
+
+  .text-box {
+    cursor: pointer;
+
+    p,
+    li {
+      font-family: "Pretendard-L";
+
+    }
+
+    .text {
+      width: 1048px;
+      font-size: 16px;
+      color: #555555;
+      overflow: hidden;
+      /* Hide any overflow */
+      text-overflow: ellipsis;
+      /* Add an ellipsis at the end */
+      display: -webkit-box;
+      -webkit-line-clamp: 2;
+      /* Limit to 2 lines */
+      -webkit-box-orient: vertical;
+      margin-bottom: 20px;
+    }
+
+    h5 {
+      font-family: "Pretendard-B";
+      font-size: 25px;
+      margin-bottom: 20px;
+
+    }
+
+    .address {
+      font-size: 20px;
+      margin-bottom: 18px;
+    }
+
+    .date {
+      ul {
+        display: flex;
+        gap: 20px;
+      }
+
+      li {
+        font-size: 17px;
+
+        b {
+          margin-left: 5px;
+        }
+      }
+    }
+  }
+
+  .tabs {
+    .tab-box {
+      display: flex;
+      justify-content: end;
+      gap: 25px;
+    }
+
+    .tab-title {
+      display: flex;
+      align-items: center;
+      gap: 13px;
+
+      p {
+        cursor: pointer;
+        font-family: "HAPPINESS-SANS-REGULAR";
+        color: #cccccc;
+        font-size: 17px;
+
+        b {
+          color: #cccccc;
+        }
+      }
+
+    }
+
+    .tab-title.active p {
+      color: #000;
+
+      b {
+        color: #ff4141;
+      }
+    }
+
+    .tab-content {
+      .content-wrap {
+        margin-top: -23px;
+      }
+
+      .box-wrap {
+        width: 454px;
+        height: 370px;
+
+        .box {
+          background-image: linear-gradient(#fff, #fff),
+            linear-gradient(-45deg, #fff, #fff);
+          background-origin: border-box;
+          background-clip: content-box, border-box;
+          border: 3px solid transparent;
+          border-radius: 32px;
+        }
+
+        .box:hover {
+          background-image: linear-gradient(#fff, #fff),
+            linear-gradient(-45deg, #ca3e49, #3d355d);
+        }
+
+        .tab-image {
+          width: 100%;
+          height: 297px;
+          object-fit: cover;
+          border-radius: 30px;
+        }
+      }
+    }
+  }
+
+  .list-wrap {
+    border-top: 2px solid #000;
+
+    &>li {
+      border-bottom: 2px solid #eeeeee;
+      padding: 30px 10px;
+    }
+  }
+
+  .no-results {
+    text-align: center;
+    padding: 60px 0;
+    border-bottom: 1px solid #ddd;
+    border-top: 1px solid #ddd;
+
+  }
+
+  .no-results p:first-of-type {
+    font-size: 32px;
+    font-family: "Pretendard-B";
+    margin-top: 45px;
+  }
+
+  .no-results p:last-of-type {
+    font-size: 18px;
+    line-height: 30px;
+    font-family: "Pretendard-L";
+    margin-top: 30px;
+  }
+}
 
 /*사진 기록물 등록페이지 */
 .insert-form {
-    padding: 10px 0;
-    border-top: 2px solid #000;
-    border-left: 0;
-    border-right: 0;
-    border-bottom: 1px solid #eee;
-    border-radius: 0;
+  padding: 10px 0;
+  border-top: 2px solid #000;
+  border-left: 0;
+  border-right: 0;
+  border-bottom: 1px solid #eee;
+  border-radius: 0;
 
-    dl {
-        dd {
-            padding: 0 24px;
+  dl {
+    dd {
+      padding: 0 24px;
 
-            li {
-                p {
-                    font-family: "Pretendard-L";
-                    font-size: 16px;
-                }
-            }
+      li {
+        p {
+          font-family: "Pretendard-L";
+          font-size: 16px;
         }
-
-        textarea {
-            min-height: 425px;
-            width: 100%;
-            padding: 15px;
-        }
-        textarea:focus {
-            outline: none;
-            box-shadow: none;
-          }
-        .category-add {
-            width: 72px;
-            height: 29px;
-            color: #fff;
-            background-color: #000;
-            border-radius: 15px;
-            margin-left: 10px;
-        }
+      }
     }
 
-    .invalid-feedback {
-        display: flex;
-        border: 0;
-        background-color: transparent;
-        margin-left: 10px;
-        span{
-            color: #e22d2d;
-            font-size: 14px;
-            font-family: "Pretendard-EL";
-        }
-
+    textarea {
+      min-height: 425px;
+      width: 100%;
+      padding: 15px;
     }
 
+    textarea:focus {
+      outline: none;
+      box-shadow: none;
+    }
+
+    .category-add {
+      width: 72px;
+      height: 29px;
+      color: #fff;
+      background-color: #000;
+      border-radius: 15px;
+      margin-left: 10px;
+    }
+  }
+
+  .invalid-feedback {
+    display: flex;
+    border: 0;
+    background-color: transparent;
+    margin-left: 10px;
+
+    span {
+      color: #e22d2d;
+      font-size: 14px;
+      font-family: "Pretendard-EL";
+    }
+  }
 }
 
 .file-input {
-    display: none;
+  display: none;
 }
 
 /* Style the custom label (the clickable button) */
 .file-label {
-    display: inline-block;
-    padding: 25px 0px;
-    width: 100% !important;
-    background-color: #f6f6f6;
-    border: 2px dashed #dadada;
-    color: white;
-    font-size: 16px;
-    border-radius: 10px;
-    cursor: pointer;
-    text-align: center;
-    transition: background-color 0.3s ease;
+  display: inline-block;
+  padding: 25px 0px;
+  width: 100% !important;
+  background-color: #f6f6f6;
+  border: 2px dashed #dadada;
+  color: white;
+  font-size: 16px;
+  border-radius: 10px;
+  cursor: pointer;
+  text-align: center;
+  transition: background-color 0.3s ease;
 
 }
 
 .file-label>div p {
-    font-family: "Pretendard-B" !important;
-    font-size: 20px !important;
+  font-family: "Pretendard-B" !important;
+  font-size: 20px !important;
 }
 
 /* Style the label on hover */
@@ -732,546 +773,561 @@
 
 /* Style for the file names display */
 .file-names {
-    display: block;
-    /* Make each file name appear on a new line */
-    font-size: 16px;
-    color: #333;
+  display: block;
+  /* Make each file name appear on a new line */
+  font-size: 16px;
+  color: #333;
 
-    &> div, span {
-        color: #dadada;
+  &>div,
+  span {
+    color: #dadada;
+  }
+
+  .file-wrap {
+    border: 1px solid #dadada;
+    border-radius: 10px;
+    padding: 12px;
+
+    .file-name {
+      display: flex;
+      align-items: center;
+
+      img {
+        margin-right: 10px;
+      }
+
     }
-
-    .file-wrap {
-        border: 1px solid #dadada;
-        border-radius: 10px;
-        padding: 12px;
-
-        .file-name {
-            display: flex;
-            align-items: center;
-
-            img {
-                margin-right: 10px;
-            }
-
-        }
-    }
+  }
 }
 
 
 /* 모달 */
 .modal-overlay {
-    position: fixed;
-    top: 0;
-    left: 0;
-    width: 100%;
-    height: 100%;
-    background-color: rgba(0, 0, 0, 0.5);
-    /* 배경 어두운 투명도 */
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    z-index: 9999;
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background-color: rgba(0, 0, 0, 0.5);
+  /* 배경 어두운 투명도 */
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  z-index: 9999;
 }
 
 .modal-content {
-    background-color: #fff;
-    padding: 50px 35px;
-    border-radius: 8px;
-    max-width: 1000px;
-    width: 100%;
-    text-align: center;
+  background-color: #fff;
+  padding: 50px 35px;
+  border-radius: 8px;
+  max-width: 1000px;
+  width: 100%;
+  text-align: center;
 
-    h2 {
-        font-family: "Pretendard-B";
-        font-size: 30px;
+  h2 {
+    font-family: "Pretendard-B";
+    font-size: 30px;
+  }
+
+  /* pagination */
+  .pagination {
+    button {
+      width: 40px;
+      height: 40px;
+      margin: 0 4px;
+      border: 1px solid #f0f1f4;
+      background-color: #fff;
+      border-radius: 50px;
     }
 
-    /* pagination */
-    .pagination {
-        button {
-            width: 40px;
-            height: 40px;
-            margin: 0 4px;
-            border: 1px solid #f0f1f4;
-            background-color: #fff;
-            border-radius: 50px;
-        }
-
-        button.page-number {
-            font-size: 20px;
-            color: #555555;
-            width: 40px;
-            height: 40px;
-            background-color: #f0f1f4;
-            border-radius: 50px;
-        }
-
-        button.page-number.clicked {
-            background-color: #ce3e48;
-            color: #fff;
-        }
-
-        .anticon {
-            svg {
-                font-size: 17px;
-
-                path {
-                    color: #636364;
-                }
-            }
-
-
-        }
+    button.page-number {
+      font-size: 20px;
+      color: #555555;
+      width: 40px;
+      height: 40px;
+      background-color: #f0f1f4;
+      border-radius: 50px;
     }
 
-    .modal-search {
-        padding: 13px;
-        background-color: rgba(0, 61, 97, 0.05);
-        border-radius: 10px;
-
-        input {
-            padding: 0px 20px;
-            background-color: #fff;
-            border-radius: 5px;
-            width: 300px;
-            height: 45px;
-            font-size: 16px;
-            margin-right: 5px;
-        }
-
-        .search-btn {
-            display: flex;
-            align-items: center;
-            justify-content: center;
-            width: 80px;
-            height: 45px;
-            gap: 5px;
-            border-radius: 5px;
-            background-color: #000;
-            p {
-                font-size: 16px;
-                color: #fff;
-                font-family: "Pretendard-SB";
-            }
-        }
+    button.page-number.clicked {
+      background-color: #ce3e48;
+      color: #fff;
     }
 
+    .anticon {
+      svg {
+        font-size: 17px;
 
+        path {
+          color: #636364;
+        }
+      }
+    }
+  }
 
-    .register-b {
-        width: 110px;
-        height: 40px;
-        font-size: 18px;
-        background-color: #000;
+  .modal-search {
+    padding: 13px;
+    background-color: rgba(0, 61, 97, 0.05);
+    border-radius: 10px;
+
+    input {
+      padding: 0px 20px;
+      background-color: #fff;
+      border-radius: 5px;
+      width: 300px;
+      height: 45px;
+      font-size: 16px;
+      margin-right: 5px;
+    }
+
+    .search-btn {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      width: 80px;
+      height: 45px;
+      gap: 5px;
+      border-radius: 5px;
+      background-color: #000;
+
+      p {
+        font-size: 16px;
         color: #fff;
-        font-family: "Pretendard-M";
-        border-radius: 50px;
+        font-family: "Pretendard-SB";
+      }
     }
+  }
 
+  .register-b {
+    width: 110px;
+    height: 40px;
+    font-size: 18px;
+    background-color: #000;
+    color: #fff;
+    font-family: "Pretendard-M";
+    border-radius: 50px;
+  }
 }
-
 
 /* 사진기록물 상세페이지 */
 .gallery-form {
-    border: 0;
+  border: 0;
 
-    dl {
-        padding: 30px 0 0 0;
-        border-top: 2px solid #000;
+  dl {
+    padding: 30px 0 0 0;
+    border-top: 2px solid #000;
+
+    dd {
+      position: relative;
+      background: #f6f6f6;
+      padding: 25px 0px;
+
+      p {
+        flex: 1;
+        font-size: 35px;
+        text-align: center;
+        font-family: "Pretendard-B"
+      }
+
+      .date {
+        position: absolute;
+        right: 30px;
+
+        span {
+          font-family: "Pretendard-R";
+          font-size: 18px;
+        }
+
+        img {
+          object-fit: contain;
+          margin-right: 10px;
+        }
+      }
+    }
+  }
+
+  .gallery {
+    margin-bottom: 107px;
+    position: relative;
+
+    &.video {
+      margin-bottom: 50px;
+
+      img {
+        height: 800px;
+        border-radius: 20px;
+      }
+
+      .video-container {
+        position: relative;
+        width: 100%;
+        padding-top: 56.25%;
+        /* 16:9 비율 */
+        overflow: hidden;
+      }
+
+      .video-container iframe {
+        position: absolute;
+        top: 0;
+        left: 0;
+        width: 100%;
+        height: 100%;
+      }
+    }
+
+    .main-swiper {
+      .swiper {
+        width: 100%;
+
+        .swiper-slide {
+          img {
+            width: 100%;
+            aspect-ratio: 15 / 8;
+            object-fit: contain;
+            background-color: #ddd;
+            display: block;
+          }
+        }
+
+      }
+    }
+
+    .thumbnail {
+      /* width: 1127px; */
+      padding: 30px 95px;
+      background-color: #fff;
+      border-radius: 90px;
+      position: absolute;
+      z-index: 1;
+      left: 50%;
+      transform: translateX(-50%);
+      bottom: -10%;
+      box-shadow: 1px 2px 19px 1px rgba(0, 0, 0, 0.04);
+
+      .swiper {
+        width: 940px;
+        position: initial;
+        height: 120px;
+        margin: 0 auto;
+
+        .swiper-slide {
+          background-image: linear-gradient(#fff, #fff),
+            linear-gradient(-45deg, #fff, #fff);
+          background-origin: border-box;
+          background-clip: content-box, border-box;
+          border: 3px solid transparent;
+        }
+
+        .swiper-slide:hover,
+        .active-thumb {
+          background-image: linear-gradient(#fff, #fff),
+            linear-gradient(-45deg, #ca3e49, #3d355d);
+        }
+
+        .swiper-wrapper {
+          margin: 0;
+        }
+
+        .swiper-slide img {
+          width: -webkit-fill-available;
+          cursor: pointer;
+          object-fit: contain;
+        }
+
+        input {
+          position: absolute;
+          right: 6px;
+          top: 6px;
+          z-index: 5;
+        }
+      }
+    }
+
+    .swiper-button-prev,
+    .swiper-button-next {
+      box-shadow: none;
+      margin-top: -35px;
+    }
+
+    .swiper-button-prev {
+      left: 20px;
+    }
+
+    .swiper-button-next {
+      right: 20px;
+    }
+  }
+
+  .img-box {
+    margin-right: 50px;
+    width: 600px;
+    height: 360px;
+
+    img {
+      width: 100%;
+      height: 100%;
+      object-fit: contain;
+    }
+  }
+
+  .info-form {
+    background-image: linear-gradient(#fff, #fff), linear-gradient(-45deg, #ca3e49, #3f355c);
+    background-origin: border-box;
+    background-clip: content-box, border-box;
+    border: 3px solid transparent;
+    border-radius: 32px;
+    padding: 0;
+    height: 360px;
+
+    .info-box {
+      padding: 50px 40px;
+
+      dl {
+        border: 0;
+        padding: 37px;
+        border-radius: 20px;
+        background-color: #f5f6f8;
 
         dd {
-            position: relative;
-            background: #f6f6f6;
-            padding: 25px 0px;
+          background-color: transparent;
+          padding: 0;
 
-            p {
-                flex: 1;
-                font-size: 35px;
-                text-align: center;
-                font-family: "Pretendard-B"
-            }
-
-            .date {
-                position: absolute;
-                right: 30px;
-
-                span {
-                    font-family: "Pretendard-R";
-                    font-size: 18px;
-                }
-
-                img {
-
-                    object-fit: contain;
-                    margin-right: 10px;
-                }
-
-            }
-
-
-        }
-
-    }
-
-    .gallery {
-        margin-bottom: 107px;
-        position: relative;
-
-        &.video {
-            margin-bottom: 50px;
-
-            img {
-                height: 800px;
-                border-radius: 20px;
-            }
-            .video-container {
-                position: relative;
-                width: 100%;
-                padding-top: 56.25%; /* 16:9 비율 */
-                overflow: hidden;
-              }
-              
-              .video-container iframe {
-                position: absolute;
-                top: 0;
-                left: 0;
-                width: 100%;
-                height: 100%;
-              }
-        }
-
-        .main-swiper {
-            .swiper {
-                width: 100%;
-
-                .swiper-slide {
-                    img {
-                        width: 100%;
-                        aspect-ratio: 15 / 8;
-                        object-fit: contain;
-                        background-color: #ddd;
-                        display: block;
-                    }
-                }
-
-            }
-        }
-
-        .thumbnail {
-            /* width: 1127px; */
-            padding: 30px 95px;
-            background-color: #fff;
-            border-radius: 90px;
-            position: absolute;
-            z-index: 1;
-            left: 50%;
-            transform: translateX(-50%);
-            bottom: -10%;
-            box-shadow: 1px 2px 19px 1px rgba(0, 0, 0, 0.04);
-
-            .swiper {
-                width: 940px;
-                position: initial;
-                height: 120px;
-                margin: 0 auto;
-                .swiper-slide{
-                    background-image: linear-gradient(#fff, #fff),
-                    linear-gradient(-45deg, #fff, #fff);
-                    background-origin: border-box;
-                    background-clip: content-box, border-box;
-                    border: 3px solid transparent;
-                }
-                .swiper-slide:hover,
-                .active-thumb {
-                    background-image: linear-gradient(#fff, #fff),
-                    linear-gradient(-45deg, #ca3e49, #3d355d);
-                }
-                .swiper-wrapper {
-                    margin: 0;
-                }
-
-                .swiper-slide img {
-                    width: -webkit-fill-available;
-                    cursor: pointer;
-                    object-fit: contain;
-
-                }
-
-                input{position: absolute; right: 6px; top: 6px; z-index: 5;}
-            }
-        }
-
-        .swiper-button-prev,
-        .swiper-button-next {
-            box-shadow: none;
-            margin-top: -35px;
-        }
-
-        .swiper-button-prev {
-            left: 20px;
-        }
-
-        .swiper-button-next {
-            right: 20px;
-        }
-
-
-    }
-
-    .img-box {
-        margin-right: 50px;
-        width: 600px;
-        height: 360px;
-        img{
-            width: 100%;
-            height: 100%;
-            object-fit: contain;
-        }
-    }
-
-    .info-form {
-        background-image: linear-gradient(#fff, #fff), linear-gradient(-45deg, #ca3e49, #3f355c);
-        background-origin: border-box;
-        background-clip: content-box, border-box;
-        border: 3px solid transparent;
-        border-radius: 32px;
-        padding: 0;
-        height: 360px;
-
-        .info-box {
-            padding: 50px 40px;
-
-            dl {
-                border: 0;
-                padding: 37px;
-                border-radius: 20px;
-                background-color: #f5f6f8;
-
-                dd {
-                    background-color: transparent;
-                    padding: 0;
-
-                    p {
-                        font-size: 20px;
-                        text-align: left;
-                        font-family: "Pretendard-L";
-                    }
-                }
-            }
-        }
-
-    }
-
-
-    .btn-group {
-        margin-top: 24px;
-        text-align: center;
-
-        button {
-            width: 160px;
-            height: 45px;
-            font-family: "Pretendard-B";
-            font-size: 16px;
-            padding: 13px 21px;
+          p {
+            font-size: 20px;
             text-align: left;
-            margin: 0 5px;
+            font-family: "Pretendard-L";
+          }
         }
+      }
+    }
+  }
 
-        .select-down {
-            background-image: url(../../images/downbtn_border.png);
-        }
+  .btn-group {
+    margin-top: 24px;
+    text-align: center;
 
-        .all-down {
-            background-image: url(../../images/downbtn_bg.png);
-            color: #fff;
-        }
+    button {
+      width: 160px;
+      height: 45px;
+      font-family: "Pretendard-B";
+      font-size: 16px;
+      padding: 13px 21px;
+      text-align: left;
+      margin: 0 5px;
     }
 
+    .select-down {
+      background-image: url(../../images/downbtn_border.png);
+    }
 
+    .all-down {
+      background-image: url(../../images/downbtn_bg.png);
+      color: #fff;
+    }
+  }
 }
+
 .loading-overlay {
-    position: fixed;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    background-color: rgba(0, 0, 0, 0.5);
-    display: flex;
-    flex-direction: column;
-    justify-content: center;
-    align-items: center;
-    z-index: 9999;
-    p{color: #fff;}
-    p:first-of-type {
-        font-size: 30px;
-        font-family: "Pretendard-B";
-        margin-top: 28px;
-    }
-    p:last-of-type {
-        font-size: 22px;
-        font-family: "Pretendard-M";
-        margin-top: 18px;
-    }
+  position: fixed;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background-color: rgba(0, 0, 0, 0.5);
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  z-index: 9999;
+
+  p {
+    color: #fff;
   }
-  .loading-spinner {
-    background: url(../../images/loading.png);
-   width: 178px;
-   height: 178px;
+
+  p:first-of-type {
+    font-size: 30px;
+    font-family: "Pretendard-B";
+    margin-top: 28px;
   }
-  @keyframes spin {
-    0% {
-      transform: rotate(0deg);
-    }
-    100% {
-      transform: rotate(360deg);
-    }
+
+  p:last-of-type {
+    font-size: 22px;
+    font-family: "Pretendard-M";
+    margin-top: 18px;
   }
+}
+
+.loading-spinner {
+  background: url(../../images/loading.png);
+  width: 178px;
+  height: 178px;
+}
+
+@keyframes spin {
+  0% {
+    transform: rotate(0deg);
+  }
+
+  100% {
+    transform: rotate(360deg);
+  }
+}
 
 /* 회원관리,  카테고리 관리 */
 .management {
-    .left-con {
-        width: 350px;
-        margin-right: 55px;
-    }
+  .left-con {
+    width: 350px;
+    margin-right: 55px;
+  }
 
-    .search-area {
-        gap: 5px;
-        padding: 0;
-        height: 40px;
-    }
+  .search-area {
+    gap: 5px;
+    padding: 0;
+    height: 40px;
+  }
 
-    .search-wrap {
+  .search-wrap {
 
-        position: initial;
-        transform: none;
+    position: initial;
+    transform: none;
 
-        input {
-            width: 100%;
-            height: 100%;
-            border: 1px solid #000;
-            border-radius: 5px;
-        }
-
-        .select-box {
-            border-color: #000;
-            width: 100px;
-            height: 100%;
-
-            select {
-                width: 100%;
-                color: #000;
-            }
-        }
-
-        .search-btn {
-            position: relative;
-            flex-shrink: 0;
-            width: 40px;
-            height: 40px;
-            background-color: #000;
-            border-radius: 5px;
-
-            img {
-                position: absolute;
-                left: 50%;
-                right: 50%;
-                transform: translateX(-50%) translateY(-50%);
-            }
-
-        }
-    }
-
-    .btn-group-small {
-        gap: 5px;
-
-        .button {
-            &.flex {
-                img {
-                    text-align: left;
-                    margin-right: 10px;
-                }
-
-                p {
-                    text-align: center;
-                }
-            }
-        }
+    input {
+      width: 100%;
+      height: 100%;
+      border: 1px solid #000;
+      border-radius: 5px;
     }
 
     .select-box {
-        width: 230px;
-        height: 50px;
-        border: 1px solid #ddd;
-        padding: 0 15px;
-        margin: 0;
+      border-color: #000;
+      width: 100px;
+      height: 100%;
 
-        select {
-            width: 100%;
-            height: 100%;
-            font-size: 16px;
-            /* color: #999999; */
-        }
+      select {
+        width: 100%;
+        color: #000;
+      }
     }
 
-    .switch {
-        label {
-            margin-top: -12px;
-        }
-    }
+    .search-btn {
+      position: relative;
+      flex-shrink: 0;
+      width: 40px;
+      height: 40px;
+      background-color: #000;
+      border-radius: 5px;
 
-    table {
-        .selected {
-            background-color: rgba(194, 61, 74, 0.2);
-        }
-        border-radius: 10px;
-        overflow: hidden;
-
-        thead {
-            display: table;
-            width: 100%;
-            background-color: #636364;
-
-            th {
-                color: #fff;
-                border: 1px solid #eee;
-            }
-        }
-
-        td {
-            /* border: 1px solid #eee; */
-            text-align: center;
-        }
-        tbody {
-            border: 1px solid #eee;
-            display: block;
-            min-height: 53rem;
-            max-height: 53rem; /* Adjust the height as per your requirement */
-            overflow-y: auto;
-            overflow-x: hidden; /* Optional: Prevent horizontal scroll */
-          }
-          tbody tr{
-            table-layout: fixed; display: table;width: 100%;
-            td{cursor: pointer;}
-        }
-        tbody tr:hover td {
-            background-color: rgba(194, 61, 74, 0.1);
-        }
+      img {
+        position: absolute;
+        left: 50%;
+        right: 50%;
+        transform: translateX(-50%) translateY(-50%);
+      }
 
     }
+  }
 
-    .delete-member {
-        background-color: #f5f8f9;
+  .btn-group-small {
+    gap: 5px;
 
-        td {
-            color: #aaaaaa;
-
+    .button {
+      &.flex {
+        img {
+          text-align: left;
+          margin-right: 10px;
         }
+
+        p {
+          text-align: center;
+        }
+      }
+    }
+  }
+
+  .select-box {
+    width: 230px;
+    height: 50px;
+    border: 1px solid #ddd;
+    padding: 0 15px;
+    margin: 0;
+
+    select {
+      width: 100%;
+      height: 100%;
+      font-size: 16px;
+      /* color: #999999; */
+    }
+  }
+
+  .switch {
+    label {
+      margin-top: -12px;
+    }
+  }
+
+  table {
+    .selected {
+      background-color: rgba(194, 61, 74, 0.2);
     }
 
-    textarea {
-        border-color: #ddd;
+    border-radius: 10px;
+    overflow: hidden;
+
+    thead {
+      display: table;
+      width: 100%;
+      background-color: #636364;
+
+      th {
+        color: #fff;
+        border: 1px solid #eee;
+      }
     }
+
+    td {
+      /* border: 1px solid #eee; */
+      text-align: center;
+    }
+
+    tbody {
+      border: 1px solid #eee;
+      display: block;
+      min-height: 53rem;
+      max-height: 53rem;
+      /* Adjust the height as per your requirement */
+      overflow-y: auto;
+      overflow-x: hidden;
+      /* Optional: Prevent horizontal scroll */
+    }
+
+    tbody tr {
+      table-layout: fixed;
+      display: table;
+      width: 100%;
+
+      td {
+        cursor: pointer;
+      }
+    }
+
+    tbody tr:hover td {
+      background-color: rgba(194, 61, 74, 0.1);
+    }
+
+  }
+
+  .delete-member {
+    background-color: #f5f8f9;
+
+    td {
+      color: #aaaaaa;
+
+    }
+  }
+
+  textarea {
+    border-color: #ddd;
+  }
 }
 
 
@@ -1280,157 +1336,157 @@
 
 
 input[type="date"] {
-    position: relative;
-    width: 158px;
-    border-radius: 8px;
-    background: url(../../images/icon/calendar.png) no-repeat right 10px center / auto;
+  position: relative;
+  width: 158px;
+  border-radius: 8px;
+  background: url(../../images/icon/calendar.png) no-repeat right 10px center / auto;
 }
 
 input[type="date"]::placeholder {
-    color: #fff;
-    ;
+  color: #fff;
+  ;
 }
 
 input[type='date']::-webkit-calendar-picker-indicator {
-    position: absolute;
-    left: 0;
-    top: 0;
-    width: 100%;
-    height: 100%;
-    background: transparent;
-    color: transparent;
-    cursor: pointer;
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+  background: transparent;
+  color: transparent;
+  cursor: pointer;
 }
 
 input[type="checkbox"] {
-    position: relative;
-    width: 22px;
-    height: 22px;
-    padding: 0;
-    accent-color: #544483;
-    /* This will change the checkbox color when checked */
-    border: 1px solid #cccccc;
-    /* This controls the border color */
-    border-radius: 4px;
-    /* Optional: rounded corners */
-    background-color: #fff;
-    /* Default background */
-    appearance: none;
-    /* Remove the default checkbox appearance */
-    cursor: pointer;
+  position: relative;
+  width: 22px;
+  height: 22px;
+  padding: 0;
+  accent-color: #544483;
+  /* This will change the checkbox color when checked */
+  border: 1px solid #cccccc;
+  /* This controls the border color */
+  border-radius: 4px;
+  /* Optional: rounded corners */
+  background-color: #fff;
+  /* Default background */
+  appearance: none;
+  /* Remove the default checkbox appearance */
+  cursor: pointer;
 }
 
 /* Checked state of the checkbox */
 input[type="checkbox"]:checked {
-    background-color: #544483;
-    /* Custom background when checked */
-    border-color: #544483;
-    /* Custom border color when checked */
+  background-color: #544483;
+  /* Custom background when checked */
+  border-color: #544483;
+  /* Custom border color when checked */
 }
 
 input[type="checkbox"]:checked::before {
-    content: '';
-    background-image: url(../../images/check.png);
-    background-repeat: no-repeat;
-    position: absolute;
-    left: 2px;
-    top: 5px;
-    width: 15px;
-    height: 11px;
+  content: '';
+  background-image: url(../../images/check.png);
+  background-repeat: no-repeat;
+  position: absolute;
+  left: 2px;
+  top: 5px;
+  width: 15px;
+  height: 11px;
 }
 
 input[type="checkbox"]:checked+label {
-    color: rgba(0, 0, 0, 0.12);
-    /* Change the label color when checkbox is checked */
+  color: rgba(0, 0, 0, 0.12);
+  /* Change the label color when checkbox is checked */
 }
 
 input[type="checkbox"]+label,
 input[type='radio']+label {
-    font-size: 17px;
-    font-family: "Pretendard-L";
-    width: 140px;
-    flex-shrink: 0;
+  font-size: 17px;
+  font-family: "Pretendard-L";
+  width: 140px;
+  flex-shrink: 0;
 }
 
 /* 기본스타일 제거, 버튼 모양 재설정 */
 input[type='radio'] {
-    flex-shrink: 0;
-    -webkit-appearance: none;
-    /* 웹킷 브라우저에서 기본 스타일 제거*/
-    -moz-appearance: none;
-    /* 모질라 브라우저에서 기본 스타일 제거*/
-    appearance: none;
-    /*기본 브라우저에서 기본 스타일 제거*/
-    width: 22px;
-    height: 22px;
-    padding: 0;
-    border: 1px solid #ccc;
-    /*체크되지 않았을 때의 테두리 색상*/
-    border-radius: 50%;
-    outline: none;
-    /*focus 시에 나타나는 기본 스타일 제거*/
-    cursor: pointer;
+  flex-shrink: 0;
+  -webkit-appearance: none;
+  /* 웹킷 브라우저에서 기본 스타일 제거*/
+  -moz-appearance: none;
+  /* 모질라 브라우저에서 기본 스타일 제거*/
+  appearance: none;
+  /*기본 브라우저에서 기본 스타일 제거*/
+  width: 22px;
+  height: 22px;
+  padding: 0;
+  border: 1px solid #ccc;
+  /*체크되지 않았을 때의 테두리 색상*/
+  border-radius: 50%;
+  outline: none;
+  /*focus 시에 나타나는 기본 스타일 제거*/
+  cursor: pointer;
 }
 
 /* 체크 시 버튼 모양 스타일*/
 input[type='radio']:checked {
-    background-color: #544483;
-    /*체크 시 내부 원 색상*/
-    border: 4px solid #fff;
-    /*라인이 아닌, 라인과 원 사이 색상*/
-    box-shadow: 0 0 0 1px #ccc;
-    /*라인*/
+  background-color: #544483;
+  /*체크 시 내부 원 색상*/
+  border: 4px solid #fff;
+  /*라인이 아닌, 라인과 원 사이 색상*/
+  box-shadow: 0 0 0 1px #ccc;
+  /*라인*/
 }
 
 .switch {
-    input[type="checkbox"] {
-        height: 0;
-        width: 0;
-        visibility: hidden;
-    }
+  input[type="checkbox"] {
+    height: 0;
+    width: 0;
+    visibility: hidden;
+  }
 
-    label {
-        cursor: pointer;
-        text-indent: -9999px;
-        width: 65px;
-        height: 28px;
-        background: #787878;
-        display: block;
-        border-radius: 100px;
-        position: relative;
-        transition: background-color 0.3s ease;
-        /* Added smooth transition for background */
-    }
+  label {
+    cursor: pointer;
+    text-indent: -9999px;
+    width: 65px;
+    height: 28px;
+    background: #787878;
+    display: block;
+    border-radius: 100px;
+    position: relative;
+    transition: background-color 0.3s ease;
+    /* Added smooth transition for background */
+  }
 
-    label:after {
-        content: '';
-        position: absolute;
-        top: 4px;
-        left: 5px;
-        width: 20px;
-        height: 20px;
-        background: #fff;
-        border-radius: 50%;
-    }
+  label:after {
+    content: '';
+    position: absolute;
+    top: 4px;
+    left: 5px;
+    width: 20px;
+    height: 20px;
+    background: #fff;
+    border-radius: 50%;
+  }
 
-    /* When the input is checked */
-    input:checked+label {
-        background: #544483;
-        /* Color when active */
-    }
+  /* When the input is checked */
+  input:checked+label {
+    background: #544483;
+    /* Color when active */
+  }
 
-    input:checked+label:after {
-        left: calc(100% - 5px);
-        transform: translateX(-100%);
-        /* Keeps the ball moving smoothly */
-    }
+  input:checked+label:after {
+    left: calc(100% - 5px);
+    transform: translateX(-100%);
+    /* Keeps the ball moving smoothly */
+  }
 
-    /* Optional: Make the toggle ball slightly larger during the click for a better effect */
-    label:active:after {
-        width: 20px;
-        /* Slightly increase the ball size */
-        height: 20px;
-    }
+  /* Optional: Make the toggle ball slightly larger during the click for a better effect */
+  label:active:after {
+    width: 20px;
+    /* Slightly increase the ball size */
+    height: 20px;
+  }
 }
 
 
@@ -1438,45 +1494,214 @@
 
 /* table*/
 table {
-    width: 100%;
-    border-collapse: collapse;
-    border-top: 2px solid #000;
+  width: 100%;
+  border-collapse: collapse;
+  border-top: 2px solid #000;
 }
 
 thead {
-    background-color: #f6f6f6;
+  background-color: #f6f6f6;
 }
 
 th {
-    font-family: "Pretendard-SB";
-    font-size: 18px;
+  font-family: "Pretendard-SB";
+  font-size: 18px;
 }
 
 tbody tr {
-    border-bottom: 1px solid #eeeeee;
+  border-bottom: 1px solid #eeeeee;
 
-    td {
-        font-size: 16px;
-        font-family: "Pretendard-L";
-    }
+  td {
+    font-size: 16px;
+    font-family: "Pretendard-L";
+  }
 }
 
 td,
 th {
-    padding: 10px 0;
+  padding: 10px 0;
 }
 
 /* 에디터 */
-.ck.ck-editor__editable.ck-focused:not(.ck-editor__nested-editable){
-    border-color: #ddd !important;
-    box-shadow: 0 0 0 0 !important;
+.ck.ck-editor__editable.ck-focused:not(.ck-editor__nested-editable) {
+  border-color: #ddd !important;
+  box-shadow: 0 0 0 0 !important;
 }
-  .ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content{
-    border-color: #ddd !important;
+
+.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content {
+  border-color: #ddd !important;
+}
+
+.ck.ck-editor__main>.ck-editor__editable:not(.ck-focused) {
+  border-color: #ddd !important;
+}
+
+.ck.ck-balloon-panel.ck-balloon-panel_visible {
+  display: none !important;
+}
+
+
+/* 카드형 목록 보기 (사진 기록물 전용 / 갤러리형) */
+.gallery-wrap {
+  width: 100%;
+  display: grid;
+  gap: 30px;
+  grid-template-columns: repeat(4, 1fr);
+  grid-auto-rows: auto;
+}
+
+.gallery-item {
+  cursor: pointer;
+
+  .item {
+    padding: 30px;
+    border: 1px solid #ddd;
+    border-radius: 24px;
+    height: 100%;
+    display: flex;
+    flex-direction: column;
   }
-  .ck.ck-editor__main > .ck-editor__editable:not(.ck-focused){
-    border-color: #ddd !important;
+
+  .img-wrap {
+    position: relative;
+    width: 100%;
+    aspect-ratio: 4 / 3;
+    border-radius: 24px;
+    overflow: hidden;
+    background-color: #f5f5f5;
+
+    img {
+      width: 100%;
+      height: 100%;
+      object-fit: cover;
+    }
   }
-  .ck.ck-balloon-panel.ck-balloon-panel_visible{
-    display: none !important;
-  }
(파일 끝에 줄바꿈 문자 없음)
+
+  .text-box {
+    width: 100%;
+    margin-top: 20px;
+    font-family: "Pretendard-L";
+    font-size: 16px;
+  }
+
+  .category {
+    width: 100%;
+    flex-wrap: wrap;
+  }
+}
+
+.img-view {
+  display: flex;
+  gap: 20px;
+
+  .current-img-wrap {
+    width: 60%;
+    aspect-ratio: 6 / 4;
+    background-color: #ddd;
+
+    img {
+      width: 100%;
+      height: 100%;
+      object-fit: contain;
+    }
+  }
+
+  .thumb-view {
+    width: 40%;
+    aspect-ratio: 6 / 4;
+  }
+}
+
+.thumbnails {
+  width: 100%;
+  height: calc(100% - 65px);
+  overflow-y: auto;
+
+  >div {
+    display: grid;
+    grid-template-columns: repeat(3, 1fr);
+    gap: 20px;
+  }
+
+  .thumbnail-wrap {
+    position: relative;
+    width: 100%;
+  }
+
+  .thumbnail {
+    width: 100%;
+    aspect-ratio: 6 / 4;
+    cursor: pointer;
+
+    img {
+      width: 100%;
+      height: 100%;
+      object-fit: cover;
+    }
+  }
+
+  .float-div {
+    position: absolute;
+    right: .5rem;
+    bottom: .5rem;
+    z-index: 5;
+  }
+}
+
+.download-btn {
+  .btn {
+    width: 160px;
+    height: 45px;
+    font-family: "Pretendard-B";
+    font-size: 16px;
+    padding: 13px 21px;
+    text-align: left;
+    margin: 0 5px;
+    background-image: url(../../images/downbtn_bg.png);
+    color: #fff;
+  }
+
+  .select-down {
+    background-image: url(../../images/downbtn_border.png);
+  }
+}
+
+.btn-sm {
+  color: inherit;
+  font-size: 14px;
+  font-family: "Pretendard-SB" !important;
+
+  padding: 5px 10px;
+  border-width: 1px;
+  border-style: solid;
+  border-radius: 3px;
+  background-color: #FFFFFF;
+
+  &.red {
+    color: #a5067b;
+    border: 1px solid #a5067b;
+  }
+}
+
+.category-dd {
+  ul {
+    display: flex;
+    gap: 15px;
+    flex-wrap: wrap;
+    max-height: 80px;
+    width: 100%;
+    overflow-y: auto;
+    overflow-x: hidden;
+  }
+
+  li {
+    display: flex;
+    align-items: center;
+    width: 175px;
+    gap: 12px;
+
+    label {
+      cursor: pointer;
+    }
+  }
+}
(파일 끝에 줄바꿈 문자 없음)
client/resources/js/cmmnPlugin.js
--- client/resources/js/cmmnPlugin.js
+++ client/resources/js/cmmnPlugin.js
@@ -96,6 +96,36 @@
     Vue.config.globalProperties.$processTitle = (title) => {
       if (!title) return '';
       return title.trim().replace(/\s+/g, ' ');
+    };
+
+    // 생산연도 포맷팅 함수
+    Vue.config.globalProperties.$formatPrdctnDate = (prdctnYear) => {
+      if (!prdctnYear) return '-';
+
+      const prdctnYearStr = String(prdctnYear);
+
+      // 길이에 따른 처리
+      if (prdctnYearStr.length === 4) {
+        // YYYY 형식인 경우 - 년도만 있는 경우
+        return `${prdctnYearStr}`;
+      } else if (prdctnYearStr.length === 8) {
+        // YYYYMMDD 형식인 경우
+        const year = prdctnYearStr.substring(0, 4);
+        const month = prdctnYearStr.substring(4, 6);
+        const day = prdctnYearStr.substring(6, 8);
+
+        // 월과 일이 00인 경우 처리
+        if (month === '00' && day === '00') {
+          return `${year}`;
+        } else if (day === '00') {
+          return `${year}.${month}`;
+        } else {
+          return `${year}.${month}.${day}`;
+        }
+      }
+
+      // 다른 형식은 그대로 반환
+      return prdctnYearStr;
     }
   },
 }
(파일 끝에 줄바꿈 문자 없음)
client/views/component/CardViewList.vue (Renamed from client/views/component/listLayout/CardViewList.vue)
--- client/views/component/listLayout/CardViewList.vue
+++ client/views/component/CardViewList.vue
@@ -1,5 +1,5 @@
 <template>
-  <div class="mb-30">
+  <div class="result-list-wrap mb-30">
     <div class="flex-sp-bw mb-20">
       <div class="resultext">
         <img :src="resulticon" alt="">
@@ -8,7 +8,7 @@
       <button type="button" class="gopage" @click="fnMoveTo">모두보기</button>
     </div>
     <div v-if="list.length > 0">
-      <CardStyleComponent :name="name" :list="list" />
+      <CardStyleComponent :typeText="typeText" :name="name" :list="list" />
     </div>
     <div v-else class="no-results">
       <img :src="nosearch" alt="">
@@ -55,6 +55,18 @@
   },
 
   computed: {
+    typeText() {
+      switch (this.name) {
+        case 'P':
+          return '사진';
+        case 'V':
+          return '영상';
+        case 'M':
+          return '미디어 영상';
+        case 'N':
+          return '스크랩 자료';
+      }
+    },
     helpText() {
       switch (this.name) {
         case 'P':
 
client/views/component/CategoryListComponent.vue (added)
+++ client/views/component/CategoryListComponent.vue
@@ -0,0 +1,85 @@
+<template>
+  <ul>
+    <li v-for="(category, idx) of categoryList" :key="idx">
+      <input type="checkbox" :id="'ctgry_' + idx" name="categorys" :value="category.ctgryId" :checked="isSelected(category)" @change="updateSelected(category)" />
+      <label :for="'ctgry_' + idx">{{ category.ctgryNm }}</label>
+    </li>
+  </ul>
+</template>
+<script>
+// API
+import { findAllByNullProc } from "@/resources/api/category";
+
+// 카테고리 목록 검색
+export default {
+  name: 'CategoryListComponent',
+
+  props: {
+    modelValue: {
+      type: Array,
+      default: () => [],
+    }
+  },
+
+  emits: ['update:modelValue'],
+
+  data() {
+    return {
+      categoryList: [], // 카테고리 목록
+    };
+  },
+
+  created() {
+    this.fnFindCategorys(); // 카테고리 목록 조회
+  },
+
+  methods: {
+    // 카테고리 목록 조회
+    async fnFindCategorys() {
+      try {
+        const response = await findAllByNullProc();
+        if (response.data && response.data.data && response.data.data.ctgry) {
+          this.categoryList = response.data.data.ctgry;
+        } else {
+          this.categoryList = [];
+        }
+      } catch (error) {
+        this.categoryList = []; // 카테고리 목록 초기화
+        if (error.response) {
+          alert(error.response.data.message);
+        }
+        console.error(error.message);
+      }
+    },
+
+    // 체크박스가 선택되었는지 확인
+    isSelected(category) {
+      return this.modelValue.some(item =>
+        item.ctgryId === category.ctgryId || item === category.ctgryId);
+    },
+
+    // 선택된 카테고리 업데이트 (부모 컴포넌트에 이벤트 발생)
+    updateSelected(category) {
+      // 현재 선택된 항목의 복사본 생성
+      const updatedSelection = [...this.modelValue];
+
+      // 이미 선택된 항목인지 확인
+      const index = updatedSelection.findIndex(item =>
+        (typeof item === 'object' && item.ctgryId === category.ctgryId) ||
+        item === category.ctgryId
+      );
+
+      if (index === -1) {
+        // 선택되지 않은 경우 추가
+        updatedSelection.push(category);
+      } else {
+        // 이미 선택된 경우 제거
+        updatedSelection.splice(index, 1);
+      }
+
+      // 부모 컴포넌트에 업데이트된 목록 전달
+      this.$emit('update:modelValue', updatedSelection);
+    }
+  }
+};
+</script>(파일 끝에 줄바꿈 문자 없음)
client/views/component/DefaultPagination.vue (Renamed from client/views/component/listLayout/DefaultPagination.vue)
--- client/views/component/listLayout/DefaultPagination.vue
+++ client/views/component/DefaultPagination.vue
No changes
 
client/views/component/PrdctnSelectComponent.vue (added)
+++ client/views/component/PrdctnSelectComponent.vue
@@ -0,0 +1,166 @@
+<template>
+  <div class="date-input-group">
+    <select id="prdctnYear" v-model="localDateForm.year" class="year-select" @change="emitChanges">
+      <option v-for="year in yearOptions" :key="year" :value="year">{{ year }}년</option>
+    </select>
+    <input type="text" id="prdctnMonth" placeholder="월" v-model="localDateForm.month" maxlength="2" @input="onlyNumberInput('month')" class="month-input">
+    <input type="text" id="prdctnDay" placeholder="일" v-model="localDateForm.day" maxlength="2" @input="onlyNumberInput('day')" class="day-input">
+  </div>
+</template>
+<script>
+export default {
+  name: "PrdctnSelectComponent",
+
+  props: {
+    // 초기값 또는 부모에서 전달하는 날짜 객체
+    modelValue: {
+      type: Object,
+      default: () => ({
+        year: new Date().getFullYear(),
+        month: '',
+        day: ''
+      })
+    },
+
+    // 포맷팅된 날짜 문자열 (YYYYMMDD)
+    value: {
+      type: String,
+      default: ''
+    }
+  },
+
+  emits: ['update:modelValue', 'formatted-date'],
+
+  data() {
+    return {
+      // 내부적으로 사용할 로컬 데이터
+      localDateForm: {
+        year: this.modelValue.year || new Date().getFullYear(),
+        month: this.modelValue.month || '',
+        day: this.modelValue.day || ''
+      }
+    };
+  },
+
+  computed: {
+    // 년도 옵션 (현재부터 1970년까지)
+    yearOptions() {
+      const currentYear = new Date().getFullYear();
+      const years = [];
+      for (let year = currentYear; year >= 1970; year--) {
+        years.push(year);
+      }
+      return years;
+    },
+
+    // 날짜 포맷팅 (YYYYMMDD 형식)
+    formattedDate() {
+      const year = this.localDateForm.year || '';
+      const month = this.localDateForm.month || '00';
+      const day = this.localDateForm.day || '00';
+
+      if (!year) return '';
+      return `${year}${month.padStart(2, '0')}${day.padStart(2, '0')}`;
+    }
+  },
+
+  watch: {
+    // 부모로부터 변경된 값 감지
+    modelValue: {
+      handler(newValue) {
+        // 참조 공유가 아닌 값 복사로 변경
+        this.localDateForm = {
+          year: newValue.year || new Date().getFullYear(),
+          month: newValue.month || '',
+          day: newValue.day || ''
+        };
+      },
+      deep: true,
+      immediate: true
+    },
+
+    // 외부에서 전달된 포맷팅된 날짜값 감지
+    value: {
+      handler(newValue) {
+        if (newValue && newValue !== this.formattedDate) {
+          this.parsePrdctnYear(newValue);
+        }
+      },
+      immediate: true
+    }
+  },
+
+  created() {
+    // 컴포넌트 생성 시 값이 있으면 파싱
+    if (this.value) {
+      this.parsePrdctnYear(this.value);
+    }
+  },
+
+  methods: {
+    // 값 변경 시 부모에게 전달
+    emitChanges() {
+      this.$emit('update:modelValue', { ...this.localDateForm });
+      this.$emit('formatted-date', this.formattedDate);
+    },
+
+    // 숫자만 입력 가능하도록 제한
+    onlyNumberInput(field) {
+      this.localDateForm[field] = this.localDateForm[field].replace(/[^0-9]/g, '');
+
+      // 월 입력 범위 제한 (1-12)
+      if (field === 'month' && this.localDateForm.month) {
+        const month = parseInt(this.localDateForm.month);
+        if (month > 12) this.localDateForm.month = '12';
+        if (month < 1) this.localDateForm.month = '01';
+      }
+
+      // 일 입력 범위 제한 (1-31)
+      if (field === 'day' && this.localDateForm.day) {
+        const day = parseInt(this.localDateForm.day);
+        if (day > 31) this.localDateForm.day = '31';
+        if (day < 1) this.localDateForm.day = '01';
+      }
+
+      // 값 변경 알림
+      this.emitChanges();
+    },
+
+    // 날짜 문자열 파싱 메서드
+    parsePrdctnYear(prdctnYear) {
+      if (!prdctnYear) {
+        this.localDateForm = {
+          year: new Date().getFullYear(),
+          month: '',
+          day: ''
+        };
+        this.emitChanges();
+        return;
+      }
+
+      const prdctnYearStr = String(prdctnYear);
+
+      if (prdctnYearStr.length === 4) {
+        // YYYY 형식인 경우
+        this.localDateForm = {
+          year: prdctnYearStr,
+          month: '',
+          day: ''
+        };
+      } else if (prdctnYearStr.length === 8) {
+        // YYYYMMDD 형식인 경우
+        const year = prdctnYearStr.substring(0, 4);
+        let month = prdctnYearStr.substring(4, 6);
+        month = month === '00' ? '' : month;
+        let day = prdctnYearStr.substring(6, 8);
+        day = day === '00' ? '' : day;
+
+        this.localDateForm = { year, month, day };
+      }
+
+      // 값 변경 알림
+      this.emitChanges();
+    }
+  }
+};
+</script>(파일 끝에 줄바꿈 문자 없음)
client/views/component/listLayout/CardStyleComponent.vue
--- client/views/component/listLayout/CardStyleComponent.vue
+++ client/views/component/listLayout/CardStyleComponent.vue
@@ -3,6 +3,9 @@
     <li v-for="(item, idx) in list" :key="idx" class="mb-30" @click="fnMoveTo(item)">
       <div class="result-box">
         <div class="main-img">
+          <div v-if="!$isEmpty(typeText)" class="float-div">
+            <p class="float-txt">{{ typeText }}</p>
+          </div>
           <img v-if="name === 'M'" :src="getYouTubeThumbnail(item.link)" alt="영상 썸네일">
           <img v-else-if="!$isEmpty(item.thumbnail)" :src="item.thumbnail.filePath" :alt="item.sj + ' 썸네일'">
           <img v-else src="client/resources/images/img6.png" alt="Not found image">
@@ -18,7 +21,7 @@
           </div>
           <div class="date">
             <ul>
-              <li>생산연도 <b>{{ item.prdctnYear ? item.prdctnYear : '-' }}</b></li>
+              <li>생산연도 <b>{{ item.prdctnYear ? $formatPrdctnDate(item.prdctnYear) : '-' }}</b></li>
               <li>|</li>
               <li>등록 <b>{{ $dotFormatDate(item.rgsde) }}</b></li>
             </ul>
@@ -35,6 +38,10 @@
   name: "CardStyleComponent",
 
   props: {
+    typeText: {
+      type: String,
+      default: null
+    },
     name: {
       type: String,
       default: 'P'
 
client/views/component/listLayout/GalleryStyleComponent.vue (added)
+++ client/views/component/listLayout/GalleryStyleComponent.vue
@@ -0,0 +1,77 @@
+<template>
+  <ul class="gallery-wrap">
+    <li v-for="(item, idx) in list" :key="idx" class="gallery-item" @click="fnMoveTo(item)">
+      <div class="item">
+        <figure class="img-wrap">
+          <img v-if="!$isEmpty(item.thumbnail)" :src="item.thumbnail.filePath" :alt="item.sj + ' 썸네일'">
+          <img v-else src="client/resources/images/img6.png" alt="Not found image">
+        </figure>
+        <div class="text-box">
+          <h5 class="txt-center">{{ item.sj }}</h5>
+          <div class="txt-right mb-20">
+            <p class="mb-5">생산연도 <b>{{ item.prdctnYear ? $formatPrdctnDate(item.prdctnYear) : '-' }}</b></p>
+            <p>등록 <b>{{ $dotFormatDate(item.rgsde) }}</b></p>
+          </div>
+          <ul class="category">
+            <li v-for="(ctgry, ctgryIdx) of item.ctgrys" :key="ctgryIdx" class="category1">{{ ctgry.ctgryNm }}</li>
+          </ul>
+        </div>
+      </div>
+    </li>
+  </ul>
+</template>
+<script>
+export default {
+  name: "GalleryStyleComponent",
+
+  props: {
+    typeText: {
+      type: String,
+      default: null
+    },
+    name: {
+      type: String,
+      default: 'P'
+    },
+    list: {
+      type: Array,
+      default: () => [],
+    },
+  },
+
+  computed: {
+    page() {
+      switch (this.name) {
+        case 'P':
+          return 'PicHistoryDetail';
+        case 'V':
+          return 'VideoHistoryDetail';
+        case 'M':
+          return 'MediaVideoDetail';
+        case 'N':
+          return 'NewsReleaseDetail';
+      }
+    },
+  },
+
+  methods: {
+    // 페이지 이동
+    fnMoveTo(item) {
+      let key = null;
+      switch (this.name) {
+        case 'P':
+        case 'V':
+          key = 'dcryId';
+          break;
+        case 'M':
+          key = 'mediaVidoId';
+          break;
+        case 'N':
+          key = 'nesDtaId';
+          break;
+      }
+      this.$router.push({ name: this.page, query: { id: item[key] } });
+    }
+  },
+};
+</script>(파일 끝에 줄바꿈 문자 없음)
client/views/component/listLayout/ListStyleComponent.vue
--- client/views/component/listLayout/ListStyleComponent.vue
+++ client/views/component/listLayout/ListStyleComponent.vue
@@ -12,7 +12,7 @@
           </div>
           <div class="date ">
             <ul>
-              <li>생산연도 <b>{{ item.prdctnYear ? item.prdctnYear : '-' }}</b></li>
+              <li>생산연도 <b>{{ item.prdctnYear ? $formatPrdctnDate(item.prdctnYear) : '-' }}</b></li>
               <li>|</li>
               <li>등록 <b>{{ $dotFormatDate(item.rgsde) }}</b></li>
             </ul>
 
client/views/component/modal/CategorySelectModal.vue (deleted)
--- client/views/component/modal/CategorySelectModal.vue
@@ -1,142 +0,0 @@
-<template>
-  <div class="modal-overlay">
-    <div class="modal-content" @click.stop>
-      <div class="flex-sp-bw mb-20">
-        <h2>카테고리 조회</h2>
-        <button class="closebtn" @click="$emit('toggleModal')">✕</button>
-      </div>
-      <div class="modal-search flex-center mb-20">
-        <input type="text" placeholder="카테고리명을 입력하세요." v-model="searchReqDTO.searchText" @keyup.enter="fnChnageReqDTO">
-        <button type="button" class="search-btn" @click="fnChnageReqDTO">
-          <img :src="searchicon" alt="">
-          <p>검색</p>
-        </button>
-      </div>
-      <table class="mb-10">
-        <thead>
-          <tr>
-            <th>카테고리 항목</th>
-            <th>선택</th>
-          </tr>
-        </thead>
-        <tbody>
-          <template v-if="list.length > 0">
-            <tr v-for="(item, idx) of list" :key="idx" :class="{ 'selected': item.isSelected }">
-              <td>{{ item.ctgryNm }}</td>
-              <td><input type="checkbox" :value="item" v-model="selectedList" /></td>
-            </tr>
-          </template>
-          <tr v-else>
-            <td colspan="2">조건에 맞는 카테고리가 존재하지 않습니다.</td>
-          </tr>
-        </tbody>
-      </table>
-      <div class="flex-end mb-30"><button class="register-b" @click="fnAddCtgries">등록</button></div>
-      <DefaultPagination :search="searchReqDTO" @onChange="fnChangeCurrentPage" />
-    </div>
-  </div>
-</template>
-<script>
-// COMPONENT
-import DefaultPagination from '@/views/component/listLayout/DefaultPagination.vue';
-// API
-import { findAllCategoryProc } from '@/resources/api/category';
-
-export default {
-  name: 'CategorySelectModal',
-
-  components: {
-    DefaultPagination
-  },
-
-  props: {
-    selectedCtgries: {
-      type: Array,
-      default: () => [],
-    }
-  },
-
-  data() {
-    return {
-      // ICON
-      searchicon: 'client/resources/images/icon/search.png',
-
-      // 검색 객체
-      searchReqDTO: {
-        searchType: 'nm',
-        searchText: null,
-        useAt: 'Y',
-        selectedCtgryIds: null,
-        // 페이지네이션
-        currentPage: 1, // 현재 페이지
-        recordSize: 10, // 한 페이지에 표시할 데이터 개수
-      },
-
-      list: [], // 카테고리 목록
-      selectedList: [] // 선택한 카테고리 목록
-    };
-  },
-
-  created() {
-    this.fnSearch(); // 목록 조회
-  },
-
-  methods: {
-    // 검색 조건이 변경된 경우
-    fnChnageReqDTO() {
-      this.searchReqDTO.currentPage = 1;
-      this.$nextTick(() => {
-        this.fnSearch();
-      });
-    },
-
-    // 목록 조회
-    async fnSearch() {
-      try {
-        if (this.searchReqDTO.hasOwnProperty('ctgryIds')) {
-          delete this.searchReqDTO.ctgryIds;
-        }
-        if (this.selectedCtgries.length > 0) {
-          this.searchReqDTO.selectedCtgryIds = this.selectedCtgries.map(item => item.ctgryId).join(',');
-        }
-
-        const response = await findAllCategoryProc(this.searchReqDTO);
-        let ctgries = response.data.data.ctgry;
-        for (let item of ctgries) {
-          item.isSelected = false;
-          for (let ctgry of this.selectedCtgries) {
-            if (item.ctgryId === ctgry.ctgryId) {
-              item.isSelected = true;
-              break;
-            }
-          }
-        }
-
-        this.list = ctgries;
-        this.searchReqDTO = response.data.data.search;
-      } catch (error) {
-        alert('조회중 오류가 발생했습니다.');
-
-        if (error.response) {
-          alert(error.response.data.message);
-        }
-        console.error(error.message);
-      }
-    },
-
-    // 카테고리 추가
-    fnAddCtgries() {
-      this.$emit('addCtgries', this.selectedList);
-    },
-
-    // 페이지 이동
-    fnChangeCurrentPage(currentPage) {
-      this.searchReqDTO.currentPage = Number(currentPage);
-
-      this.$nextTick(() => {
-        this.fnSearch();
-      });
-    },
-  }
-};
-</script>(파일 끝에 줄바꿈 문자 없음)
client/views/component/player/VideoComponent.vue
--- client/views/component/player/VideoComponent.vue
+++ client/views/component/player/VideoComponent.vue
@@ -23,7 +23,6 @@
 <style scoped>
 .video-player {
   width: 100%;
-  max-width: 800px;
   margin: 0 auto;
 }
 
client/views/pages/AppRouter.js
--- client/views/pages/AppRouter.js
+++ client/views/pages/AppRouter.js
@@ -10,13 +10,13 @@
 import MyInfo from "./user/MyInfo.vue";
 import MemberManagement from "./member/MemberManagement.vue";
 // 기록물 - 사진
-import PicHistorySearch from "./bbsDcry/photo/PicHistorySearch.vue";
-import PicHistoryInsert from "./bbsDcry/photo/PicHistoryInsert.vue";
-import PicHistoryDetail from "./bbsDcry/photo/PicHistoryDetail.vue";
+import PicHistorySearch from "./bbsDcryPhoto/PicHistorySearch.vue";
+import PicHistoryInsert from "./bbsDcryPhoto/PicHistoryInsert.vue";
+import PicHistoryDetail from "./bbsDcryPhoto/PicHistoryDetail.vue";
 // 기록물 - 영상
-import VideoHistoryInsert from "./bbsDcry/video/VideoHistoryInsert.vue";
-import VideoHistoryDetail from "./bbsDcry/video/VideoHistoryDetail.vue";
-import VideoHistorySearch from "./bbsDcry/video/VideoHistorySearch.vue";
+import VideoHistoryInsert from "./bbsDcryVideo/VideoHistoryInsert.vue";
+import VideoHistoryDetail from "./bbsDcryVideo/VideoHistoryDetail.vue";
+import VideoHistorySearch from "./bbsDcryVideo/VideoHistorySearch.vue";
 // 미디어 영상
 import MediaVideoInsert from "./bbsMediaVido/MediaVideoInsert.vue";
 import MediaVideoDetail from "./bbsMediaVido/MediaVideoDetail.vue";
client/views/pages/bbsDcryPhoto/PicHistoryDetail.vue (Renamed from client/views/pages/bbsDcry/photo/PicHistoryDetail.vue)
--- client/views/pages/bbsDcry/photo/PicHistoryDetail.vue
+++ client/views/pages/bbsDcryPhoto/PicHistoryDetail.vue
@@ -23,32 +23,24 @@
           </div>
         </dd>
       </dl>
-      <div>
-        <div class="gallery">
-          <div class="main-swiper">
-            <swiper :style="{ '--swiper-navigation-color': '#fff', '--swiper-pagination-color': '#fff' }" :loop="true" :spaceBetween="10" :thumbs="{ swiper: thumbsSwiper }" :modules="modules" class="mySwiper2" @slideChange="handleMainSlideChange">
-              <swiper-slide v-for="(item, idx) of findResult.files" :key="idx">
-                <img :src="item.filePath" :alt="item.fileNm" />
-              </swiper-slide>
-            </swiper>
-          </div>
-          <div class="thumbnail">
-            <swiper @swiper="setThumbsSwiper" :spaceBetween="20" :slidesPerView="4" :freeMode="true" :watchSlidesProgress="true" :modules="modules" :navigation="true" class="mySwiper">
-              <swiper-slide v-for="(item, idx) of findResult.files" :key="idx" :class="{ 'active-thumb': activeIndex === idx }">
-                <input type="checkbox" :id="'photo_' + idx" :value="item" v-model="selectedFiles" @click.stop />
-                <img :src="item.filePath" :alt="item.fileNm" />
-              </swiper-slide>
-            </swiper>
-          </div>
+      <div class="img-view">
+        <div class="current-img-wrap">
+          <img :src="currentImg.filePath" :alt="currentImg.fileNm" />
         </div>
-        <div class="btn-group">
-          <button class="select-down" @click="fnDownload('selected')">선택 다운로드</button>
-          <button class="all-down" @click="fnDownload('all')">전체 다운로드</button>
-          <div v-if="loading" class="loading-overlay">
-            <div class="loading-spinner"></div>
+        <div class="thumb-view">
+          <div class="download-btn txt-right mb-20">
+            <button class="btn all-down" @click="fnDownload('all')">전체 다운로드</button>
+          </div>
+          <div class="thumbnails">
             <div>
-              <p>다운로드 중입니다</p>
-              <p>잠시만 기다려주세요</p>
+              <div v-for="(item, idx) of findResult.files" :key="idx" class="thumbnail-wrap">
+                <figure class="thumbnail" @click="onchangeImg(item)">
+                  <img :src="item.filePath" :alt="item.fileNm" />
+                </figure>
+                <div class="float-div">
+                  <button type="button" class="btn-sm red" @click="fnDownload('selected', item)">다운로드</button>
+                </div>
+              </div>
             </div>
           </div>
         </div>
@@ -90,6 +82,13 @@
       <button class="gray-line-bg " type="button" @click="fnMoveTo('list')">목록</button>
     </div>
   </div>
+  <div v-if="loading" class="loading-overlay">
+    <div class="loading-spinner"></div>
+    <div>
+      <p>다운로드 중입니다</p>
+      <p>잠시만 기다려주세요</p>
+    </div>
+  </div>
 </template>
 <script>
 import { ref } from 'vue';
@@ -104,7 +103,7 @@
 // import required modules
 import { FreeMode, Navigation, Thumbs } from 'swiper/modules';
 // COMPONENT
-import ViewerComponent from '../../../component/editor/ViewerComponent.vue';
+import ViewerComponent from '@/views/component/editor/ViewerComponent.vue';
 // API
 import { findDcryProc, deleteDcryProc } from '@/resources/api/dcry';
 import { fileDownloadProc, multiFileDownloadProc } from '@/resources/api/file';
@@ -150,6 +149,11 @@
 
       activeIndex: 0,
 
+      currentImg: {
+        fileNm: "기본이미지",
+        filePath: "client/resources/images/no_img.png",
+      },
+
       isRegister: false,
     };
   },
@@ -167,6 +171,10 @@
   },
 
   methods: {
+    onchangeImg(img) {
+      this.currentImg = img;
+    },
+
     handleMainSlideChange(swiper) {
       this.activeIndex = swiper.realIndex;
     },
@@ -181,6 +189,9 @@
           alert('올바른 접근이 아닙니다.');
           this.fnMoveTo('list'); // 목록으로 이동
         }
+
+        this.currentImg = this.findResult.files[0];
+
         this.isRegister = this.$registerChk(this.findResult.register);
       } catch (error) {
         alert('조회중 오류가 발생했습니다.');
@@ -194,26 +205,16 @@
     },
 
     // 파일 다운로드
-    async fnDownload(type) {
-      // Set loading to true when download starts
+    async fnDownload(type, file) {
       this.loading = true;
-
-      // 유효성 검사
-      if (type === 'selected') {
-        if (this.selectedFiles.length === 0) {
-          alert("파일을 1개 이상 선택하거나 전체 다운로드를 클릭해주세요.");
-          this.loading = false; // Hide loading if validation fails
-          return;
-        }
-      }
 
       let url = null;
       let link = null;
 
       try {
-        let fileList;
+        let fileList = [];
         if (type === 'selected') {
-          fileList = this.selectedFiles;
+          fileList.push(file);
         } else if (type === 'all') {
           fileList = this.findResult.files;
         }
client/views/pages/bbsDcryPhoto/PicHistoryInsert.vue (Renamed from client/views/pages/bbsDcry/photo/PicHistoryInsert.vue)
--- client/views/pages/bbsDcry/photo/PicHistoryInsert.vue
+++ client/views/pages/bbsDcryPhoto/PicHistoryInsert.vue
@@ -22,7 +22,7 @@
         <div class="hr"></div>
         <dd>
           <label for="prdctnYear">생산연도</label>
-          <input type="text" id="prdctnYear" placeholder="생산연도를 입력하세요" v-model="requestDTO.prdctnYear" pattern="[0-9]{4}" maxlength="4" @input="onlyNumberInput">
+          <prdctn-select-component v-model="dateForm" :value="requestDTO.prdctnYear" @formatted-date="requestDTO.prdctnYear = $event" />
         </dd>
         <div class="hr"></div>
         <dd>
@@ -37,13 +37,9 @@
           </div>
         </dd>
         <div class="hr"></div>
-        <dd>
-          <label for="category" class="flex align-center">
-            <p>카테고리</p><button type="button" class="category-add" @click="fnToggleModal">추가하기</button>
-          </label>
-          <ul class="category">
-            <li v-for="(item, idx) of selectedCtgries" :key="idx">{{ item.ctgryNm }} <button type="button" class="cancel" @click="fnDelCtgry(item.ctgryId)"><b>✕</b></button></li>
-          </ul>
+        <dd class="category-dd">
+          <label for="category" class="flex align-center">카테고리</label>
+          <category-list-component v-model="selectedCtgries" />
         </dd>
         <div class="hr"></div>
         <dd>
@@ -112,7 +108,6 @@
       </button>
     </div>
   </div>
-  <CategorySelectModal v-if="isModalOpen" :selectedCtgries="selectedCtgries" @toggleModal="fnToggleModal" @addCtgries="fnAddCtgries" />
   <div v-if="loading" class="loading-overlay">
     <div class="loading-spinner"></div>
     <div>
@@ -124,8 +119,9 @@
 <script>
 import { DoubleLeftOutlined, LeftOutlined, RightOutlined, DoubleRightOutlined } from '@ant-design/icons-vue';
 // COMPONENT
-import EditorComponent from '../../../component/editor/EditorComponent.vue';
-import CategorySelectModal from '../../../component/modal/CategorySelectModal.vue';
+import PrdctnSelectComponent from '@/views/component/PrdctnSelectComponent.vue';
+import EditorComponent from '@/views/component/editor/EditorComponent.vue';
+import CategoryListComponent from '@/views/component/CategoryListComponent.vue';
 // API
 import { findDcryProc, saveDcry, updateDcry } from '@/resources/api/dcry';
 
@@ -135,8 +131,11 @@
     LeftOutlined,
     RightOutlined,
     DoubleRightOutlined,
+    PrdctnSelectComponent,
+    // COMPONENT
+    PrdctnSelectComponent,
     EditorComponent,
-    CategorySelectModal,
+    CategoryListComponent,
   },
 
   data() {
@@ -150,7 +149,6 @@
 
       pageId: null,
 
-      isModalOpen: false,
       isDragging: false,
 
       fileNames: [],
@@ -167,6 +165,13 @@
         fileId: null,
         files: [],
         ctgryIds: [],
+      },
+
+      // 날짜 객체 (자식 컴포넌트와 동기화)
+      dateForm: {
+        year: new Date().getFullYear(),
+        month: '',
+        day: ''
       },
 
       multipartFiles: [],
@@ -190,7 +195,6 @@
     async fnFindDcry() {
       try {
         const response = await findDcryProc(this.pageId);
-
         if (response.data.data.dcry.ty !== 'P') {
           alert('올바른 접근이 아닙니다.');
           this.fnMoveTo('list'); // 목록으로 이동
@@ -226,23 +230,6 @@
       if (thumbFile) {
         this.selectedThumb = thumbFile.fileNm;
       }
-    },
-
-    // 카테고리 모달 열기/닫기
-    fnToggleModal() {
-      this.isModalOpen = !this.isModalOpen;
-    },
-
-    // 카테고리 등록
-    fnAddCtgries(selectedCtgries) {
-      this.selectedCtgries = [...this.selectedCtgries, ...selectedCtgries];
-
-      this.fnToggleModal(); // 카테고리 모달 닫기
-    },
-
-    // 카테고리 삭제
-    fnDelCtgry(id) {
-      this.selectedCtgries = this.selectedCtgries.filter(item => item.ctgryId !== id);
     },
 
     // 드래그 앤 드롭 이벤트 핸들러
@@ -371,16 +358,14 @@
         alert("제목을 입력해 주세요.");
         return;
       }
+
       if (!this.$isEmpty(this.requestDTO.prdctnYear)) {
         if (!/^\d+$/.test(this.requestDTO.prdctnYear)) {
           alert("생산연도는 숫자만 입력 가능합니다.");
           return;
         }
-        if (this.requestDTO.prdctnYear.length !== 4) {
-          alert("생산연도는 4자리로 입력해주세요.");
-          return;
-        }
       }
+
       if (this.$isEmpty(this.selectedThumb)) {
         alert("썸네일로 사용할 이미지를 선택해주세요.");
         return;
@@ -396,6 +381,7 @@
       }
 
       this.loading = true; // 로딩 시작
+
       try {
         const formData = new FormData();
 
@@ -491,11 +477,6 @@
         this.$router.push(routes['list']);
       }
     },
-
-    // 생산연도 입력 제한
-    onlyNumberInput() {
-      this.requestDTO.prdctnYear = this.requestDTO.prdctnYear.replace(/[^0-9]/g, '');
-    }
   }
 };
 </script>
client/views/pages/bbsDcryPhoto/PicHistorySearch.vue (Renamed from client/views/pages/bbsDcry/photo/PicHistorySearch.vue)
--- client/views/pages/bbsDcry/photo/PicHistorySearch.vue
+++ client/views/pages/bbsDcryPhoto/PicHistorySearch.vue
@@ -40,7 +40,7 @@
         </div>
         <div class="tab-content">
           <div v-if="searchResult.length > 0">
-            <CardStyleComponent v-if="selectedTabId === 'CARD'" :name="'P'" :list="searchResult" />
+            <gallery-style-component v-if="selectedTabId === 'CARD'" :name="'P'" :list="searchResult" />
             <ListStyleComponent v-if="selectedTabId === 'LIST'" :name="'P'" :list="searchResult" />
           </div>
           <div v-else class="no-results">
@@ -65,9 +65,9 @@
 <script>
 // COMPONENT
 import SearchFormComponent from '@/views/component/SearchFormComponent.vue';
-import CardStyleComponent from '@/views/component/listLayout/CardStyleComponent.vue';
+import GalleryStyleComponent from '@/views/component/listLayout/GalleryStyleComponent.vue';
 import ListStyleComponent from '@/views/component/listLayout/ListStyleComponent.vue';
-import DefaultPagination from '@/views/component/listLayout/DefaultPagination.vue';
+import DefaultPagination from '@/views/component/DefaultPagination.vue';
 // API
 import { findDcrysProc } from "@/resources/api/dcry";
 
@@ -75,7 +75,7 @@
   components: {
     SearchFormComponent,
     DefaultPagination,
-    CardStyleComponent,
+    GalleryStyleComponent,
     ListStyleComponent,
   },
 
client/views/pages/bbsDcryVideo/VideoHistoryDetail.vue (Renamed from client/views/pages/bbsDcry/video/VideoHistoryDetail.vue)
--- client/views/pages/bbsDcry/video/VideoHistoryDetail.vue
+++ client/views/pages/bbsDcryVideo/VideoHistoryDetail.vue
@@ -71,8 +71,8 @@
 </template>
 <script>
 // COMPONENT
-import VideoComponent from '../../../component/player/VideoComponent.vue';
-import ViewerComponent from '../../../component/editor/ViewerComponent.vue';
+import VideoComponent from '@/views/component/player/VideoComponent.vue';
+import ViewerComponent from '@/views/component/editor/ViewerComponent.vue';
 // API
 import { findDcryProc, deleteDcryProc } from '@/resources/api/dcry';
 import { fileDownloadProc } from '@/resources/api/file';
client/views/pages/bbsDcryVideo/VideoHistoryInsert.vue (Renamed from client/views/pages/bbsDcry/video/VideoHistoryInsert.vue)
--- client/views/pages/bbsDcry/video/VideoHistoryInsert.vue
+++ client/views/pages/bbsDcryVideo/VideoHistoryInsert.vue
@@ -21,7 +21,7 @@
         <div class="hr"></div>
         <dd>
           <label for="prdctnYear">생산연도</label>
-          <input type="text" id="prdctnYear" placeholder="생산연도를 입력하세요" v-model="requestDTO.prdctnYear" pattern="[0-9]{4}" maxlength="4" @input="onlyNumberInput">
+          <prdctn-select-component v-model="dateForm" :value="requestDTO.prdctnYear" @formatted-date="requestDTO.prdctnYear = $event" />
         </dd>
         <div class="hr"></div>
         <dd>
@@ -36,13 +36,9 @@
           </div>
         </dd>
         <div class="hr"></div>
-        <dd>
-          <label for="category" class="flex align-center">
-            <p>카테고리</p><button type="button" class="category-add" @click="fnToggleModal">추가하기</button>
-          </label>
-          <ul class="category">
-            <li v-for="(item, idx) of selectedCtgries" :key="idx">{{ item.ctgryNm }} <button type="button" class="cancel" @click="fnDelCtgry(item.ctgryId)"><b>✕</b></button></li>
-          </ul>
+        <dd class="category-dd">
+          <label for="category" class="flex align-center">카테고리</label>
+          <category-list-component v-model="selectedCtgries" />
         </dd>
         <div class="hr"></div>
         <dd>
@@ -53,7 +49,7 @@
               <div class="invalid-feedback"><img :src="erroricon" alt=""><span>첨부파일은 건당 최대 10GB를 초과할 수 없습니다.</span></div>
             </li>
             <li class="file-insert">
-              <input type="file" id="fileInput" ref="fileInput" class="file-input" accept="video/mp4,video/quicktime,video/x-msvideo,video/x-ms-wmv,video/webm,video/x-matroska" @change="handleFileSelect">
+              <input type="file" id="fileInput" ref="fileInput" class="file-input" accept="video/mp4,video/quicktime,video/x-msvideo,video/x-ms-wmv,video/webm,video/x-matroska,application/mxf" @change="handleFileSelect">
               <label for="fileInput" class="file-label mb-20" @dragover.prevent="handleDragOver" @dragleave.prevent="handleDragLeave" @drop.prevent="handleDrop" :class="{ 'drag-over': isDragging }">
                 <div class="flex-center align-center">
                   <img :src="fileicon" alt="">
@@ -100,13 +96,13 @@
       <p>잠시만 기다려주세요</p>
     </div>
   </div>
-  <CategorySelectModal v-if="isModalOpen" :selectedCtgries="selectedCtgries" @toggleModal="fnToggleModal" @addCtgries="fnAddCtgries" />
 </template>
 <script>
 import { DoubleLeftOutlined, LeftOutlined, RightOutlined, DoubleRightOutlined } from '@ant-design/icons-vue';
 // COMPONENT
-import EditorComponent from '../../../component/editor/EditorComponent.vue';
-import CategorySelectModal from '../../../component/modal/CategorySelectModal.vue';
+import PrdctnSelectComponent from '@/views/component/PrdctnSelectComponent.vue';
+import EditorComponent from '@/views/component/editor/EditorComponent.vue';
+import CategoryListComponent from '@/views/component/CategoryListComponent.vue';
 // API
 import { findDcryProc, saveDcry, updateDcry } from '@/resources/api/dcry';
 
@@ -116,8 +112,10 @@
     LeftOutlined,
     RightOutlined,
     DoubleRightOutlined,
+    // COMPONENT
+    PrdctnSelectComponent,
     EditorComponent,
-    CategorySelectModal,
+    CategoryListComponent,
   },
 
   data() {
@@ -131,7 +129,6 @@
 
       pageId: null,
 
-      isModalOpen: false,
       isDragging: false,
 
       fileNames: [],
@@ -148,6 +145,13 @@
         fileId: null,
         files: [],
         ctgryIds: [],
+      },
+
+      // 날짜 객체 (자식 컴포넌트와 동기화)
+      dateForm: {
+        year: new Date().getFullYear(),
+        month: '',
+        day: ''
       },
 
       multipartFiles: [],
@@ -201,23 +205,6 @@
       this.selectedCtgries = dcry.ctgrys.length > 0 ? dcry.ctgrys : [];
     },
 
-    // 카테고리 모달 열기/닫기
-    fnToggleModal() {
-      this.isModalOpen = !this.isModalOpen;
-    },
-
-    // 카테고리 등록
-    fnAddCtgries(selectedCtgries) {
-      this.selectedCtgries = [...this.selectedCtgries, ...selectedCtgries];
-
-      this.fnToggleModal(); // 카테고리 모달 닫기
-    },
-
-    // 카테고리 삭제
-    fnDelCtgry(id) {
-      this.selectedCtgries = this.selectedCtgries.filter(item => item.ctgryId !== id);
-    },
-
     // 드래그 앤 드롭 이벤트 핸들러
     handleDragOver(event) {
       this.isDragging = true;
@@ -242,7 +229,7 @@
 
     // 파일 업로드 처리 함수
     processFiles(files) {
-      const allowedTypes = ['mp4', 'mov', 'avi', 'wmv', 'mkv', 'webm']; // 영상 파일만 허용
+      const allowedTypes = ['mp4', 'mov', 'avi', 'wmv', 'mkv', 'webm', 'mxf']; // 'mxf' 추가
       const maxSize = 10 * 1024 * 1024 * 1024; // 10GB
 
       // 유효성 검사
@@ -257,7 +244,7 @@
 
         // 파일 타입 검증
         if (!allowedTypes.includes(fileType)) {
-          alert(`${file.name} 파일은 허용되지 않는 형식입니다. 영상 파일(mp4, mov, avi, wmv, mkv, webm)만 업로드 가능합니다.`);
+          alert(`${file.name} 파일은 허용되지 않는 형식입니다. 영상 파일(mp4, mov, avi, wmv, mkv, webm, mxf)만 업로드 가능합니다.`);
           this.resetFileInput(); // input 파일 목록 비움
           return;
         }
@@ -299,18 +286,16 @@
       // 공백제거
       this.requestDTO.sj = this.$processTitle(this.requestDTO.sj);
       this.requestDTO.adres = this.$processTitle(this.requestDTO.adres);
+
       // 유효성 검사
       if (this.$isEmpty(this.requestDTO.sj)) {
         alert("제목을 입력해 주세요.");
         return;
       }
+
       if (!this.$isEmpty(this.requestDTO.prdctnYear)) {
         if (!/^\d+$/.test(this.requestDTO.prdctnYear)) {
           alert("생산연도는 숫자만 입력 가능합니다.");
-          return;
-        }
-        if (this.requestDTO.prdctnYear.length !== 4) {
-          alert("생산연도는 4자리로 입력해주세요.");
           return;
         }
       }
@@ -325,6 +310,7 @@
       }
 
       this.loading = true; // 로딩 시작
+
       try {
         const formData = new FormData();
 
@@ -415,11 +401,6 @@
         this.$router.push(routes['list']);
       }
     },
-
-    // 생산연도 입력 제한
-    onlyNumberInput() {
-      this.requestDTO.prdctnYear = this.requestDTO.prdctnYear.replace(/[^0-9]/g, '');
-    }
   }
 };
 </script>
client/views/pages/bbsDcryVideo/VideoHistorySearch.vue (Renamed from client/views/pages/bbsDcry/video/VideoHistorySearch.vue)
--- client/views/pages/bbsDcry/video/VideoHistorySearch.vue
+++ client/views/pages/bbsDcryVideo/VideoHistorySearch.vue
@@ -67,7 +67,7 @@
 import SearchFormComponent from '@/views/component/SearchFormComponent.vue';
 import CardStyleComponent from '@/views/component/listLayout/CardStyleComponent.vue';
 import ListStyleComponent from '@/views/component/listLayout/ListStyleComponent.vue';
-import DefaultPagination from '@/views/component/listLayout/DefaultPagination.vue';
+import DefaultPagination from '@/views/component/DefaultPagination.vue';
 // API
 import { findDcrysProc } from "@/resources/api/dcry";
 
client/views/pages/bbsMediaVido/MediaVideoDetail.vue
--- client/views/pages/bbsMediaVido/MediaVideoDetail.vue
+++ client/views/pages/bbsMediaVido/MediaVideoDetail.vue
@@ -65,8 +65,8 @@
 </template>
 <script>
 // COMPONENT
-import YoutubeComponent from '../../component/player/YoutubeComponent.vue';
-import ViewerComponent from '../../component/editor/ViewerComponent.vue';
+import YoutubeComponent from '@/views/component/player/YoutubeComponent.vue';
+import ViewerComponent from '@/views/component/editor/ViewerComponent.vue';
 // API
 import { findMediaVidoProc, deleteMediaVidoProc } from '@/resources/api/mediaVido';
 import { fileDownloadProc } from '@/resources/api/file';
client/views/pages/bbsMediaVido/MediaVideoInsert.vue
--- client/views/pages/bbsMediaVido/MediaVideoInsert.vue
+++ client/views/pages/bbsMediaVido/MediaVideoInsert.vue
@@ -21,13 +21,13 @@
         <div class="hr"></div>
         <dd>
           <label for="prdctnYear">생산연도</label>
-          <input type="text" id="prdctnYear" placeholder="생산연도를 입력하세요" v-model="requestDTO.prdctnYear" pattern="[0-9]{4}" maxlength="4" @input="onlyNumberInput">
+          <prdctn-select-component v-model="dateForm" :value="requestDTO.prdctnYear" @formatted-date="requestDTO.prdctnYear = $event" />
         </dd>
         <div class="hr"></div>
         <dd>
           <label for="link">주소</label>
           <input type="text" id="link" class="invalid-url" placeholder="유튜브 URL 주소를 입력하세요" v-model="requestDTO.link">
-          <div class="invalid-feedback border">
+          <div class="invalid-feedback border" v-if="!isValidYoutubeURL && requestDTO.link">
             <img :src="erroricon" alt="">
             <span>유튜브 URL만 입력 가능합니다.</span>
           </div>
@@ -40,13 +40,9 @@
           </div>
         </dd>
         <div class="hr"></div>
-        <dd>
-          <label for="category" class="flex align-center">
-            <p>카테고리</p><button type="button" class="category-add" @click="fnToggleModal">추가하기</button>
-          </label>
-          <ul class="category">
-            <li v-for="(item, idx) of selectedCtgries" :key="idx">{{ item.ctgryNm }} <button type="button" class="cancel" @click="fnDelCtgry(item.ctgryId)"><b>✕</b></button></li>
-          </ul>
+        <dd class="category-dd">
+          <label for="category" class="flex align-center">카테고리</label>
+          <category-list-component v-model="selectedCtgries" />
         </dd>
       </dl>
     </form>
@@ -58,13 +54,13 @@
       </button>
     </div>
   </div>
-  <CategorySelectModal v-if="isModalOpen" :selectedCtgries="selectedCtgries" @toggleModal="fnToggleModal" @addCtgries="fnAddCtgries" />
 </template>
 <script>
 import { DoubleLeftOutlined, LeftOutlined, RightOutlined, DoubleRightOutlined } from '@ant-design/icons-vue';
 // COMPONENT
-import EditorComponent from '../../component/editor/EditorComponent.vue';
-import CategorySelectModal from '../../component/modal/CategorySelectModal.vue';
+import PrdctnSelectComponent from '@/views/component/PrdctnSelectComponent.vue';
+import EditorComponent from '@/views/component/editor/EditorComponent.vue';
+import CategoryListComponent from '@/views/component/CategoryListComponent.vue';
 // API
 import { findMediaVidoProc, saveMediaVidoProc, updateMediaVidoDcry } from '@/resources/api/mediaVido';
 
@@ -74,8 +70,10 @@
     LeftOutlined,
     RightOutlined,
     DoubleRightOutlined,
+    // COMPONENT
+    PrdctnSelectComponent,
     EditorComponent,
-    CategorySelectModal,
+    CategoryListComponent,
   },
 
   data() {
@@ -87,8 +85,6 @@
       searchicon: 'client/resources/images/icon/search.png',
 
       pageId: null,
-
-      isModalOpen: false,
       isDragging: false,
 
       // 등록/수정 요청 객체
@@ -102,9 +98,25 @@
         ctgryIds: [], // 카테고리 정보
       },
 
+      // 날짜 객체 (자식 컴포넌트와 동기화)
+      dateForm: {
+        year: new Date().getFullYear(),
+        month: '',
+        day: ''
+      },
+
       isValidYoutubeURL: true,
       selectedCtgries: [], // 카테고리 목록
     };
+  },
+
+  computed: {
+    // URL 유효성 검사
+    isValidYoutubeURL() {
+      if (!this.requestDTO.link) return true;
+      const youtubeRegex = /^(https?:\/\/)?(www\.)?(youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/shorts\/|youtube\.com\/embed\/)([a-zA-Z0-9_-]{11})(\S*)?$/;
+      return youtubeRegex.test(this.requestDTO.link);
+    }
   },
 
   created() {
@@ -140,48 +152,27 @@
       this.selectedCtgries = mediaVido.ctgrys.length > 0 ? mediaVido.ctgrys : [];
     },
 
-    // 카테고리 모달 열기/닫기
-    fnToggleModal() {
-      this.isModalOpen = !this.isModalOpen;
-    },
-
-    // 카테고리 등록
-    fnAddCtgries(selectedCtgries) {
-      this.selectedCtgries = [...this.selectedCtgries, ...selectedCtgries];
-
-      this.fnToggleModal(); // 카테고리 모달 닫기
-    },
-
-    // 카테고리 삭제
-    fnDelCtgry(id) {
-      this.selectedCtgries = this.selectedCtgries.filter(item => item.ctgryId !== id);
-    },
-
     // 등록
     async submitForm() {
       // 공백제거
       this.requestDTO.sj = this.$processTitle(this.requestDTO.sj);
+
       // 유효성 검사
       if (this.$isEmpty(this.requestDTO.sj)) {
         alert("제목을 입력해 주세요.");
         return;
       }
+
       if (!this.$isEmpty(this.requestDTO.prdctnYear)) {
         if (!/^\d+$/.test(this.requestDTO.prdctnYear)) {
           alert("생산연도는 숫자만 입력 가능합니다.");
           return;
         }
-        if (this.requestDTO.prdctnYear.length !== 4) {
-          alert("생산연도는 4자리로 입력해주세요.");
-          return;
-        }
       }
-      if (!this.$isEmpty(this.requestDTO.link)) {
-        const youtubeRegex = /^(https?:\/\/)?(www\.)?(youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/shorts\/|youtube\.com\/embed\/)([a-zA-Z0-9_-]{11})(\S*)?$/;
-        if (!youtubeRegex.test(this.requestDTO.link)) {
-          alert("주소는 유튜브 URL만 입력 가능합니다.");
-          return;
-        }
+
+      if (!this.$isEmpty(this.requestDTO.link) && !this.isValidYoutubeURL) {
+        alert("주소는 유튜브 URL만 입력 가능합니다.");
+        return;
       }
 
       try {
@@ -193,7 +184,10 @@
         this.requestDTO.ctgryIds = this.selectedCtgries.map(ctgry => ctgry.ctgryId);
 
         // API 통신
-        const response = this.$isEmpty(this.pageId) ? await saveMediaVidoProc(this.requestDTO) : await updateMediaVidoDcry(this.requestDTO);
+        const response = this.$isEmpty(this.pageId)
+          ? await saveMediaVidoProc(this.requestDTO)
+          : await updateMediaVidoDcry(this.requestDTO);
+
         let id = response.data.data.mediaVidoId;
         alert(this.$isEmpty(this.pageId) ? "등록되었습니다." : "수정되었습니다.");
 
@@ -225,11 +219,6 @@
         alert("올바르지 않은 경로를 요청하여 목록으로 이동합니다.");
         this.$router.push(routes['list']);
       }
-    },
-
-    // 생산연도 입력 제한
-    onlyNumberInput() {
-      this.requestDTO.prdctnYear = this.requestDTO.prdctnYear.replace(/[^0-9]/g, '');
     },
   }
 };
client/views/pages/bbsMediaVido/MediaVideoSearch.vue
--- client/views/pages/bbsMediaVido/MediaVideoSearch.vue
+++ client/views/pages/bbsMediaVido/MediaVideoSearch.vue
@@ -66,7 +66,7 @@
 import SearchFormComponent from '@/views/component/SearchFormComponent.vue';
 import CardStyleComponent from '@/views/component/listLayout/CardStyleComponent.vue';
 import ListStyleComponent from '@/views/component/listLayout/ListStyleComponent.vue';
-import DefaultPagination from '@/views/component/listLayout/DefaultPagination.vue';
+import DefaultPagination from '@/views/component/DefaultPagination.vue';
 // API
 import { findAllMediaVidosProc } from "@/resources/api/mediaVido";
 
client/views/pages/bbsNesDta/NewsReleaseInsert.vue
--- client/views/pages/bbsNesDta/NewsReleaseInsert.vue
+++ client/views/pages/bbsNesDta/NewsReleaseInsert.vue
@@ -22,7 +22,7 @@
         <div class="hr"></div>
         <dd>
           <label for="prdctnYear">생산연도</label>
-          <input type="text" id="prdctnYear" placeholder="생산연도를 입력하세요" v-model="requestDTO.prdctnYear" pattern="[0-9]{4}" maxlength="4" @input="onlyNumberInput">
+          <prdctn-select-component v-model="dateForm" :value="requestDTO.prdctnYear" @formatted-date="requestDTO.prdctnYear = $event" />
         </dd>
         <div class="hr"></div>
         <dd>
@@ -37,13 +37,9 @@
           </div>
         </dd>
         <div class="hr"></div>
-        <dd>
-          <label for="category" class="flex align-center">
-            <p>카테고리</p><button type="button" class="category-add" @click="fnToggleModal">추가하기</button>
-          </label>
-          <ul class="category">
-            <li v-for="(item, idx) of selectedCtgries" :key="idx">{{ item.ctgryNm }} <button type="button" class="cancel" @click="fnDelCtgry(item.ctgryId)"><b>✕</b></button></li>
-          </ul>
+        <dd class="category-dd">
+          <label for="category" class="flex align-center">카테고리</label>
+          <category-list-component v-model="selectedCtgries" />
         </dd>
         <div class="hr"></div>
         <dd>
@@ -95,13 +91,13 @@
       </button>
     </div>
   </div>
-  <CategorySelectModal v-if="isModalOpen" :selectedCtgries="selectedCtgries" @toggleModal="fnToggleModal" @addCtgries="fnAddCtgries" />
 </template>
 <script>
 import { DoubleLeftOutlined, LeftOutlined, RightOutlined, DoubleRightOutlined } from '@ant-design/icons-vue';
 // COMPONENT
+import PrdctnSelectComponent from '@/views/component/PrdctnSelectComponent.vue';
 import EditorComponent from '@/views/component/editor/EditorComponent.vue';
-import CategorySelectModal from '@/views/component/modal/CategorySelectModal.vue';
+import CategoryListComponent from '@/views/component/CategoryListComponent.vue';
 // API
 import { findNesDtaProc, saveNesDtaProc, updateNesDtaProc } from '@/resources/api/nesDta';
 
@@ -111,8 +107,10 @@
     LeftOutlined,
     RightOutlined,
     DoubleRightOutlined,
+    // COMPONENT
+    PrdctnSelectComponent,
     EditorComponent,
-    CategorySelectModal,
+    CategoryListComponent,
   },
 
   data() {
@@ -126,7 +124,6 @@
 
       pageId: null,
 
-      isModalOpen: false,
       isDragging: false,
 
       fileNames: [],
@@ -142,6 +139,13 @@
         fileId: null,
         files: [],
         ctgryIds: [],
+      },
+
+      // 날짜 객체 (자식 컴포넌트와 동기화)
+      dateForm: {
+        year: new Date().getFullYear(),
+        month: '',
+        day: ''
       },
 
       multipartFiles: [],
@@ -184,23 +188,6 @@
 
       this.multipartFiles = [];
       this.selectedCtgries = nesDta.ctgrys.length > 0 ? nesDta.ctgrys : [];
-    },
-
-    // 카테고리 모달 열기/닫기
-    fnToggleModal() {
-      this.isModalOpen = !this.isModalOpen;
-    },
-
-    // 카테고리 등록
-    fnAddCtgries(selectedCtgries) {
-      this.selectedCtgries = [...this.selectedCtgries, ...selectedCtgries];
-
-      this.fnToggleModal(); // 카테고리 모달 닫기
-    },
-
-    // 카테고리 삭제
-    fnDelCtgry(id) {
-      this.selectedCtgries = this.selectedCtgries.filter(item => item.ctgryId !== id);
     },
 
     // 드래그 앤 드롭 이벤트 핸들러
@@ -283,21 +270,20 @@
     async submitForm() {
       // 공백제거
       this.requestDTO.sj = this.$processTitle(this.requestDTO.sj);
+
       // 유효성 검사
       if (this.$isEmpty(this.requestDTO.sj)) {
         alert("제목을 입력해 주세요.");
         return;
       }
+
       if (!this.$isEmpty(this.requestDTO.prdctnYear)) {
         if (!/^\d+$/.test(this.requestDTO.prdctnYear)) {
           alert("생산연도는 숫자만 입력 가능합니다.");
           return;
         }
-        if (this.requestDTO.prdctnYear.length !== 4) {
-          alert("생산연도는 4자리로 입력해주세요.");
-          return;
-        }
       }
+
       if (!this.$isEmpty(this.requestDTO.link)) {
         const urlRegex = /^(https?:\/\/)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)$/;
         if (!urlRegex.test(this.requestDTO.link)) {
@@ -394,11 +380,6 @@
         this.$router.push(routes['list']);
       }
     },
-
-    // 생산연도 입력 제한
-    onlyNumberInput() {
-      this.requestDTO.prdctnYear = this.requestDTO.prdctnYear.replace(/[^0-9]/g, '');
-    }
   }
 };
 </script>
client/views/pages/bbsNesDta/NewsReleaseSearch.vue
--- client/views/pages/bbsNesDta/NewsReleaseSearch.vue
+++ client/views/pages/bbsNesDta/NewsReleaseSearch.vue
@@ -67,7 +67,7 @@
 import SearchFormComponent from '@/views/component/SearchFormComponent.vue';
 import CardStyleComponent from '@/views/component/listLayout/CardStyleComponent.vue';
 import ListStyleComponent from '@/views/component/listLayout/ListStyleComponent.vue';
-import DefaultPagination from '@/views/component/listLayout/DefaultPagination.vue';
+import DefaultPagination from '@/views/component/DefaultPagination.vue';
 // API
 import { findAllNesDtasProc } from "@/resources/api/nesDta";
 
client/views/pages/main/Main.vue
--- client/views/pages/main/Main.vue
+++ client/views/pages/main/Main.vue
@@ -10,35 +10,24 @@
       <div class="swiper-button-prev"></div>
       <div class="pagination_container">
         <div class="swiper-pagination"></div>
-       <div class="flex align-center" >
+        <div class="flex align-center">
           <div class="swiper-pagination2"></div>
-          <button class="swiper-play-pause-btn" @click="toggleAutoplay"><component :is="isAutoplay ? 'PauseOutlined' : 'CaretRightOutlined'" /></button>
-       </div>
+          <button class="swiper-play-pause-btn" @click="toggleAutoplay">
+            <component :is="isAutoplay ? 'PauseOutlined' : 'CaretRightOutlined'" />
+          </button>
+        </div>
       </div>
     </div>
-    <!-- <swiper ref="swiper" :loop="true" :spaceBetween="30" :centeredSlides="true" :autoplay="{
-      delay: 2500,
-      disableOnInteraction: false,
-    }" :pagination="{
-      type: ['fraction', 'progressbar'], progressbarOpposite: true,
-    }" :navigation="true" :modules="modules" class="mySwiper" :allowTouchMove="false">
-      <swiper-slide v-for="(item, index) in slides" :key="index">
-        <img :src="item.img" :alt="item.alt" />
-      </swiper-slide>
-    </swiper> -->
     <div class="search-wrap">
       <div class="search-area">
         <div class="custom-select" @click="toggleDropdown">
-  <div class="selected-option">{{ getSelectedText }}</div>
-  <ul v-if="isDropdownOpen" class="select-options">
-    <li v-for="option in options" :key="option.value" @click.stop="selectOption(option)">
-      {{ option.text }}
-    </li>
-  </ul>
-</div>
+          <div class="selected-option">{{ getSelectedText }}</div>
+          <ul v-if="isDropdownOpen" class="select-options">
+            <li v-for="option in options" :key="option.value" @click.stop="selectOption(option)"> {{ option.text }} </li>
+          </ul>
+        </div>
         <div class="line"></div>
-        <div style="width: 60%;"><input type="text" placeholder="검색어를 입력하세요" v-model="searchText"
-            @keyup.enter="fnMoveTo('TotalSearch')"></div>
+        <div style="width: 60%;"><input type="text" placeholder="검색어를 입력하세요" v-model="searchText" @keyup.enter="fnMoveTo('TotalSearch')"></div>
         <button type="button" class="search-btn" @click="fnMoveTo('TotalSearch')"><img :src="search" alt=""></button>
       </div>
       <div class="total-search">
@@ -52,7 +41,6 @@
         <div><span>기록물 현황</span></div>
       </div>
       <ul>
-
         <template v-for="(item, idx) of icons" :key="idx">
           <li @click="fnMoveTo(item.routeName)">
             <div class="labeling"><img :src="item.url" :alt="item.name + '아이콘'"><span>{{ item.name }}</span></div>
@@ -61,46 +49,36 @@
           <li class="line" v-if="idx < icons.length - 1"></li>
         </template>
       </ul>
-
     </div>
   </div>
-  <div class="new-update w1500 mb-50">
-    <div class="tabs">
-      <ul class="">
-        <li v-for="(tab, index) in tabs" :key="index" class="tab-title" :class="{ active: selectedTab === tab.id }"
-          @click="selectTab(tab.id)">
-          <img :src="selectedTab === tab.id ? tab.activeImage : tab.inactiveImage" :alt="tab.title" class="tab-icon" />
-          <p><b>{{ tab.title }}</b>&nbsp;기록물</p>
-        </li>
-      </ul>
+  <div class="new-update w1500">
+    <div v-for="(tab, index) in tabs" :key="index" class="tabs mb-50">
+      <div class="title mb-30">
+        <h4>{{ tab.title }}</h4>
+        <button type="button" class="gopage" @click="fnMoveTo(tab.contents.search)">더보기</button>
+      </div>
       <div class="tab-content">
-        <template v-for="(tabContent, idx1) of tabContents" :key="idx1">
-          <div v-show="tabContent.id === selectedTab" class="content-wrap">
-            <div style="text-align: right;">
-              <button type="button" class="gopage" @click="fnMoveTo(tabContent.search)">더보기</button>
-            </div>
-            <div class="new-pic">
-              <div v-for="(item, idx2) in tabContent.list" :key="idx2" class="box-wrap">
-                <div class="box" @click="fnMoveTo(tabContent.view, item.dcryId)">
-                  <div class="img-area"><img :src="item.thumbnail.filePath" :alt="item.sj" class="tab-image" /></div>
-                  <div class="info">
-                    <p>{{ item.sj }}</p>
-                    <span>{{ $dotFormatDate(item.rgsde) }}</span>
-                  </div>
-                </div>
+        <div class="new-pic">
+          <div v-for="(item, idx2) in tab.contents.list" :key="idx2" class="box-wrap">
+            <div class="box" @click="fnMoveTo(tab.contents.view, item.dcryId)">
+              <div class="img-area">
+                <img :src="item.thumbnail.filePath" :alt="item.sj" class="tab-image" />
               </div>
-              <!-- 게시물이 없는 경우 -->
-              <div v-for="i in Math.max(0, 3 - tabContent.list.length)" :key="`empty-${i}`" class="box-wrap">
-                <div class="box">
-                  <div class="img-area"><img :src="noimg" class="tab-image" /></div>
-                  <div class="info">
-                    <p>등록된 게시물이 없습니다.</p>
-                  </div>
-                </div>
+              <div class="info">
+                <p>{{ item.sj }}</p>
+                <span>{{ $dotFormatDate(item.rgsde) }}</span>
               </div>
             </div>
           </div>
-        </template>
+          <div v-for="i in Math.max(0, 3 - tab.contents.list.length)" :key="`empty-${i}`" class="box-wrap">
+            <div class="box">
+              <div class="img-area"><img :src="noimg" class="tab-image" /></div>
+              <div class="info">
+                <p>등록된 게시물이 없습니다.</p>
+              </div>
+            </div>
+          </div>
+        </div>
       </div>
     </div>
   </div>
@@ -157,11 +135,6 @@
 import 'swiper/css';
 import Swiper from 'swiper/bundle';
 
-// Import Swiper Vue components
-// import { Swiper, SwiperSlide } from 'swiper/vue';
-// import 'swiper/css';
-// import 'swiper/css/pagination';
-// import 'swiper/css/navigation';
 import { Autoplay, Pagination, Navigation } from 'swiper/modules';
 import { CaretRightOutlined, PauseOutlined } from '@ant-design/icons-vue';
 
@@ -179,13 +152,13 @@
   setup() {
     const swiperContainer = ref(null);
     const slides = [
-        { img: 'client/resources/images/visual.png', alt: 'Slide 1' },
-        { img: 'client/resources/images/visual.png', alt: 'Slide 2' },
-        { img: 'client/resources/images/visual.png', alt: 'Slide 3' },
-        // Add more slides as needed
-      ];
-      const isAutoplay = ref(true); // Tracks the autoplay state
-      let swiperInstance = null;
+      { img: 'client/resources/images/visual.png', alt: 'Slide 1' },
+      { img: 'client/resources/images/visual.png', alt: 'Slide 2' },
+      { img: 'client/resources/images/visual.png', alt: 'Slide 3' },
+      // Add more slides as needed
+    ];
+    const isAutoplay = ref(true); // Tracks the autoplay state
+    let swiperInstance = null;
 
     onMounted(() => {
       // Main Swiper with Fraction Pagination
@@ -233,6 +206,7 @@
       isAutoplay,
     };
   },
+
   data() {
     return {
       noimg: "client/resources/images/no_img.png",
@@ -244,29 +218,26 @@
       tabs: [
         {
           id: "newPhoto",
-          title: "신규 사진",
-          activeImage: "client/resources/images/mCont_ico1_on.png", // Active tab image
-          inactiveImage: "client/resources/images/mCont_ico1_off.png",
+          title: "신규 사진 기록물",
+          contents: { list: [], search: 'PicHistorySearch', view: 'PicHistoryDetail' },
         },
         {
           id: "newVideo",
-          title: "신규 영상",
-          activeImage: "client/resources/images/mCont_ico2_on.png", // Active tab image
-          inactiveImage: "client/resources/images/mCont_ico2_off.png",
+          title: "신규 영상 기록물",
+          contents: { list: [], search: 'VideoHistorySearch', view: 'VideoHistoryDetail' },
         },
       ],
-      tabContents: [], // 신규 사진, 영상 기록물
       mediaContents: [], // 신규 미디어 영상
       bodoContents: [], // 신규 스크랩 자료
       searchRecord: 'all', // 통합검색 Selectbox 내용
       isDropdownOpen: false,
-    options: [
-      { value: 'all', text: '전체' },
-      { value: 'pic', text: '사진' },
-      { value: 'video', text: '영상' },
-      { value: 'media', text: '미디어 영상' },
-      { value: 'bodo', text: '스크랩 자료' },
-    ],
+      options: [
+        { value: 'all', text: '전체' },
+        { value: 'pic', text: '사진' },
+        { value: 'video', text: '영상' },
+        { value: 'media', text: '미디어 영상' },
+        { value: 'bodo', text: '스크랩 자료' },
+      ],
       searchText: null, // 통합검색 Input 내용
       icons: [
         {
@@ -307,25 +278,25 @@
       navigation: true, // Enable navigation buttons (prev/next)
     };
   },
+
+  computed: {
+    getSelectedText() {
+      const selected = this.options.find(opt => opt.value === this.searchRecord);
+      return selected ? selected.text : '';
+    }
+  },
+
   created() {
     this.fnFindAllSttuses();
   },
-  computed: {
-  getSelectedText() {
-    const selected = this.options.find(opt => opt.value === this.searchRecord);
-    return selected ? selected.text : '';
-  }
-},
+
   methods: {
     toggleDropdown() {
-    this.isDropdownOpen = !this.isDropdownOpen;
-  },
-  selectOption(option) {
-    this.searchRecord = option.value;
-    this.isDropdownOpen = false;
-  },
-    selectTab(index) {
-      this.selectedTab = index; // Update the selected tab index
+      this.isDropdownOpen = !this.isDropdownOpen;
+    },
+    selectOption(option) {
+      this.searchRecord = option.value;
+      this.isDropdownOpen = false;
     },
 
     // 메인화면 정보 조회
@@ -340,10 +311,10 @@
           });
 
           let photoDcrys = response.data.data.photoDcrys;
-          this.tabContents.push({ id: 'newPhoto', list: photoDcrys, search: 'PicHistorySearch', view: 'PicHistoryDetail' });
+          this.tabs[0].contents = { id: 'newPhoto', list: photoDcrys, search: 'PicHistorySearch', view: 'PicHistoryDetail' };
 
           let vidoDcrys = response.data.data.vidoDcrys;
-          this.tabContents.push({ id: 'newVideo', list: vidoDcrys, search: 'VideoHistorySearch', view: 'VideoHistoryDetail' });
+          this.tabs[1].contents = { id: 'newVideo', list: vidoDcrys, search: 'VideoHistorySearch', view: 'VideoHistoryDetail' };
 
           let mediaVidos = response.data.data.mediaVidos;
           this.mediaContents = this.onChangeList(mediaVidos);
client/views/pages/main/TotalSearch.vue
--- client/views/pages/main/TotalSearch.vue
+++ client/views/pages/main/TotalSearch.vue
@@ -29,8 +29,8 @@
 </template>
 <script>
 // COMPONENT
-import SearchFormComponent from '../../component/SearchFormComponent.vue';
-import CardViewList from "../../component/listLayout/CardViewList.vue";
+import SearchFormComponent from '@/views/component/SearchFormComponent.vue';
+import CardViewList from "../../component/CardViewList.vue";
 // API
 import { findAllDatas } from "../../../resources/api/main"; // 통합 검색
 
Add a comment
List