์‡ผํ•‘๋ชฐ ํ”„๋กœ์ ํŠธ (2)

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";
	}