2022. 3. 19. 18:25ใ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> <!-- div class="topVisual" ๋ -->
</div> <!-- div id="topVisualWrap" ๋ -->
<!-- ์ปจํ
์ธ ์์ญ -->
<div id="Content">
<h2>
<span>๊ฐ๋ฐ ์ง์</span>
<span @click="goList()"><b>Q&A</b></span>
</h2>
<div class="ListTbWrap mt-20">
<div class="margin-left:5px;margin-bottom:5px;">
<input type="checkbox" name="" id="result01" :checked="devInquryData.secretAt === false" v-model="devInquryData.secretAt" value=false>
<label for="result01">
<span></span>๋น๋ฐ๊ธ
</label>
</div> <!-- div class="margin-left:5px;margin-bottom:5px;" ๋ -->
<table class="tList">
<caption>Q&A ์์ </caption>
<colgroup>
<col style="width:15%">
<col>
</colgroup>
<tbody>
<tr>
<td class="PalignL">์ ๋ชฉ
<span class="t_red">*</span>
</td>
<td class="PalignL">
<input id="" type="text" class="w100p" placeholder="์ ๋ชฉ์ ์
๋ ฅ ํด ์ฃผ์ธ์!" v-model="devInquryData.inqrySj" ref="inqrySj">
</td>
</tr>
<tr>
<td class="PalignL">๋ด์ฉ
<span class="t_red">*</span>
</td>
<td class="PalignL">
<textarea class="w100p" rows="15" placeholder="๋ด์ฉ์ ์
๋ ฅ ํด ์ฃผ์ธ์!" v-model="devInquryData.inqryCn" ref="inqryCn"></textarea>
</td>
</tr>
<tr>
<td class="PalignL">์ฒจ๋ถ ํ์ผ</td>
<td class="PalignL">
<template v-if="devInquryData.isNew === 'C'">
<input type="file" name="" @change="doFileChange">
</template>
<template v-else>
<input type="file" name="" @change="doFileChange">
<a href="#" class="attatch_file ml-10">{{ devInquryData.fileNm }}</a>
<button type="button" class="btnFileDel" :hidden="isNew">์ญ์ </button>
</template>
</td>
</tr>
</tbody>
</table>
</div> <!-- div class="ListTbWrap mt-20" ๋ -->
<div class="btn_wrap">
<a href="#" class="btn04" @click="doRegist()">{{ this.isNewText }}</a>
<a href="#" class="btn03" @click="goList()">์ทจ ์</a>
</div> <!-- div class="btn_wrap" ๋ -->
</div> <!-- div id="Content" ๋ -->
</div> <!-- div id="contentWrap" ๋ -->
<!-- Pop up -->
<div class="card3_popup" style="display: block; top:160px;" v-show="this.finishPopupShow">
<div class="popup_body">
<!-- Message -->
<div class="card_mody mt-20">
<p class="c_tit">๊ฒ์๊ธ ์์ ์ด ์๋ฃ ๋์์ต๋๋ค!</p>
</div> <!-- div class="card_mody mt-20" ๋ -->
<div class="btn_wrap_pop">
<button class="btn_m01 blue">ํ ์ธ</button>
</div> <!-- div class="btn_wrap_pop" ๋ -->
<div class="popup_close" @click="this.finishPopupShow = false">๋ซ๊ธฐ</div>
</div> <!-- div class="popup_body" ๋ -->
<!-- Pop up ๋ -->
<!-- Pop up -->
<div class="card3_popup" style="display: block; top:160px;" v-show="this.validationPopupShow">
<div class="popup_body">
<div class="card_mody mt-20">
<p class="c_tit">ํ์ ํญ๋ชฉ์ ๊ผญ ์
๋ ฅ ํด ์ฃผ์ธ์!</p>
</div> <!-- div class="card_mody mt-20" ๋ -->
</div> <!-- div class="popup_body" ๋ -->
<div class="btn_wrap_pop">
<button class="btn_m01 blue" @click="this.validationPopupShow = false">ํ์ธ</button>
<div class="popup_close" @click="this.validationPopupShow = false">๋ซ๊ธฐ</div>
</div> <!-- div class="btn_wrap_pop" ๋ -->
</div> <!-- div class="card3_popup" ๋ -->
</div> <!-- div class="card3_popup" style="display: block; top:160px;" v-show="this.finishPopupShow" ๋ -->
<!-- Pop up ๋ -->
</template>
<script>
import { devInquryRegist, devInquryDetail } from "@/api/devInquryApi";
export default {
data() {
return {
finishPopupShow : false,
validationPopupShow : false,
isNew : false,
isNewText : '๋ฑ ๋ก',
devInquryData : {secretAt : false},
}
}, // data() ๋
created() {
// ๊ธ ๋ฑ๋ก์ ๋ค์ด๊ฐ๊ธฐ ์ํ ์กฐ๊ฑด์ (status๊ฐ C์ด๋ฉด ๋ฑ๋ก์ผ๋ก ์ฒ๋ฆฌ)
if(this.$route.query.status !== 'C') {
this.isNew = false;
this.isNewText = '์ ์ ';
this.getDetailView();
} else {
this.isNew = true;
this.isNewText = '๋ฑ ๋ก';
} // if(this.$route.query.status != 'C') ๋
}, // created() ๋
methods : {
goList() {
this.$router.push({
path : "/support/devInquryList",
});
}, // goList() ๋
goDetailView(inqurySn) {
this.$router.push({
path : "/support/devInquryDetailView",
query : {
inqurySn
} // query ๋
});
},
getDetailView() {
devInquryDetail({
inqrySn : this.$route.query.inqrySn
}).then(response => {
console.log("์๋ต์ผ๋ก ๋ค์ด์จ ์์ธ ์กฐํ ์ ๋ณด : " + response.data);
this.devInquryData = response.data.devInquryVO;
console.log("ํ์ฌ DevInquryRegist.vue์ this.devInquryData ๊ฐ :" + this.devInquryData);
}).catch(error => {
console.log("๊ฒ์๋ฌผ / ์์ ๊ณผ์ ์ ์ํ ๊ธ ์์ธ ์กฐํ์์ ๋ฌธ์ ๊ฐ ์๊ฒจ Catch๋ฌธ์ด ๋์ํ์์ต๋๋ค!" + error + "๋ฌธ์ ๋ฐ์์ผ๋ก ๋ชฉ๋ก ์กฐํ๋ก ์ด๋ ๋ฉ๋๋ค.");
this.goList();
});
}, // getView() ๋
doRegist() {
console.log("๊ธ ๋ฑ๋ก(doRegist\(\)) Method๊ฐ ๋์ํ์์ต๋๋ค! DevInquryRegist.vue์ Member ๋ณ์ inqurySj ๊ฐ : " + this.devInquryData.inqrySj);
// ํ์ ์
๋ ฅ ํญ๋ชฉ ๊ฒ์ฌ๋ฅผ ์ํ Validation ๋ถ๊ธฐ์ (์ ๋ชฉ)
if(this.devInquryData.inqrySj === undefined || this.devInquryData.inqrySj === '') {
this.validationPopupShow = true;
this.$ref.inqrySj.focus();
return false;
} // if(this.devInquryData.inqurySj == undefined || this.devInquryData.inqurySj == '') ๋
// ํ์ ์
๋ ฅ ํญ๋ชฉ ๊ฒ์ฌ๋ฅผ ์ํ Validation ๋ถ๊ธฐ์ (๋ด์ฉ)
if(this.devInquryData.inqryCn == undefined || this.devInquryData.inqryCn == '') {
this.validationPopupShow = true;
this.$ref.inquryCn.focus();
return false;
} // if(this.devInquryData.inqryCn == undefined || this.devInquryData.inqryCn == '' ๋
// ๊ธ ๋ฑ๋ก์ ์ํด API๋ฅผ ํธ์ถํด์ Backend์ ๋ด์ฉ ์ ๋ฌ
devInquryRegist(this.devInquryData).then(response => {
console.log("๊ธ ๋ฑ๋ก์ ์ํด Back End์๊ฒ ๋ด์ฉ์ ์์ฒญํ๊ณ , ์๋ต ๋ฐ์ ๊ฐ : " + response.data);
alert("๊ฒ์๊ธ " + (this.isNew === true ? "๋ฑ๋ก" : "์์ ") + "์ด ์๋ฃ ๋์์ต๋๋ค!");
// ์์ฑ๋ ๊ฒ์๊ธ ์์ธ ์กฐํ๋ก ์ด๋ ์ํค๊ธฐ ์ํด ํด๋น Method ํธ์ถ
this.goDetailView(response.data.resultSn);
}).catch(error => {
console.log("๊ธ ๋ฑ๋ก์ ์ฒ๋ฆฌํ๋ ์ค์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ catch๋ฌธ์ด ๋์ ํ์์ต๋๋ค!");
alert("๊ฒ์๊ธ " + (this.isNew === true ? "๋ฑ๋ก์" : "์์ ์" + " ์คํจํ์์ต๋๋ค! \r\n ๊ด๋ฆฌ์์๊ฒ ๋ฌธ์ ๋ฐ๋๋๋ค!"));
// ๋ชฉ๋ก ์กฐํ๋ก ์ด๋ ์ํค๊ธฐ ์ํด ํด๋น Method ํธ์ถ
this.goList();
});
}, //doRegist() ๋
doFileChange(e) {},
}, // methods ๋
} // export default ๋
</script>
๐ฝ Code ๋ถ์ - ๋ฑ๋ก
๊ธ ๋ฑ๋ก๊ณผ ์์ ์ ํ Component์์ ๋ชจ๋ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ์๋ ๊ฒ์ด์์.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด ๊ณณ์ ๋ฑ๋ก๊ณผ ์์ ์ ๋ชจ๋ ๋ถ์ํด์ ์ ๋ฆฌ ํด ๋ณด๋๋ก ํ ๊ฒ์ด์์.
๋จผ์ ๋น๋ฐ๊ธ์ Checkํ์ฌ ๋น๋ฐ๊ธ์ธ์ง ์๋์ง๋ฅผ ์ ํด์ค ์ ์๋ ๋ถ๋ถ์ธ ๊ฒ์ด์์.
์ฌ์ค ์ฃผ๋ํ๋์ ์ด ๋ถ๋ถ์์ ๊ฝค๋ ๊ณ ์์ ํ๋ ๊ฒ์ด์์.
๋ฐ๋ก ๋น๋ฐ๊ธ CheckBox์ ๊ธฐ๋ณธ๊ฐ์ด ์ด๊ธฐํ ๋์ง ์์ NPE๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ ์ธ ๊ฒ์ด์์.
์ด ๋ฌธ์ ๋ '์ด ๊ณณ'์ ์ ๋ฆฌํ์ฌ ์ค๋นํด ๋ ๊ฒ์ด์์.
27๋ฒ์งธ ์ค์ ๋ณด๋ฉด `:checked`๋ฅผ ํตํด ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ค ๊ฒ์ด ์ ํ๋๊ฒ ํ ๊ฒ์ธ์ง ์ค์ ์ ํด ์ค๊ฒ์ด์์.
์์์ ๋ฐ์ํ๋ค๋ ๋ฌธ์ ๋ฅผ ์ดํด๋ณด๋ฉด ์ฌ์ค ์ด ์ค์ ์์ด๋ ๋๋ ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค Data Bindding์ ์ํด v-model ์์ฑ์ ์ด์ฉํ์ฌ secretAt์ ๊ฐ์ Bindding ํด ์ค ๊ฒ์ด์์.
๊ทธ๋ฆฌ๊ณ , ํ๋ Error๊ฐ ๋์ HTML ์์ฑ value๋ฅผ ํตํด `false`๋ฅผ ๋ฃ์ด์คฌ๋๋ฐ, ์ฌ์ค ์ด ๋ถ๋ถ๋ ์ง์๋ ์๊ด ์๋ ๋ถ๋ถ์ธ ๊ฒ์ด์์.
<tbody>
<tr>
<td class="PalignL">์ ๋ชฉ
<span class="t_red">*</span>
</td>
<td class="PalignL">
<input id="" type="text" class="w100p" placeholder="์ ๋ชฉ์ ์
๋ ฅ ํด ์ฃผ์ธ์!" v-model="devInquryData.inqrySj" ref="inqrySj">
</td>
</tr>
<tr>
<td class="PalignL">๋ด์ฉ
<span class="t_red">*</span>
</td>
<td class="PalignL">
<textarea class="w100p" rows="15" placeholder="๋ด์ฉ์ ์
๋ ฅ ํด ์ฃผ์ธ์!" v-model="devInquryData.inqryCn" ref="inqryCn"></textarea>
</td>
</tr>
<tr>
<td class="PalignL">์ฒจ๋ถ ํ์ผ</td>
<td class="PalignL">
<template v-if="devInquryData.isNew === 'C'">
<input type="file" name="" @change="doFileChange">
</template>
<template v-else>
<input type="file" name="" @change="doFileChange">
<a href="#" class="attatch_file ml-10">{{ devInquryData.fileNm }}</a>
<button type="button" class="btnFileDel" :hidden="isNew">์ญ์ </button>
</template>
</td>
</tr>
</tbody>
์ค์ ๋ก ๊ธ ๋ฑ๋ก / ์์ ์ ๋ํ Data๋ฅผ ์ ๋ ฅ ๋ฐ๊ณ , ์ ๋ฌํ๋ ๋ถ๋ถ์ด ๋ชจ๋ ์ด ๊ณณ์ ์๊ธฐ ๋๋ฌธ์ ์ด ๊ณณ์ ๋ถ์ํด ๋ณด๋ ค๋ ๊ฒ์ด์์.
์ ๋ชฉ์ ์ ๋ ฅ ๋ฐ๋ ๊ณณ์ ๋ณด๋ฉด Data๋ฅผ Bindding ํด ์ฃผ๋๋ฐ, devInquryData์์ ๊ฒ์๊ธ ์ ๋ชฉ(inqurySj)๋ก Bindding์ ํด ์ฃผ๋ ๊ฒ์ด์์. ๊ทธ๋ ๊ฒ ๋๋ฉด
์ด ๊ณณ 146๋ฒ์งธ ์ค devInquryData ๊ฐ์ฒด(Object)์ inqurySj๋ผ๋ ๊ฐ์ฒด ์ด๋ฆ๊ณผ ํจ๊ป ์ ๋ชฉ์์ ์ ๋ ฅ ๋ฐ์ ๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ๋ ๊ฒ์ด์์.
๊ทธ ๋ค์ ์ ๋ชฉ ๋ฐ๋ ๋ถ๋ถ์ `ref=inqrySj`๋ผ๋ ๋ถ๋ถ์ด ์๋๋ฐ, ์ด๊ฒ์ Templat refs๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ฒ์ด์์.
์์ ๊ฐ์ด 198๋ฒ์งธ ์ค์ ์์ฑํด ์ฃผ๋ฉด doRegist()๊ฐ ํธ์ถ์ด ๋๊ณ , ์ ๋ชฉ์ด ์์ ๋ ํด๋น ์ ๋ชฉ์ด ๋น์๋ค๋ ๊ฒ์ ํ์ํ๊ธฐ ์ํด focus()๋ฅผ ํธ์ถํ๊ธฐ ์ํด ์ด์ฉํ๋ ๊ฒ์ด์์.
๋ด์ฉ๋ ์์ ๊ฐ์ Logic์ผ๋ก ๋ง๋ค์ด ์ค ๊ฒ์ด์์.
์ด๋ฒ์๋ ์ฒจ๋ถ ํ์ผ์ ๋ํด ์์ ๋ณผ ๊ฒ์ด์์.
์ต์ด 67๋ฒ์งธ ์ค์ ๋ณด๋ฉด v-if์ ํตํด isNew๋ผ๋ ๊ฐ์ฒด ๊ฐ์ด 'C'์ธ์ง๋ฅผ ํ์ธํ๋ ๊ฒ์ด์์. ์ด ๊ฐ์ด 'C'์ด๋ฉด ๋ฑ๋ก Logic์ ์ํํ๊ณ , 'U'์ด๋ฉด ์์ Logic์ ์ฒ๋ฆฌํ๊ฒ ํ๊ธฐ ์ํด ๊ทธ๋ ๋ต๋๋ค.
๋ฑ๋ก Logic ์ํ์ด ๋ง๋ค๋ฉด 68๋ฒ์งธ ์ค์ด ์ํ ๋๋๋ฐ, <input> Tag๋ก ์์ฑ file์ ๋ฃ์ด File์ Uploadํ ์ ์๋ ํ๊ฒฝ์ ๋ง๋ค๊ณ , Event๊ฐ ๋ฐ์ํ๊ฒ ๋๋ฉด doFileChange๋ผ๋ Method๋ฅผ ํธ์ถํ๊ฒ ๋๋ ๊ฒ์ด์์. ๊ฒฐ๊ตญ ์ด์ฉ์๊ฐ ์ด๋ค File์ ์ ํํ๊ฒ ๋๋ฉด ํด๋น Method๊ฐ ํธ์ถ๋๋ ๊ฒ์ด์์.
์ด ๋ถ๋ถ์ ์์ง ๊ตฌํ์ด ์ ๋์๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ด ์๋ฃ๋๋ฉด ๋ค์ ์์ ํ๋๋ก ํ ๊ฒ์ด์์.
๋ค์ ๋์์ค๋ฉด 71๋ฒ์งธ ์ค์๋ isNew๊ฐ 'C'๊ฐ ์๋๋ผ๋ฉด?์ ์ฒ๋ฆฌํ๋๋ฐ, ์ด๋ ์์ ์ด ๋ ๊ฒ์ด๊ณ , ๊ฐ์ Logic์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด์์.
๊ทธ๋ฆฌ๊ณ , 74๋ฒ์งธ ์ค์ฒ๋ผ ํ์ผ ์ด๋ฆ(fileNm)์ ์ถ๋ ฅํ๊ฒ ํด ๋ ๊ฒ์ด์์.
๊ทธ๋ฐ๋ฐ, ์ ๋ก๋ํ ํ์ผ์ ์ทจ์ํ๊ณ ์ถ์ ์๋ ์๋ ๊ฒ์ด์์. ์ด๋ฅผ ์ํด 76๋ฒ์งธ ์ค์ button์ ๋ง๋ค์ด ์ค ๊ฒ์ด๊ณ , isNew๋ฅผ ์ด์ฉ์์๊ฒ ๋ณด์ด์ง ์๊ฒ ์ฒ๋ฆฌ ํด ๋ฒ๋ฆฌ๋ ๊ฒ์ด์์. :hidden์ HTML์์ `type=hidden`๊ณผ ๊ฐ์ ์์ฑ์ด๊ณ , ์จ๊ฒจ์ง ์ ๋ ฅ ํ๋๋ Rendering์ด ๋๋ ์น ํ์ด์ง์์๋ ์ ํ ๋ณด์ด์ง ์์ผ๋ฉฐ, ํ์ด์ง ์ฝํ ์ธ ๋ด์์ ๊ทธ๊ฒ์ ๋ณผ ์ ์๊ฒ ๋ง๋ค๋ ๋ฐฉ๋ฒ๋ ์๊ฒ ๋ง๋ค์ด ๋ฒ๋ฆฌ๋ ๊ฒ์ด์์.
์ด ๋ฒ์๋ ์ด Button์ ๋ํด ์์ ๋ณผ ๊ฒ์ด์์.
85๋ฒ์งธ ์ค์ ๋ณด๋ฉด Click Event๊ฐ ๋ฐ์ํ์ ๋, doRegist()๊ฐ ํธ์ถ ๋๋ ๊ฒ์ด์์.
์ด Method๊ฐ ํธ์ถ๋๋ฉด ํด๋น Method๊ฐ ๋์ํ๋ค๋ ๊ฒ์ ์๋ ค์ฃผ๊ธฐ ์ํ console ์ถ๋ ฅ์ด ๋ฐ์ํ๊ณ , ๊ฒ์๊ธ ์ ๋ชฉ(inqrySj)๊ฐ ๋น์ด์๊ฑฐ๋, null์ธ์ง๋ฅผ ํ๋จํด์ ๊ทธ๊ฒ ๋ง๋ค๋ฉด `validationPopupShow`๋ฅผ true ๊ฐ์ผ๋ก ๋ฐ๊ฟ ์ฃผ๋ ๊ฒ์ด์์.
`validationPopupShow`๊ฐ true๊ฐ ๋๋ฒ๋ฆฌ๋ฉด ์์ Popup์ฐฝ์ด ๋จ๊ฒ ๋๊ณ , 'ํ์ ํญ๋ชฉ์ ๊ผญ ์ ๋ ฅ ํด ์ฃผ์ธ์!'๋ผ๋ Message๋ฅผ ๋ด์ Pop up์ด ๋จ๊ฒ ๋๋ ๊ฒ์ด์์.
ํด๋น Popup ์ฐฝ์๋ ๋ ๊ฐ์ Button์ด ์๋๋ฐ, ํ๋๋ `ํ์ธ`๊ณผ ๋ ๋ค๋ฅธ ํ๋๋`๋ซ๊ธฐ`์ธ ๊ฒ์ด์์. ๋ Button์ ๊ธฐ๋ฅ์ด ๋๊ฐ์๋ฐ, Click Event๊ฐ ๋ฐ์๋๋ฉด `validationPopupShow` ๋ณ์์ ๊ฐ์ `false`๋ก ๋ฐ๊ฟ ํด๋น Popup ์ฐฝ์ด ์์ด์ง๋ ํจ๊ณผ๋ฅผ ๋ง๋ค์ด ์ฃผ๋ ๊ฒ์ด์์.
๐ฝ Code ๋ถ์ - ์์
๋จผ์ '๊ธ ์์ '์ ์์ธ ๋ณด๊ธฐ Page์์ ๊ฐ๋ฅํ ๊ฒ์ด์์.
์์ ๊ฐ์ด '์์ธ ๋ณด๊ธฐ' Page์์ `์์ ` Button์ Clickํ๋ฉด '์์ 'ํ ์ ์๋ Page๋ก ์๋๋ฐ, '๊ธ ๋ฑ๋ก'๊ณผ ๋์ผํ Component๊ฐ Rendering๋์ด '์์ ' Logic์ ์ํํ ์ ์๊ฒ ํด ์ฃผ์๋ต๋๋ค!
์์ ๊ฐ์ด DetailView Component์ Button์ด ์ ์ธ ๋์ด ์๋ ๊ฒ์ด์์.
์ Button์ ๋ต๊ธ์ด ์์ด์ผ์ง ๋ณด์ฌ์ง๊ฒ ๋๋๋ฐ, ๊ทธ ์ด์ ๋ 115๋ฒ์งธ ์ค์์ template Tag์์ v-if๋ฅผ ํตํด ๋ต๋ณ ์ฌ๋ถ(answerAt)์ด 'Y'๊ฐ ์๋๋ผ๋ฉด ์ฆ, 'N'์ด๋ผ๋ฉด Rendering ํด๋ผ! ๋ผ๊ณ ํด์ค ๊ฒ์ด์์.
๊ทธ๋ฆฌ๊ณ , <a> Tag๋ฅผ ํด๋ฆญํ๊ฒ ๋๋ฉด Click Event๋ก ์ธํด `goRegist()`๊ฐ ํธ์ถ๋๋๋ฐ, ์ด ๋, ๋งค๊ฐ๋ณ์๋ก ๊ฒ์๊ธ ์ผ๋ จ๋ฒํธ(inqrySn)์ ๊ฐ์ง๊ณ ๊ฐ๋ ๊ฒ์ด์์.
์์๋ '๊ธ ๋ฑ๋ก' Logic์ ์ฒ๋ฆฌํ๊ธฐ ์ํ Method์ธ๋ฐ, ๋งค๊ฐ ๋ณ์๊ฐ ์๋ ํํ๋ก ํธ์ถ์ด ๋๊ฒ ์์ฑ์ด ๋์ด ์๊ณ , ํด๋น Method๊ฐ ํธ์ถ์ด ๋๋ฉด DevInquryRegist Component๋ฅผ Re Renderingํ๊ฒ ๋์ด ์๋๋ฐ, query๋ฅผ ์ด์ฉํ์ฌ status๋ฅผ 'C'๋ก ์ฃผ์ด '๋ฑ๋ก'์ด๋ผ๋ Logic์ด ์ฒ๋ฆฌ๋๊ฒ ํด ์ฃผ๋ ๊ฒ์ด์์.
์ด๋ฒ์๋ '์์ ' Logic์ ์ํํ๊ธฐ ์ํ `goRegist` Method ์์. '์์ '์ด๋ผ๋ Logic์ ์ด๋ค ๊ฒ์๊ธ ์์ธ ๋ณด๊ธฐ์์ ์ด๋ค์ ธ์ผ ํ๋ ๊ฒ์ด์์. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด ์น๊ตฌ๋ ๋งค๊ฐ๋ณ์๊ฐ ๋ค์ด์์ผ ๋์์ํ๊ณ , ๊ทธ ๋งค๊ฐ๋ณ์๋ ๊ฒ์๊ธ ์ผ๋ จ๋ฒํธ์ธ ๊ฒ์ด์์.
์ด ์น๊ตฌ๊ฐ ํธ์ถ๋๊ฒ ๋๋ฉด ๋จผ์ Router๋ฅผ ํตํด DevInquryRegist Component๋ฅผ Re Renderingํ๊ฒ ๋๊ณ , '๋ฑ๋ก'๊ณผ๋ ๋ค๋ฅด๊ฒ status์ ๊ฐ์ 'U'๋ก ์ฃผ์ด ๊ธ ์์ Logic์ด ์ํ๋๋๋ก ๋ง๋ค์ด ์ค ๊ฒ์ด์์.
๊ทธ๋ผ ๊ธ ๋ฑ๋ก๊ณผ ๋์ผํ Component๊ฐ Renderinge ๋๋ ๊ฒ์ธ๋ฐ, ์ด๋ป๊ฒ ๊ธฐ์กด์ ์ ๋ ฅ๋์ด ์๋ ๋ด์ฉ์ ๊ฐ์ ธ์ค๋ฉด์ '์์ '์ด๋ผ๋ Action์ ์ทจํ๊ฒ ํด ์ฃผ๋ ๊ฒ์ผ๊น์? ๐ค
์ ๋ต์ ๋ฐ๋ก ์๋ ๊ทธ๋ฆผ์ ์๋ ๊ฒ์ด์์.
์ฌ๊ธฐ created()๋ฅผ ๋ณด๊ฒ ๋๋ฉด ํด๋น Component๊ฐ Rendering๋ ๋, ์ด Method๊ฐ ๋์ํ๊ฒ ๋๋๋ฐ, ์ต์ด router์์ ์ ๋ฌ๋ query๋ผ๋ ๊ฐ์ฒด ์์ status์ ๊ฐ์ ํ์ธ ํ๋ ๊ฒ์ด์์.
152๋ฒ์งธ ์ค์ ๋ณด๋ฉด 'C'๊ฐ ์๋๋ผ๋ฉด? ์ด๋ผ๊ณ ์ ํ ์๊ณ , '์์ ' Logic์ ์ํํ๊ฒ ๋๋๋ฐ, ์ต์ด `isNew`๋ฅผ `false`๋ฅผ ์ค์ ํ์ฌ ์๋ก ๋ง๋ค์ด ์ง๋ ๊ฒ์๊ธ์ด ์๋๋ผ๊ณ ์ค์ ์ ํด์ฃผ๊ณ , `isNewText`์๋ ์๋์ค๋ฐ ์ฐ๋ฆฌ๋๋ผ ํ๊ธ๋ก '์ ์ '!์ ๋ฑ ์ ๋ ฅ ํด ์ค ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค ๋ง์ง๋ง์ผ๋ก, `getDetailView()`๋ฅผ ํธ์ถํจ์ผ๋ก, ๋ณธ๊ฒฉ์ ์ผ๋ก '์์ ' ์ด๋ผ๋ Logic์ด ์ํ๋ ์ ์๋๋ก ํด ์ค ๊ฒ์ด์์.
๊ทธ๋ผ `getDetailView()`๋ฅผ ๋ง๋๋ฌ ๊ฐ๋ด์ผ ๊ฒ ์ด์! ๐
์ต์ด ์ด Method๊ฐ ํธ์ถ๋๋ฉด devInquryDetail์ ํธ์ถํ๋๋ฐ, ์ด Method๋ API๋ก Axios๋ฅผ ํตํด Back End์ ํต์ ์ ์ํด ์ ์ํ Method์ธ ๊ฒ์ด์์. devInquryDetail์ ํธ์ถ ํ ๋, 212๋ฒ์งธ ์ค์ ๋ณด๋ฉด ๊ฒ์๊ธ ์ผ๋ จ๋ฒํธ๋ฅผ ์์ธ ์กฐํ ๋ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ๋๊ฒจ ์ฃผ๋ ๊ฒ์ ๋ณผ ์ ์๋ ๊ฒ์ด์์.
์ด Method๊ฐ ํธ์ถ๋๋ฉด Axios๋ฅผ ํตํด Back End์์ ์ง์ ํ Controller์ URI '/api/support/devInqury'๋ก HTTP Method๋ฅผ 'post'๋ก ํ ์ํ์์ ๋งค๊ฐ ๋ณ์๋ก ๋ค์ด์จ ๊ฒ์๊ธ ๋ฒํธ๋ฅผ ์ ๋ฌ ํด ์ฃผ๋ ๊ฒ์ด์์.
/**
* ๊ฒ์๊ธ ๋ฑ๋ก / ์์ ์๋น์ค
* @param devInquryVO - ํ์ ๊ฐ์
์ ์ํ ์ด์ฉ์ ์
๋ ฅ๊ฐ์ ๋ด์ DTO
* @return Object - ์๋ฒ ์ฒ๋ฆฌ ์ฌ๋ถ์ ํด๋นํ๋ Status Code ๋ฐ Data ๋ฐํ์ ์ํ ๊ฐ์ฒด
* @see ""
*/
// TODO - Controller์ ์๋ ๋น์ฆ๋์ค ๋ก์ง ServiceImpl๋ก ์ฎ๊ฒจ์ผ ํ๋ฉฐ, ๋ฑ๋ก / ์์ ๋ถ๋ฆฌ ์์
ํ์
@ResponseBody @PostMapping("/devInqury")
public Object devInquryRegist(@RequestBody DevInquryVO devInquryVO, HttpServletRequest request) throws Exception {
log.info("devInquryRegist(@RequestBody DevInquryVO devInquryVO, HttpServletRequest request)๊ฐ ํธ์ถ ๋์์ต๋๋ค!");
log.info("Client์์ ๋์ด์จ Data Value๋ฅผ ๋จผ์ ํ์ธ ํ๊ธฐ ์ํด ๋ฐฐ์ด ๋ณ์์ ๊ฐ์ ๋ฃ๊ฒ ์ต๋๋ค!");
Field[] fields = devInquryVO.getClass().getDeclaredFields();
log.info("๋ฐ๋ณต๋ฌธ์ ํตํด ๋ฐฐ์ด์ ๋ค์ด ๊ฐ Data๋ฅผ ํ๋์ฉ ๊บผ๋ด ํ์ธ ํด ๋ณด๊ฒ ์ต๋๋ค!");
for (Field field : fields) {
/** ์ฐธ๊ณ ์๋ฃ
* @see "https://tyboss.tistory.com/entry/Java-%EC%9E%90%EB%B0%94-%EB%A6%AC%ED%94%8C%EB%A0%89%EC%85%98-reflection-setAccessible"
*/
log.info("Java ๋ฆฌํ๋ ์
๊ธฐ๋ฒ ์ค setAccessible(true) ํตํด Field ๊ฐ์ฒด ์๋ฃํ Type field์ ์ ๊ทผ์ ์ด ์ง์์์ ์ํ ์ ์ด๋ฅผ ๋ณ๊ฒฝ ํ๊ฒ ์ต๋๋ค!");
field.setAccessible(true);
System.err.println(field.getName() + " : " + field.get(devInquryVO));
} // for (Field field : fields) ๋
Map<String, Object> result = new HashMap<>();
log.info("devInquryVO ๊ฐ : " + devInquryVO.toString());
try {
log.info("๋ฑ๋กํ ๊ธ์ด ๋น๋ฐ๊ธ์ธ์ง ํ์ธ ํ๊ฒ ์ต๋๋ค!");
if (devInquryVO.getSecretAt().equals("false")) {
log.info("๋ฑ๋กํ ๊ธ์ด ๋น๋ฐ๊ธ์ด ์๋๋๋ค! ๊ณต๊ฐ๊ธ๋ก ๋ฑ๋ก ํฉ๋๋ค!");
devInquryVO.setSecretAt("N");
} else {
log.info("๋ฑ๋กํ ๊ธ์ด ๋น๋ฐ๊ธ ์
๋๋ค! ๋น๋ฐ๊ธ๋ก ๋ฑ๋ก ํฉ๋๋ค!");
devInquryVO.setSecretAt("Y");
} // if (devInquryVO.getSecretAt().equals("false")) - else ๋
log.info("๋ฑ๋ก / ์์ ํ๋ณ์ ์ํด ๋ฑ๋ก ์์ฒญ์ ๊ฒ์๊ธ ์ผ๋ จ๋ฒํธ๊ฐ ์๋์ง ํ์ธ ํ๊ฒ ์ต๋๋ค!");
// TODO : ๋ฑ๋ก / ์์ Logic ๋ถ๋ฆฌ ํ์
if (CustomStringUtil.getString(devInquryVO.getInqrySn()) == "" || devInquryVO.getInqrySn() == 0) {
log.info("๋ฑ๋ก ์์ฒญ ๊ฒ์๊ธ ์ผ๋ จ๋ฒํธ๊ฐ ๋น์ด์์ต๋๋ค! ๊ฒ์๊ธ ๋ฑ๋ก์ ์ํ ํฉ๋๋ค!");
// TODO - ํ์๊ฐ์
๋ฐ ๋ก๊ทธ์ธ ๋ก์ง ๊ตฌํ ๋ค ์๋ ํ๋์ฝ๋ฉ ์์ ํ์
devInquryVO.setInqryUserSn(4);
log.info("devInquryService.devInquryInsertUpdate(devInquryVO)์ ํธ์ถ ํ๊ฒ ์ต๋๋ค!");
devInquryService.devInquryInsert(devInquryVO);
log.info("Map result์ ๊ฒ์๊ธ ์ผ๋ จ ๋ฒํธ๋ฅผ ๋ฃ๊ฒ ์ต๋๋ค!");
result.put("resultSn", devInquryVO.getInqrySn());
} else {
log.info("๋ฑ๋ก ์์ฒญ ๊ฒ์๊ธ ์ผ๋ จ๋ฒํธ๊ฐ ์กด์ฌ ํฉ๋๋ค! ๊ฒ์๊ธ ์์ ์ ์ํ ํฉ๋๋ค!");
log.info("devInquryService.devInquryInsertUpdate(devInquryVO)์ ํธ์ถ ํ๊ฒ ์ต๋๋ค!");
devInquryService.devInquryUpdate(devInquryVO);
log.info("Map result์ ๊ฒ์๊ธ ์ผ๋ จ ๋ฒํธ๋ฅผ ๋ฃ๊ฒ ์ต๋๋ค!");
result.put("resultSn", devInquryVO.getInqrySn());
} // if (CustomStringUtil.getString(devInquryVO.getInqrySn() == "" || devInquryVO.getInqrySn() == 0)) - else ๋
log.info("Logic์ด ์๋ฃ ๋์์ผ๋ฏ๋ก, 200 Code๋ฅผ Map result์ ๋ฃ๊ฒ ์ต๋๋ค!");
result.put("code", 200);
} catch (Exception e) {
log.info("๊ฒ์๊ธ ๋ฑ๋ก / ์์ ์ ๋ฌธ์ ๊ฐ ๋ฐ์(๊ถํ ๋ฌธ์ )ํ์ฌ catch๋ฌธ์ด ์คํ ๋์์ต๋๋ค!");
e.printStackTrace();
log.warn(e.getMessage());
log.info("Logic์ด Error๋ก 401 Code๋ฅผ Map result์ ๋ฃ๊ฒ ์ต๋๋ค!");
result.put("code", 401);
return result;
} // try - catch ๋
return result;
} // devInquryRegist(@RequestBody DevInquryVO devInquryVO, HttpServletRequest request) ๋
๊ทธ๋ผ ์์ ๊ฐ์ด ํด๋น Controller์ API๊ฐ ํธ์ถ์ด ๋๊ณ , Logic์ ์ฒ๋ฆฌํด ์ฃผ๋ ๊ฒ์ด๋๋๋ค.
๋ค์ `DevInquryRegist.vue - getDetailView()`๋ก ๋์์ ๋ณด๋ฉด BackEnd์์ ํต์ ์ ๋ ๋ง์น๊ณ , BackEnd๋ ๊ฒ์๊ธ ์ผ๋ จ๋ฒํธ๋ก ์กฐํ๋ฅผ ์์ฒญํ๋ ๊ฒ์๊ธ ์ ๋ณด๋ฅผ ์ ๋ฌ์ ํด ์ค๊ฒ์ด์์. ๊ทธ ๋ด์ฉ์ด 173๋ฒ์งธ ์ค response์ ๋ด๊ธฐ๊ฒ ๋๊ณ , 176๋ฒ์งธ ์ค์ BackEnd๊ฐ ์ ๋ฌํด ์ค ๊ฒ์๊ธ์ ๋ชจ๋ ์ ๋ณด๋ฅผ `devInquryData`๋ผ๋ ๊ฐ์ฒด(Object)์ ์ ์ฅ์ ํด ์ค ๊ฒ์ด์์.
๊ทธ๋ผ ์์ HTML Code๋ฅผ ํตํด ํด๋น ๊ฒ์๊ธ Data๋ค์ ์ด์ฉํด์ '์์ '์ ํด๋นํ๋ DevInquryRegist Coponent๊ฐ Rendering ๋๋ฉด์ '์์ '์ด๋ผ๋ Logic์ ์ํํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด๋๋๋ค!
๋ง์ฝ ์ ๊ทธ๋ฆผ `DevInquryRegist.vue - getDetailView()`์์ ๋ฌธ์ ๊ฐ ์๊ฒจ catch ๋ฌธ์ผ๋ก ์ง์ ํ๊ฒ ๋๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
์ต์ด Console์ ๋ฌธ์ ๋ด์ฉ์ ์ถ๋ ฅํ๊ณ , ๋ชฉ๋ก์ ํด๋นํ๋ Component๊ฐ Re Rendering ๋๋๋ก `goList()`๋ฅผ ํธ์ถํด ์ฃผ๋ ๊ฒ์ด๋๋๋ค!