박정하 박정하 03-24
250324 박정하 통합검색 수정
@799e982d5f175a7dadbc1d35678646029626623b
client/resources/api/category.js
--- client/resources/api/category.js
+++ client/resources/api/category.js
@@ -1,6 +1,6 @@
 import apiClient from "./index";
 
-// 카테고리 목록 조회
-export const findAllCategoryProc = mber => {
-    return apiClient.post(`/category/findAllCategory.json`, mber);
+// 카테고리 목록 조회 (검색조건 없음)
+export const findAllCategoryProc = () => {
+  return apiClient.get(`/category/findAllByNull.json`);
 }
(파일 끝에 줄바꿈 문자 없음)
 
client/resources/api/dcry.js (added)
+++ client/resources/api/dcry.js
@@ -0,0 +1,14 @@
+import apiClient from "./index";
+
+// 기록물 목록 조회
+export const findAllDatas = (searchReqDTO) => {
+  return apiClient.get(`/main/findAllDatas.json`, { params: searchReqDTO });
+}
+
+// 기록물 상세 조회
+
+// 기록물 등록
+
+// 기록물 수정
+
+// 기록물 삭제(파일 끝에 줄바꿈 문자 없음)
client/resources/api/main.js
--- client/resources/api/main.js
+++ client/resources/api/main.js
@@ -7,5 +7,5 @@
 
 // 통합 검색
 export const findAllDatas = (searchReqDTO) => {
-  return apiClient.get(`/main/findAllDatas.json`, { params: { searchReqDTO: JSON.stringify(searchReqDTO) } });
+  return apiClient.get(`/main/findAllDatas.json`, { params: searchReqDTO });
 }
(파일 끝에 줄바꿈 문자 없음)
client/views/pages/main/Main.vue
--- client/views/pages/main/Main.vue
+++ client/views/pages/main/Main.vue
@@ -31,11 +31,11 @@
           <option value="bodo">보도자료</option>
         </select>
         <div class="line"></div>
-        <input type="text" placeholder="검색어를 입력하세요">
+        <input type="text" placeholder="검색어를 입력하세요" v-model="searchText">
         <button class="search-btn"><img :src="search" alt=""></button>
       </div>
       <div class="total-search">
-        <button class="total-btn" @click="fnMoveTo('TotalSearch')"><a href="">상세검색</a></button>
+        <button class="total-btn" @click="fnMoveTo('TotalSearch')">상세검색</button>
       </div>
     </div>
   </div>
@@ -170,6 +170,8 @@
       noimg: "client/resources/images/no_img.png",
       nomedia: "client/resources/images/no_media.png",
       nobodo: "client/resources/images/no_bodo.png",
+      direct: 'client/resources/images/direct-btn.png',
+      search: 'client/resources/images/icon/search.png',
       selectedTab: "newPhoto", // Set initial tab index to 신규사진기록물 (first tab)
       tabs: [
         {
@@ -188,8 +190,7 @@
       tabContents: [], // 신규 사진, 영상 기록물
       mediaContent: [], // 신규 미디어 영상
       bodoContent: [], // 신규 보도자료
-      direct: 'client/resources/images/direct-btn.png',
-      search: 'client/resources/images/icon/search.png',
+      searchText: null, // 통합검색 Input 내용
       icons: [
         {
           id: "TOTAL",
@@ -320,9 +321,14 @@
 
     // 페이지 이동
     fnMoveTo(page) {
+      let params = null;
+      if (page === 'TotalSearch') {
+        params = { searchText: this.searchText };
+      }
+
       this.$router.push({
         name: page,
-        query: {},
+        query: params,
       });
     }
   },
client/views/pages/user/PicHistoryInsert.vue
--- client/views/pages/user/PicHistoryInsert.vue
+++ client/views/pages/user/PicHistoryInsert.vue
@@ -1,158 +1,149 @@
 <template>
-    <div class="content">
-        <div class="sub-title-area mb-30">
-            <h2>사진 기록물</h2>
-            <div class="breadcrumb-list">
-                <ul>
-                    <li><img :src="homeicon" alt="Home Icon">
-                        <p>기록물</p>
-                    </li>
-                    <li><img :src="righticon" alt=""></li>
-                    <li>사진 기록물</li>
-                </ul>
-            </div>
-        </div>
-        <form action="" class="insert-form mb-50">
-            <dl>
-                <dd>
-                    <label for="id" class="require">제목</label>
-                    <div class="wfull"><input type="text" id="id" value="" placeholder="제목을 입력하세요."></div>
-                </dd>
-                <div class="hr"></div>
-                <dd>
-                    <label for="year">생산연도</label>
-                    <input type="text" id="year" value="" placeholder="생산연도를 입력하세요">
-
-                </dd>
-                <div class="hr"></div>
-                <dd>
-                    <label for="address">주소</label>
-                    <div class="wfull"><input type="text" id="address" value="" placeholder="주소를 입력하세요"></div>
-
-                </dd>
-                <div class="hr"></div>
-                <dd>
-                    <label for="text">내용</label>
-                    <textarea name="" id=""></textarea>
-
-                </dd>
-                <div class="hr"></div>
-                <dd>
-                    <label for="category" class="flex align-center">
-                        <p>카테고리</p><button type="button" class="category-add" @click="openModal">추가하기</button>
-                    </label>
-                    <ul class="category">
-                        <li class="category1">카테고리1 <button class="cancel"><b>✕</b></button></li>
-                        <li class="category2">카테고리2 <button class="cancel"><b>✕</b></button></li>
-                    </ul>
-
-                </dd>
-                <div class="hr"></div>
-                <dd>
-                    <label for="file" class="require">파일</label>
-                    <ul class="wfull">
-                        <li class="flex align-center">
-                            <p>파일첨부</p>
-                            <div class="invalid-feedback"><img :src="erroricon" alt=""><span>첨부파일은 10건까지 등록 가능하며, 건당 최대
-                                    100MB를 초과할 수 없습니다.</span></div>
-                        </li>
-                        <li class="file-insert">
-                            <input type="file" id="fileInput" class="file-input" multiple @change="showFileNames">
-                            <label for="fileInput" class="file-label mb-20">
-                                <div class="flex-center align-center"><img :src="fileicon" alt="">
-                                    <p>파일첨부하기</p>
-                                </div>
-                                <p>파일을 첨부하시려면 이 영역으로 파일을 끌고 오거나 클릭해주세요</p>
-                            </label>
-                            <p class="mb-10">파일목록</p>
-                            <div id="fileNames" class="file-names">
-                                <span v-if="fileNames.length === 0">선택된 파일이 없습니다.</span>
-                                <div v-for="(file, index) in fileNames" :key="index" class="flex-sp-bw mb-5 file-wrap">
-                                    <div class="file-name">
-                                        <!-- Corrected here: Use file.icon instead of fileicons.img -->
-                                        <img :src="file.icon" alt="fileicon">
-                                        <p>{{ file.name }}</p>
-                                    </div>
-                                    <button type="button" class="cancel" @click="removeFile(index)"><b>✕</b></button>
-                                </div>
-                            </div>
-                        </li>
-
-                    </ul>
-
-                </dd>
-            </dl>
-        </form>
-
-        <div class="btn-group flex-center">
-            <button class="cancel">취소</button>
-            <button class="register">등록</button>
-        </div>
+  <div class="content">
+    <div class="sub-title-area mb-30">
+      <h2>사진 기록물</h2>
+      <div class="breadcrumb-list">
+        <ul>
+          <li><img :src="homeicon" alt="Home Icon">
+            <p>기록물</p>
+          </li>
+          <li><img :src="righticon" alt=""></li>
+          <li>사진 기록물</li>
+        </ul>
+      </div>
     </div>
-    <div v-if="isModalOpen" class="modal-overlay" @click="closeModal">
-        <div class="modal-content" @click.stop>
-            <h2>모달 제목</h2>
-            <p>모달의 내용이 여기에 들어갑니다.</p>
-            <button @click="closeModal">닫기</button>
-        </div>
+    <form action="" class="insert-form mb-50">
+      <dl>
+        <dd>
+          <label for="id" class="require">제목</label>
+          <div class="wfull"><input type="text" id="id" value="" placeholder="제목을 입력하세요."></div>
+        </dd>
+        <div class="hr"></div>
+        <dd>
+          <label for="year">생산연도</label>
+          <input type="text" id="year" value="" placeholder="생산연도를 입력하세요">
+        </dd>
+        <div class="hr"></div>
+        <dd>
+          <label for="address">주소</label>
+          <div class="wfull"><input type="text" id="address" value="" placeholder="주소를 입력하세요"></div>
+        </dd>
+        <div class="hr"></div>
+        <dd>
+          <label for="text">내용</label>
+          <textarea name="" id=""></textarea>
+        </dd>
+        <div class="hr"></div>
+        <dd>
+          <label for="category" class="flex align-center">
+            <p>카테고리</p><button type="button" class="category-add" @click="openModal">추가하기</button>
+          </label>
+          <ul class="category">
+            <li class="category1">카테고리1 <button class="cancel"><b>✕</b></button></li>
+            <li class="category2">카테고리2 <button class="cancel"><b>✕</b></button></li>
+          </ul>
+        </dd>
+        <div class="hr"></div>
+        <dd>
+          <label for="file" class="require">파일</label>
+          <ul class="wfull">
+            <li class="flex align-center">
+              <p>파일첨부</p>
+              <div class="invalid-feedback"><img :src="erroricon" alt=""><span>첨부파일은 10건까지 등록 가능하며, 건당 최대 100MB를 초과할 수 없습니다.</span></div>
+            </li>
+            <li class="file-insert">
+              <input type="file" id="fileInput" class="file-input" multiple @change="showFileNames">
+              <label for="fileInput" class="file-label mb-20">
+                <div class="flex-center align-center"><img :src="fileicon" alt="">
+                  <p>파일첨부하기</p>
+                </div>
+                <p>파일을 첨부하시려면 이 영역으로 파일을 끌고 오거나 클릭해주세요</p>
+              </label>
+              <p class="mb-10">파일목록</p>
+              <div id="fileNames" class="file-names">
+                <span v-if="fileNames.length === 0">선택된 파일이 없습니다.</span>
+                <div v-for="(file, index) in fileNames" :key="index" class="flex-sp-bw mb-5 file-wrap">
+                  <div class="file-name">
+                    <!-- Corrected here: Use file.icon instead of fileicons.img -->
+                    <img :src="file.icon" alt="fileicon">
+                    <p>{{ file.name }}</p>
+                  </div>
+                  <button type="button" class="cancel" @click="removeFile(index)"><b>✕</b></button>
+                </div>
+              </div>
+            </li>
+          </ul>
+        </dd>
+      </dl>
+    </form>
+    <div class="btn-group flex-center">
+      <button class="cancel">취소</button>
+      <button class="register">등록</button>
     </div>
+  </div>
+  <div v-if="isModalOpen" class="modal-overlay" @click="closeModal">
+    <div class="modal-content" @click.stop>
+      <h2>모달 제목</h2>
+      <p>모달의 내용이 여기에 들어갑니다.</p>
+      <button @click="closeModal">닫기</button>
+    </div>
+  </div>
 </template>
-
 <script>
 export default {
-    data() {
-        return {
-            isModalOpen: false,
-            // Define the image sources
-            homeicon: 'client/resources/images/icon/home.png',
-            erroricon: 'client/resources/images/icon/error.png',
-            righticon: 'client/resources/images/icon/right.png',
-            fileicon: 'client/resources/images/icon/file.png',
-            fileNames: [],
-        };
-    },
-    methods: {
-        showFileNames(event) {
-            const files = event.target.files;
-            this.fileNames = [];  // Clear previous file names
+  data() {
+    return {
+      isModalOpen: false,
+      // Define the image sources
+      homeicon: 'client/resources/images/icon/home.png',
+      erroricon: 'client/resources/images/icon/error.png',
+      righticon: 'client/resources/images/icon/right.png',
+      fileicon: 'client/resources/images/icon/file.png',
+      fileNames: [],
+    };
+  },
+  methods: {
+    showFileNames(event) {
+      const files = event.target.files;
+      this.fileNames = [];  // Clear previous file names
 
-            for (let i = 0; i < files.length; i++) {
-                const file = files[i];
-                const fileType = file.name.split('.').pop().toLowerCase();  // Get file extension
+      for (let i = 0; i < files.length; i++) {
+        const file = files[i];
+        const fileType = file.name.split('.').pop().toLowerCase();  // Get file extension
 
-                // Set default icon
-                let iconPath = this.fileicons;
+        // Set default icon
+        let iconPath = this.fileicons;
 
-                // Determine the icon based on file type
-                if (['jpg', 'jpeg', 'png', 'gif'].includes(fileType)) {
-                    iconPath = 'client/resources/images/icon/imgicon.png';  // Example for image files
-                } else if (['pdf'].includes(fileType)) {
-                    iconPath = 'client/resources/images/icon/pdficon.png';  // Example for PDF files
-                } else if (['xls'].includes(fileType)) {
-                    iconPath = 'client/resources/images/icon/excelicon.png';  // Example for audio files
-                } else if (['hwp'].includes(fileType)) {
-                    iconPath = 'client/resources/images/icon/hwpicon.png';  // Example for video files
-                }
-
-                // Push the file name and corresponding icon to the fileNames array
-                this.fileNames.push({
-                    name: file.name,
-                    icon: iconPath
-                });
-            }
-        },
-        removeFile(index) {
-            // Remove file from the list
-            this.fileNames.splice(index, 1);
-            console.log(removeFile)
-        },
-        openModal() {
-            this.isModalOpen = true;
-        },
-        // 모달 닫기
-        closeModal() {
-            this.isModalOpen = false;
+        // Determine the icon based on file type
+        if (['jpg', 'jpeg', 'png', 'gif'].includes(fileType)) {
+          iconPath = 'client/resources/images/icon/imgicon.png';  // Example for image files
+        } else if (['pdf'].includes(fileType)) {
+          iconPath = 'client/resources/images/icon/pdficon.png';  // Example for PDF files
+        } else if (['xls'].includes(fileType)) {
+          iconPath = 'client/resources/images/icon/excelicon.png';  // Example for audio files
+        } else if (['hwp'].includes(fileType)) {
+          iconPath = 'client/resources/images/icon/hwpicon.png';  // Example for video files
         }
+
+        // Push the file name and corresponding icon to the fileNames array
+        this.fileNames.push({
+          name: file.name,
+          icon: iconPath
+        });
+      }
+    },
+    removeFile(index) {
+      // Remove file from the list
+      this.fileNames.splice(index, 1);
+      console.log(removeFile)
+    },
+    openModal() {
+      this.isModalOpen = true;
+    },
+    // 모달 닫기
+    closeModal() {
+      this.isModalOpen = false;
     }
+  }
 };
 </script>
client/views/pages/user/PicHistorySearch.vue
--- client/views/pages/user/PicHistorySearch.vue
+++ client/views/pages/user/PicHistorySearch.vue
@@ -1,233 +1,256 @@
 <template>
-    <div class="content">
-        <div class="sub-title-area mb-30">
-            <h2>사진 기록물</h2>
-            <div class="breadcrumb-list">
-                <ul>
-                    <!-- Bind the image source dynamically for homeicon -->
-                    <li><img :src="homeicon" alt="Home Icon"><p>기록물</p></li>
-                    <li><img :src="righticon" alt=""></li>
-                    <li>통합검색</li>
-                </ul>
-            </div>
-        </div>
-        <form action="search" class="search-form mb-40">
-            <dl>
-                <dd class="mb-15">
-                    <p>검색범위</p>
-                    <ul>
-                        <li v-for="(option, index) in checkOptions2" :key="index">
-                            <input type="checkbox" :id="'check_button_' + index" :name="'check_button_' + index" />
-                            <label :for="'check_button_' + index">{{ option }}</label>
-                        </li>
-                    </ul>
-                </dd>
-                <dd class="mb-15">
-                    <p>검색어</p>
-                    <div class="wfull"><input type="text"></div>
-                </dd>
-                <dd class="mb-15">
-                    <p>생산연도</p>
-                    <input type="date">
-                    <p class="mark">~</p>
-                    <input type="date">
-                </dd>
-                <dd class="mb-20">
-                    <p>카테고리</p>
-                    <ul>
-                        <li v-for="(option, index) in checkOptions3" :key="index">
-                            <input type="checkbox" :id="'check_button_' + index" :name="'check_button_' + index" />
-                            <label :for="'check_button_' + index">{{ option }}</label>
-                        </li>
-                    </ul>
-                </dd>
-                <dd class="mb-15">
-                    <p>정렬</p>
-                    <ul>
-                        <li v-for="(option, index) in checkOptions4" :key="index">
-                            <input type="radio" :id="'radio_button_' + index" :name="'radio_button_' + index" />
-                            <label :for="'radio_button_' + index">{{ option }}</label>
-                        </li>
-                    </ul>
-                </dd>
-                <div class="btn-group">
-                    <button class="reset"><img :src="reseticon" alt="">
-                        <p>초기화</p>
-                    </button>
-                    <button class="search"><img :src="searchicon" alt="">
-                        <p>검색</p>
-                    </button>
-                </div>
-
-            </dl>
-
-        </form>
-        <div class="search-result">
-            <ul>
-                <div class="flex-sp-bw mb-20">
-                    <div class="resultext wfull">
-                        <img :src="resulticon" alt="">
-                        <p>총 <b>{{ count }}개</b>의 사진 기록물이 검색되었습니다. </p>
-                    </div>
-                    <select v-model="itemsPerPage" @change="changeItemsPerPage">
-                    <option :value="5" selected>5개</option>
-                    <option :value="10">10개</option>
-                    <option :value="15">15개</option>
-                </select>
-
-                </div>
-                <li v-for="(resultitem, index) in paginatedItems" :key="index" class="mb-30">
-
-                    <div class="result-box">
-                        <div class="main-img"><img :src="resultitem.img" alt=""></div>
-                        <div class="text-box">
-                            <h5>{{ resultitem.title }}</h5>
-                            <p class="address">{{ resultitem.address }}</p>
-                            <p class="text">{{ resultitem.content }}</p>
-                            <div class="mb-20">
-                                <ul class="category">
-                                    <li v-if="resultitem.category1" class="category1">카테고리1</li>
-                                    <li v-if="resultitem.category2" class="category2">카테고리2</li>
-                                </ul>
-                            </div>
-                            <div class="date">
-                                <ul>
-                                    <li>생산연도 <b>{{ resultitem.year }}</b></li>
-                                    <li>|</li>
-                                    <li>등록 <b>{{ resultitem.date }}</b></li>
-                                </ul>
-                            </div>
-                        </div>
-                    </div>
-                </li>
-            </ul>
-            <button> <router-link :to="{ path: '/PicHistoryInsert.page' }" class="insert">등록</router-link></button>
-            <div class="pagination">
-              
-                <!-- Previous and Next Page Buttons -->
-                <button @click="previousPage" :disabled="currentPage === 1">Prev</button>
-                <span>{{ currentPage }} / {{ totalPages }}</span>
-                <button @click="nextPage" :disabled="currentPage === totalPages">Next</button>
-            </div>
-        </div>
+  <div class="content">
+    <div class="sub-title-area mb-30">
+      <h2>사진 기록물</h2>
+      <div class="breadcrumb-list">
+        <ul>
+          <!-- Bind the image source dynamically for homeicon -->
+          <li><img :src="homeicon" alt="Home Icon">
+            <p>기록물</p>
+          </li>
+          <li><img :src="righticon" alt=""></li>
+          <li>통합검색</li>
+        </ul>
+      </div>
     </div>
+    <form action="search" class="search-form mb-40">
+      <dl>
+        <dd class="mb-15">
+          <p>검색범위</p>
+          <ul>
+            <li>
+              <input type="checkbox" id="allScope" v-model="isChkAllScope" @change="fnChkAllOptions('scope')" />
+              <label for="allScope">전체</label>
+            </li>
+            <li v-for="(scope, idx) in searchType" :key="idx">
+              <input type="checkbox" :id="idx" :name="searchType" :value="scope.key" v-model="searchReqDTO.searchType" @change="fnChkOption('scope')" />
+              <label :for="idx">{{ scope.value }}</label>
+            </li>
+          </ul>
+        </dd>
+        <dd class="mb-15">
+          <p>검색어</p>
+          <div class="wfull"><input type="text" v-model="searchReqDTO.searchText"></div>
+        </dd>
+        <dd class="mb-15">
+          <p>생산연도</p>
+          <input type="date" v-model="searchReqDTO.startYear">
+          <p class="mark">~</p>
+          <input type="date" v-model="searchReqDTO.endYear">
+        </dd>
+        <dd class="mb-20">
+          <p>카테고리</p>
+          <ul>
+            <li v-for="(category, idx) of categorys" :key="idx">
+              <input type="checkbox" :id="category.ctgryId" name="categorys" :value="category.ctgryId" v-model="searchReqDTO.searchCtgry" />
+              <label :for="category.ctgryId">{{ category.ctgryNm }}</label>
+            </li>
+          </ul>
+        </dd>
+        <dd class="mb-15">
+          <p>정렬</p>
+          <ul>
+            <li v-for="(order, idx) of orders" :key="idx">
+              <input type="radio" :id="order.key" name="orders" :value="order.key" v-model="searchReqDTO.order" />
+              <label :for="order.key">{{ order.value }}</label>
+            </li>
+          </ul>
+        </dd>
+        <div class="btn-group">
+          <button class="reset"><img :src="reseticon" alt="">
+            <p>초기화</p>
+          </button>
+          <button class="search"><img :src="searchicon" alt="">
+            <p>검색</p>
+          </button>
+        </div>
+      </dl>
+    </form>
+    <div class="search-result">
+      <ul>
+        <div class="flex-sp-bw mb-20">
+          <div class="resultext wfull">
+            <img :src="resulticon" alt="">
+            <p>총 <b>{{ count }}개</b>의 사진 기록물이 검색되었습니다. </p>
+          </div>
+          <select v-model="itemsPerPage" @change="changeItemsPerPage">
+            <option :value="5" selected>5개</option>
+            <option :value="10">10개</option>
+            <option :value="15">15개</option>
+          </select>
+        </div>
+        <li v-for="(resultitem, index) in paginatedItems" :key="index" class="mb-30">
+          <div class="result-box">
+            <div class="main-img"><img :src="resultitem.img" alt=""></div>
+            <div class="text-box">
+              <h5>{{ resultitem.title }}</h5>
+              <p class="address">{{ resultitem.address }}</p>
+              <p class="text">{{ resultitem.content }}</p>
+              <div class="mb-20">
+                <ul class="category">
+                  <li v-if="resultitem.category1" class="category1">카테고리1</li>
+                  <li v-if="resultitem.category2" class="category2">카테고리2</li>
+                </ul>
+              </div>
+              <div class="date">
+                <ul>
+                  <li>생산연도 <b>{{ resultitem.year }}</b></li>
+                  <li>|</li>
+                  <li>등록 <b>{{ resultitem.date }}</b></li>
+                </ul>
+              </div>
+            </div>
+          </div>
+        </li>
+      </ul>
+      <button> <router-link :to="{ path: '/PicHistoryInsert.page' }" class="insert">등록</router-link></button>
+      <div class="pagination">
+        <!-- Previous and Next Page Buttons -->
+        <button @click="previousPage" :disabled="currentPage === 1">Prev</button>
+        <span>{{ currentPage }} / {{ totalPages }}</span>
+        <button @click="nextPage" :disabled="currentPage === totalPages">Next</button>
+      </div>
+    </div>
+  </div>
 </template>
-
 <script>
+import { findAllCategoryProc } from "../../../resources/api/category"; // 카테고리 목록 검색
+
 export default {
-    data() {
-        return {
-            currentPage: 1, // Current page number
-            itemsPerPage: 5,
-            resulticon: "client/resources/images/icon/r-check.png",
-            homeicon: 'client/resources/images/icon/home.png',
-            searchicon: 'client/resources/images/icon/search.png',
-            reseticon: 'client/resources/images/icon/reset.png',
-            righticon: 'client/resources/images/icon/right.png',
-            count: 23,
-            checkOptions: [
-                '전체',
-                '사진',
-                '영상',
-                '미디어 영상',
-                '보도자료',
-            ],
-            checkOptions2: [
-                '전체',
-                '제목',
-                '내용',
-                '주소',
-            ],
-            checkOptions3: [
-                '카테고리1',
-                '카테고리2',
-                '카테고리3',
-                '카테고리4',
-                '카테고리5',
-            ],
-            checkOptions4: [
-                '최신',
-                '인기',
-            ],
-            resultitems: [
-                {
-                    img: 'client/resources/images/img6.png',
-                    title: '사진 기록물 제목',
-                    address: '경상북도 구미시 송정대로 55',
-                    content: '대한민국 최대의 내륙 산업단지를 보유하고, 서울로부터 277km, 부산으로부터 167km 거리에 있으며, 면적은 615㎢로 경상북도 전체 면적의 3.2%에 달합니다. 인구는 41만 명이고, 선산읍, 고아읍, 산동읍을 비롯한 3읍, 5면, 17개 동으로 구성되어…',
-                    category1: true,
-                    category2: true,
-                    year: 2020,
-                    date: '2021-01-01'
-                },
-                {
-                    img: 'client/resources/images/img6.png',
-                    title: '영상 기록물 제목',
-                    address: '경상북도 구미시 송정대로 55',
-                    content: '대한민국 최대의 내륙 산업단지를 보유하고, 서울로부터 277km, 부산으로부터 167km 거리에 있으며, 면적은 615㎢로 경상북도 전체 면적의 3.2%에 달합니다. 인구는 41만 명이고, 선산읍, 고아읍, 산동읍을 비롯한 3읍, 5면, 17개 동으로 구성되어…',
-                    category1: true,
-                    category2: false,
-                    year: 2021,
-                    date: '2022-01-01'
-                },
-                {
-                    img: 'client/resources/images/img6.png',
-                    title: '미디어 영상 제목',
-                    address: '경상북도 구미시 송정대로 55',
-                    content: '대한민국 최대의 내륙 산업단지를 보유하고, 서울로부터 277km, 부산으로부터 167km 거리에 있으며, 면적은 615㎢로 경상북도 전체 면적의 3.2%에 달합니다. 인구는 41만 명이고, 선산읍, 고아읍, 산동읍을 비롯한 3읍, 5면, 17개 동으로 구성되어…',
-                    category1: true,
-                    category2: false,
-                    year: 2021,
-                    date: '2022-01-01'
-                },
-                {
-                    img: 'client/resources/images/img6.png',
-                    title: '보도자료 제목',
-                    address: '경상북도 구미시 송정대로 55',
-                    content: '대한민국 최대의 내륙 산업단지를 보유하고, 서울로부터 277km, 부산으로부터 167km 거리에 있으며, 면적은 615㎢로 경상북도 전체 면적의 3.2%에 달합니다. 인구는 41만 명이고, 선산읍, 고아읍, 산동읍을 비롯한 3읍, 5면, 17개 동으로 구성되어…',
-                    category1: true,
-                    category2: false,
-                    year: 2021,
-                    date: '2022-01-01'
-                },
-            ]
-        };
-    },
-    computed: {
-        // Total number of pages
-        totalPages() {
-            return Math.ceil(this.resultitems.length / this.itemsPerPage);
-        },
+  data() {
+    return {
+      currentPage: 1, // Current page number
+      itemsPerPage: 5,
+      resulticon: "client/resources/images/icon/r-check.png",
+      homeicon: 'client/resources/images/icon/home.png',
+      searchicon: 'client/resources/images/icon/search.png',
+      reseticon: 'client/resources/images/icon/reset.png',
+      righticon: 'client/resources/images/icon/right.png',
 
-        // Paginated items based on current page and items per page
-        paginatedItems() {
-            const start = (this.currentPage - 1) * this.itemsPerPage;
-            const end = start + this.itemsPerPage;
-            return this.resultitems.slice(start, end);
-        },
-    },
-    methods: {
-        // Change the number of items displayed per page
-        changeItemsPerPage() {
-            this.currentPage = 1; // Reset to first page when changing items per page
-        },
+      // 검색용 객체
+      searchReqDTO: {
+        searchType: [],
+        searchText: null,
+        startYear: null,
+        endYear: null,
+        searchTy: null,
+        searchCtgry: [],
+        order: "rgsde",
+      },
 
-        // Go to the previous page
-        previousPage() {
-            if (this.currentPage > 1) {
-                this.currentPage--;
-            }
-        },
+      isChkAllScope: false, // 검색범위 전체 체크 여부
+      searchType: [
+        { key: "sj", value: "제목" },
+        { key: "cn", value: "내용" },
+        { key: "adres", value: "주소" },
+      ], // 검색범위 목록
+      categorys: [], // 카테고리 목록
+      orders: [
+        { key: "rgsde", value: "최신" },
+        { key: "rdcnt", value: "인기" },
+      ], // 정렬 목록
 
-        // Go to the next page
-        nextPage() {
-            if (this.currentPage < this.totalPages) {
-                this.currentPage++;
-            }
+      searchResult: [], // 검색결과
+      resultitems: [
+        {
+          img: 'client/resources/images/img6.png',
+          title: '사진 기록물 제목',
+          address: '경상북도 구미시 송정대로 55',
+          content: '대한민국 최대의 내륙 산업단지를 보유하고, 서울로부터 277km, 부산으로부터 167km 거리에 있으며, 면적은 615㎢로 경상북도 전체 면적의 3.2%에 달합니다. 인구는 41만 명이고, 선산읍, 고아읍, 산동읍을 비롯한 3읍, 5면, 17개 동으로 구성되어…',
+          category1: true,
+          category2: true,
+          year: 2020,
+          date: '2021-01-01'
         },
+      ]
+    };
+  },
+
+  computed: {
+    // Total number of pages
+    totalPages() {
+      return Math.ceil(this.resultitems.length / this.itemsPerPage);
     },
+
+    // Paginated items based on current page and items per page
+    paginatedItems() {
+      const start = (this.currentPage - 1) * this.itemsPerPage;
+      const end = start + this.itemsPerPage;
+      return this.resultitems.slice(start, end);
+    },
+  },
+
+  created() {
+    // 초기 데이터 세팅
+    this.isChkAllScope = true;
+    this.searchReqDTO.searchType = this.searchType.map(item => item.key);
+    this.searchReqDTO.order = this.orders[0].key
+
+    this.fnFindCategorys(); // 카테고리 목록 조회 (검색조건 없음)
+  },
+
+  methods: {
+    // Change the number of items displayed per page
+    changeItemsPerPage() {
+      this.currentPage = 1; // Reset to first page when changing items per page
+    },
+
+    // Go to the previous page
+    previousPage() {
+      if (this.currentPage > 1) {
+        this.currentPage--;
+      }
+    },
+
+    // Go to the next page
+    nextPage() {
+      if (this.currentPage < this.totalPages) {
+        this.currentPage++;
+      }
+    },
+
+    // 카테고리 목록 조회
+    async fnFindCategorys() {
+      try {
+        const response = await findAllCategoryProc();
+        this.categorys = response.data.data.ctgry;
+      } catch (error) {
+        if (error.response) {
+          console.log("에러 응답:", error.response.data);
+        }
+        console.error("Error:", error);
+      }
+    },
+
+    // 통합검색
+    async fnFindAllDatas() {
+      try {
+        let params = {};
+        if (this.searchReqDTO.searchRecord.length > 0) {
+          params.searchRecords = this.searchReqDTO.searchRecord.join(',');
+        }
+        if (this.searchReqDTO.searchType.length > 0) {
+          params.searchTypes = this.searchReqDTO.searchType.join(',');
+        }
+        if (this.searchReqDTO.searchCtgry.length > 0) {
+          params.searchCtgries = this.searchReqDTO.searchCtgry.join(',');
+        }
+        params.searchText = this.searchReqDTO.searchText;
+        params.startYear = this.searchReqDTO.startYear;
+        params.endYear = this.searchReqDTO.endYear;
+        params.order = this.searchReqDTO.order;
+
+        // API 호출
+        const response = await findAllDatas(params);
+        this.searchResult = response.data.data.searchResult;
+      } catch (error) {
+        if (error.response) {
+          console.log("에러 응답:", error.response.data);
+        }
+        console.error("Error:", error);
+      }
+    },
+  },
 };
 </script>
-<style scoped>
-
-</style>
(파일 끝에 줄바꿈 문자 없음)
+<style scoped></style>
(파일 끝에 줄바꿈 문자 없음)
client/views/pages/user/TotalSearch.vue
--- client/views/pages/user/TotalSearch.vue
+++ client/views/pages/user/TotalSearch.vue
@@ -1,194 +1,286 @@
 <template>
-    <div class="content">
-        <div class="sub-title-area mb-30">
-            <h2>통합검색</h2>
-            <div class="breadcrumb-list">
-                <ul>
-                    <!-- Bind the image source dynamically for homeicon -->
-                    <li><img :src="homeicon" alt="Home Icon"><p></p></li>
-                    <li><img :src="righticon" alt=""></li>
-                    <li>통합검색</li>
-                </ul>
-            </div>
-        </div>
-        <form action="search" class="search-form mb-40">
-            <dl>
-                <dd class="mb-15">
-                    <p>기록유형</p>
-                    <ul>
-                        <li v-for="(option, index) in checkOptions" :key="index">
-                            <input type="checkbox" :id="'check_button_' + index" :name="'check_button_' + index" />
-                            <label :for="'check_button_' + index">{{ option }}</label>
-                        </li>
-                    </ul>
-                </dd>
-                <dd class="mb-15">
-                    <p>검색범위</p>
-                    <ul>
-                        <li v-for="(option, index) in checkOptions2" :key="index">
-                            <input type="checkbox" :id="'check_button_' + index" :name="'check_button_' + index" />
-                            <label :for="'check_button_' + index">{{ option }}</label>
-                        </li>
-                    </ul>
-                </dd>
-                <dd class="mb-15">
-                    <p>검색어</p>
-                    <div class="wfull"><input type="text"></div>
-                </dd>
-                <dd class="mb-15">
-                    <p>생산연도</p>
-                    <input type="date">
-                    <p class="mark">~</p>
-                    <input type="date">
-                </dd>
-                <dd class="mb-20">
-                    <p>카테고리</p>
-                    <ul>
-                        <li v-for="(option, index) in checkOptions3" :key="index">
-                            <input type="checkbox" :id="'check_button_' + index" :name="'check_button_' + index" />
-                            <label :for="'check_button_' + index">{{ option }}</label>
-                        </li>
-                    </ul>
-                </dd>
-                <dd class="mb-15">
-                    <p>정렬</p>
-                    <ul>
-                        <li v-for="(option, index) in checkOptions4" :key="index">
-                            <input type="radio" :id="'radio_button_' + index" :name="'radio_button_' + index" />
-                            <label :for="'radio_button_' + index">{{ option }}</label>
-                        </li>
-                    </ul>
-                </dd>
-                <div class="btn-group">
-                    <button class="reset"><img :src="reseticon" alt="">
-                        <p>초기화</p>
-                    </button>
-                    <button class="search"><img :src="searchicon" alt="">
-                        <p>검색</p>
-                    </button>
-                </div>
-
-            </dl>
-
-        </form>
-        <div class="search-result">
-            <ul>
-                <li v-for="(resultitem, index) in resultitems" :key="index" class="mb-30">
-                    <div class="flex-sp-bw mb-20">
-                        <div class="resultext">
-                            <img :src="resulticon" alt="">
-                            <p>총 <b>{{ resultitem.count }}개</b>의 사진 기록물이 검색되었습니다. </p>
-                        </div>
-                        <router-link :to="{ path: '/' + resultitem.id }" class="gopage">모두보기</router-link>
-                    </div>
-                    <div class="result-box">
-                        <div class="main-img"><img :src="resultitem.img" alt=""></div>
-                        <div class="text-box">
-                            <h5>{{ resultitem.title }}</h5>
-                            <p class="address">{{ resultitem.address }}</p>
-                            <p class="text">{{ resultitem.content }}</p>
-                            <div class="mb-20">
-                                <ul class="category">
-                                    <li v-if="resultitem.category1" class="category1">카테고리1</li>
-            <li v-if="resultitem.category2" class="category2">카테고리2</li>
-                                </ul>
-                            </div>
-                            <div class="date">
-                                <ul>
-                                    <li>생산연도 <b>{{ resultitem.year }}</b></li>
-                                    <li>|</li>
-                                    <li>등록 <b>{{ resultitem.date }}</b></li>
-                                </ul>
-                            </div>
-                        </div>
-                    </div>
-                </li>
-            </ul>
-        </div>
+  <div class="content">
+    <div class="sub-title-area mb-30">
+      <h2>통합검색</h2>
+      <div class="breadcrumb-list">
+        <ul>
+          <!-- Bind the image source dynamically for homeicon -->
+          <li>
+            <img :src="homeicon" alt="Home Icon">
+            <p></p>
+          </li>
+          <li><img :src="righticon" alt=""></li>
+          <li>통합검색</li>
+        </ul>
+      </div>
     </div>
+    <form action="search" class="search-form mb-40">
+      <dl>
+        <dd class="mb-15">
+          <p>기록유형</p>
+          <ul>
+            <li>
+              <input type="checkbox" id="allRecord" v-model="isChkAllRecord" @change="fnChkAllOptions('record')" />
+              <label for="allRecord">전체</label>
+            </li>
+            <li v-for="(record, idx) in searchRecord" :key="idx">
+              <input type="checkbox" :id="idx" :name="searchRecord" :value="record.key" v-model="searchReqDTO.searchRecord" @change="fnChkOption('record')" />
+              <label :for="idx">{{ record.value }}</label>
+            </li>
+          </ul>
+        </dd>
+        <dd class="mb-15">
+          <p>검색범위</p>
+          <ul>
+            <li>
+              <input type="checkbox" id="allScope" v-model="isChkAllScope" @change="fnChkAllOptions('scope')" />
+              <label for="allScope">전체</label>
+            </li>
+            <li v-for="(scope, idx) in searchType" :key="idx">
+              <input type="checkbox" :id="idx" :name="searchType" :value="scope.key" v-model="searchReqDTO.searchType" @change="fnChkOption('scope')" />
+              <label :for="idx">{{ scope.value }}</label>
+            </li>
+          </ul>
+        </dd>
+        <dd class="mb-15">
+          <p>검색어</p>
+          <div class="wfull"><input type="text" v-model="searchReqDTO.searchText"></div>
+        </dd>
+        <dd class="mb-15">
+          <p>생산연도</p>
+          <input type="date" v-model="searchReqDTO.startYear">
+          <p class="mark">~</p>
+          <input type="date" v-model="searchReqDTO.endYear">
+        </dd>
+        <dd class="mb-20">
+          <p>카테고리</p>
+          <ul>
+            <li v-for="(category, idx) of categorys" :key="idx">
+              <input type="checkbox" :id="category.ctgryId" name="categorys" :value="category.ctgryId" v-model="searchReqDTO.searchCtgry" />
+              <label :for="category.ctgryId">{{ category.ctgryNm }}</label>
+            </li>
+          </ul>
+        </dd>
+        <dd class="mb-15">
+          <p>정렬</p>
+          <ul>
+            <li v-for="(order, idx) of orders" :key="idx">
+              <input type="radio" :id="order.key" name="orders" :value="order.key" v-model="searchReqDTO.order" />
+              <label :for="order.key">{{ order.value }}</label>
+            </li>
+          </ul>
+        </dd>
+        <div class="btn-group">
+          <button type="button" class="reset" @click="init">
+            <img :src="reseticon" alt="">
+            <p>초기화</p>
+          </button>
+          <button type="button" class="search" @click="fnFindAllDatas">
+            <img :src="searchicon" alt="">
+            <p>검색</p>
+          </button>
+        </div>
+      </dl>
+    </form>
+    <div class="search-result">
+      <ul>
+        <li v-for="(resultItem, idx) of searchResult" :key="idx" class="mb-30">
+          <div class="flex-sp-bw mb-20">
+            <div class="resultext">
+              <img :src="resulticon" alt="">
+              <p>총 <b>{{ resultItem.count }}개</b>의 {{ searchRecord[idx].value }}{{ resultItem.key === 'N' ? '가' : '이' }} 검색되었습니다.</p>
+            </div>
+            <router-link :to="{ path: '/' + resultItem.id }" class="gopage">모두보기</router-link>
+          </div>
+          <div v-for="(item, idx2) of resultItem.list" :key="idx2" class="result-box">
+            <div class="main-img">
+              <img v-if="item.hasOwnProperty('files') && item.files.length > 0" :src="item.files[0].filePath" alt="">
+              <img v-else src="client/resources/images/img6.png" alt="">
+            </div>
+            <div class="text-box">
+              <h5>{{ item.sj }}</h5>
+              <p v-if="resultItem.key === 'P' || resultItem.key === 'V'" class="address">{{ item.adres }}</p>
+              <p class="text">{{ item.cn }}</p>
+              <div class="mb-20">
+                <ul class="category">
+                  <li v-for="(ctgry, idx3) of item.ctgrys" :key="idx3" class="category1">{{ ctgry.ctgryNm }}</li>
+                </ul>
+              </div>
+              <div class="date">
+                <ul>
+                  <li>생산연도 <b>{{ item.prdctnYear }}</b></li>
+                  <li>|</li>
+                  <li>등록 <b>{{ item.rgsde }}</b></li>
+                </ul>
+              </div>
+            </div>
+          </div>
+        </li>
+      </ul>
+    </div>
+  </div>
 </template>
-
 <script>
+// 통합 검색
+import { findAllDatas } from "../../../resources/api/main";
+import { findAllCategoryProc } from "../../../resources/api/category"; // 카테고리 목록 검색
+
 export default {
-    data() {
-        return {
-            resulticon: "client/resources/images/icon/r-check.png",
-            homeicon: 'client/resources/images/icon/home.png',
-            searchicon: 'client/resources/images/icon/search.png',
-            reseticon: 'client/resources/images/icon/reset.png',
-            righticon: 'client/resources/images/icon/right.png',
-            checkOptions: [
-                '전체',
-                '사진',
-                '영상',
-                '미디어 영상',
-                '보도자료',
-            ],
-            checkOptions2: [
-                '전체',
-                '제목',
-                '내용',
-                '주소',
-            ],
-            checkOptions3: [
-                '카테고리1',
-                '카테고리2',
-                '카테고리3',
-                '카테고리4',
-                '카테고리5',
-            ],
-            checkOptions4: [
-                '최신',
-                '인기',
-            ],
-            resultitems: [
-                {
-                    count: 5,
-                    img: 'client/resources/images/img6.png',
-                    title: '사진 기록물 제목',
-                    address: '경상북도 구미시 송정대로 55',
-                    content: '대한민국 최대의 내륙 산업단지를 보유하고, 서울로부터 277km, 부산으로부터 167km 거리에 있으며, 면적은 615㎢로 경상북도 전체 면적의 3.2%에 달합니다. 인구는 41만 명이고, 선산읍, 고아읍, 산동읍을 비롯한 3읍, 5면, 17개 동으로 구성되어…',
-                    category1: true,
-                    category2: true,
-                    year: 2020,
-                    date: '2021-01-01',
-                    id: 'PicHistorySearch.page'
-                },
-                {
-                    count: 3,
-                    img: 'client/resources/images/img6.png',
-                    title: '영상 기록물 제목',
-                    address: '경상북도 구미시 송정대로 55',
-                    content: '대한민국 최대의 내륙 산업단지를 보유하고, 서울로부터 277km, 부산으로부터 167km 거리에 있으며, 면적은 615㎢로 경상북도 전체 면적의 3.2%에 달합니다. 인구는 41만 명이고, 선산읍, 고아읍, 산동읍을 비롯한 3읍, 5면, 17개 동으로 구성되어…',
-                    category1: true,
-                    category2: false,
-                    year: 2021,
-                    date: '2022-01-01'
-                },
-                {
-                    count: 3,
-                    img: 'client/resources/images/img6.png',
-                    title: '미디어 영상 제목',
-                    address: '경상북도 구미시 송정대로 55',
-                    content: '대한민국 최대의 내륙 산업단지를 보유하고, 서울로부터 277km, 부산으로부터 167km 거리에 있으며, 면적은 615㎢로 경상북도 전체 면적의 3.2%에 달합니다. 인구는 41만 명이고, 선산읍, 고아읍, 산동읍을 비롯한 3읍, 5면, 17개 동으로 구성되어…',
-                    category1: true,
-                    category2: false,
-                    year: 2021,
-                    date: '2022-01-01'
-                },
-                {
-                    count: 3,
-                    img: 'client/resources/images/img6.png',
-                    title: '보도자료 제목',
-                    address: '경상북도 구미시 송정대로 55',
-                    content: '대한민국 최대의 내륙 산업단지를 보유하고, 서울로부터 277km, 부산으로부터 167km 거리에 있으며, 면적은 615㎢로 경상북도 전체 면적의 3.2%에 달합니다. 인구는 41만 명이고, 선산읍, 고아읍, 산동읍을 비롯한 3읍, 5면, 17개 동으로 구성되어…',
-                    category1: true,
-                    category2: false,
-                    year: 2021,
-                    date: '2022-01-01'
-                },
-            ]
-        };
+  data() {
+    return {
+      // icon
+      resulticon: "client/resources/images/icon/r-check.png",
+      homeicon: 'client/resources/images/icon/home.png',
+      searchicon: 'client/resources/images/icon/search.png',
+      reseticon: 'client/resources/images/icon/reset.png',
+      righticon: 'client/resources/images/icon/right.png',
+
+      // 검색용 객체 초기값
+      searchDefault: {
+        searchRecord: ["P", "V", "M", "N"],
+        searchType: ["sj", "cn", "adres"],
+        searchText: null,
+        startYear: null,
+        endYear: null,
+        searchCtgry: [],
+        order: "rgsde",
+      },
+      searchReqDTO: {},
+
+      isChkAllRecord: true, // 기록유형 전체 체크 여부
+      searchRecord: [
+        { key: "P", value: "사진" },
+        { key: "V", value: "영상" },
+        { key: "M", value: "미디어영상" },
+        { key: "N", value: "보도자료" },
+      ], // 기록유형 목록
+      isChkAllScope: true, // 검색범위 전체 체크 여부
+      searchType: [
+        { key: "sj", value: "제목" },
+        { key: "cn", value: "내용" },
+        { key: "adres", value: "주소" },
+      ], // 검색범위 목록
+      categorys: [], // 카테고리 목록
+      orders: [
+        { key: "rgsde", value: "최신" },
+        { key: "rdcnt", value: "인기" },
+      ], // 정렬 목록
+
+      searchResult: [], // 검색결과
+
+      isInitialLoad: true // 초기 로드 여부
+    };
+  },
+
+  created() {
+    this.init(); // 초기화
+    this.fnFindCategorys(); // 카테고리 목록 조회 (검색조건 없음)
+  },
+
+  mounted() {
+    let searchText = this.$route.query.searchText;
+    if (searchText !== null) {
+      this.searchReqDTO.searchText = searchText;
     }
+
+    this.fnFindAllDatas(); // 통합검색
+  },
+
+  methods: {
+    // 초기화
+    init() {
+      if (this.isInitialLoad) {
+        this.isInitialLoad = false;
+      } else {
+        if (!confirm('검색 조건을 초기화하시겠습니까?')) {
+          return;
+        }
+      }
+      this.searchReqDTO = Object.assign({}, this.searchDefault); // 검색객체 초기화
+      this.searchResult = []; // 검색결과 초기화
+    },
+    // 카테고리 목록 조회
+    async fnFindCategorys() {
+      try {
+        const response = await findAllCategoryProc();
+        this.categorys = response.data.data.ctgry;
+      } catch (error) {
+        this.categorys = []; // 카테고리 목록 초기화
+
+        if (error.response) {
+          console.log("에러 응답:", error.response.data);
+        }
+        console.error("Error:", error);
+      }
+    },
+
+    // 통합검색
+    async fnFindAllDatas() {
+      if (this.searchReqDTO.searchRecord == null || this.searchReqDTO.searchRecord.length < 1) {
+        alert('검색 유형은 최소 한 개 이상 선택해주세요.');
+        return;
+      }
+
+      try {
+        let params = {};
+        if (this.searchReqDTO.searchRecord.length > 0) {
+          params.searchRecords = this.searchReqDTO.searchRecord.join(',');
+        }
+        if (this.searchReqDTO.searchType.length > 0) {
+          params.searchTypes = this.searchReqDTO.searchType.join(',');
+        }
+        if (this.searchReqDTO.searchCtgry.length > 0) {
+          params.searchCtgries = this.searchReqDTO.searchCtgry.join(',');
+        }
+        params.searchText = this.searchReqDTO.searchText;
+        params.startYear = this.searchReqDTO.startYear;
+        params.endYear = this.searchReqDTO.endYear;
+        params.order = this.searchReqDTO.order;
+
+        // API 호출
+        const response = await findAllDatas(params);
+        this.searchResult = response.data.data.searchResult;
+      } catch (error) {
+        this.searchResult = []; // 검색결과 초기화
+
+        if (error.response) {
+          alert(error.response.data.message);
+        }
+        console.error(error.message);
+      }
+    },
+
+    // 기록유형 전체 선택 여부 변경
+    fnChkAllOptions(type) {
+      switch (type) {
+        case 'record':
+          if (this.isChkAllRecord) {
+            this.searchReqDTO.searchRecord = this.searchRecord.map(item => item.key);
+          } else {
+            this.searchReqDTO.searchRecord = [];
+          }
+          break;
+        case 'scope':
+          if (this.isChkAllScope) {
+            this.searchReqDTO.searchType = this.searchType.map(item => item.key);
+          } else {
+            this.searchReqDTO.searchType = [];
+          }
+          break;
+      }
+    },
+
+    // 기록유형 선택 여부 변경
+    fnChkOption(type) {
+      switch (type) {
+        case 'record':
+          this.isChkAllRecord = this.searchReqDTO.searchRecord.length === this.searchRecord.length;
+          break;
+        case 'scope':
+          this.isChkAllScope = this.searchReqDTO.searchType.length === this.searchType.length;
+          break;
+      }
+    },
+  },
 };
 </script>
server/modules/web/server.js
--- server/modules/web/server.js
+++ server/modules/web/server.js
@@ -89,15 +89,20 @@
 });
 
 /**
- * @author : 하석형
- * @since : 2023.08.24
+ * @author : 박정하
+ * @since : 2025.03.24
  * @dscription : REST API 서버에 데이터 요청 보내기(Proxy)
  */
 webServer.use(
   "*.json",
   expressProxy(API_SERVER_HOST, {
     proxyReqPathResolver: function (request) {
-      return `${request.params["0"]}.json`;
+      // 쿼리스트링 여부에 따라 다르게 전송
+      if (request.url.split('?')[1]) {
+        return request.originalUrl;
+      } else {
+        return `${request.params["0"]}.json`;
+      }
     },
     proxyReqOptDecorator: function (proxyReqOpts, srcReq) {
       proxyReqOpts.headers['X-Forwarded-For'] = srcReq.headers['x-forwarded-for'] || srcReq.connection.remoteAddress;
@@ -138,6 +143,6 @@
 webServer.use(function (error, request, response, next) {
   const errorCode = !error.statusCode ? 500 : error.statusCode;
   response.redirect('/notFound.page'); // 에러 페이지로 유도
-  let message = `[Error:${errorCode}] ${request.url}/n ${error.stack}/n`;
+  let message = `[Error: ${errorCode}]${request.url} / n ${error.stack} / n`;
   Logger.logging(message);
 });
(파일 끝에 줄바꿈 문자 없음)
Add a comment
List