2023. 3. 24. 14:11ใSpring
์นดํ ๊ณ ๋ฆฌ ๋ชฉ๋ก ์ค ์นดํ ๊ณ ๋ฆฌ ์ฌ์ฉ ์ฌ๋ถ๋ฅผ bootstrap ์ฌ์ฉํ์ฌ ๋ผ๋์ค ๋ฒํผ์ผ๋ก ์์
bootstrap ํญ์์ Forms์ Checks & radios์์ ์์ค ๋ณต์ฌ
<th:block th:unless="${#lists.size(cateList) == 0}">
<tr th:each="category, state : ${cateList}">
<td>[[${state.count}]]</td>
<td>[[${category.cateName}]]</td>
<td>
<div class="row">
<div class="form-check col-6">
<input th:name="${'isUse_' + state.count}" type="radio" class="form-check-input" th:checked="${category.isUse == 'Y'}">์ฌ์ฉ์ค
</div>
<div class="form-check col-6">
<input th:name="${'isUse_' + state.count}" type="radio" class="form-check-input" th:checked="${category.isUse == 'N'}">๋ฏธ์ฌ์ฉ
</div>
</div>
</td>
<td>[[${category.orderNum}]]</td>
</tr>
</th:block>
for๋ฌธ ์์ ๋ผ๋์ค ๋ฒํผ์ด ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฅ name ์์ฑ์ ์ฃผ๋ฉด ๋ค ๊ฐ์ name์ ๊ฐ์ง๊ฒ ๋ผ์ ํ๋๋ก ๋ฌถ์
for๋ฌธ ๋๋ฉด์ name ๋ฐ๊ฟ์ค์ผ ํจ.
ํ๋ฉด์ ์ฒดํฌ๋์ด ๋ณด์ผ ๋ ์ค์ ์ฌ์ฉ/๋ฏธ์ฌ์ฉ ์ฌ๋ถ์ธ isUse๊ฐ์ด ์ฒดํฌ ๋์ด ํ๋ฉด์ ๋ณด์ฌ์ค์ผ ํจ.
ํ์๋ฆฌํ ๋ฌธ๋ฒ th:checked ์์ฑ ์ฌ์ฉํ์ฌ isUse ๊ฐ ๋ถ๋ฌ์์ ๊ธฐ๋ฅ ์ค์ .
์ฌ์ฉ์ฌ๋ถ ๋ผ๋์ค ์ฒดํฌ ๋ณ๊ฒฝ ์
์ค์ ์นดํ ๊ณ ๋ฆฌ ์ฌ์ฉ ์ฌ๋ถ๋ ๋ณ๊ฒฝ๋๊ฒ ๊ธฐ๋ฅ ์์ฑ.
<th:block th:unless="${#lists.size(cateList) == 0}">
<tr th:each="category, state : ${cateList}">
<td>[[${state.count}]]</td>
<td>[[${category.cateName}]]</td>
<td>
<div class="row">
<div class="form-check col-6">
<input th:name="${'isUse_' + state.count}" type="radio"
class="form-check-input" th:checked="${category.isUse == 'Y'}"
th:onchange="changeIsUse([[${category.cateCode}]]);">์ฌ์ฉ์ค
</div>
<div class="form-check col-6">
<input th:name="${'isUse_' + state.count}" type="radio"
class="form-check-input" th:checked="${category.isUse == 'N'}"
th:onchange="changeIsUse([[${category.cateCode}]]);">๋ฏธ์ฌ์ฉ
</div>
</div>
</td>
</tr>
</th:block>
radio input ํ๊ทธ์ th:onchange ์์ฑ ์ด์ฉํด์ js์ ajax ์ฌ์ฉํ์ฌ ํจ์ ์์ฑ.
html์์ js๋ก ๋์ด์ฌ ๋ cateCode์ isUse์ value ๊ฐ ํ์.
cateCode๋ ๋งค๊ฐ๋ณ์๋ก ๋ฃ์ด์ค
//๋ผ๋์ค ๋ฒํผ ์ฒดํฌ ์ ์นดํ
๊ณ ๋ฆฌ ์ฌ์ฉ ์ฌ๋ถ ๋ณ๊ฒฝ
function changeIsUse(cateCode){
//ajax start
$.ajax({
url: '/admin/changeIsUse', //์์ฒญ๊ฒฝ๋ก
type: 'post',
data: {'cateCode' : cateCode}, //ํ์ํ ๋ฐ์ดํฐ
success: function(result) {
},
error: function() {
alert('์คํจ');
}
});
//ajax end
}
๋ผ๋์ค ์ฒดํฌ ๋ณ๊ฒฝ์ isUse๊ฐ update > ์ฟผ๋ฆฌ์์ฑ
isUse๊ฐ์ ์ฟผ๋ฆฌ ์์ฑํ๋ฉด์ ์ฒ๋ฆฌํจ.
<!-- ์นดํ
๊ณ ๋ฆฌ ์ฌ์ฉ ์ฌ๋ถ ๋ณ๊ฒฝ -->
<!-- DECODE : else์ ๊ฐ์! IS_USE๊ฐ Y๋ฉด N์ผ๋ก N์ด๋ฉด Y๋ก-->
<update id="updateIsUse">
UPDATE ITEM_CATEGORY
SET
IS_USE = DECODE(IS_USE, 'Y', 'N', 'N', 'Y')
WHERE CATE_CODE = #{cateCode}
</update>
AdminService ๋ฉ์๋ ์์ฑ
//์นดํ
๊ณ ๋ฆฌ ๋ณ๊ฒฝ
@Override
public int changeIsUse(String cateCode) {
return sqlSession.update("adminMapper.updateIsUse", cateCode);
}
AdminServiceImpl ๋ฉ์๋ ๊ตฌํ
//์นดํ
๊ณ ๋ฆฌ ๋ณ๊ฒฝ
@Override
public int changeIsUse(String cateCode) {
return sqlSession.update("adminMapper.updateIsUse", cateCode);
}
AdminController์์ฑ
๋ฉ์๋ ์คํ ์ update๊ฐ ์ ๋์์ผ๋ฉด 1์ return ํจ. ๊ทธ ๊ฐ js๋ก return
//์นดํ
๊ณ ๋ฆฌ ๋ณ๊ฒฝ
@ResponseBody
@PostMapping("/changeIsUse")
public int changeIsUse(String cateCode) {
return adminService.changeIsUse(cateCode); //๋ณ๊ฒฝ ์ ๋๋ฉด return์ผ๋ก 1์ค. js๋ก ๋ณด๋ด๊ธฐ
}
js๋ก ๋์์์ if๋ฌธ์ผ๋ก ์นดํ ๊ณ ๋ฆฌ ๋ณ๊ฒฝ ์ ๋๋์ง ํ์ธ ์ฌ๋ถ ์ฐฝ ๋์์ฃผ๊ธฐ.
//๋ผ๋์ค ๋ฒํผ ์ฒดํฌ ์ ์นดํ
๊ณ ๋ฆฌ ์ฌ์ฉ ์ฌ๋ถ ๋ณ๊ฒฝ
function changeIsUse(cateCode){
//ajax start
$.ajax({
url: '/admin/changeIsUse', //์์ฒญ๊ฒฝ๋ก
type: 'post',
data: {'cateCode' : cateCode}, //ํ์ํ ๋ฐ์ดํฐ
success: function(result) {
if(result == 1) {
alert('์นดํ
๊ณ ๋ฆฌ ์ฌ์ฉ ์ฌ๋ถ๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค.');
}
else {
alert('์ผ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.');
}
},
error: function() {
alert('์คํจ');
}
});
//ajax end
}
ํ์ฌ์ํ
์นดํ ๊ณ ๋ฆฌ ๋ฑ๋ก ํ ๋ค์ ์กฐํ๋ ๋ฐ์ดํฐ๋ก ํ ์ด๋ธ ๊ทธ๋ฆด ๋ ๋ผ๋์ค ๋ฒํผ์ด ์๋๋ผ isUse value๊ฐ์ผ๋ก ๊ทธ๋ฆผ
๋ผ๋์ค ๋ฒํผ์ผ๋ก ๊ทธ๋ ค์ง๊ฒ ์ฝ๋ ์์ > javascript ์ธ์ด๋ก ์ธ์ํ ์ ์๊ฒ ์ฝ๋ ๋ฐ๊ฟ์ผ ํจ.
์ฝ๋ ๋ฐ๊ฟ ๋ ์ฃผ์์ฌํญ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋งค๊ฐ๋ณ์ onchange="changeIsUse(${result[i].cateCode});๋ฅผ ๋ฌธ์๋ก ์ธ์ ๋ชป ํจ.
๊ฐ๋ฐ์๋ชจ๋๋ก ํ์ธํ๋ฉด ์๋ ๊ทธ๋๋ก cateCode ๊ฐ์ ธ๊ฐ.
๋ฐ์ดํฐ๋ฅผ ๋ฌธ์๋ก ์ธ์ํ ์ ์๊ฒ ๋งค๊ฐ๋ณ์๋ฅผ ํ๋ฐ์ดํ๋ก ๊ฐ์ธ์ผ ๋๋ค.
//์นดํ
๊ณ ๋ฆฌ ๋ฑ๋ก ํ ์คํ๋๋ ๋ชฉ๋ก ์กฐํ ๊ธฐ๋ฅ
function getCateListAjax(){
//ajax start
$.ajax({
url: '/admin/getCateListAjax', //์์ฒญ๊ฒฝ๋ก
type: 'post',
async : false, //๋๊ธฐ ๋ฐฉ์์ผ๋ก ์คํ
data: {}, //ํ์ํ ๋ฐ์ดํฐ
success: function(result) {
//์นดํ
๊ณ ๋ฆฌ ๋ชฉ๋ก ํ
์ด๋ธ์ tbody ํ๊ทธ๋ฅผ ์ ํ
const tbodyTag = document.querySelector('#cateListTable tbody')
//ํด๋น ํ๊ทธ ์์ ๋ชจ๋ ๋ด์ฉ ์ญ์
tbodyTag.replaceChildren();
//์๋กญ๊ฒ ์กฐํ๋ ์นดํ
๊ณ ๋ฆฌ ๋ชฉ๋ก ๋ฐ์ดํฐ๋ก ํ
์ด๋ธ ์ฑ์์ค.
let str = '';
for(let i = 0 ; i < result.length ; i++){
str += `<tr>`;
str += `<td>${i + 1}</td>`;
str += `<td>${result[i].cateName}</td>`;
str += '<td>';
str += '<div class="row">';
str += `<div class="form-check col-6">`;
if(result[i].isUse == 'Y'){
str += `<input name="isUse_${i+1}" type="radio" class="form-check-input"
checked onchange="changeIsUse('${result[i].cateCode}');">์ฌ์ฉ์ค`;
}else{
str += `<input name="isUse_${i+1}" type="radio" class="form-check-input"
onchange="changeIsUse('${result[i].cateCode}');">์ฌ์ฉ์ค`;
}
str += `</div>`;
str += ` <div class="form-check col-6">`;
if(result[i].isUse == 'N'){
str += `<input name="isUse_${i+1}" type="radio" class="form-check-input"
checked onchange="changeIsUse('${result[i].cateCode}');">๋ฏธ์ฌ์ฉ`;
}else{
str += `<input name="isUse_${i+1}" type="radio" class="form-check-input"
onchange="changeIsUse('${result[i].cateCode}');">๋ฏธ์ฌ์ฉ`;
}
str += `</div>`;
str += `</div>`;
str += `</td>`;
str += `<td>${result[i].orderNum}</td>`;
str += `<td><input type="button" value="์ญ์ " class="btn btn-danger" onclick="deleteCate('${result[i].cateCode}');"></td>`
str += '</tr>';
}
tbodyTag.insertAdjacentHTML('afterbegin', str);
},
error: function() {
alert('์คํจ');
}
});
//ajax end
}
์นดํ ๊ณ ๋ฆฌ ์ญ์ ๊ธฐ๋ฅ
์นดํ ๊ณ ๋ฆฌ ๋ชฉ๋ก ์กฐํ ํ ์ด๋ธ์ ํ ์ถ๊ฐํ์ฌ ์ญ์ ๋ฒํผ ๋ง๋ฆ.
์ญ์ ๋ฒํผ ๋๋ฅด๋ฉด ๋ฐ์ดํฐ ์ญ์ ๋๊ฒํจ.
ajax ์ฌ์ฉ x ์ผ๋ฐ ํ์ด์ง ์ด๋ ์ฌ์ฉํ์ฌ ๊ธฐ๋ฅ ์์ฑ.
cate_manage.html์ input button ํ์ ์ผ๋ก ์ญ์ ๋ฒํผ ์์ฑ
์ญ์ ๋ฒํผ์ ๋๋ฅด๋ฉด ํด๋น ์นดํ ๊ณ ๋ฆฌ๊ฐ ์ญ์ ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ cateCode ๊ฐ์ง๊ณ ๊ฐ์ผํจ.
๋งค๊ฐ๋ณ์๋ก js์ ๋๊ฒจ์ฃผ๊ธฐ
<th:block th:unless="${#lists.size(cateList) == 0}">
<tr th:each="category, state : ${cateList}">
<td>[[${state.count}]]</td>
<td>[[${category.cateName}]]</td>
<td>
<div class="row">
<div class="form-check col-6">
<input th:name="${'isUse_' + state.count}" type="radio" class="form-check-input" th:checked="${category.isUse == 'Y'}">์ฌ์ฉ์ค
</div>
<div class="form-check col-6">
<input th:name="${'isUse_' + state.count}" type="radio" class="form-check-input" th:checked="${category.isUse == 'N'}">๋ฏธ์ฌ์ฉ
</div>
</div>
</td>
<td>[[${category.orderNum}]]</td>
<td><input type="button" value="์ญ์ " class="btn btn-danger" th:onclick="deleteCate([[${category.cateCode}]]);"> </td>
</tr>
</th:block>
html์์ ๋์ด์จ ๋ฐ์ดํฐ ๋งค๊ฐ๋ณ์ ๋ฐ์์ js์์์นดํ ๊ณ ๋ฆฌ ์ญ์ ํจ์ ์์ฑ.
//์นดํ
๊ณ ๋ฆฌ ์ญ์
function deleteCate(cateCode){
var result = confirm('์นดํ
๊ณ ๋ฆฌ๋ฅผ ์ญ์ ํ์๊ฒ ์ต๋๊น?'); //ํ์
์ฐฝ์ ํ์ธ ์ทจ์ ๋ฒํผ > ํ์ธ : retrun true, ์ทจ์ : retrun false
if(result){
location.href = `/admin/deleteCate?cateCode=${cateCode}`;
}
์ญ์ ์ฟผ๋ฆฌ ์์ฑ
<!-- ์นดํ
๊ณ ๋ฆฌ ์ญ์ -->
<delete id="deleteCate">
DELETE ITEM_CATEGORY
WHERE CATE_CODE = #{cateCode}
</delete>
AdminService ๋ฉ์๋ ์์ฑ
//์นดํ
๊ณ ๋ฆฌ ์ญ์
void deleteCate(String cateCode);
AdminServiceImpl ๋ฉ์๋ ๊ตฌํ
//์นดํ
๊ณ ๋ฆฌ ์ญ์
@Override
public void deleteCate(String cateCode) {
sqlSession.delete("adminMapper.deleteCate", cateCode);
}
AdminController ์์ฑ.
๋ฉ์๋ ์คํ
์ญ์ ํ ํ๋ฉด์ ๋ค์ ์นดํ ๊ณ ๋ฆฌ ๋ชฉ๋ก ์กฐํํด์ผ ํจ.
์ด์ ์ ๋ง๋ค์ด๋ ์นดํ ๊ณ ๋ฆฌ ๊ด๋ฆฌ ํ์ด์ง๋ก ์ด๋ํ์ฌ ๋ชฉ๋ก ์กฐํํ๊ธฐ.
//์นดํ
๊ณ ๋ฆฌ ์ญ์
@GetMapping("/deleteCate")
public String deleteCate(String cateCode) {
adminService.deleteCate(cateCode);
return "redirect:/admin/cateManage";
}
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ผํ๋ชฐ ํ๋ก์ ํธ(4) ํ์ ๊ฐ์ ๊ธฐ๋ฅ (0) | 2023.03.27 |
---|---|
์ผํ๋ชฐ ํ๋ก์ ํธ(3) (0) | 2023.03.24 |
์ผํ๋ชฐ ํ๋ก์ ํธ(1) - ์ ๋ฐ์ ์ธ ํ ์ก๊ธฐ (0) | 2023.03.23 |
ajax ์ฐ์ต ํ๋ก์ ํธ (0) | 2023.03.22 |
Ajax 2 (์ต๊ทผ ์ ๋ฐ์ดํธ ๋ฐฉ๋ฒ) (0) | 2023.03.22 |