2022. 3. 23. 02:02ใ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
๐ ๋ต๋ณ ๋ง๋ค๊ธฐ - ๋ฑ๋ก
๐ฝ ๊ฐ์
๋ต๊ธ, ๋๊ธ ๋ฑ์ ์ด๋ค ๊ฒ์ํ์ ์์ธ ์กฐํ์ ๋ค์ด๊ฐ๋ฉด ์ด์ฉํ ์ ์๋ ์๋น์ค์ธ ๊ฒ์ด์์.
์ฃผ๋ํ๋์ด ์ด ๊ณณ์์ ๋ง๋ค๊ณ ์ ํ๋ ๋ต๋ณ์ ํต์์ ์ธ ๋ต๊ธ, ๋๊ธ์ฒ๋ผ ์ฌ๋ฌ ๊ธ์ ์ฌ๋ฆด ์ ์๋ ๊ฒ์ด ์๋๋ผ, ํ๋ฒ๋ง ๋ฑ ๋ฑ๋กํ ์ ์๋ ์๋น์ค๋ฅผ ๋ง๋ค์ด ๋ณผ ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค ์ฐจํ Refactoring์ ํ๊ฒ ๋ ๋, ์ฌ๋ฌ ๋ต๊ธ์ ๋ฌ ์ ์๋ ์๋น์ค๋ก ๋ฐ์ ์ ์์ผ๋ณด๋ ค๊ณ ๊ณํํ ๊ฒ์ด์์.
๋จผ์ ๋ชฉ๋ก ์กฐํ ํ๋ฉด์์ ๋ณด๋ฉด ์๋์ ๊ฐ์ด `๋ต๋ณ ์ฌ๋ถ`์ `๋๊ธฐ`์ `์๋ฃ`๊ฐ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ ๊ฒ์ด์์.
๋ต๊ธ์ด ๋ฌ๋ฆฌ๋ฉด '์๋ฃ'๋ก ๋ณ๊ฒฝ์ด ๋ ๊ฒ์ด๊ณ , ๋ต๊ธ์ด ๋ฌ๋ฆฌ์ง ์์ผ๋ฉด '๋๊ธฐ'๋ก ๋จ์ ์๊ฒ ๋๋ ๊ฒ์ด์์.
๐ฝ ํ๋ฉด
๐ฝ Source Code
<template v-if="devInquryData.answerAt !== 'N'">
<div class="view_wrap" style="border-top: 1px solid black;">
<div style="margin-top:-30px; margin-left: -5px; front-weight: bold;">
[ ๋ต๋ณ ๋ด์ฉ ]
</div> <!-- div style="margin-top:-30px; margin-left: -5px; front-weight: bold;" ๋ -->
<br>
{{devInquryData.answerCn}}
</div> <!-- class="view_wrap" style="border-top: 1px solid black;" ๋ -->
<div class="btn_wrap">
<button class="btn04" @click="this.devInquryData.answerAt = 'N'">๋ต๊ธ ์์ </button>
<button class="btn03" @click="this.deleteReplyPopup = true">๋ต๊ธ ์ญ์ </button>
</div>
</template> <!-- template v-if="devInquryData.answerAt !== 'N'" ๋ -->
<template v-else>
<table class="tList">
<caption>๋ต๊ธ</caption>
<colgroup>
<col style="width: 15%">
</colgroup>
<tbody>
<tr>
<td class="PalignL">๋ต๊ธ
</td>
<td class="PalignL">
<textarea id="" type="text" class="w100p" rows="5" placeholder="๊ทํ์ ์ง์์ ์ ์ ํด ์ฃผ์ธ์!" v-model="devInquryData.answerCn" ref="answerCn"></textarea>
</td>
</tr>
</tbody>
</table>
<div class="btn_wrap">
<button class="btn04" @click="doRegistReply(inqrySn)">๋ต๊ธ ๋ฑ๋ก</button>
</div>
</template>
๋ต๊ธ์ ํด๋น ํ๋ Source Code๋ ์์ ๊ฐ์ ๊ฒ์ด์์.
์ด Code๋ ๊ฒ์๊ธ ์์ธ ์กฐํ Code์์ ๋ค์ด ์๋ ๊ฒ์ด์์.
์์ ์ฝ๋ ์ค์์ ์ ์ฌ์ง ๋ด์ฉ์ ๋ต๋ณ ๋ด์ฉ์ ์กฐํํ๋ ๋ถ๋ถ์ธ๋ฐ, ์ด ๋ถ๋ถ์ ๋ฐ๋ก ๊ธ์ ์์ฑํ๊ฒ ๋ ๊ฒ์ด๊ณ , ์ด๋ฒ ์ฅ์์๋ ๋ฑ๋ก / ์์ ์ ๋ํด์ ๊ณต๋ถ ํด ๋ณด๋๋ก ํ ๊ฒ์ด์์.
์ฌ๊ธฐ์ ํ๊ฐ์ง ์ง๊ณ ๋์ด๊ฐ์ผ ํ ๊ฒ์ <templat> Tag๋ฅผ ๋ณด์๋ฉด v-if๋ฌธ์ด ์๊ณ , devInquryData ์์ answerAt ๋ณ์์ ๊ฐ์ด 'N'์ด ์๋๋ผ๋ฉด ์ฆ, 'Y'๋ผ๋ฉด ๋ต๋ณ ๋ด์ฉ์ ํ์ํ๋ผ๊ณ ํ ๊ฒ์ด์์.
<template v-else>
<table class="tList">
<caption>๋ต๊ธ</caption>
<colgroup>
<col style="width: 15%">
</colgroup>
<tbody>
<tr>
<td class="PalignL">๋ต๊ธ
</td>
<td class="PalignL">
<textarea id="" type="text" class="w100p" rows="5" placeholder="๊ทํ์ ์ง์์ ์ ์ ํด ์ฃผ์ธ์!" v-model="devInquryData.answerCn" ref="answerCn"></textarea>
</td>
</tr>
</tbody>
</table>
<div class="btn_wrap">
<button class="btn04" @click="doRegistReply(inqrySn)">๋ต๊ธ ๋ฑ๋ก</button>
</div>
</template>
ํ์ง๋ง, ์ฐ๋ฆฌ๊ฐ ์ด๋ฒ ์ฅ์์ ์ฃผ๋ก ๊ณต๋ถํ ๋ด์ฉ์ ๋ฐ๋ก ์ด ๋ถ๋ถ์ธ ๊ฒ์ด์์.
๋ค์ <template> Tag๊ฐ ์์์ด ๋๊ณ , v-else๊ฐ ์๋ ๊ฒ์ด์์. ์์์ ์ค๋ช ํ 'Y'๋ผ๋ฉด ๋ต๋ณ์ ํ์ํ๋๋ก ํ ๊ฒ์ธ๋ฐ, ์ด ๊ณณ์์๋ 'Y'๊ฐ ์๋๋ผ๋ฉด ์ฆ, 'N' ์ด๋ผ๋ฉด ์ด ๋ถ๋ถ์ ํ์ํ๋ผ๊ณ ํ ๊ฒ์ด์์.
๋จผ์ <td> Tag๋ฅผ ํตํด์ `๋ต๊ธ`์ด ํ์ ์ ๋ชฉ์ผ๋ก ํ์๋๊ฒ ๋ง๋ค์ด ์ค ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค ๋ค์ <td> Tag๋ฅผ ํตํด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ต๊ธ์ ๋ด๋ ๋ด์ฉ์ด ์๋๋ฐ, ์ฐ๋ฆฌ๊ฐ ์ฃผ๋ชฉํด์ผ ํ ๋ถ๋ถ์ ๋ฐ๋ก <textarea> Tag์ธ ๊ฒ์ด์์.
์ฌ๊ธฐ์ rows๋ฅผ ํตํด ํด๋น ํ์ ํฌ๊ธฐ๋ฅผ ์ ํด ์ฃผ์๊ณ , placeholder๋ฅผ ํตํด ๋ฌด์์ ์ ์ด์ผ ๋๋์ง ๋ํ๋ด ์ค ๊ฒ์ด์์.
๊ทธ ๋ค์ v-model์ ํตํด Data๋ฅผ Bindingํ๋๋ก ํด ์ฃผ์๋๋ฐ, ๊ทธ ์ด์ ๋ ๋ต๊ธ ์์ Logic ๋๋ฌธ์ด๊ณ , ์ด ๋ถ๋ถ์ ์๋์์ ์ด์ผ๊ธฐ ํด ๋ณด๋๋ก ํ ๊ฒ์ด์์. ref๋ฅผ ํตํด์ ํด๋น ๊ฐ์ด Null์ด๋ผ๋ฉด ํ์๊ฐ ๋๋๋ก ํด ์ค ๊ฒ์ด์์.
์์์ v-model์ ํตํด ๋ฌธ์์ด Data๊ฐ ์ ๋ ฅ์ด ๋๋ฉด 208๋ฒ์งธ ์ค์ `devInquryData`๋ผ๋ ๋ณ์์์ ๊ฐ์ฒด(Object) Type์ผ๋ก `answerCn : [๋ต๊ธ ๋ด์ฉ ๋ฌธ์์ด]`์ด ๋ด๊ธฐ๊ฒ ๋ ๊ฒ์ด์์.
๊ทธ๋ผ ์์ ๊ฐ์ด ๊ธ์ ์์ฑ์ ํ๋ค๋ฉด Button์ ํตํด ๋ฌด์ธ๊ฐ Event๊ฐ ๋ฐ์ํ๊ฒ ํด ์ค์ผ ํ ๊ฒ์ด์์. ์ด ๋ถ๋ถ์ด ๋ฐ๋ก 94 ~ 96๋ฒ์งธ ์ค์ ๋ด์ฉ์ด๊ณ , 95๋ฒ์งธ ์ค์ ์ฐ๋ฆฌ๋ ์ฃผ๋ชฉํด์ผ ํ ๊ฒ์ด์์.
`@click` ์ฆ, '๋ต๋ณ ๋ฑ๋ก' Button์ Click Event๊ฐ ๋ฐ์ํ๊ฒ ๋๋ฉด `doRegistReply()`๊ฐ ํธ์ถ๋๊ฒ ๋๋๋ฐ, ์ด ๋, ๊ฒ์๊ธ ์ผ๋ จ๋ฒํธ(inqrySn)์ ์ ๋ฌ ํด ์ฃผ๊ฒ ๋๋ ๊ฒ์ด์์. ๊ฒ์๊ธ ์ผ๋ จ๋ฒํธ๋ฅผ ์ ๋ฌํ๋ ์ด์ ๋ ํน์ ๊ฒ์๊ธ์ ๋ต๊ธ์ ๋จ๊ธฐ๋ ๊ฐ๋ ์ด๊ธฐ ๋๋ฌธ์ธ ๊ฒ์ด์์.
๊ทธ๋ผ ์ด์ `doRegistReply()`๋ฅผ ๋ง๋๋ฌ ๊ฐ๋ด์ผ ๊ฒ ์ด์!
์ต์ด ์ด Method๊ฐ ํธ์ถ์ด ๋๋ฉด ํด๋น Method๊ฐ ํธ์ถ ๋์๋ค๋ ๋ด์ฉ์ Console์ ์ถ๋ ฅํ๊ฒ ๋๊ณ ,
263๋ฒ์งธ ์ค์ ๋ณด๋ฉด If๋ฌธ์ ํตํด ๋ต๋ณ ๋ด์ฉ(answerCn)์ด ๋น์ด์๋์ง ํ์ธ์ ํ๋ ๊ฒ์ด์์. ๋ง์ฝ ๋น์ด ์๊ฑฐ๋, ๊ณต๋ฐฑ๋ง ์ ๋ ฅ์ด ๋์๋ค๋ฉด Popup์ฐฝ์ ํ๋ ๋์ด์ค ๊ฒ์ธ๋ฐ, ํด๋น Popup์ฐฝ์ ๋์ด์ฃผ๊ธฐ ์ํด boolean Type์ ๋ณ์ `validationPopupShow`์ true๋ก ๋ฐ๊ฟ์ฃผ๊ฒ ๋๋๋ฐ, ์์์ data()์์ ํด๋น ๋ณ์๋ ์ ์ธ์ด ๋์ด ์๊ณ , false๋ก ์ด๊ธฐํ ๋์ด ์๋ ๊ฒ์ด์์.
๊ทธ๋ผ ์ด ๋ถ๋ถ์ด true๊ฐ ๋๋ฉด ์ด๋ค ์ผ์ด ๋ฐ์ํ๊ฒ ๋ ๊น์?
๋ฐ๋ก ์ด ๋ถ๋ถ์ Popup์ฐฝ์ด ๋ฑ! ํ๊ณ ๋์ด์ง๊ฒ ๋๋ ๊ฒ์ด์์.
114๋ฒ์งธ ์ค์ ๋ณด๋ฉด v-show๋ฅผ ํตํด validationPopupShow ๋ณ์๊ฐ true์ด๋ฉด ์๋ ๋ด์ฉ์ด ๋ณด์ฌ์ ธ๋ผ! ๋ผ๊ณ ๋ช ๋ น์ ์ค ๊ฒ์ด์์.
207๋ฒ์งธ ์ค์ ํด๋น ํ๋ ๋ถ๋ถ์ด ํด๋น Popup ์ฐฝ์ `ํ์ธ` Button์ธ๋ฐ, ์ด Button์ ํด๋ฆญํ๊ฒ ๋๋ฉด `validationPopupShow` ๋ณ์์ ๊ฐ์ด false๋ก ๋ฐ๊พธ๋ฉด์ ํด๋น Popup์ด ์ฌ๋ผ์ง๋ ๊ฒ์ด์์.
๊ทธ๋ ๋ค๋ฉด ์ ์์ ์ผ๋ก ์์ฑ์ด ๋์๋ค๋ฉด ์ด๋ค์ผ์ด ๋ฐ์ํ ๊น์?
์ ์์ ์ผ๋ก ๊ธ์ด ์์ฑ ๋์๋ค๋ฉด if๋ฌธ์ ๋ฐ์ด ๋๊ณ , ๋ฐ๋ก ์ด ๋ถ๋ถ์ผ๋ก ์ค๊ฒ ๋ ๊ฒ์ด์์. 311๋ฒ์งธ ์ค์ ๋ณด๋ฉด devInquryReplyRegist()๋ฅผ ํธ์ถํ๋๋ฐ, ์ด Method๋ Axios๋ฅผ ์ด์ฉํ๋ ๋ฐ๋ก ์์ฑ๋ Api.js์์ ์๋ ์น๊ตฌ๋ฅผ ํธ์ถํ๋ ๊ฒ์ด์์. ์ด ๋, devInquryData ๊ฐ์ฒด๋ฅผ ์ ๋ฌ์ ํด ์ค์ผ๋ก์จ, ๋ต๋ณ ๋ฑ๋ก์ ํ์ํ ๋ด์ฉ์ ๋ชจ๋ ๋ด์ ๋ณด๋ด๋ ๊ฒ์ด์์.
์์ ๊ฐ์ด Method๋ฅผ ๋ฐ๋ก ํธ์ถํ ์ ์๋ ์ด์ ๋ ๋ฐ๋ก ์ฌ๊ธฐ์ ํด๋น Api์ Method๋ฅผ import ํด ์ฃผ์๊ธฐ ๋๋ฌธ์ธ ๊ฒ์ด์์.
๊ทธ๋ผ ์ด์ devInquryReplyRegist๋ฅผ ๋ง๋๋ฌ ๊ฐ๋ด์ผ ๊ฒ ์ด์!
๊ทธ๋ผ ์ด ๊ณณ์ ์์นํ devInquryReplyRegist๊ฐ ํธ์ถ๋๊ฒ ๋๋๋ฐ, 1๋ฒ์งธ ์ค์ ๋ณด๊ฒ ๋๋ฉด import๋ฅผ ํตํด Axios๋ฅผ import ํด ์ค ๊ฒ์ด์์. Axios๋ฅผ ์ด์ฉํ๋ ค๋ฉด ๋จผ์ '์ค์น'๋ฅผ ํด์ฃผ์ด์ผ ํ๋ ๊ฒ์ด์์.
์ด Method๊ฐ ์ด๋ค ์ผ์ ํ๋์ง ์์ ๋ณผ๊ฒ์.
๋จผ์ ์ด Method๊ฐ ๋์ํ๋ฉด Cosole์ ๋ด์ฉ์ ์ถ๋ ฅํ ๋ค Server (Back End - API)์ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋๋ฐ, ํด๋น URI์ HTTP Method๋ฅผ `post`๋ก ํ์ฌ Request Body์ ๋ต๊ธ์ ์ ๋ ฅํ๊ธฐ ์ํด ํ์ํ ๋ต๋ณ ์ฌ๋ถ(answerAt), ๋ต๋ณ ๋ด์ฉ(answerCn), ๋ต๊ธ ์์ฑ์ ์ผ๋ จ๋ฒํธ(answerUserSn), ๊ฒ์๊ธ ์ผ๋ จ ๋ฒํธ(inqurySn)์ ๋ํ ๊ฐ์ ๋ด์ data๋ก ๋ณด๋ด์ฃผ๋ ๊ฒ์ด์์.
๋ค์ ์ด ๊ณณ์ผ๋ก ๋์์์ 311๋ฒ์งธ response์ BackEnd๊ฐ ์๋ต์ผ๋ก ๋๋ ค์ค ๊ฐ์ด ๊ฐ์ฒด(Object) Type์ผ๋ก ๋ด๊ธฐ๊ฒ ๋๊ณ , ์ด ๋ด์ฉ์ ๋จผ์ Console์ ์ฐ์ด ํ์ธ์ ํ ๋ค ๊ฒฝ๊ณ ์ฐฝ(312๋ฒ์งธ ์ค)์ ๋์ด '๋ต๊ธ ๋ฑ๋ก์ด ์๋ฃ ๋์์ต๋๋ค!'๋ฅผ ์๋ ค ์ฃผ๋ ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค getDetailViewWithReply()๋ฅผ ํธ์ถํ๋๋ฐ, ํด๋น ๊ฒ์๊ธ ๋ฒํธ์ ํด๋น ํ๋ ์์ธ ์กฐํ Page๊ฐ ์ด๋ฆฌ๊ฒ ํ๊ธฐ ์ํด Back End๊ฐ ๋๋ ค์ค Data ์ค ๊ฒ์๊ธ ์ผ๋ จ๋ฒํธ(InqurySn)๊ฐ์ ์ ๋ฌํ์ฌ ์์ธ ์กฐํ Page๋ก ๋์๊ฐ ์ ์๊ฒ ํด๋น Method๋ฅผ ํธ์ถํ๋ ๊ฒ์ด์์.
๊ทธ๋ผ ์์ ๊ทธ๋ฆผ์ getDetailViewWithReply() Method๊ฐ ๋์ํ๊ฒ ๋๋ ๊ฒ์ด์์. ์ด์ ๋ํด ์์ธํ ๋ด์ฉ์ '์ด ๊ณณ'์ ์ค๋นํด ๋๊ฒ์!
๐ ๋ต๋ณ ๋ง๋ค๊ธฐ - ์์
๋ต๊ธ ์์ ์ '๋ต๊ธ ์์ '์ด๋ผ๋ Button์ Click ํจ์ผ๋ก Click Event๋ฅผ ํตํด devInquryData ์์ answerAt์ด "N"์ผ๋ก ๋ฐ๊พธ๋ฉด์ ๋ถํฐ ์์ํ๋ ๊ฒ์ด์์.
์์ '๋ต๊ธ ๋ฑ๋ก'๊ณผ ๋๊ฐ์ง๋ง, ์ฌ๊ธฐ์ ์ด์ผ๊ธฐ ํ๊ณ ์ถ์ ๊ฒ์ ๋ฐ๋ก '๋ต๊ธ ์์ '์ ๋๋ ์ ๋, answerAt์ด "N"์ผ๋ก ๋ฐ๋์ด์ <templat> Tage์ v-else๊ฐ ๋์ํ๊ฒ ๋์ด '๋ฑ๋ก'์ด๋ผ๋ ๊ฒ์ด ๊ฐ๋ฅํ๊ฒ ๋๋ ๊ฒ์ธ๋ฐ,
'๋ต๊ธ ์์ '์ ๋๋ฅด๊ฒ ๋๋ฉด '๋ฑ๋ก'๊ณผ๋ ๋ค๋ฅด๊ฒ ๊ธฐ์กด์ ์ ๋ ฅ๋์ด ์๋ ๋ต๊ธ ๋ด์ฉ์ ๊ทธ๋๋ก ๊ฐ์ ธ์ค๋ฉด์ ์์ ์ ํ ์ ์๊ฒ ํด ์ฃผ๋ ๊ฒ์ด์์.
์ด๋ ๊ฒ ํ ์ ์์๋ ์ด์ ๋ `DevInquryDetailView.vue - 75 ~ 97` ๊ทธ๋ฆผ์์ 88๋ฒ์งธ ์ค์ v-model ๋๋ฌธ์ธ๋ฐ, answerCn์ Data Binding์ ํด์ค์ ๊ธฐ์กด์ ์ ๋ ฅ๋ ๊ฐ์ ๊ฐ์ ธ์ค๊ฒ ํด์ค์ผ๋ก ์ด Logic์ด ์ํ๋ ์ ์๊ฒ ํด ์ค๊ฒ์ด์์.
๊ทธ ์ธ ๋ชจ๋ ๋ด์ฉ์ '๋ฑ๋ก'๊ณผ ์์ ํ ๊ฐ์ต๋๋ค!