2022. 3. 18. 17:55ใProgramming Project ์์ ์ค/๋ด์ฉ ์ ๋ฆฌ
๐ง๐ป๐ป Git Hub ์ฃผ์
๐ ๋ชฉ์ฐจ
โ [FrontEnd][Vue-PJ] ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - Home / Main
โ [FrontEnd][Vue-PJ] ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ๊ฒ์ํ ๋ง๋ค๊ธฐ : ๋ชฉ๋ก ์กฐํ
โ [FrontEnd][Vue-PJ] ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ๊ฒ์ํ ๋ง๋ค๊ธฐ : ์์ธ ์กฐํ
โ [FrontEnd][Vue-PJ] ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ๊ฒ์ํ ๋ง๋ค๊ธฐ : ๋ฑ๋ก / ์์
โ [FrontEnd][Vue-PJ] ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ๊ฒ์ํ ๋ง๋ค๊ธฐ : ์ญ์
โ [FrontEnd][Vue-PJ] ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ๊ฒ์ํ ๋ง๋ค๊ธฐ : ๋ต๋ณ ๋ฑ๋ก / ์์
โ [FrontEnd][Vue-PJ] ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ๊ฒ์ํ ๋ง๋ค๊ธฐ : ๋ต๋ณ ์ญ์
๐จ๐ฉ๐ง๐ฆ ํ์ ๊ด๋ จ
โ [FrontEnd][Vue-PJ] ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ํ์ ๊ด๋ จ : ํ์ ๊ฐ์
- ๋ถ ๋ก -
[FrontEnd][Vue-PJ] ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - Paging ์ฒ๋ฆฌ
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - Vue Router
๐ ๊ฒ์ํ ๋ง๋ค๊ธฐ - ๋ชฉ๋ก ์กฐํ
๐ฝ ํ๋ฉด
๐ฝ Source Code
<template>
<!-- ์ปจํ
์ธ ์์ญ -->
<div id="contentWrap">
<div id="topVisualWrap">
<div class="topVisual">
<p class="tit01">[JUNY COMPANY] ๊ฐ๋ฐ์ ์
๋ฌด ํ์
์๋น์ค ์ํ</p>
<p class="tit02">์ธ๊ณต์ง๋ฅ ํด๋ผ์ฐ๋ ์ฃผ๋ํ๋ ํ๋ซํผ <span></span></p>
</div> <!-- class="topVisual" ๋ -->
</div> <!-- id="topVisualWrap" ๋ -->
<!-- ์ปจํ
์ธ ์์ญ -->
<div id="Content">
<h2>
<span>๊ฐ๋ฐ์ง์</span>
<span><b>Q&A</b></span>
</h2>
<div class="topSearch">
<select name="" class="tops_sel" v-model="searchParams.srchType">
<option value="1">์ ๋ชฉ</option>
<option value="2">๋ด์ฉ</option>
<option value="3">์์ฑ์</option>
</select>
<input type="text" name="" class="tops_inp" placeholder="๊ฒ์์ด๋ฅผ ์
๋ ฅ ํด ์ฃผ์ธ์!" v-model="searchParams.srcWord" @keyup.enter="searchList()">
<button type="button" onclick="" class="topBtnSearch" @click="searchList()">๊ฒ์</button>
</div> <!-- class="topSearch" -->
<div class="ListTbWrap mt-20">
<div class="tbHead">
<div class="total">
์ด<span>{{total}}</span>๊ฑด ๊ฒ์๊ธ ์กด์ฌ
</div> <!-- class="total" ๋ -->
<div class="tbHeadR">
<button type="button" class="btn01" @click="goRegist()">๊ธ์ฐ๊ธฐ</button>
</div> <!-- class="tbHeadR" ๋ -->
</div> <!-- class="tbHead" ๋ -->
<table class="tList">
<caption>๊ฐ๋ฐ์ ๊ฐ์ด๋ ๋ชฉ๋ก</caption>
<colgroup>
<col style="width: 8%">
<col>
<col style="width: 10%">
<col style="width: 15%">
<col style="width: 10%">
</colgroup>
<thead>
<tr>
<th>์๋ฒ</th>
<th>์ ๋ชฉ</th>
<th>๋ฑ๋ก์</th>
<th>๋ฑ๋ก์ผ</th>
<th>๋ต๋ณ ์ฌ๋ถ</th>
</tr>
</thead>
<tbody>
<template v-if="this.total > 0">
<tr v-for="(list) in devInquryList" :key="list.inqrySn">
<td>{{list.inqryIndex}}</td>
<td class="alignL">
<a href="#" :class="{'ellipsis' : list.secretAt==='N', 'ellipsis lock' : list.secretAt === 'Y'}" @click="goDetailView(list.inqrySn)">{{list.inqrySj}}</a>
</td>
<td>{{list.userId}}</td>
<td>{{list.creatDt}}</td>
<td>
<label class="lb01" v-if="list.answerAt==='N'">๋๊ธฐ</label>
<label class="lb01" v-else-if="list.answerAt!=='N'">์๋ฃ</label>
</td>
</tr>
</template>
<template v-else>
<tr>
<td colspan="5" class="noData">๋ฐ์ดํฐ๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค.</td>
</tr>
</template>
</tbody>
</table>
<!-- ํ์ง์ง ์ฒ๋ฆฌ ๋ถ -->
<pagination
v-show="total > 0"
ref="pagination"
:total-count="total"
:row-count="this.searchParams.perPageNum"
:curr-page="this.searchParams.page"
@change-page="changePage"
/>
<!-- ์ธ๊ฐ ๊ด๋ จ Pop up -->
<div class="card3_popup" style="display: block; top: 160px;" v-show="this.viewDeletePopup">
<div class="popup_body">
<!-- Message -->
<div class="card_mody mt-20">
<p class="c_tit">์์ฑ์๋ง ์ด๋ ๊ฐ๋ฅ ํฉ๋๋ค!</p>
</div> <!-- class="card_mody mt-20" ๋ -->
</div> <!-- class="popup_body" ๋ -->
<div class="popup_close" @click="this.viewDeletePopup = false">๋ซ๊ธฐ</div>
</div> <!-- class="card3_popup" style="display: block; top: 160px;" v-show="this.viewDeletePopup" ๋ -->
<!-- ์ธ๊ฐ ๊ด๋ จ Pop up End -->
<!-- Login ๊ด๋ จ Pop up -->
<div class="card3_popup" style="display: block; top:160px;" v-show="this.loginDeletePopup">
<div class="popup_body">
<!-- Message -->
<div class="card_mody mt-20">
<p class="c_tit">๋ก๊ทธ์ธ ํ ์ด์ฉ ๊ฐ๋ฅ ํฉ๋๋ค!</p>
</div>
</div> <!-- class="popup_body" ๋ -->
<div class="btn_wrap_pop">
<button class="btn_m01_50" @click="this.loginDeletePopup = false">ํ์ธ</button>
<button class="btn_m02_50" @click="this.loginDeletePopup = false">์ทจ์</button>
</div> <!-- class="btn_wrap_pop" ๋ -->
<div class="popup_close" @click="this.loginDeletePopup = false">๋ซ๊ธฐ</div>
</div> <!-- class="card3_popup" style="display: block; top:160px;" v-show="this.loginDeletePopup" ๋ -->
<!-- Login ๊ด๋ จ Pop up End -->
</div> <!-- class="ListTbWrap mt-20" ๋ -->
</div> <!-- id="Content" ๋ -->
</div> <!-- id="contentWrap" ๋ -->
</template>
<script>
import {devInquryList} from "@/api/devInquryApi";
export default {
data() {
return {
searchParams : {
srchWord : "",
srchType : "1",
page: 1,
perPageNum: 10
}, // serchParams ๋
devInquryList : [],
total : 0,
loginDeletePopup : false, viewDeletePopup : false
} // return ๋
}, // data() ๋
created() {
this.handleFilter();
}, // created() ๋
methods: {
searchList() {
devInquryList(this.searchParams)
.then(response => {
console.log("Q&A ๊ฒ์ํ ๋ชฉ๋ก ์กฐํ ๊ฐ(response.data.devInquryList) : ", response.data)
this.devInquryList = response.data.devInquryList;
this.total = response.data.devInquryListCnt;
});
}, // searchList() ๋
handleFilter() {
this.searchParams.page = 1;
this.searchList(); // ๋ชฉ๋ก ์กฐํ Method ํธ์ถ
}, // handleFilter() ๋
/* ํ์ด์ง๋น ๊ฐฏ์ ๋ณ๊ฒฝ */
changeRowCount(perPageNum) {
this.searchParams.perPageNum = perPageNum;
this.changePage(1);
},
changePage(page) {
this.searchParams.page = page;
this.searchList(); // ๋ชฉ๋ก ์กฐํ
},
goDetailView(inqrySn) {
this.$router.push({
path : "/support/devInquryDetailView",
query : {
inqrySn : inqrySn,
} // query ๋
});
}, // goDetailView(inqrySn) ๋
goRegist() {
this.$router.push({
path: "/support/devInquryRegist",
query : {
status : 'C',
noticeSn : 0
}
});
}, // goRegist() ๋
} // methods ๋
}
</script>
<style lang="">
</style>
DevInquryList.vue
๐ฝ axois๋ฅผ ์ด์ฉํ Back End์์ ํต์
Code๋ฅผ ๋ถ์ํ๊ธฐ ์ ์ ๋จผ์ axios๋ฅผ ํตํด Back End์ ์ด๋ป๊ฒ ์์ฒญ์ ์ฃผ๊ณ , ์ด๋ป๊ฒ ์๋ต๊ฐ์ ๋ฐ์์ค๋์ง ์ ๋ฆฌํ๋ ๊ฒ์ด ๋จผ์ ๋ผ๊ณ ํ๋จํ ๊ฒ์ด์์.
์ต์ด ์ฃผ๋ํ๋์ methods์์ Method๋ค์ ์ ์๋ฅผ ํ๋๋ฐ, axios๋ฅผ ์ด์ฉํ searchList()๋ผ๋ Method๋ฅผ ๋จผ์ ๋ง๋ค์ด ์ค ๊ฒ์ด์์.
์ต์ด ํด๋น Componet๊ฐ Randering์ด ๋ ๋, created()๊ฐ ๋์ํ๊ฒ ๋๋๋ฐ,
์ด ๋, handleFilter()๋ผ๋ Method๋ฅผ ํธ์ถํ๊ฒ ๋ง๋ค์ด ์ค ๊ฒ์ด์์.
handleFilter๋ ๋จผ์ Paging์ฒ๋ฆฌ์ ๋ํ ์ด๊ธฐ๊ฐ ์ฆ, ํ์ฌ Page ์์น๋ฅผ 1๋ก ๋ง๋ค์ด ์ฃผ๊ณ , ๊ฒ์๊ธ ๋ด์ฉ์ ๋ชจ๋ ๊ฐ์ ธ์์ผ ํ๋๊น searchList()๋ฅผ ํธ์ถํ๊ฒ ๋๋ ๊ฒ์ด์์.
๋ค์ serchList()์ ๋ชจ์ต์ ์ดํด ๋ณด๋ฉด
Method๊ฐ ๋์ํ๋ฉด์ devInquryList๋ผ๋ Method๋ฅผ ํธ์ถํ๋ฉด์ ๊ทธ ์์ ๊ฐ์ฒด(Object)ํ Member ๋ณ์๋ก ๋ง๋ค์ด ๋ searchParams๋ผ๋ ์น๊ตฌ๋ฅผ ๋งค๊ฐ ๋ณ์๋ก ์ ๋ฌ์ ํด ์ฃผ๋ ๊ฒ์ด์์. ์ฆ, BackEnd์ ์์ฒญ๊ฐ์ ์ ๋ฌ ํ ๋ ์ฌ๊ธฐ searchParams๋ฅผ ์ด์ฉํด์ ๋ณด๋ด๋ ๊ฒ์ด์์.
denInquryList()๋ DevInquryList.vue์ ์ ์๋ Method๊ฐ ์๋๋ฐ, ์ด๋ป๊ฒ ๊ตฌ์ฑ์ด ๋์ด ์๋์ง ์ดํด ๋ณผ ๊ฒ์ด์์.
DevInquryList()๋ devInquryApi.js์ ์ ์ ๋์ด ์๋ Method์ธ ๊ฒ์ด์์.
import axios from 'axios';
/**
* Q&A ๊ฒ์ํ ๊ด๋ จ API
* <pre>
* <b>History:</b>
* ์ฃผ๋ํ๋, 1.0.0, 2022.03.09 ์ต์ด ์์ฑ
* </pre>
*
* @author ์ฃผ๋ํ๋
* @version 1.0.0, 2022.03.09 ์ต์ด ์์ฑ
* @See ""
* @see <a href=""></a>
*/
/**
* Q&A ๋ชฉ๋ก ์กฐํ
*/
export function devInquryList(params) {
return axios({
// Back End Route URI
url: '/api/support/devInquryList',
// HTTP Method
method: 'post',
data: params
});
} // devInquryList(params) ๋
์ต์ด axios๋ฅผ ํด๋น Project์ ์ค์น๋ฅผ ํด ์ฃผ์ด์ผ ํ๋ ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค import๋ฅผ ํตํด axios๋ฅผ ์ด์ฉํ๊ฒ ๋ค๊ณ ์ ์ธ์ ํ ๋ค
์ด๋ป๊ฒ ์ด์ฉํ ์ง๋ฅผ Method๋ฅผ ํตํด ๋ง๋ค์ด ์ฃผ๋ฉด ๋๋ ๊ฒ์ด์์.
์ฐธ๊ณ ๋ก ์ด๋ ๊ฒ ๋ฐ๋ก API์ ํด๋นํ๋ JavaScript Code๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง, ์ง์ Component์์ axios๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ๋ ์๋ ๊ฒ์ด์์. ํ์์ ๋ํ ๋ฐฉ๋ฒ์ ์ด Project๋ฅผ Refactoring ํ๋ฉด์ ์ด์ฉํด ๋ณผ ๊ฒ์ด์์.
export function์ด๋ผ๋ ๊ฒ์ ์ธ๋ถ์์ ์ด ํจ์๋ฅผ ์ด์ฉํ๊ฒ ๋ค๊ณ ํ๋ ๊ฒ์ธ๋ฐ, JAVA๋ก ๋ฐ์ก์ ๋๋ ์ด๋ค Method๋ฅผ public ์ ๊ทผ ์ ์ด์๋ฅผ ์ค์ ํด ์ฃผ๋ ๊ฒ์ด๋ ๊ฐ๋ค๊ณ ์ฃผ๋ํ๋์ ์ดํดํ ๊ฒ์ด์์.
ํด๋น Method๊ฐ ํธ์ถ ๋ ๋, ๋งค๊ฐ ๋ณ์๋ฅผ ๋ฃ์ด์ฃผ๋๋ฐ, ์ด ๋งค๊ฐ ๋ณ์์๋ Server์ ์ด๋ค ๊ฐ์ ์กฐํํ ๋ ํ์ํ ๊ฐ๋ค์ ๋ฃ์ด ์ฃผ๋ ๊ฒ์ด์์. ์๋ฅผ ๋ค๋ฉด ๋ชฉ๋ก ์กฐํ๋๊น Paging ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒ์ด๊ณ , Paging ์ฒ๋ฆฌ์ ๋ํ ์์ ๋ฒํธ, ๋ ๋ฒํธ, ๋ช ๊ฐ๊น์ง ํ Page ๋ด์์ ๋ณด์ฌ์ค ๊ฒ์ธ์ง์ ๋ํ ๋ฑ๋ฑ์ ๊ฐ๋ค์ ๋ณด๋ผ ์ ์๋ ๊ฒ์ด์์.
์ด์ url ๋ถ๋ถ์ Back End๊ฐ Q&A ๊ฒ์ํ ๋ชฉ๋ก ์กฐํ์์ ์ค์ ํ URI๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ ๊ฒ์ด์์.
๊ทธ๋ฆฌ๊ณ , method๋ก ์ด๋ค HTTP Method๋ฅผ ์ด์ฉํ ๊ฒ์ธ์ง ์ ์ํด ์ฃผ๋๊ฑด๋ฐ, ์ฌ๊ธฐ์๋ Post๋ฅผ ์ด์ฉํ์ง๋ง, RESTFul ํ๊ฒ Coding์ ํ๋ค๋ฉด post๊ฐ ์๋๋ผ get์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒ์ด์์.
๊ทธ๋ฆฌ๊ณ , ์ค์ ์ ์ผ๋ก ์์ฒญ์ ๋ณด๋ผ ๋ data๋ผ๋ ๋ณ์ ์ด๋ฆ์ผ๋ก ๋ณด๋ด๊ธฐ ์ํด data๋ผ๋ ์ด๋ฆ์ ์ ์ํ๊ณ , ๊ทธ ๊ฐ์ params ๊ฐ์ฒด๋ก ๋ฃ์ด์ค ๊ฒ์ด์์.
์ด์ ๋ค์ ํด๋น Method๋ฅผ ํธ์ถํ์๋ DevInquryList.vue์ methods ์์ฑ์ผ๋ก ๊ฐ๋ณด๋ฉด
.then์ ํตํด ์๋ต์ผ๋ก ๋ค์ด์จ Data๋ฅผ ์ฒ๋ฆฌํ๊ฒ ๋๋๋ฐ ๊ทธ ๋ด์ฉ์ response๋ผ๋ ๊ณณ์ ๋ด๋ ๊ฒ์ด์์.
์๋ต์ผ๋ก ๋ค์ด์จ ์ค์ Data๋ response์์ data๋ผ๋ ๊ณณ์ผ๋ก ๋ค์ด์ค๊ฒ ๋๋๋ฐ,
๊ทธ ์์๋ ์ด๋ ๊ฒ devInquryList๋ผ๋ ๋ฐฐ์ด๋ก ์ด๋ค์ง ๊ฐ์ฒด๋ค ๊ฐ๊ณผ ํด๋น ๊ฒ์ํ์ ์กฐํ๋ ๊ฒ์๊ธ ๊ฐ์์ธ devInquryListCnt๊ฐ ๊ฐ์ฒด ํ์(Key : Value)๋ก ๋ค์ด ์๋ ๊ฒ์ด์์.
devInquryList ๋ฐฐ์ด์ด 10๊ฐ๋ก ๊ตฌ์ฑ๋ ๊ฒ์ searchParams์ ๋ฃ์ด๋ ๊ฐ์ฒด Data`perPageNum : 10`์ด๋ผ๊ณ ์คฌ๋๋ฐ, ํ ํ์ด์ง์ 10๊ฐ๊น์ง ์ถ๋ ฅํ๋ผ๊ณ ์ค์ ์ ํ๊ธฐ ๋๋ฌธ์ธ ๊ฒ์ด์์.
176๋ฒ์งธ ์ค์ console๋ก ์ฐ์ผ๋ผ๊ณ ํ๊ธฐ ๋๋ฌธ์ ์์ฒ๋ผ ์ด๋ค ๊ฐ์ด ์ด๋ป๊ฒ ๋ค์ด์๋์ง๋ฅผ ํ์ธํ ์ ์๋ ๊ฒ์ด๋๋๋ค.
๊ทธ๋ฐ ๋ค ์ฃผ๋ํ๋์ ๋ค์ด์จ Data๋ฅผ ์๋ฆฌ์กฐ๋ฆฌ ์ด์ฉํ๊ธฐ ์ํด data()์ ์ ์ํ devInquryList๋ผ๋ ๋ฐฐ์ด์ ์๋ต์ผ๋ก ๋ค์ด์จ devInquryList๋ฅผ ๋ฃ์ด์ฃผ๊ณ , total์ด๋ผ๋ ๋ณ์์ devInquryListCnt ๊ฐ์ ๋ฃ์ด์ค ๊ฒ์ด์์.
์ด์ ์๋์์ total์ ํตํด ๊ฒ์๊ธ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ ๋ถ๋ถ์ด ๋์ค๋๋ฐ, ์ด๋ ๊ฒ ์ค์ ์ ํด์คฌ๊ธฐ ๋๋ฌธ์ ์ถ๋ ฅ์ ํ ์ ์๋ ๊ฒ์ด๋๋๋ค.
๐ฝ Code ๋ถ์
๋ค๋ฅธ ํ๋ฉด๊ณผ ๊ณตํต์ ์ผ๋ก ์ถ๋ ฅ๋๋ ๋ถ๋ถ์ ์ ์ธํ๊ณ , ํ๋ํ๋ ๋ถ์ํด์ ์ ๋ฆฌ ํด ๋ณผ ๊ฒ์ด์์.
์ต์ด ์ด ๋ถ๋ถ์ ํ๋๋ก ๋ฌถ์ด ์ฃผ๊ธฐ ์ํด div Tag๋ก ์๋์ ๊ฐ์ด ๋ฌถ์ด ์ค ๊ฒ์ด์์.
์ด์ Q&A ๊ฒ์ํ์์ ๊ฒ์๊ธ์ ๊ฒ์ํ ์ ์๋ธ ๋ถ๋ถ์ ํ๋ฒ ๋ง๋ค์ด ๋ณผ ๊ฒ์ด์์.
์ต์ด ๊ฒ์์ ๋ํ Type์ ์ก์ ์ฃผ๊ธฐ ์ํด select Box๋ฅผ ํ๋ ์ก์ ์ค ๊ฒ์ด์์. ๊ฒ์ Type์ด๋ '์ ๋ชฉ', '๋ด์ฉ', '์์ฑ์' ๋ฑ์ ํตํด ํด๋น ๋ด์ฉ์ ๊ฒ์ํ ์ ์๋ ๊ฒ์ด์์. select Box์ option Tag๋ก ์ ๋ชฉ, ๋ด์ฉ, ์์ฑ์๋ฅผ ์กฐํํ ์ ์๋ ๋ถ๋ถ์ ๋ง๋ค์๊ณ , ํด๋น Tag์ value๋ ์ซ์๋ฅผ ๋ฃ์ด์ค ๊ฒ์ด์์.
Back End์์ Query๋ฅผ ๋ ๋ฆด ๋ ์ซ์๊ฐ์ผ๋ก ๋ฐ๊ธฐ ๋๋ฌธ์ธ ๊ฒ์ธ๋ฐ,
<!-- Q&A ๋ชฉ๋ก ์กฐํ -->
<select id="devInquryList" parameterType="com.devcommunity.junyharang.model.vo.support.DevInquryVO" resultType="com.devcommunity.junyharang.model.vo.support.DevInquryVO">
select row_number() over(order by i.INQRY_SN asc) as INQRY_INDEX , i.INQRY_SN, i.INQRY_USER_SN , i.FILE_SN , i.INQRY_CN , i.INQRY_SJ , i.SECRET_AT , i.ANSWER_AT , i.ANSWER_CN , i.ANSWER_USER_SN , i.ANSWER_DT , i.CREAT_DT , i.UPDT_DT , i.UPDUSR_SN, u.USER_ID
from tb_com_inqry i inner join tb_user u
on i.INQRY_USER_SN = u.user_sn
where 1=1
<if test=' srchType neq null and srchType neq "" '>
<choose>
<when test="srchType eq '1'.toString()">
and i.INQRY_SJ like CONCAT('%', #{srchWord}, '%')
</when>
<when test="srchType eq '2'.toString()">
and i.INQRY_CN like CONCAT('%', #{srchWord}, '%')
</when>
<when test="srchType eq '3'.toString()">
and u.USER_ID like CONCAT('%', #{srchWord}, '%')
</when>
</choose>
</if>
order by INQRY_SN desc
<if test=' pageStart neq null and perPageNum neq null '>
LIMIT #{pageStart}, #{perPageNum}
</if>
</select>
์์ Code๊ฐ Back End์์ ํด๋น ๊ฒ์ํ ๋ชฉ๋ก ์กฐํ์ ๋ํ Mapper.xml Code์ธ๋ฐ, ์์ธํ ๊ฑด '์ด ๊ณณ'์ ์ค๋น ํด ๋ ๊ฒ์ด์์.
์ ์ฌ์ง์์ if ๋ฌธ์ ํตํด srchType(๊ฒ์ ํ์ )์ด null์ด ์๋๊ณ , ๊ณต๋์ด ์๋๋ผ๋ฉด? ํด๋น ๊ฐ์ ํตํด์ ๊ฒ์์ ํ ์ ์๊ฒ ๊ตฌ์ฑ์ด ๋์ด ์๋๋ฐ, 1์ด๋ผ๋ ๊ฐ์ด ๋ค์ด์ค๋ฉด ์ ๋ชฉ์ผ๋ก ๊ฒ์์ ํ๊ณ , 2๋ผ๋ ๊ฐ์ด ๋ค์ด์ค๋ฉด ๋ด์ฉ์ ๊ฒ์ํ๊ณ , 3์ด๋ผ๋ ๊ฐ์ด ๋ค์ด์ค๋ฉด ์์ฑ์๋ฅผ ๊ฒ์ํ๋ ๊ฒ์ด์์.
๊ทธ๋ผ ์ด์ ๊ฒ์์ด๋ฅผ ์ ๋ ฅํ ๋ถ๋ถ์ด ํ์ํ ๊ฒ์ด๊ณ , ๊ฒ์์ด ์ ๋ ฅ์ด ๋ค ๋์์ผ๋ฉด ํด๋น ๊ฐ์ Server์ ๋ณด๋ด๊ธฐ ์ํ Button์ด ํ์ํ ๊ฒ์ด์์.
๋จผ์ ๊ฒ์์ด๋ฅผ ์
๋ ฅ ๋ฐ๊ธฐ ์ํด input Tag๋ฅผ ์ก์์ฃผ๊ณ , type์ text๋ก ํ์ฌ ๋ฌธ์์ด์ ๋ฐ์ ์ ์๊ฒ ๋ง๋ค์ด ์ค ๊ฒ์ด์์.
๊ทธ๋ฆฌ๊ณ , Placeholder ์์ฑ์ผ๋ก
์ด๋ ๊ฒ ๊ฒ์์ด๋ฅผ ์ ๋ ฅ ํด ๋ฌ๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ๋ณด์ด๊ฒ ์ฒ๋ฆฌ๋ฅผ ํด ์ค ๊ฒ์ด์์.
์๋ Html Tag์์ ํด๋น ๊ฐ์ input Tag์ ๋ฃ์ด์ค ๋, ์ฆ, Input Tag์ ์ ๋ ฅ๋ ๊ฐ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์์ฑ์ด value ์์ฑ์ธ๋ฐ, Vue.js์์๋ v-model์ ์ฌ์ฉํ๋ ๊ฒ์ด์์.
v-model ์์ฑ์ searchParams.srchWord๋ผ๋๊ฐ์ฒด๋ฅผ ๋ฃ์ด ์คฌ๋๋ฐ, ์ด๋ ๊ฒ ์ค์ ์ ํด ์ฃผ๊ฒ ๋๋ฉด <Script>์ data() return ๋ถ์์ ํด๋น ๊ฐ์ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒ์ด์์.
v-model์ ์ค์ ํด ์ค ๊ฒ์ฒ๋ผ searchParams๋ผ๋ ๊ฐ์ฒด(Object)์์ srchWord ๊ฐ์ฒด ์ด๋ฆ๊ณผ ๊ฐ์ ์ด๊ธฐํํด์ ์ ์ ํด ์ค ๊ฒ์ด์์.
data()๋ JAVA๋ก ๋ฐ์ง๋ฉด ์์ฑ์์ ๊ฐ์ ๊ฒ์ด๊ณ , ๊ทธ ๋ฐ์ ์ ์๋ ๊ฐ์ฒด, ๋ณ์ ๋ฑ์ Member ๋ณ์๊ฐ ๋๋ค๊ณ ์ฃผ๋ํ๋์ ์ดํด ํ ๊ฒ์ด์์.
๊ฒ์์ด์ ๊ฒฝ์ฐ ์ด์ฉ์๊ฐ ์ ๋ ฅํ์ง ์๋ ์ด์ ๊ฒ์ ์ฒ๋ฆฌ๊ฐ ๋ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ srchWord๋ฅผ ๊ณต๋ฐฑ์ผ๋ก ์ด๊ธฐํ ํด ์ฃผ์๋ต๋๋ค.
์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๊ฒ์๊ธ์ ๋ํ ๋ชฉ๋ก ์ฒ๋ฆฌ, ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ํ๋ ๋ถ๋ถ์ ๋ํด ๊ตฌ์ญ์ ์ค์ ํ๊ธฐ ์ํด <div class "ListbWrap mt-20">์ผ๋ก ๋ฌถ์ด์ค ๊ฒ์ด์์.
๋จผ์ ์์ ๊ฐ์ด ํ์ฌ ๊ฒ์๊ธ์ด ๋ช ๊ฐ๊ฐ ์๋์ง๋ฅผ ์ถ๋ ฅ ํด ์ฃผ๋ ๋ถ๋ถ์ ๋ง๋ค์ด ๋ณผ ๊ฒ์ด์์.
{{ }} ์ด๋ ๊ฒ ์ค๊ดํธ ๋ ๊ฐ ์์ `total`์ด๋ผ๋ ๊ฒ์ ์ถ๋ ฅํ๋๋ก ํด ์ฃผ์๋๋ฐ,
์์ ๊ทธ๋ฆผ์์ ๋ณด์ด๋ฏ์ด 163๋ฒ์งธ ์ค์ total์ด๋ผ๋ ๋ณ์๋ฅผ 0์ผ๋ก ์ด๊ธฐํ ํด ์ฃผ์๊ณ , ์ด๊ฒ์ ์์ Tag์์ ๊ทธ ๊ฐ์ ์ถ๋ ฅํ๊ธฐ ์ํด ์ ๋ ๊ฒ ํด ์ค ๊ฒ์ด์์.
`total`์ด๋ผ๋ ๋ณ์์ ๊ฐ์ด ์ธ์ ๋ณํ๋๋ฉด BackEnd์ ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ต์ด ๋์์์ ๋ ๋ณํ๊ฐ ์ผ์ด๋๊ฒ ๋๋ ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค์ ์ฐ์ธก์ `๊ธ์ฐ๊ธฐ` Button์ ๋ง๋ค๊ธฐ ์ํด ์๋์ ๊ฐ์ด ํด ์ค ๊ฒ์ด์์.
<button> Tag๋ฅผ ์ด์ฉํ๋๋ฐ, html์์ ํด๋น Button์ ํด๋ฆญํ์ ๋, ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ด์ฉํ๋ ์์ฑ์ onclick์ด์ง๋ง, Vue.js์์๋ @clic์ ์ด์ฉํด ์ ์ ํด ์ฃผ๋ ๊ฒ์ด์์. ์ฃผ๋ํ๋์ ํด๋ฆญ Event๊ฐ ๋ฐ์ํ๋ฉด `goRegist()`๋ฅผ ํธ์ถ ํ๋ผ๊ณ ์ ์ํด ์ค ๊ฒ์ด์์.
๊ธ์ฐ๊ธฐ, ์์ฑ์ ๋ํ ๋ด์ฉ์ ๋ฐ๋ก ์ ์ํ๊ฒ ์ง๋ง, ์์ Method๊ฐ ํธ์ถ์ด ๋๋ฉด router๋ฅผ ํตํด ํด๋น Page๊ฐ Re Rendering ๋๋๋ก ์ค์ ํ ๊ฒ์ด์์. ๊ทธ๋ฆฌ๊ณ , status๋ฅผ `C` ๋ผ๊ณ ํด์ ๋๋๋ง์ ํ๋๋ฐ, ์ด๊ฒ์ ๊ธ ๋ฑ๋ก๊ณผ ์์ ์ด ํฉ์ณ์ ธ ์๊ธฐ ๋๋ฌธ์ ๊ธ ๋ฑ๋ก ์์ C๋ผ๋ ๊ฐ์ ๋ฐ์ ๊ธ ๋ฑ๋ก ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด ์ ๋ฌ ํด ์ฃผ๋ ๊ฐ์ด์์.
์์ Logic์์ InqrySn (๊ฒ์๊ธ ์ผ๋ จ๋ฒํธ)๊ฐ 0๋ณด๋ค ํฌ๊ฑฐ๋, ๊ฐ์ด ์กด์ฌํ๋ฉด ์์ Logic์ ์ฒ๋ฆฌํ๋๋ก ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ 0์ ๋ฃ์ด์ ๊ธ ๋ฑ๋ก์ ์ฒ๋ฆฌํ๋๋ก ๊ฐ์ ์ด๊ธฐํ ํ ๋ค ์ ๋ฌํ๋ ๊ฒ์ด์์.
์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๊ฒ์๊ธ ๋ชฉ๋ก ์กฐํ์ ํ์ํ ๋ด์ฉ์ ์์ ๋ณผ ๊ฒ์ด์์.
์์๋ ์๋ ์ฌ์ง์ฒ๋ผ ์ก์ ์ฃผ๊ธฐ ์ํด ์์ฑํ ๊ณณ์ด์์.
ํด๋น html Tag๋ '์ด ๊ณณ'์ ์ค๋น ํด ๋์์ด์!
์ด์ ์์ ํด๋นํ๋ ๋ถ๋ถ์ ๋ง๋ค์ด ๋ณผ ๊ฒ์ด์์.
๋จผ์ template Tag๋ฅผ ์ด์ฉํ์ฌ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ณ , ์ฝํ ์ธ ๊ฐ ๋ก๋๋ ๋ ์ฆ์ ๋๋๋ง ๋์ง ์๊ฒ ํ๊ณ ๋์ Vue๋ฅผ ํตํด ํด๋น ์ฝํ ์ธ ๊ฐ ํ์ํ ๋ ๋ณด์ด๋๋ก ํ๊ธฐ ์ํด ๋ง๋ ๊ฒ์ด์์. ๊ทธ๋ผ ์ด๋จ ๋ ๋ณด์ด๋๋ก ์ค์ ์ ํ์์๊น์? ๋ฐ๋ก v-if๋ฅผ ํตํด ์์์ ์ด์ผ๊ธฐ ํ๋ total ๋ณ์์ ๊ฐ์ด 0๋ณด๋ค ํด ๋๋ง ๋ณด์ด๋๋ก ํ ๊ฒ์ด์์. 0 ๋ณด๋ค ์๋ค๋ฉด ๊ตณ์ด ๋ชฉ๋ก ์กฐํ๋ฅผ ํ ํ์๊ฐ ์์ผ๋ Rendering์ ํ ๋, ํด๋น ๋ด์ฉ์ ์ฒ๋ฆฌํ์ง ์์ ์ฑ๋ฅ ํฅ์์ ๊ธฐ๋ ํ ์ ์๋ ๊ฒ์ด์์.
v-if๋ ์กฐ๊ฑด์ด ๋ง์กฑํ์ง ์์ผ๋ฉด Rendring์์ฒด๋ฅผ ํ์ง ์์ง๋ง, v-show๋ Rendering์ ํ์ง๋ง, ์กฐ๊ฑด์ด ๋ง์กฑํ ๋๋ง ๋ณด์ฌ์ง๊ฒ ํด ์ฃผ๋ ์ฐจ์ด๊ฐ ์๋ค๋ ๊ฒ์ ์ฐธ๊ณ ํ ๋งํ ์ด์ผ๊ธฐ ์ธ ๊ฒ์ด์์.
์ด์ <tr>(ํ ๊ตฌ์ฑ)์ ํตํด์ 1๊ฐ์ ํ์ ๋จผ์ ๋ง๋ค๊ณ , v-for๋ฅผ ํตํด ๋ฐ๋ณต๋ฌธ์ ๋๋ ค ์ฃผ๋๋ฐ, Axios๋ฅผ ํตํด ๋ฐ์์จ devInquryList ๊ฐ์ ํ๋ํ๋ ๊บผ๋ด ๋ฐ๋ณตํ์ฌ (list)์ ๋ฃ์ด์ฃผ๊ฒ ๋๊ณ , key๋ฅผ ํตํด ์ด ๋ฐ๋ณต๋ฌธ์ uniqueํ ์ด๋ฆ์ ๋ฃ์ด์ค ๊ฒ์ธ๋ฐ, ํด๋น ๊ฒ์๊ธ์ ์ผ๋ จ๋ฒํธ๊ฐ uniqueํ ๊ฐ์ด๋ 68๋ฒ์งธ ์ค ์์ ๊ฐ์ด ์ค์ ํด ์ค ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค ๊ฐ ์ด์ ๋ง๋ค์ด ์ฃผ๋๋ฐ, 5๊ฐ์ ์ด์ด ๋ง๋ค์ด ์ง๊ฒ ๋ ๊ฒ์ด์์.
๋จผ์ ์ฒซ๋ฒ์งธ ์ด์๋ ๊ฒ์๊ธ์ ์์ ๋ฒํธ๋ฅผ ๋ํ๋ด๊ธฐ ์ํด list์์ ๋ค์ด ์์ inqryIndex์ ๊ฐ์ ํ์ํ๋๋ก ํ ๊ฒ์ด์์.
๊ทธ๋ฆฌ๊ณ , ํด๋น ๊ฒ์๊ธ์ ์ ๋ชฉ์ ํ์ ํ๊ธฐ ์ํด 70 ~ 72๋ฒ์งธ ๊น์ง ์์ฑ์ ํ ๊ฒ์ธ๋ฐ, a Tag์์ ๋ด์ฉ์ด ์ค์ํ ๊ฒ์ด์์.
๋จผ์ class ์์ฑ์ ์ฌ์ฉํ๋๋ฐ, ๊ทธ ์์ 'ellipsis'๋ css์ ์ด๋ฆ์ธ ๊ฒ์ด์์.
`:class`๋ vue์์ ์กฐ๊ฑด์ ๋ฐ๋ฅธ Class๋ฅผ ๋ฃ์ด์ค ๋ ์ฌ์ฉํด ์ฃผ๋ ๊ฒ์ด์์.
:class="{'ํด๋์ค์ด๋ฆ' : '์กฐ๊ฑด'}"
์ด๋ฅผ ํด์ํด ๋ณด๋ฉด ๋จผ์ list์์ ์์ secretAt(๋น๋ฐ๊ธ ์ฌ๋ถ)์ ๊ฐ์ด 'N' ์ฆ, false์ด๋ฉด ๋น๋ฐ๊ธ์ด ์๋ ๊ฒ์ด๋๊น style.css ๋ด์ ellipsis ์ด๋ฆ์ css๋ก ๊พธ๋ฉฐ์ ๋ณด์ฌ์ฃผ๊ณ , secreatAt์ด ์ฐธ์ด๋ฉด ๋์ผํ css๋ฅผ ์ฌ์ฉํ๋, sub.css๋ด lock๊ด๋ จ CSS๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ฌ์ฉํ์ฌ ๋น๋ฐ๊ธ ํ์๊ฐ ๋๋๋ก ๋ง๋ค์ด ์ฃผ๋ ๊ฒ์ด์์.
๋ฐ๋ก ์ด๋ฐ ์์ผ๋ก ๋ง์ด์์.
๊ทธ๋ฆฌ๊ณ ์ด ์ ๋ชฉ์ ํด๋ฆญ์ ํ๊ฒ ๋๋ฉด goDetailView๋ผ๋ Method๋ฅผ ํธ์ถํ๋๋ฐ, list์์ ๋ค์ด์๋ ๊ฒ์๊ธ ์ผ๋ จ๋ฒํธ(inqrySn)์ ๋ฃ์ด ํธ์ถํ์ฌ ์์ธ ์กฐํ๊ฐ ์ฒ๋ฆฌ ๋๋๋ก ํ ๊ฒ์ด์์. ๊ทธ๋ฆฌ๊ณ , ๊ฒ์๊ธ ์ ๋ชฉ์ด ๋ฐ์ ํ์ถ ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ list์์ ๋ค์ด์์ ๊ฒ์๊ธ ์ ๋ชฉ(inqrySj)๊ฐ ๋ณด์ด๋๋ก ์ฒ๋ฆฌ๋ฅผ ํด ์ค ๊ฒ์ด๋๋๋ค.
๊ฒ์๊ธ ์ ๋ชฉ์ ํด๋ฆญํ๊ฒ ๋๋ฉด ์ด Method๊ฐ ๊ฒ์๊ธ ์ผ๋ จ๋ฒํธ๋ฅผ ๊ฐ์ง๊ณ ํธ์ถ ๋๋ ๊ฒ์ด์์.
๊ทธ๋ผ router๋ฅผ ํตํด Rendering์ ํ๊ฒ ๋๋๋ฐ, /src/views/support/q&a/devInquryDetailView Component๋ฅผ Renderingํ๊ฒ ๋๊ณ , ์์ธ ๊ฒ์๊ธ์ ๊ฐ์ ธ์ค๊ธฐ ์ํด query์ ๊ฒ์๊ธ ์ผ๋ จ๋ฒํธ๋ฅผ ๋ฃ์ด ๋ณด๋ด ์ฃผ๋ ๊ฒ์ด์์.
์ฌ๊ธฐ์ ' : ' ์ ๊ธฐ์ค์ผ๋ก ์์๊ฒ์ ์ค์ ๋ก ์ฒ๋ฆฌ๋ ์์น์ ๋ณ์๋ฅผ ์๋ฏธํ๊ณ , ๋ค์๋ ๋งค๊ฐ ๋ณ์๋ก ๋ค์ด์จ ๋ณ์๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด์์.
query์ ์๋ฏธ๋ JSON ํํ๋ก query String ํํ๋ก ์ ๋ฌ๋๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค ์์ฑ์์ ID๊ฐ ๋ณด์ด๊ฒ ํ๊ธฐ ์ํด 73๋ฒ์งธ ์ค์ฒ๋ผ ํด์ค ๊ฒ์ด๊ณ , ๊ทธ ๋ค์ ๊ฒ์๊ธ ๋ชฉ๋ก ์กฐํ ์ฒ๋ฆฌ ๊ทธ๋ฆผ 74๋ฒ์งธ ์ค์๋ ์์ฑ์ผ์๋ฅผ ๋ณด์ฌ์ง๊ฒ ํด ์ค ๊ฒ์ด์์.
๊ฒ์๊ธ ๋ชฉ๋ก ์กฐํ ์ฒ๋ฆฌ ๊ทธ๋ฆผ 75๋ฒ์งธ ์ค์๋ ์๋์ ๊ฐ์ด ํ์๋ ๊ฒ์ ํ๊ธฐ ์ํด์ ์์ฑํ ๋ถ๋ถ์ธ ๊ฒ์ด์์.
label ์์ฑ์์ v-if๋ฅผ ํตํด list์์ answerAt(๋ต๋ณ ์ฌ๋ถ) ์์ฑ์ ๊ฐ์ด 'N' ์ฆ, false์ด๋ฉด '๋๊ธฐ'๋ผ๊ณ ๋ณด์ฌ์ง๊ณ , !== 'N' ์ฆ, 'Y'์ด๋ฉด '์๋ฃ'๋ก ๋ณด์ฌ์ง๊ฒ ํด์ค ๊ฒ์ด์์.
๊ฒ์๊ธ ๋ชฉ๋ก ์กฐํ ์ฒ๋ฆฌ 83๋ฒ์งธ ์ค์ ๋ณด๋ฉด <templat>์ ํ๋ ๋ค์ ์์ํ๋๋ฐ ์ด๋ฒ์๋ v-else๊ฐ ๋ค์ด๊ฐ ๊ฒ์ด์์. ์์ v-if๋ฌธ ์กฐ๊ฑด์ ๋ง์ง ์์ผ๋ฉด ์ด๋ ๊ฒ ์ฒ๋ฆฌํด๋ผ! ๋ผ๊ณ ์ง์๋ฅผ ํ๋ ๊ฒ์ด์์.
์ผ๋จ ํ๊ณผ ์ด์ ํ๋ ๋ง๋ค๊ณ , ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค.๋ฅผ ์ถ๋ ฅํด ์ฃผ๋ ๊ฒ์ด์์.
๐ ๊ฒ์ํ ๋ง๋ค๊ธฐ - ๋ชฉ๋ก ์กฐํ - Paging ์ฒ๋ฆฌ
์์ HTML ์ Code๋ฅผ ๋ณด๋ฉด HTML Tag๊ฐ ์๋ <pagination/> ์ด๋ผ๋ Tag๊ฐ ๋ณด์ด๊ณ , ๊ทธ ์๋ ์ฌ๋ฌ ์์ฑ๋ค์ด ๋ณด์ด๋ ๊ฒ์ด์์. ๊ทธ ์์ฑ๋ค์ Pagination์ props์ ์ ์๋ ๊ฐ์ฒด๋ค์ ์ฐธ์กฐํ๊ณ ์๋ ๊ฒ์ด์์.
์ด ๊ฒ์ Vue๋ฅผ ํตํด ๋ง๋ Component๋ฅผ ์ด์ฉํ ๋ ์ด๋ ๊ฒ Component๋ฅผ ๋ง์น HTML Tag ์ฌ์ฉํ๋ฏ์ด ์ด์ฉํ ์ ์๋ ๊ฒ์ด์์.
๋จผ์ ํด๋น Tag๋ฅผ ๋ถ์ํด ๋ณด๋ฉด v-show๋ฅผ ํตํด ๊ฒ์๊ธ ๊ฐ์(total)์ด 0๋ณด๋ค ํฌ๋ค๋ฉด ๋ณด์ฌ์ฃผ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ณด์ด์ง ์๊ฒ ๋ค๋ ๊ฒ์ด๊ณ , ref ์์ฑ์ผ๋ก pagination Coponent ์ด๋ฆ์ ์ฐธ์กฐํ๊ฒ ๋ค๋ ๊ฒ์ธ๋ฐ, ๊ทธ๋ผ ์ด Component๋ ์ด๋์ ์ ์ธ์ด ๋์ด ์์๊น์?
๊ทธ๊ฑด ๋ฐ๋ก ์ ์ญ์ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ main.js์ ์๋ ๊ฒ์ด์์. ์ฌ๊ธฐ 6๋ฒ์งธ ์ค์ ๋ณด๋ฉด Pagination.vue๋ฅผ Pagination์ด๋ ์ด๋ฆ์ผ๋ก Import๋ฅผ ํ๊ณ , app์ ํตํด component๋ฅผ ๋ง๋๋๋ฐ, ์ด๋ฆ์ paginateion์ผ๋ก ๋ง๋ค๊ณ , ๊ทธ Component์ ๊ฐ์ ์ ๋ ฅํด ์ฒ๋ฆฌ๊ฐ ๋๋๋ก ํ ๊ฒ์ด์์.
Paging์ฒ๋ฆฌ๋ฅผ ์ํด ์ ์ฒด Data๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ์ํด 97๋ฒ์งธ ์ค์ฒ๋ผ ํ๊ณ , ํ ํ์ด์ง๋น ๋ช ๊ฐ๊น์ง ์ถ๋ ฅํ ๊ฒ์ธ์ง์ ๋ํ ๊ฐ์ ์ ์(:row-count = ...) ํด์ฃผ๊ณ , ์ฒซ๋ฒ์งธ Page ๊ฐ์ ์ ์(:curr-page ... )ํด์ฃผ๊ณ , ๋ง์ง๋ง์ผ๋ก Page๋ฅผ ์ด์ฉ์๊ฐ ๋ณ๊ฒฝํ์ ๋ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ด์ฉ์ 100๋ฒ์งธ ์ค์ ์ ์ ํด ์ค ๊ฒ์ด์์.
100๋ฒ์งธ ์ค์ ๋ํด ์ข ๋ ์์๋ณด์๋ฉด ์ด์ฉ์๊ฐ ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ์์ ๋,
๊ฐ๊ฐ์ Page ๋ฒํธ๋ฅผ ๋๋ฌ Page๋ฅผ ์ด๋ํ ์ ์๋ ๊ฒ์ด์์. Page ๋ฒํธ๋ฅผ ๋๋ฌ Page๊ฐ ์ด๋ํ ๋, changePage๊ฐ ํธ์ถ ๋๋๋ก ํด ์ค ๊ฒ์ธ๋ฐ,
ํ์ฌ page ๋ฒํธ๋ฅผ ๋งค๊ฐ ๋ณ์๊ฐ์ผ๋ก ๊ฐ์ ธ์์ ํด๋น Method๊ฐ ์คํ๋๋ ๊ฒ์ด์์.
์ฌ์ค ํด๋น Paging ์ฒ๋ฆฌ๋ฅผ ์ง์ ํ๋ ์น๊ตฌ๋ Pagination.vue์ธ ๊ฒ์ด์์.
๐ ๊ฒ์ํ ๋ง๋ค๊ธฐ - ๊ฐ ์ข Pop up
์ด์ Pop up์ฐฝ์ ๋ํด์ ํ๋ฒ ๋ง๋ค์ด ๋ณด๋ ค๊ณ ํ๋ ๊ฒ์ด์์. ๋จผ์ ์ธ๊ฐ ๊ด๋ จ Pop up์ ๋ง๋ค๊ฑด๋ฐ, ์์ ์ฝ๋์์ 104๋ฒ์งธ ์ค์ v-show ์์ฑ์ด ์๋ ๊ฒ์ด์์. ์กฐ๊ฑด์ ๋ง์ผ๋ฉด ๋ณด์ฌ์ฃผ๊ณ , ๋ง์ง ์์ผ๋ฉด ๋ณด์ฌ์ฃผ์ง ์๊ฒ ๋ค๋ ๊ฒ์ด์์.
loginDeletePopup์ ๊ธฐ๋ณธ๊ฐ์ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด false์ธ ๊ฒ์ด์์.
๊ทธ๋ ๋ค๋ ๊ฑด ํ์์๋ ๋ณด์ด์ง ์๋๋ค๋ ๊ฒ์ด์์. ์์ง ๋ก๊ทธ์ธ์ด๋ ํ์๊ฐ์ ๋ก์ง์ด ์๊ธฐ ๋๋ฌธ์ ์ธ๊ฐ์ ๋ํด ์กฐ๊ฑด์ ๋ ๋ฃ์ง ์์์ง๋ง, ์ฃผ๋ํ๋์ ํด๋น ํ์์ด ๋ก๊ทธ์ธํ์ง ์์๋ค๋ฉด ์ด ๋ชฉ๋ก ์กฐํ Page์ ๋ค์ด์ฌ ์ ์๊ฒ ํ ๊ฒ์ด์์.
๊ทธ๋์ Login์ ํ์ง ์์๋ค๋ฉด loginDeletePopup์ด true๊ฐ ๋ ๊ฒ์ด๊ณ , ํด๋น Pop up์ด ๋ฑ์ฅํ๊ฒ ๋ง๋๋ ค๊ณ ์์ฑํ ๊ฒ์ด์์.
ํด๋น Popup ์ฐฝ์๋ ์์ ๊ฐ์ด ๋ ๊ฐ์ Button์ ๋ง๋ค์ด ์ค ๊ฒ์ด์์. ์ฌ์ค ์ง๊ธ์ ๊ธฐ๋ฅ์ด ๋๊ฐ์๋ฐ, ๋์ค์ 'ํ์ธ'์ ํด๋นํ๋ Button์ '๋ก๊ทธ์ธ ํ๋ฌ ๊ฐ๊ธฐ'๋ก ๋ง๋ค์ด ์ฃผ๊ณ , click Event๊ฐ ๋ฐ์ํ๋ฉด Login ์ฐฝ์ผ๋ก ๋์ด๊ฐ๊ฒ ๋ง๋ค์ด ์ค ๊ฒ์ด์์.
ํ์ฌ๋ click Evente๊ฐ ๋ฐ์ํ๋ฉด loginDeletePopup์ ๊ฐ์ false๋ก ๋ง๋ค์ด ์ฃผ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฅ ํด๋น Popup์ด ์ฌ๋ผ์ง ๊ฒ์ด์์.