박정하 박정하 04-11
250411 박정하 오류 수정
@1044827e3ad46603ada24e9b2f5e99616fe9bf13
 
client/views/component/SearchFormComponent.vue (added)
+++ client/views/component/SearchFormComponent.vue
@@ -0,0 +1,313 @@
+<template>
+  <div class="search-form form">
+    <dl>
+      <!-- 통합검색에서만 보이는 기록유형 선택 -->
+      <dd class="mb-15" v-if="pageType === 'all'">
+        <p>기록유형</p>
+        <ul>
+          <li>
+            <input type="checkbox" id="allRecord" v-model="isChkAllRecord" @change="fnChkAllOptions('record')" />
+            <label for="allRecord">전체</label>
+          </li>
+          <li>
+            <input type="checkbox" id="photoRecord" v-model="formData.usePhoto" @change="fnChkOption('record')" />
+            <label for="photoRecord">사진</label>
+          </li>
+          <li>
+            <input type="checkbox" id="videoRecord" v-model="formData.useVideo" @change="fnChkOption('record')" />
+            <label for="videoRecord">영상</label>
+          </li>
+          <li>
+            <input type="checkbox" id="mediaVideo" v-model="formData.useMedia" @change="fnChkOption('record')" />
+            <label for="mediaVideo">미디어영상</label>
+          </li>
+          <li>
+            <input type="checkbox" id="newsData" v-model="formData.useNews" @change="fnChkOption('record')" />
+            <label for="newsData">보도자료</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>
+            <input type="checkbox" id="searchSj" v-model="formData.useSj" @change="fnChkOption('scope')" />
+            <label for="searchSj">제목</label>
+          </li>
+          <li>
+            <input type="checkbox" id="searchCn" v-model="formData.useCn" @change="fnChkOption('scope')" />
+            <label for="searchCn">내용</label>
+          </li>
+          <li v-if="pageType !== 'media' && pageType !== 'bodo'">
+            <input type="checkbox" id="searchAdres" v-model="formData.useAdres" @change="fnChkOption('scope')" />
+            <label for="searchAdres">주소</label>
+          </li>
+        </ul>
+      </dd>
+      <dd class="mb-15">
+        <p>검색어</p>
+        <div class="wfull"><input type="text" v-model="formData.searchText" v-on:keyup.enter="fnSearch"></div>
+      </dd>
+      <dd class="mb-15">
+        <p>생산연도</p>
+        <input type="text" v-model="formData.startYear" pattern="[0-9]{4}" maxlength="4" @input="onlyNumberInput('startYear')">
+        <p class="mark">~</p>
+        <input type="text" v-model="formData.endYear" pattern="[0-9]{4}" maxlength="4" @input="onlyNumberInput('endYear')">
+      </dd>
+      <dd class="mb-20 category-dd" v-if="categoryList.length > 0">
+        <p>카테고리</p>
+        <ul>
+          <li v-for="(category, idx) of categoryList" :key="idx">
+            <input type="checkbox" :id="'ctgry_' + idx" name="categorys" :value="category.ctgryId" v-model="formData.searchCtgries" />
+            <label :for="'ctgry_' + idx">{{ 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="formData.order" />
+            <label :for="order.key">{{ order.value }}</label>
+          </li>
+        </ul>
+      </dd>
+      <div class="btn-group">
+        <button type="button" class="reset" @click="fnReset">
+          <img :src="reseticon" alt="">
+          <p>초기화</p>
+        </button>
+        <button type="button" class="search" @click="fnSearch">
+          <img :src="searchicon" alt="">
+          <p>검색</p>
+        </button>
+      </div>
+    </dl>
+  </div>
+</template>
+<script>
+// API
+import { findAllByNullProc } from "@/resources/api/category"; // 카테고리 목록 검색
+
+export default {
+  name: "SearchFormComponent",
+  props: {
+    // 부모 컴포넌트에서 전달받을 데이터
+    initialData: {
+      type: Object,
+      default: () => ({
+        usePhoto: true,
+        useVideo: true,
+        useMedia: true,
+        useNews: true,
+        useSj: true,
+        useCn: true,
+        useAdres: true,
+        searchText: null,
+        startYear: null,
+        endYear: null,
+        searchCtgries: [],
+        order: "rgsde",
+        // 페이지네이션 관련 속성
+        currentPage: 1,
+        recordSize: 24,
+      }),
+    },
+    // 페이지 타입 (통합검색: 'all', 사진: 'pic', 영상: 'video', 미디어: 'media', 보도자료: 'bodo')
+    pageType: {
+      type: String,
+      default: 'all'
+    }
+  },
+  data() {
+    return {
+      // 아이콘
+      searchicon: 'client/resources/images/icon/search.png',
+      reseticon: 'client/resources/images/icon/reset.png',
+
+      isChkAllRecord: true, // 기록유형 전체 체크 여부
+      isChkAllScope: true, // 검색범위 전체 체크 여부
+
+      // 검색 폼 데이터
+      formData: {},
+
+      // 카테고리 목록
+      categoryList: [],
+
+      // 정렬 목록
+      orders: [
+        { key: "rgsde", value: "최신" },
+        { key: "rdcnt", value: "인기" },
+      ],
+    };
+  },
+  created() {
+    // 초기 데이터 설정
+    this.initFormData();
+
+    // 카테고리 목록 조회
+    this.fnFindCategorys();
+  },
+  watch: {
+    // initialData가 변경되면 formData를 업데이트
+    initialData: {
+      handler() {
+        this.initFormData();
+      },
+      deep: true
+    }
+  },
+  methods: {
+    // 폼 데이터 초기화
+    initFormData() {
+      // 초기 데이터 복사
+      this.formData = JSON.parse(JSON.stringify(this.initialData));
+
+      // 페이지 타입에 따라 검색 타입 설정
+      if (this.pageType !== 'all') {
+        // 페이지 타입에 맞는 searchTy 설정
+        switch (this.pageType) {
+          case 'pic':
+            this.formData.searchTy = "P";
+            break;
+          case 'video':
+            this.formData.searchTy = "V";
+            break;
+          case 'media':
+            this.formData.searchTy = "M";
+            // 미디어 영상에서는 주소 검색 비활성화
+            this.formData.useAdres = false;
+            break;
+          case 'bodo':
+            this.formData.searchTy = "N";
+            // 보도자료에서는 주소 검색 비활성화
+            this.formData.useAdres = false;
+            break;
+        }
+      }
+
+      // 전체 체크박스 상태 동기화
+      this.isChkAllRecord = this.formData.usePhoto && this.formData.useVideo && this.formData.useMedia && this.formData.useNews;
+
+      // 검색범위 전체 체크박스 상태 계산
+      if (this.pageType === 'media' || this.pageType === 'bodo') {
+        // 미디어 영상과 보도자료는 제목과 내용만 검색 가능
+        this.isChkAllScope = this.formData.useSj && this.formData.useCn;
+      } else {
+        // 기타 타입은 주소 포함 세 가지 모두 검색 가능
+        this.isChkAllScope = this.formData.useSj && this.formData.useCn && this.formData.useAdres;
+      }
+    },
+
+    // 카테고리 목록 조회
+    async fnFindCategorys() {
+      try {
+        const response = await findAllByNullProc();
+        if (response.data && response.data.data && response.data.data.ctgry) {
+          this.categoryList = response.data.data.ctgry;
+          console.log("카테고리 조회 성공:", this.categoryList);
+        } else {
+          console.error("카테고리 데이터 형식이 잘못되었습니다:", response.data);
+          this.categoryList = [];
+        }
+      } catch (error) {
+        this.categoryList = []; // 카테고리 목록 초기화
+        console.error("카테고리 조회 실패:", error);
+
+        if (error.response) {
+          alert(error.response.data.message);
+        }
+        console.error(error.message);
+      }
+    },
+
+    // 초기화 버튼 클릭
+    fnReset() {
+      if (confirm('검색 조건을 초기화하시겠습니까?')) {
+        this.initFormData();
+
+        // 부모 컴포넌트에 이벤트 발생
+        this.$emit('reset');
+      }
+    },
+
+    // 검색 실행
+    fnSearch() {
+      // 유효성 검사 (통합검색일 경우 검색 유형 체크)
+      if (this.pageType === 'all' && !this.formData.usePhoto && !this.formData.useVideo && !this.formData.useMedia && !this.formData.useNews) {
+        alert('검색 유형은 최소 한 개 이상 선택해주세요.');
+        return;
+      }
+
+      // 검색 범위 유효성 검사
+      if (this.pageType === 'media' || this.pageType === 'bodo') {
+        // 미디어 영상과 보도자료는 제목, 내용만 체크
+        if (!this.formData.useSj && !this.formData.useCn) {
+          alert('검색 범위는 최소 한 개 이상 선택해주세요.');
+          return;
+        }
+      } else {
+        // 다른 타입은 제목, 내용, 주소 체크
+        if (!this.formData.useSj && !this.formData.useCn && !this.formData.useAdres) {
+          alert('검색 범위는 최소 한 개 이상 선택해주세요.');
+          return;
+        }
+      }
+
+      // 부모 컴포넌트에 이벤트 발생 (데이터 전달)
+      this.$emit('search', JSON.parse(JSON.stringify(this.formData)));
+    },
+
+    // 전체 선택/해제
+    fnChkAllOptions(type) {
+      switch (type) {
+        case 'record':
+          this.formData.usePhoto = this.isChkAllRecord;
+          this.formData.useVideo = this.isChkAllRecord;
+          this.formData.useMedia = this.isChkAllRecord;
+          this.formData.useNews = this.isChkAllRecord;
+          break;
+        case 'scope':
+          this.formData.useSj = this.isChkAllScope;
+          this.formData.useCn = this.isChkAllScope;
+          // media 또는 bodo 타입이 아닌 경우에만 주소 검색 옵션 설정
+          if (this.pageType !== 'media' && this.pageType !== 'bodo') {
+            this.formData.useAdres = this.isChkAllScope;
+          }
+          break;
+      }
+    },
+
+    // 개별 체크박스 선택시 전체 체크박스 상태 업데이트
+    fnChkOption(type) {
+      switch (type) {
+        case 'record':
+          this.isChkAllRecord = this.formData.usePhoto && this.formData.useVideo && this.formData.useMedia && this.formData.useNews;
+          break;
+        case 'scope':
+          if (this.pageType === 'media' || this.pageType === 'bodo') {
+            // 미디어 영상과 보도자료는 제목과 내용만 체크
+            this.isChkAllScope = this.formData.useSj && this.formData.useCn;
+          } else {
+            // 다른 타입은 주소 포함 체크
+            this.isChkAllScope = this.formData.useSj && this.formData.useCn && this.formData.useAdres;
+          }
+          break;
+      }
+    },
+
+    // 생산연도 입력 제한
+    onlyNumberInput(type) {
+      if (type === 'startYear') {
+        this.formData.startYear = this.formData.startYear.replace(/[^0-9]/g, '');
+      } else if (type === 'endYear') {
+        this.formData.endYear = this.formData.endYear.replace(/[^0-9]/g, '');
+      }
+    }
+  },
+};
+</script>(파일 끝에 줄바꿈 문자 없음)
client/views/component/listLayout/CardViewList.vue
--- client/views/component/listLayout/CardViewList.vue
+++ client/views/component/listLayout/CardViewList.vue
@@ -11,7 +11,9 @@
       <CardStyleComponent :name="name" :list="list" />
     </div>
     <div v-else class="no-results">
-      <p>등록된 게시물이 없습니다.</p>
+      <img :src="nosearch" alt="">
+      <p>검색 결과가 없습니다.</p>
+      <p>단어의 철자가 정확한지 확인해 주시기 바랍니다.<br> 검색어의 단어 수를 줄이거나, 다른 검색어(유사어)로 검색해 보시기 바랍니다.<br> 일반적으로 많이 사용하는 검색어로 다시 검색해 주시기 바랍니다.</p>
     </div>
   </div>
 </template>
@@ -46,6 +48,8 @@
 
   data() {
     return {
+      // ICON
+      nosearch: "client/resources/images/no_search.png",
     };
   },
 
client/views/pages/bbsDcry/photo/PicHistoryInsert.vue
--- client/views/pages/bbsDcry/photo/PicHistoryInsert.vue
+++ client/views/pages/bbsDcry/photo/PicHistoryInsert.vue
@@ -68,35 +68,35 @@
                 <div v-if="requestDTO.files.length === 0 && multipartFiles.length === 0">선택된 파일이 없습니다.</div>
                 <!-- 기존 등록된 파일 목록 -->
                 <div v-for="(file, idx) of requestDTO.files" :key="idx" class="mb-5">
-                 <div class="flex align-center" style="gap: 10px;">
+                  <div class="flex align-center" style="gap: 10px;">
                     <input type="radio" name="thumbAt" :id="'oldFile_' + file.fileOrdr" v-model="selectedThumb" :value="file.fileNm">
                     <label :for="'oldFile_' + file.fileOrdr">
-                      <p>대표사진 지정</p></label>
-                 </div >
-                    <div class="flex-sp-bw file-wrap">
-                      <div class="file-name">
-                        <img src="/client/resources/images/icon/imgicon.png" alt="fileicon">
-                        <p>{{ file.fileNm }}</p>
-                      </div>
-                      <button type="button" class="cancel" @click="fnDelFile('old', file.fileOrdr)"><b>✕</b></button>
+                      <p>대표사진 지정</p>
+                    </label>
+                  </div>
+                  <div class="flex-sp-bw file-wrap">
+                    <div class="file-name">
+                      <img src="/client/resources/images/icon/imgicon.png" alt="fileicon">
+                      <p>{{ file.fileNm }}</p>
                     </div>
-                  
+                    <button type="button" class="cancel" @click="fnDelFile('old', file.fileOrdr)"><b>✕</b></button>
+                  </div>
                 </div>
                 <!-- 새로 추가된 파일 목록 -->
                 <div v-for="(file, idx) of multipartFiles" :key="idx" class="mb-5">
                   <div class="flex align-center" style="gap: 10px;">
                     <input type="radio" name="thumbAt" :id="'newFile_' + idx" v-model="selectedThumb" :value="file.name">
                     <label :for="'newFile_' + idx">
-                      <p>대표사진 지정</p></label>
-                  </div >
-                    <div class="flex-sp-bw file-wrap">
-                      <div class="file-name">
-                        <img src="/client/resources/images/icon/imgicon.png" alt="fileicon">
-                        <p>{{ file.name }}</p>
-                      </div>
-                      <button type="button" class="cancel" @click="fnDelFile('new', idx)"><b>✕</b></button>
+                      <p>대표사진 지정</p>
+                    </label>
+                  </div>
+                  <div class="flex-sp-bw file-wrap">
+                    <div class="file-name">
+                      <img src="/client/resources/images/icon/imgicon.png" alt="fileicon">
+                      <p>{{ file.name }}</p>
                     </div>
-                  
+                    <button type="button" class="cancel" @click="fnDelFile('new', idx)"><b>✕</b></button>
+                  </div>
                 </div>
               </div>
             </li>
@@ -317,10 +317,33 @@
       } else if (type === 'old') {
         this.requestDTO.files = this.requestDTO.files.filter(item => item.fileOrdr !== separator);
       }
+      this.validateThumbnail();
+    },
 
-      // 썸네일 변경
-      if (this.requestDTO.files.length < 1 && this.multipartFiles.length > 0) {
-        this.selectedThumb = this.multipartFiles[0].name;
+    // 썸네일 유효성 검증 및 설정
+    validateThumbnail() {
+      // 1. 현재 selectedThumb가 기존 파일(requestDTO.files)에 존재하는지 확인
+      if (this.requestDTO.files && this.requestDTO.files.length > 0) {
+        const existsInCurrentFiles = this.requestDTO.files.some(file => file.fileNm === this.selectedThumb);
+
+        // 기존 파일에 없다면 첫 번째 기존 파일을 썸네일로 설정
+        if (!existsInCurrentFiles) {
+          this.selectedThumb = this.requestDTO.files[0].fileNm;
+        }
+        return;
+      }
+
+      // 2. 여기까지 왔다면 기존 파일이 없는 상태
+      // 새 파일(multipartFiles)이 있는지 확인
+      if (this.multipartFiles && this.multipartFiles.length > 0) {
+        const existsInNewFiles = this.multipartFiles.some(file => file.name === this.selectedThumb);
+
+        // 새 파일에 없다면 첫 번째 새 파일을 썸네일로 설정
+        if (!existsInNewFiles) {
+          this.selectedThumb = this.multipartFiles[0].name;
+        }
+      } else {
+        this.selectedThumb = null;
       }
     },
 
@@ -341,6 +364,10 @@
           return;
         }
       }
+      if (this.$isEmpty(this.selectedThumb)) {
+        alert("썸네일로 사용할 이미지를 선택해주세요.");
+        return;
+      }
 
       let count = this.multipartFiles.length
       if (!this.$isEmpty(this.pageId)) {
client/views/pages/bbsDcry/photo/PicHistorySearch.vue
--- client/views/pages/bbsDcry/photo/PicHistorySearch.vue
+++ client/views/pages/bbsDcry/photo/PicHistorySearch.vue
@@ -13,69 +13,8 @@
         </ul>
       </div>
     </div>
-    <div class="search-form form">
-      <dl>
-        <dd class="mb-15">
-          <p>검색범위</p>
-          <ul>
-            <li>
-              <input type="checkbox" id="allScope" v-model="isChkAllScope" @change="fnChkAllOptions" />
-              <label for="allScope">전체</label>
-            </li>
-            <li>
-              <input type="checkbox" id="searchSj" v-model="searchReqDTO.useSj" @change="fnChkOption" />
-              <label for="searchSj">제목</label>
-            </li>
-            <li>
-              <input type="checkbox" id="searchCn" v-model="searchReqDTO.useCn" @change="fnChkOption" />
-              <label for="searchCn">내용</label>
-            </li>
-            <li>
-              <input type="checkbox" id="searchAdres" v-model="searchReqDTO.useAdres" @change="fnChkOption" />
-              <label for="searchAdres">주소</label>
-            </li>
-          </ul>
-        </dd>
-        <dd class="mb-15">
-          <p>검색어</p>
-          <div class="wfull"><input type="text" v-model="searchReqDTO.searchText" v-on:keyup.enter="fnChnageReqDTO"></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 category-dd">
-          <p>카테고리</p>
-          <ul>
-            <li v-for="(category, idx) of categorys" :key="idx">
-              <input type="checkbox" :id="'ctgry_' + idx" name="categorys" :value="category.ctgryId" v-model="searchReqDTO.searchCtgries" />
-              <label :for="'ctgry_' + idx">{{ 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="fnChnageReqDTO">
-            <img :src="searchicon" alt="">
-            <p>검색</p>
-          </button>
-        </div>
-      </dl>
-    </div>
+    <!-- 검색 폼 컴포넌트 사용 -->
+    <SearchFormComponent :initialData="searchReqDTO" pageType="pic" @search="handleSearch" @reset="handleReset" />
     <div class="search-result">
       <div class="tabs">
         <div class="flex-sp-bw mb-20 align-center">
@@ -107,9 +46,7 @@
           <div v-else class="no-results">
             <img :src="nosearch" alt="">
             <p>검색 결과가 없습니다.</p>
-            <p>단어의 철자가 정확한지 확인해 주시기 바랍니다.<br>
-검색어의 단어 수를 줄이거나, 다른 검색어(유사어)로 검색해 보시기 바랍니다.<br>
-일반적으로 많이 사용하는 검색어로 다시 검색해 주시기 바랍니다.</p>
+            <p>단어의 철자가 정확한지 확인해 주시기 바랍니다.<br> 검색어의 단어 수를 줄이거나, 다른 검색어(유사어)로 검색해 보시기 바랍니다.<br> 일반적으로 많이 사용하는 검색어로 다시 검색해 주시기 바랍니다.</p>
           </div>
         </div>
       </div>
@@ -117,18 +54,26 @@
       <DefaultPagination class="mt-40" :search="searchReqDTO" @onChange="fnChangeCurrentPage" />
     </div>
   </div>
+  <div v-if="loading" class="loading-overlay">
+    <div class="loading-spinner"></div>
+    <div>
+      <p>검색 중입니다</p>
+      <p>잠시만 기다려주세요</p>
+    </div>
+  </div>
 </template>
 <script>
 // COMPONENT
+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';
 // API
-import { findAllByNullProc } from "@/resources/api/category";
 import { findDcrysProc } from "@/resources/api/dcry";
 
 export default {
   components: {
+    SearchFormComponent,
     DefaultPagination,
     CardStyleComponent,
     ListStyleComponent,
@@ -140,22 +85,7 @@
       nosearch: "client/resources/images/no_search.png",
       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',
-
-      // 검색용 객체
-      isChkAllScope: true, // 검색범위 전체 체크 여부
-      searchType: [
-        { key: "sj", value: "제목" },
-        { key: "cn", value: "내용" },
-        { key: "adres", value: "주소" },
-      ], // 검색범위 목록
-      categorys: [], // 카테고리 목록
-      orders: [
-        { key: "rgsde", value: "최신" },
-        { key: "rdcnt", value: "인기" },
-      ], // 정렬 목록
 
       // 검색용 객체 초기값
       searchDefault: {
@@ -165,15 +95,18 @@
         searchText: null,
         startYear: null,
         endYear: null,
-        searchTy: "P",
+        searchTy: "P", // 사진 기록물 고정
         searchCtgries: [],
         order: "rgsde",
         // 페이지네이션
         currentPage: 1, // 현재 페이지
         recordSize: 24, // 한 페이지에 표시할 데이터 개수
       },
-      searchReqDTO: {}, // 실제 검색에 사용되는 객체
 
+      // URL 파라미터로부터 가져온 초기 검색 조건
+      urlParamsDefault: null,
+
+      searchReqDTO: {}, // 실제 검색에 사용되는 객체
       searchResult: [], // 검색결과
 
       // 목록 레이아웃
@@ -193,66 +126,52 @@
         },
       ],
 
-      isInitialLoad: true // 초기 로드 여부
+      isInitialLoad: true, // 초기 로드 여부
+
+      loading: false, // 로딩 상태 추가
     };
   },
 
   created() {
-    this.init(); // 초기화
-    this.fnFindCategorys(); // 카테고리 목록 조회 (검색조건 없음)
+    // 초기화
+    this.searchReqDTO = JSON.parse(JSON.stringify(this.searchDefault));
+    this.selectedTabId = this.tabs[0].id; // 기본 탭 설정
+
+    // URL 파라미터에서 검색 조건 가져오기
+    this.queryParamsToSearch();
+  },
+
+  mounted() {
+    this.fnSearch(); // 초기 검색 실행
   },
 
   methods: {
-    // 초기화
-    init() {
-      if (this.isInitialLoad) {
-        this.isInitialLoad = false;
-
-        this.queryParamsToSearch();
-      } else {
-        if (!confirm('검색 조건을 초기화하시겠습니까?')) {
-          return;
-        }
-      }
-
-      this.searchReqDTO.searchTy = "P"; // 사진 기록물 고정
-      this.selectedTabId = this.tabs[0].id;
-
-      this.searchReqDTO = JSON.parse(JSON.stringify(this.searchDefault));
-      this.searchResult = []; // 검색결과 초기화
-
-      this.fnSearch(); // 통합검색
-    },
-
+    // URL 파라미터로부터 검색 조건 설정
     queryParamsToSearch() {
       let query = this.$route.query;
       if (!this.$isEmpty(query)) {
+        // 기본 검색 조건 복사
+        let urlParams = JSON.parse(JSON.stringify(this.searchDefault));
+
         const typeConverters = {
           useSj: val => val === 'true',
           useCn: val => val === 'true',
           useAdres: val => val === 'true',
           searchCtgries: val => Array.isArray(val) ? val : (val ? val.split(',') : [])
         };
+
+        // URL 파라미터 값 적용
         Object.entries(query).forEach(([key, value]) => {
-          if (key in this.searchDefault) {
-            this.searchDefault[key] = key in typeConverters ? typeConverters[key](value) : value;
+          if (key in urlParams) {
+            urlParams[key] = key in typeConverters ? typeConverters[key](value) : value;
           }
         });
-      }
-    },
 
-    // 카테고리 목록 조회
-    async fnFindCategorys() {
-      try {
-        const response = await findAllByNullProc();
-        this.categorys = response.data.data.ctgry;
-      } catch (error) {
-        this.categorys = []; // 카테고리 목록 초기화
+        // URL 파라미터 기반 초기값 저장
+        this.urlParamsDefault = urlParams;
 
-        if (error.response) {
-          alert(error.response.data.message);
-        }
-        console.error(error.message);
+        // 현재 검색 조건에 적용
+        this.searchReqDTO = JSON.parse(JSON.stringify(urlParams));
       }
     },
 
@@ -262,6 +181,31 @@
       this.$nextTick(() => {
         this.fnSearch();
       });
+    },
+
+    // 검색 폼 컴포넌트에서 검색 버튼 클릭 시 호출되는 메소드
+    handleSearch(formData) {
+      // searchTy는 항상 "P"로 유지
+      formData.searchTy = "P";
+
+      // 페이지 초기화
+      formData.currentPage = 1;
+
+      this.searchReqDTO = formData;
+      this.fnSearch();
+    },
+
+    // 검색 폼 컴포넌트에서 초기화 버튼 클릭 시 호출되는 메소드
+    handleReset() {
+      // URL 파라미터가 있으면 그 값 사용, 없으면 기본값 사용
+      if (this.urlParamsDefault) {
+        this.searchReqDTO = JSON.parse(JSON.stringify(this.urlParamsDefault));
+      } else {
+        this.searchReqDTO = JSON.parse(JSON.stringify(this.searchDefault));
+      }
+
+      this.searchResult = []; // 검색결과 초기화
+      this.fnSearch(); // 초기화 후 검색 실행
     },
 
     // 검색 조건이 변경된 경우
@@ -274,6 +218,7 @@
 
     // 통합검색
     async fnSearch() {
+      this.loading = true; // 로딩 시작
       try {
         const params = JSON.parse(JSON.stringify(this.searchReqDTO));
 
@@ -295,19 +240,9 @@
           alert(error.response.data.message);
         }
         console.error(error.message);
+      } finally {
+        this.loading = false; // 로딩 종료
       }
-    },
-
-    // 기록유형 전체 선택 여부 변경
-    fnChkAllOptions() {
-      this.searchReqDTO.useSj = this.isChkAllScope;
-      this.searchReqDTO.useCn = this.isChkAllScope;
-      this.searchReqDTO.useAdres = this.isChkAllScope;
-    },
-
-    // 기록유형 선택 여부 변경
-    fnChkOption() {
-      this.isChkAllScope = this.searchReqDTO.useSj && this.searchReqDTO.useCn && this.searchReqDTO.useAdres;
     },
 
     selectTab(tabId) {
client/views/pages/bbsDcry/video/VideoHistorySearch.vue
--- client/views/pages/bbsDcry/video/VideoHistorySearch.vue
+++ client/views/pages/bbsDcry/video/VideoHistorySearch.vue
@@ -13,69 +13,8 @@
         </ul>
       </div>
     </div>
-    <div class="search-form form">
-      <dl>
-        <dd class="mb-15">
-          <p>검색범위</p>
-          <ul>
-            <li>
-              <input type="checkbox" id="allScope" v-model="isChkAllScope" @change="fnChkAllOptions" />
-              <label for="allScope">전체</label>
-            </li>
-            <li>
-              <input type="checkbox" id="searchSj" v-model="searchReqDTO.useSj" @change="fnChkOption" />
-              <label for="searchSj">제목</label>
-            </li>
-            <li>
-              <input type="checkbox" id="searchCn" v-model="searchReqDTO.useCn" @change="fnChkOption" />
-              <label for="searchCn">내용</label>
-            </li>
-            <li>
-              <input type="checkbox" id="searchAdres" v-model="searchReqDTO.useAdres" @change="fnChkOption" />
-              <label for="searchAdres">주소</label>
-            </li>
-          </ul>
-        </dd>
-        <dd class="mb-15">
-          <p>검색어</p>
-          <div class="wfull"><input type="text" v-model="searchReqDTO.searchText" v-on:keyup.enter="fnChnageReqDTO"></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 category-dd">
-          <p>카테고리</p>
-          <ul>
-            <li v-for="(category, idx) of categorys" :key="idx">
-              <input type="checkbox" :id="'ctgry_' + idx" name="categorys" :value="category.ctgryId" v-model="searchReqDTO.searchCtgries" />
-              <label :for="'ctgry_' + idx">{{ 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="fnChnageReqDTO">
-            <img :src="searchicon" alt="">
-            <p>검색</p>
-          </button>
-        </div>
-      </dl>
-    </div>
+    <!-- 검색 폼 컴포넌트 사용 -->
+    <SearchFormComponent :initialData="searchReqDTO" pageType="video" @search="handleSearch" @reset="handleReset" />
     <div class="search-result">
       <div class="tabs">
         <div class="flex-sp-bw mb-20 align-center">
@@ -107,9 +46,7 @@
           <div v-else class="no-results">
             <img :src="nosearch" alt="">
             <p>검색 결과가 없습니다.</p>
-            <p>단어의 철자가 정확한지 확인해 주시기 바랍니다.<br>
-검색어의 단어 수를 줄이거나, 다른 검색어(유사어)로 검색해 보시기 바랍니다.<br>
-일반적으로 많이 사용하는 검색어로 다시 검색해 주시기 바랍니다.</p>
+            <p>단어의 철자가 정확한지 확인해 주시기 바랍니다.<br> 검색어의 단어 수를 줄이거나, 다른 검색어(유사어)로 검색해 보시기 바랍니다.<br> 일반적으로 많이 사용하는 검색어로 다시 검색해 주시기 바랍니다.</p>
           </div>
         </div>
       </div>
@@ -117,18 +54,26 @@
       <DefaultPagination class="mt-40" :search="searchReqDTO" @onChange="fnChangeCurrentPage" />
     </div>
   </div>
+  <div v-if="loading" class="loading-overlay">
+    <div class="loading-spinner"></div>
+    <div>
+      <p>검색 중입니다</p>
+      <p>잠시만 기다려주세요</p>
+    </div>
+  </div>
 </template>
 <script>
 // COMPONENT
+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';
 // API
-import { findAllByNullProc } from "@/resources/api/category";
 import { findDcrysProc } from "@/resources/api/dcry";
 
 export default {
   components: {
+    SearchFormComponent,
     DefaultPagination,
     CardStyleComponent,
     ListStyleComponent,
@@ -140,22 +85,7 @@
       resulticon: "client/resources/images/icon/r-check.png",
       nosearch: "client/resources/images/no_search.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',
-
-      // 검색용 객체
-      isChkAllScope: true, // 검색범위 전체 체크 여부
-      searchType: [
-        { key: "sj", value: "제목" },
-        { key: "cn", value: "내용" },
-        { key: "adres", value: "주소" },
-      ], // 검색범위 목록
-      categorys: [], // 카테고리 목록
-      orders: [
-        { key: "rgsde", value: "최신" },
-        { key: "rdcnt", value: "인기" },
-      ], // 정렬 목록
 
       // 검색용 객체 초기값
       searchDefault: {
@@ -165,15 +95,18 @@
         searchText: null,
         startYear: null,
         endYear: null,
-        searchTy: "V",
+        searchTy: "V", // 영상 기록물 고정
         searchCtgries: [],
         order: "rgsde",
         // 페이지네이션
         currentPage: 1, // 현재 페이지
         recordSize: 24, // 한 페이지에 표시할 데이터 개수
       },
-      searchReqDTO: {}, // 실제 검색에 사용되는 객체
 
+      // URL 파라미터로부터 가져온 초기 검색 조건
+      urlParamsDefault: null,
+
+      searchReqDTO: {}, // 실제 검색에 사용되는 객체
       searchResult: [], // 검색결과
 
       // 목록 레이아웃
@@ -193,66 +126,52 @@
         },
       ],
 
-      isInitialLoad: true // 초기 로드 여부
+      isInitialLoad: true, // 초기 로드 여부
+
+      loading: false, // 로딩 상태 추가
     };
   },
 
   created() {
-    this.init(); // 초기화
-    this.fnFindCategorys(); // 카테고리 목록 조회 (검색조건 없음)
+    // 초기화
+    this.searchReqDTO = JSON.parse(JSON.stringify(this.searchDefault));
+    this.selectedTabId = this.tabs[0].id; // 기본 탭 설정
+
+    // URL 파라미터에서 검색 조건 가져오기
+    this.queryParamsToSearch();
+  },
+
+  mounted() {
+    this.fnSearch(); // 초기 검색 실행
   },
 
   methods: {
-    // 초기화
-    init() {
-      if (this.isInitialLoad) {
-        this.isInitialLoad = false;
-
-        this.queryParamsToSearch();
-      } else {
-        if (!confirm('검색 조건을 초기화하시겠습니까?')) {
-          return;
-        }
-      }
-
-      this.searchReqDTO.searchTy = "V"; // 영상 기록물 고정
-      this.selectedTabId = this.tabs[0].id;
-
-      this.searchReqDTO = JSON.parse(JSON.stringify(this.searchDefault));
-      this.searchResult = []; // 검색결과 초기화
-
-      this.fnChnageReqDTO(); // 통합검색
-    },
-
+    // URL 파라미터로부터 검색 조건 설정
     queryParamsToSearch() {
       let query = this.$route.query;
       if (!this.$isEmpty(query)) {
+        // 기본 검색 조건 복사
+        let urlParams = JSON.parse(JSON.stringify(this.searchDefault));
+
         const typeConverters = {
           useSj: val => val === 'true',
           useCn: val => val === 'true',
           useAdres: val => val === 'true',
           searchCtgries: val => Array.isArray(val) ? val : (val ? val.split(',') : [])
         };
+
+        // URL 파라미터 값 적용
         Object.entries(query).forEach(([key, value]) => {
-          if (key in this.searchDefault) {
-            this.searchDefault[key] = key in typeConverters ? typeConverters[key](value) : value;
+          if (key in urlParams) {
+            urlParams[key] = key in typeConverters ? typeConverters[key](value) : value;
           }
         });
-      }
-    },
 
-    // 카테고리 목록 조회
-    async fnFindCategorys() {
-      try {
-        const response = await findAllByNullProc();
-        this.categorys = response.data.data.ctgry;
-      } catch (error) {
-        this.categorys = []; // 카테고리 목록 초기화
+        // URL 파라미터 기반 초기값 저장
+        this.urlParamsDefault = urlParams;
 
-        if (error.response) {
-          alert(error.response.data.message);
-        }
-        console.error(error.message);
+        // 현재 검색 조건에 적용
+        this.searchReqDTO = JSON.parse(JSON.stringify(urlParams));
       }
     },
 
@@ -262,6 +181,31 @@
       this.$nextTick(() => {
         this.fnSearch();
       });
+    },
+
+    // 검색 폼 컴포넌트에서 검색 버튼 클릭 시 호출되는 메소드
+    handleSearch(formData) {
+      // searchTy는 항상 "V"로 유지
+      formData.searchTy = "V";
+
+      // 페이지 초기화
+      formData.currentPage = 1;
+
+      this.searchReqDTO = formData;
+      this.fnSearch();
+    },
+
+    // 검색 폼 컴포넌트에서 초기화 버튼 클릭 시 호출되는 메소드
+    handleReset() {
+      // URL 파라미터가 있으면 그 값 사용, 없으면 기본값 사용
+      if (this.urlParamsDefault) {
+        this.searchReqDTO = JSON.parse(JSON.stringify(this.urlParamsDefault));
+      } else {
+        this.searchReqDTO = JSON.parse(JSON.stringify(this.searchDefault));
+      }
+
+      this.searchResult = []; // 검색결과 초기화
+      this.fnSearch(); // 초기화 후 검색 실행
     },
 
     // 검색 조건이 변경된 경우
@@ -274,6 +218,7 @@
 
     // 통합검색
     async fnSearch() {
+      this.loading = true; // 로딩 시작
       try {
         const params = JSON.parse(JSON.stringify(this.searchReqDTO));
 
@@ -295,19 +240,9 @@
           alert(error.response.data.message);
         }
         console.error(error.message);
+      } finally {
+        this.loading = false; // 로딩 종료
       }
-    },
-
-    // 기록유형 전체 선택 여부 변경
-    fnChkAllOptions() {
-      this.searchReqDTO.useSj = this.isChkAllScope;
-      this.searchReqDTO.useCn = this.isChkAllScope;
-      this.searchReqDTO.useAdres = this.isChkAllScope;
-    },
-
-    // 기록유형 선택 여부 변경
-    fnChkOption() {
-      this.isChkAllScope = this.searchReqDTO.useSj && this.searchReqDTO.useCn && this.searchReqDTO.useAdres;
     },
 
     selectTab(tabId) {
client/views/pages/bbsMediaVido/MediaVideoSearch.vue
--- client/views/pages/bbsMediaVido/MediaVideoSearch.vue
+++ client/views/pages/bbsMediaVido/MediaVideoSearch.vue
@@ -12,65 +12,8 @@
         </ul>
       </div>
     </div>
-    <div class="search-form form">
-      <dl>
-        <dd class="mb-15">
-          <p>검색범위</p>
-          <ul>
-            <li>
-              <input type="checkbox" id="allScope" v-model="isChkAllScope" @change="fnChkAllOptions" />
-              <label for="allScope">전체</label>
-            </li>
-            <li>
-              <input type="checkbox" id="searchSj" v-model="searchReqDTO.useSj" @change="fnChkOption" />
-              <label for="searchSj">제목</label>
-            </li>
-            <li>
-              <input type="checkbox" id="searchCn" v-model="searchReqDTO.useCn" @change="fnChkOption" />
-              <label for="searchCn">내용</label>
-            </li>
-          </ul>
-        </dd>
-        <dd class="mb-15">
-          <p>검색어</p>
-          <div class="wfull"><input type="text" v-model="searchReqDTO.searchText" v-on:keyup.enter="fnChnageReqDTO"></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 category-dd">
-          <p>카테고리</p>
-          <ul>
-            <li v-for="(category, idx) of categorys" :key="idx">
-              <input type="checkbox" :id="'ctgry_' + idx" name="categorys" :value="category.ctgryId" v-model="searchReqDTO.searchCtgries" />
-              <label :for="'ctgry_' + idx">{{ 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="fnChnageReqDTO">
-            <img :src="searchicon" alt="">
-            <p>검색</p>
-          </button>
-        </div>
-      </dl>
-    </div>
+    <!-- 검색 폼 컴포넌트 사용 -->
+    <SearchFormComponent :initialData="searchReqDTO" pageType="media" @search="handleSearch" @reset="handleReset" />
     <div class="search-result">
       <div class="tabs">
         <div class="flex-sp-bw mb-20 align-center">
@@ -102,9 +45,7 @@
           <div v-else class="no-results">
             <img :src="nosearch" alt="">
             <p>검색 결과가 없습니다.</p>
-            <p>단어의 철자가 정확한지 확인해 주시기 바랍니다.<br>
-검색어의 단어 수를 줄이거나, 다른 검색어(유사어)로 검색해 보시기 바랍니다.<br>
-일반적으로 많이 사용하는 검색어로 다시 검색해 주시기 바랍니다.</p>
+            <p>단어의 철자가 정확한지 확인해 주시기 바랍니다.<br> 검색어의 단어 수를 줄이거나, 다른 검색어(유사어)로 검색해 보시기 바랍니다.<br> 일반적으로 많이 사용하는 검색어로 다시 검색해 주시기 바랍니다.</p>
           </div>
         </div>
       </div>
@@ -112,18 +53,26 @@
       <DefaultPagination class="mt-40" :search="searchReqDTO" @onChange="fnChangeCurrentPage" />
     </div>
   </div>
+  <div v-if="loading" class="loading-overlay">
+    <div class="loading-spinner"></div>
+    <div>
+      <p>검색 중입니다</p>
+      <p>잠시만 기다려주세요</p>
+    </div>
+  </div>
 </template>
 <script>
 // COMPONENT
+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';
 // API
-import { findAllByNullProc } from "@/resources/api/category";
 import { findAllMediaVidosProc } from "@/resources/api/mediaVido";
 
 export default {
   components: {
+    SearchFormComponent,
     DefaultPagination,
     CardStyleComponent,
     ListStyleComponent,
@@ -135,22 +84,7 @@
       nosearch: "client/resources/images/no_search.png",
       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',
-
-      // 검색용 객체
-      isChkAllScope: true, // 검색범위 전체 체크 여부
-      searchType: [
-        { key: "sj", value: "제목" },
-        { key: "cn", value: "내용" },
-        { key: "adres", value: "주소" },
-      ], // 검색범위 목록
-      categorys: [], // 카테고리 목록
-      orders: [
-        { key: "rgsde", value: "최신" },
-        { key: "rdcnt", value: "인기" },
-      ], // 정렬 목록
 
       // 검색용 객체 초기값
       searchDefault: {
@@ -159,14 +93,18 @@
         searchText: null,
         startYear: null,
         endYear: null,
+        searchTy: "M", // 미디어 영상 고정
         searchCtgries: [],
         order: "rgsde",
         // 페이지네이션
         currentPage: 1, // 현재 페이지
         recordSize: 24, // 한 페이지에 표시할 데이터 개수
       },
-      searchReqDTO: {}, // 실제 검색에 사용되는 객체
 
+      // URL 파라미터로부터 가져온 초기 검색 조건
+      urlParamsDefault: null,
+
+      searchReqDTO: {}, // 실제 검색에 사용되는 객체
       searchResult: [], // 검색결과
 
       // 목록 레이아웃
@@ -186,64 +124,51 @@
         },
       ],
 
-      isInitialLoad: true // 초기 로드 여부
+      isInitialLoad: true, // 초기 로드 여부
+
+      loading: false, // 로딩 상태 추가
     };
   },
 
   created() {
-    this.init(); // 초기화
-    this.fnFindCategorys(); // 카테고리 목록 조회 (검색조건 없음)
+    // 초기화
+    this.searchReqDTO = JSON.parse(JSON.stringify(this.searchDefault));
+    this.selectedTabId = this.tabs[0].id; // 기본 탭 설정
+
+    // URL 파라미터에서 검색 조건 가져오기
+    this.queryParamsToSearch();
+  },
+
+  mounted() {
+    this.fnSearch(); // 초기 검색 실행
   },
 
   methods: {
-    // 초기화
-    init() {
-      if (this.isInitialLoad) {
-        this.isInitialLoad = false;
-
-        this.queryParamsToSearch();
-      } else {
-        if (!confirm('검색 조건을 초기화하시겠습니까?')) {
-          return;
-        }
-      }
-
-      this.selectedTabId = this.tabs[0].id;
-
-      this.searchReqDTO = JSON.parse(JSON.stringify(this.searchDefault));
-      this.searchResult = []; // 검색결과 초기화
-
-      this.fnChnageReqDTO(); // 통합검색
-    },
-
+    // URL 파라미터로부터 검색 조건 설정
     queryParamsToSearch() {
       let query = this.$route.query;
       if (!this.$isEmpty(query)) {
+        // 기본 검색 조건 복사
+        let urlParams = JSON.parse(JSON.stringify(this.searchDefault));
+
         const typeConverters = {
           useSj: val => val === 'true',
           useCn: val => val === 'true',
           searchCtgries: val => Array.isArray(val) ? val : (val ? val.split(',') : [])
         };
+
+        // URL 파라미터 값 적용
         Object.entries(query).forEach(([key, value]) => {
-          if (key in this.searchDefault) {
-            this.searchDefault[key] = key in typeConverters ? typeConverters[key](value) : value;
+          if (key in urlParams) {
+            urlParams[key] = key in typeConverters ? typeConverters[key](value) : value;
           }
         });
-      }
-    },
 
-    // 카테고리 목록 조회
-    async fnFindCategorys() {
-      try {
-        const response = await findAllByNullProc();
-        this.categorys = response.data.data.ctgry;
-      } catch (error) {
-        this.categorys = []; // 카테고리 목록 초기화
+        // URL 파라미터 기반 초기값 저장
+        this.urlParamsDefault = urlParams;
 
-        if (error.response) {
-          alert(error.response.data.message);
-        }
-        console.error(error.message);
+        // 현재 검색 조건에 적용
+        this.searchReqDTO = JSON.parse(JSON.stringify(urlParams));
       }
     },
 
@@ -253,6 +178,31 @@
       this.$nextTick(() => {
         this.fnSearch();
       });
+    },
+
+    // 검색 폼 컴포넌트에서 검색 버튼 클릭 시 호출되는 메소드
+    handleSearch(formData) {
+      // searchTy는 항상 "M"로 유지
+      formData.searchTy = "M";
+
+      // 페이지 초기화
+      formData.currentPage = 1;
+
+      this.searchReqDTO = formData;
+      this.fnSearch();
+    },
+
+    // 검색 폼 컴포넌트에서 초기화 버튼 클릭 시 호출되는 메소드
+    handleReset() {
+      // URL 파라미터가 있으면 그 값 사용, 없으면 기본값 사용
+      if (this.urlParamsDefault) {
+        this.searchReqDTO = JSON.parse(JSON.stringify(this.urlParamsDefault));
+      } else {
+        this.searchReqDTO = JSON.parse(JSON.stringify(this.searchDefault));
+      }
+
+      this.searchResult = []; // 검색결과 초기화
+      this.fnSearch(); // 초기화 후 검색 실행
     },
 
     // 검색 조건이 변경된 경우
@@ -265,6 +215,7 @@
 
     // 통합검색
     async fnSearch() {
+      this.loading = true; // 로딩 시작
       try {
         const params = JSON.parse(JSON.stringify(this.searchReqDTO));
 
@@ -286,18 +237,9 @@
           alert(error.response.data.message);
         }
         console.error(error.message);
+      } finally {
+        this.loading = false; // 로딩 종료
       }
-    },
-
-    // 검색범위 전체 선택 여부 변경
-    fnChkAllOptions() {
-      this.searchReqDTO.useSj = this.isChkAllScope;
-      this.searchReqDTO.useCn = this.isChkAllScope;
-    },
-
-    // 검색범위 선택 여부 변경
-    fnChkOption() {
-      this.isChkAllScope = this.searchReqDTO.useSj && this.searchReqDTO.useCn;
     },
 
     selectTab(tabId) {
client/views/pages/bbsNesDta/NewsReleaseSearch.vue
--- client/views/pages/bbsNesDta/NewsReleaseSearch.vue
+++ client/views/pages/bbsNesDta/NewsReleaseSearch.vue
@@ -13,65 +13,8 @@
         </ul>
       </div>
     </div>
-    <div class="search-form form">
-      <dl>
-        <dd class="mb-15">
-          <p>검색범위</p>
-          <ul>
-            <li>
-              <input type="checkbox" id="allScope" v-model="isChkAllScope" @change="fnChkAllOptions" />
-              <label for="allScope">전체</label>
-            </li>
-            <li>
-              <input type="checkbox" id="searchSj" v-model="searchReqDTO.useSj" @change="fnChkOption" />
-              <label for="searchSj">제목</label>
-            </li>
-            <li>
-              <input type="checkbox" id="searchCn" v-model="searchReqDTO.useCn" @change="fnChkOption" />
-              <label for="searchCn">내용</label>
-            </li>
-          </ul>
-        </dd>
-        <dd class="mb-15">
-          <p>검색어</p>
-          <div class="wfull"><input type="text" v-model="searchReqDTO.searchText" v-on:keyup.enter="fnChnageReqDTO"></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 category-dd">
-          <p>카테고리</p>
-          <ul>
-            <li v-for="(category, idx) of categorys" :key="idx">
-              <input type="checkbox" :id="'ctgry_' + idx" name="categorys" :value="category.ctgryId" v-model="searchReqDTO.searchCtgries" />
-              <label :for="'ctgry_' + idx">{{ 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="fnChnageReqDTO">
-            <img :src="searchicon" alt="">
-            <p>검색</p>
-          </button>
-        </div>
-      </dl>
-    </div>
+    <!-- 검색 폼 컴포넌트 사용 -->
+    <SearchFormComponent :initialData="searchReqDTO" pageType="bodo" @search="handleSearch" @reset="handleReset" />
     <div class="search-result">
       <div class="tabs">
         <div class="flex-sp-bw mb-20 align-center">
@@ -110,19 +53,27 @@
       <div class="btn-group flex-end mt-40"><button type="button" class="register" @click="fnMoveTo('edit')">등록</button></div>
       <DefaultPagination class="mt-40" :search="searchReqDTO" @onChange="fnChangeCurrentPage" />
     </div>
+    <div v-if="loading" class="loading-overlay">
+      <div class="loading-spinner"></div>
+      <div>
+        <p>검색 중입니다</p>
+        <p>잠시만 기다려주세요</p>
+      </div>
+    </div>
   </div>
 </template>
 <script>
 // COMPONENT
+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';
 // API
-import { findAllByNullProc } from "@/resources/api/category";
 import { findAllNesDtasProc } from "@/resources/api/nesDta";
 
 export default {
   components: {
+    SearchFormComponent,
     DefaultPagination,
     CardStyleComponent,
     ListStyleComponent,
@@ -134,22 +85,7 @@
       nosearch: "client/resources/images/no_search.png",
       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',
-
-      // 검색용 객체
-      isChkAllScope: true, // 검색범위 전체 체크 여부
-      searchType: [
-        { key: "sj", value: "제목" },
-        { key: "cn", value: "내용" },
-        { key: "adres", value: "주소" },
-      ], // 검색범위 목록
-      categorys: [], // 카테고리 목록
-      orders: [
-        { key: "rgsde", value: "최신" },
-        { key: "rdcnt", value: "인기" },
-      ], // 정렬 목록
 
       // 검색용 객체 초기값
       searchDefault: {
@@ -158,14 +94,18 @@
         searchText: null,
         startYear: null,
         endYear: null,
+        searchTy: "N", // 보도자료 고정
         searchCtgries: [],
         order: "rgsde",
         // 페이지네이션
         currentPage: 1, // 현재 페이지
         recordSize: 24, // 한 페이지에 표시할 데이터 개수
       },
-      searchReqDTO: {}, // 실제 검색에 사용되는 객체
 
+      // URL 파라미터로부터 가져온 초기 검색 조건
+      urlParamsDefault: null,
+
+      searchReqDTO: {}, // 실제 검색에 사용되는 객체
       searchResult: [], // 검색결과
 
       // 목록 레이아웃
@@ -185,64 +125,51 @@
         },
       ],
 
-      isInitialLoad: true // 초기 로드 여부
+      isInitialLoad: true, // 초기 로드 여부
+
+      loading: false, // 로딩 상태 추가
     };
   },
 
   created() {
-    this.init(); // 초기화
-    this.fnFindCategorys(); // 카테고리 목록 조회 (검색조건 없음)
+    // 초기화
+    this.searchReqDTO = JSON.parse(JSON.stringify(this.searchDefault));
+    this.selectedTabId = this.tabs[0].id; // 기본 탭 설정
+
+    // URL 파라미터에서 검색 조건 가져오기
+    this.queryParamsToSearch();
+  },
+
+  mounted() {
+    this.fnSearch(); // 초기 검색 실행
   },
 
   methods: {
-    // 초기화
-    init() {
-      if (this.isInitialLoad) {
-        this.isInitialLoad = false;
-
-        this.queryParamsToSearch();
-      } else {
-        if (!confirm('검색 조건을 초기화하시겠습니까?')) {
-          return;
-        }
-      }
-
-      this.selectedTabId = this.tabs[0].id;
-
-      this.searchReqDTO = JSON.parse(JSON.stringify(this.searchDefault));
-      this.searchResult = []; // 검색결과 초기화
-
-      this.fnChnageReqDTO(); // 통합검색
-    },
-
+    // URL 파라미터로부터 검색 조건 설정
     queryParamsToSearch() {
       let query = this.$route.query;
       if (!this.$isEmpty(query)) {
+        // 기본 검색 조건 복사
+        let urlParams = JSON.parse(JSON.stringify(this.searchDefault));
+
         const typeConverters = {
           useSj: val => val === 'true',
           useCn: val => val === 'true',
           searchCtgries: val => Array.isArray(val) ? val : (val ? val.split(',') : [])
         };
+
+        // URL 파라미터 값 적용
         Object.entries(query).forEach(([key, value]) => {
-          if (key in this.searchDefault) {
-            this.searchDefault[key] = key in typeConverters ? typeConverters[key](value) : value;
+          if (key in urlParams) {
+            urlParams[key] = key in typeConverters ? typeConverters[key](value) : value;
           }
         });
-      }
-    },
 
-    // 카테고리 목록 조회
-    async fnFindCategorys() {
-      try {
-        const response = await findAllByNullProc();
-        this.categorys = response.data.data.ctgry;
-      } catch (error) {
-        this.categorys = []; // 카테고리 목록 초기화
+        // URL 파라미터 기반 초기값 저장
+        this.urlParamsDefault = urlParams;
 
-        if (error.response) {
-          alert(error.response.data.message);
-        }
-        console.error(error.message);
+        // 현재 검색 조건에 적용
+        this.searchReqDTO = JSON.parse(JSON.stringify(urlParams));
       }
     },
 
@@ -252,6 +179,31 @@
       this.$nextTick(() => {
         this.fnSearch();
       });
+    },
+
+    // 검색 폼 컴포넌트에서 검색 버튼 클릭 시 호출되는 메소드
+    handleSearch(formData) {
+      // searchTy는 항상 "N"로 유지
+      formData.searchTy = "N";
+
+      // 페이지 초기화
+      formData.currentPage = 1;
+
+      this.searchReqDTO = formData;
+      this.fnSearch();
+    },
+
+    // 검색 폼 컴포넌트에서 초기화 버튼 클릭 시 호출되는 메소드
+    handleReset() {
+      // URL 파라미터가 있으면 그 값 사용, 없으면 기본값 사용
+      if (this.urlParamsDefault) {
+        this.searchReqDTO = JSON.parse(JSON.stringify(this.urlParamsDefault));
+      } else {
+        this.searchReqDTO = JSON.parse(JSON.stringify(this.searchDefault));
+      }
+
+      this.searchResult = []; // 검색결과 초기화
+      this.fnSearch(); // 초기화 후 검색 실행
     },
 
     // 검색 조건이 변경된 경우
@@ -264,6 +216,7 @@
 
     // 통합검색
     async fnSearch() {
+      this.loading = true; // 로딩 시작
       try {
         const params = JSON.parse(JSON.stringify(this.searchReqDTO));
 
@@ -285,18 +238,9 @@
           alert(error.response.data.message);
         }
         console.error(error.message);
+      } finally {
+        this.loading = false; // 로딩 종료
       }
-    },
-
-    // 검색범위 전체 선택 여부 변경
-    fnChkAllOptions() {
-      this.searchReqDTO.useSj = this.isChkAllScope;
-      this.searchReqDTO.useCn = this.isChkAllScope;
-    },
-
-    // 검색범위 선택 여부 변경
-    fnChkOption() {
-      this.isChkAllScope = this.searchReqDTO.useSj && this.searchReqDTO.useCn;
     },
 
     selectTab(tabId) {
client/views/pages/main/TotalSearch.vue
--- client/views/pages/main/TotalSearch.vue
+++ client/views/pages/main/TotalSearch.vue
@@ -13,117 +13,36 @@
         </ul>
       </div>
     </div>
-    <div class="search-form form ">
-      <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>
-              <input type="checkbox" id="photoRecord" v-model="searchReqDTO.usePhoto" @change="fnChkOption('record')" />
-              <label for="photoRecord">사진</label>
-            </li>
-            <li>
-              <input type="checkbox" id="videoRecord" v-model="searchReqDTO.useVideo" @change="fnChkOption('record')" />
-              <label for="videoRecord">영상</label>
-            </li>
-            <li>
-              <input type="checkbox" id="mediaVideo" v-model="searchReqDTO.useMedia" @change="fnChkOption('record')" />
-              <label for="mediaVideo">미디어영상</label>
-            </li>
-            <li>
-              <input type="checkbox" id="newsData" v-model="searchReqDTO.useNews" @change="fnChkOption('record')" />
-              <label for="newsData">보도자료</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>
-              <input type="checkbox" id="searchSj" v-model="searchReqDTO.useSj" @change="fnChkOption('scope')" />
-              <label for="searchSj">제목</label>
-            </li>
-            <li>
-              <input type="checkbox" id="searchCn" v-model="searchReqDTO.useCn" @change="fnChkOption('scope')" />
-              <label for="searchCn">내용</label>
-            </li>
-            <li>
-              <input type="checkbox" id="searchAdres" v-model="searchReqDTO.useAdres" @change="fnChkOption('scope')" />
-              <label for="searchAdres">주소</label>
-            </li>
-          </ul>
-        </dd>
-        <dd class="mb-15">
-          <p>검색어</p>
-          <div class="wfull"><input type="text" v-model="searchReqDTO.searchText" v-on:keyup.enter="fnSearch()"></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 category-dd">
-          <p>카테고리</p>
-          <ul>
-            <li v-for="(category, idx) of categorys" :key="idx">
-              <input type="checkbox" :id="'ctgry_' + idx" name="categorys" :value="category.ctgryId" v-model="searchReqDTO.searchCtgries" />
-              <label :for="'ctgry_' + idx">{{ 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="fnSearch">
-            <img :src="searchicon" alt="">
-            <p>검색</p>
-          </button>
-        </div>
-      </dl>
-    </div>
+    <!-- 분리된 검색 폼 컴포넌트 사용 -->
+    <SearchFormComponent :initialData="searchReqDTO" pageType="all" @search="handleSearch" @reset="handleReset" />
     <div class="search-result">
       <CardViewList v-for="(item, idx) of searchResult" :key="idx" :name="item.key" :count="item.count" :list="item.list" :params="params" />
+    </div>
+  </div>
+  <div v-if="loading" class="loading-overlay">
+    <div class="loading-spinner"></div>
+    <div>
+      <p>검색 중입니다</p>
+      <p>잠시만 기다려주세요</p>
     </div>
   </div>
 </template>
 <script>
 // COMPONENT
+import SearchFormComponent from '../../component/SearchFormComponent.vue';
 import CardViewList from "../../component/listLayout/CardViewList.vue";
 // API
 import { findAllDatas } from "../../../resources/api/main"; // 통합 검색
-import { findAllByNullProc } from "../../../resources/api/category"; // 카테고리 목록 검색
 
 export default {
   components: {
+    SearchFormComponent,
     CardViewList
   },
   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',
 
       // 검색용 객체 초기값
@@ -141,131 +60,112 @@
         searchCtgries: [],
         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: "인기" },
-      ], // 정렬 목록
+      // URL 파라미터로부터 가져온 초기 검색 조건
+      urlParamsDefault: null,
 
+      searchReqDTO: {}, // 현재 검색 조건
       searchResult: [], // 검색결과
+      params: {}, // 바로가기 링크용 파라미터
 
-      isInitialLoad: true, // 초기 로드 여부
-
-      params: {},
+      loading: false, // 로딩 상태 추가
     };
   },
 
   created() {
-    this.init(); // 초기화
-    this.fnFindCategorys(); // 카테고리 목록 조회 (검색조건 없음)
+    // 초기화
+    this.searchReqDTO = JSON.parse(JSON.stringify(this.searchDefault));
+
+    // URL 파라미터에서 검색 조건 가져오기
+    this.loadSearchParamsFromUrl();
   },
 
   mounted() {
-    let searchRecord = this.$route.query.searchRecord;
-    if (!this.$isEmpty(searchRecord)) {
-      switch (searchRecord) {
-        case 'pic':
-          this.isChkAllRecord = false;
-          this.searchReqDTO.usePhoto = true;
-          this.searchReqDTO.useVideo = false;
-          this.searchReqDTO.useMedia = false;
-          this.searchReqDTO.useNews = false;
-          break;
-        case 'video':
-          this.isChkAllRecord = false;
-          this.searchReqDTO.usePhoto = false;
-          this.searchReqDTO.useVideo = true;
-          this.searchReqDTO.useMedia = false;
-          this.searchReqDTO.useNews = false;
-          break;
-        case 'media':
-          this.isChkAllRecord = false;
-          this.searchReqDTO.usePhoto = false;
-          this.searchReqDTO.useVideo = false;
-          this.searchReqDTO.useMedia = true;
-          this.searchReqDTO.useNews = false;
-          break;
-        case 'bodo':
-          this.isChkAllRecord = false;
-          this.searchReqDTO.usePhoto = false;
-          this.searchReqDTO.useVideo = false;
-          this.searchReqDTO.useMedia = false;
-          this.searchReqDTO.useNews = true;
-          break;
-        default:
-          this.isChkAllRecord = true;
-          this.searchReqDTO.usePhoto = true;
-          this.searchReqDTO.useVideo = true;
-          this.searchReqDTO.useMedia = true;
-          this.searchReqDTO.useNews = true;
-          break;
-      }
-    }
-
-    let searchText = this.$route.query.searchText;
-    if (searchText !== null) {
-      this.searchReqDTO.searchText = searchText;
-    }
-
-    this.fnSearch(); // 통합검색
+    this.fnSearch(); // 초기 검색 실행
   },
 
   methods: {
-    // 초기화
-    init() {
-      if (this.isInitialLoad) {
-        this.isInitialLoad = false;
-      } else {
-        if (!confirm('검색 조건을 초기화하시겠습니까?')) {
-          return;
+    // URL 파라미터로부터 검색 조건 설정
+    loadSearchParamsFromUrl() {
+      // 검색 기본 값 저장
+      let urlParams = JSON.parse(JSON.stringify(this.searchDefault));
+      let hasUrlParams = false;
+
+      // searchRecord 파라미터 처리
+      let searchRecord = this.$route.query.searchRecord;
+      if (!this.$isEmpty(searchRecord)) {
+        hasUrlParams = true;
+
+        switch (searchRecord) {
+          case 'pic':
+            urlParams.usePhoto = true;
+            urlParams.useVideo = false;
+            urlParams.useMedia = false;
+            urlParams.useNews = false;
+            break;
+          case 'video':
+            urlParams.usePhoto = false;
+            urlParams.useVideo = true;
+            urlParams.useMedia = false;
+            urlParams.useNews = false;
+            break;
+          case 'media':
+            urlParams.usePhoto = false;
+            urlParams.useVideo = false;
+            urlParams.useMedia = true;
+            urlParams.useNews = false;
+            break;
+          case 'bodo':
+            urlParams.usePhoto = false;
+            urlParams.useVideo = false;
+            urlParams.useMedia = false;
+            urlParams.useNews = true;
+            break;
+          default:
+            urlParams.usePhoto = true;
+            urlParams.useVideo = true;
+            urlParams.useMedia = true;
+            urlParams.useNews = true;
+            break;
         }
       }
 
-      this.searchReqDTO = JSON.parse(JSON.stringify(this.searchDefault));
-      this.isChkAllRecord = true;
-      this.isChkAllScope = true;
+      // searchText 파라미터 처리
+      let searchText = this.$route.query.searchText;
+      if (searchText !== null && searchText !== undefined) {
+        hasUrlParams = true;
+        urlParams.searchText = searchText;
+      }
+
+      // URL 파라미터가 있으면 저장
+      if (hasUrlParams) {
+        this.urlParamsDefault = urlParams;
+        this.searchReqDTO = JSON.parse(JSON.stringify(urlParams));
+      }
+    },
+
+    // 검색 폼 컴포넌트에서 검색 버튼 클릭 시 호출되는 메소드
+    handleSearch(formData) {
+      this.searchReqDTO = formData;
+      this.fnSearch();
+    },
+
+    // 검색 폼 컴포넌트에서 초기화 버튼 클릭 시 호출되는 메소드
+    handleReset() {
+      // URL 파라미터가 있으면 그 값 사용, 없으면 기본값 사용
+      if (this.urlParamsDefault) {
+        this.searchReqDTO = JSON.parse(JSON.stringify(this.urlParamsDefault));
+      } else {
+        this.searchReqDTO = JSON.parse(JSON.stringify(this.searchDefault));
+      }
 
       this.searchResult = []; // 검색결과 초기화
+      this.fnSearch(); // 초기화 후 검색 실행
     },
 
-    // 카테고리 목록 조회
-    async fnFindCategorys() {
-      try {
-        const response = await findAllByNullProc();
-        this.categorys = response.data.data.ctgry;
-      } catch (error) {
-        this.categorys = []; // 카테고리 목록 초기화
-
-        if (error.response) {
-          alert(error.response.data.message);
-        }
-        console.error(error.message);
-      }
-    },
-
-    // 통합검색
+    // 통합검색 실행
     async fnSearch() {
-      // 유효성 검사
-      if (!this.searchReqDTO.usePhoto && !this.searchReqDTO.useVideo && !this.searchReqDTO.useMedia && !this.searchReqDTO.useNews) {
-        alert('검색 유형은 최소 한 개 이상 선택해주세요.');
-        return;
-      }
-
+      this.loading = true; // 로딩 시작
       try {
         const params = JSON.parse(JSON.stringify(this.searchReqDTO));
 
@@ -288,37 +188,10 @@
           alert(error.response.data.message);
         }
         console.error(error.message);
+      } finally {
+        this.loading = false; // 로딩 종료
       }
     },
-
-    // 기록유형 전체 선택 여부 변경
-    fnChkAllOptions(type) {
-      switch (type) {
-        case 'record':
-          this.searchReqDTO.usePhoto = this.isChkAllRecord;
-          this.searchReqDTO.useVideo = this.isChkAllRecord;
-          this.searchReqDTO.useMedia = this.isChkAllRecord;
-          this.searchReqDTO.useNews = this.isChkAllRecord;
-          break;
-        case 'scope':
-          this.searchReqDTO.useSj = this.isChkAllScope;
-          this.searchReqDTO.useCn = this.isChkAllScope;
-          this.searchReqDTO.useAdres = this.isChkAllScope;
-          break;
-      }
-    },
-
-    // 기록유형 선택 여부 변경
-    fnChkOption(type) {
-      switch (type) {
-        case 'record':
-          this.isChkAllRecord = this.searchReqDTO.usePhoto && this.searchReqDTO.useVideo && this.searchReqDTO.useMedia && this.searchReqDTO.useNews;
-          break;
-        case 'scope':
-          this.isChkAllScope = this.searchReqDTO.useSj && this.searchReqDTO.useCn && this.searchReqDTO.useAdres;
-          break;
-      }
-    }
   },
 };
 </script>
(파일 끝에 줄바꿈 문자 없음)
Add a comment
List