ajax ์—ฐ์Šต ํ”„๋กœ์ ํŠธ

2023. 3. 22. 17:27ใ†Spring

ํŽ˜์ด์ง€ ์ด๋™์—†์ด Controller๋กœ ์ด๋™ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…ํ•˜๊ณ  ์‹ถ์„ ๋•Œ > ajax ์‚ฌ์šฉ.

 

select ๋ฐ•์Šค ๊ฐ’ ๋ณ€๊ฒฝ ์‹œ ๋ณ€๊ฒฝํ•œ ๋ฐ˜์˜ ํ•™์ƒ ๋ชฉ๋ก ์กฐํšŒ ๋˜๊ฒŒ ๊ตฌํ˜„

select ๋ฐ•์Šค ์„ ํƒํ•  ๋•Œ๋งˆ๋‹ค > onchange ์†์„ฑ์—์„œ ํ•จ์ˆ˜ ๋งŒ๋“ค์–ด์คŒ.

<select id="classSelect" onchange="getStuList();">
	<option value="">์ „์ฒด</option>
		<th:block th:each="classInfo : ${classList}">
	<option th:value="${classInfo.classCode}">[[${classInfo.className}]]</option>
		</th:block>
</select>

๋ชฉ๋ก ์กฐํšŒ๋ฅผ ์œ„ํ•ด ์ฟผ๋ฆฌ ์ž‘์„ฑ

	<!-- ajax ์‚ฌ์šฉํ•˜์—ฌ select ๋ฐ•์Šค ๋ณ€๊ฒฝํ•œ ํ•™์ƒ ๋ชฉ๋ก ์กฐํšŒ -->
	<select id="getStuListAjax" resultMap="stu">
		SELECT STU_NUM
			, STU_NAME
			, STU_AGE
			, CLASS_NAME
		FROM AJAX_STUDENT STU, CLASS_INFO CLS
		WHERE STU.CLASS_CODE = CLS.CLASS_CODE
		WHERE CLS.CLASS_CODE = #{classCode}
		ORDER BY CLASS_NAME, STU_NAME
	</select>

service, serviceImpl ๋ฉ”์†Œ๋“œ ์ƒ์„ฑ, ๊ตฌํ˜„

 

Controller์—์„œ ๋ฉ”์†Œ๋“œ ์‹คํ–‰ํ•˜๋ ค๋ฉด classCode ํ•„์š”ํ•จ.

js์—์„œ ajax ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฐ›์•„ ์˜ค๋ฉด ๋จ.

๋จผ์ € select ๋ฐ•์Šค์— id ๋ถ€์—ฌํ•œ ๊ฒƒ์œผ๋กœ js์—์„œ value ๋ฐ›์•„์˜ด.

๋ณ€์ˆ˜๋กœ ์ €์žฅํ•˜์—ฌ ajax์—์„œ ๋ฐ์ดํ„ฐ ๋ณด๋‚ด์คŒ.

//์…€๋ ‰ํŠธ ๋ฐ•์Šค ๊ฐ’ ๋ณ€๊ฒฝ ์‹œ ํ•™์ƒ ๋ชฉ๋ก ์กฐํšŒ
function getStuList(){
	//selectํ•œ ํ•™๊ธ‰ ๊ฐ’
	const classCode = document.querySelector('#classSelect').value;
	
	//ajax start
	$.ajax({
		url: '/stu/listAjax', //์š”์ฒญ๊ฒฝ๋กœ
		type: 'post',
		data: {'classCode' : classCode}, //ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ
		success: function(result) {
			alert('ajax ํ†ต์‹  ์„ฑ๊ณต');
		},
	   error: function() {
		  alert('์‹คํŒจ');
	   }
    });
//ajax end
}

Controller์—์„œ js๊ฐ€ ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ณ  ๋ฉ”์†Œ๋“œ ์‹คํ–‰.

	//ํ•™๊ธ‰ ์…€๋ ‰ํŠธ ๋ฐ•์Šค ๋ณ€๊ฒฝ ์‹œ ํ•™์ƒ ๋ชฉ๋ก ajax๋กœ ์กฐํšŒ
	@ResponseBody
	@PostMapping("/listAjax")
	public void listAjax(String classCode) { //js์—์„œ ๋˜์ง„ ๋ฐ์ดํ„ฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ธฐ
		
		//select ๋ฐ•์Šค๋กœ ์„ ํƒํ•œ ํ•™๊ธ‰์˜ ํ•™์ƒ ๋ชฉ๋ก ์กฐํšŒ
		studentService.getStuListAjax(classCode);	
	}

ํ˜„์žฌ๊นŒ์ง€ select ๋ฐ•์Šค์—์„œ ํ•™๊ธ‰ ์„ ํƒํ•˜๋ฉด ํ™”๋ฉด์€ ๋ฐ”๋€Œ์ง€ ์•Š์Œ.

consol์ฐฝ์—์„œ ์„ ํƒ๋œ ํ•™๊ธ‰์˜ ํ•™์ƒ ๋ชฉ๋ก ์กฐํšŒ ๋˜๋Š” ๊ฒƒ ํ™•์ธ ๊ฐ€๋Šฅ

 

ํ™”๋ฉด๋„ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด ํ™”๋ฉด์ƒ์—์„œ ์ œ๋ชฉ ์ค„ ๋นผ๊ณ  ํ…Œ์ด๋ธ”์˜ ๋ฐ‘์˜ ๋‚ด์šฉ ๋ถ€๋ถ„ ๋‹ค ์ง€์šฐ๊ธฐ.

์ง€์šด ๊ณต๊ฐ„์— ๋‹ค์‹œ ์„ ํƒํ•œ ํ•™๊ธ‰ ๋ชฉ๋ก ์กฐํšŒ ๋ฐ์ดํ„ฐ ์ฑ„์šฐ๊ธฐ

//์…€๋ ‰ํŠธ ๋ฐ•์Šค ๊ฐ’ ๋ณ€๊ฒฝ ์‹œ ํ•™์ƒ ๋ชฉ๋ก ์กฐํšŒ
function getStuList(){
	//selectํ•œ ํ•™๊ธ‰ ๊ฐ’
	const classCode = document.querySelector('#classSelect').value;
	
	//ajax start
	$.ajax({
		url: '/stu/listAjax', //์š”์ฒญ๊ฒฝ๋กœ
		type: 'post',    //์œ„์—์„œ ๋ฐ›์•„์˜จ ํ•™๊ธ‰ ๊ฐ’ ๋ณ€์ˆ˜
		data: {'classCode' : classCode}, //Controller์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ๋ณด๋‚ด์ฃผ๊ธฐ
		success: function(result) {
			//ํ•™์ƒ ๋ชฉ๋ก ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋‚ด์šฉ ์‚ญ์ œ
			const tbodyTag = document.querySelector('.stuListTable > tbody')
			//๋ถ€๋ชจํƒœ๊ทธ.replaceChildren(); -> ์„ ํƒํ•œ ๋ถ€๋ชจ ํƒœ๊ทธ ์•ˆ์—์„œ ()์•ˆ์— ๋“ค์–ด์˜จ ์ž์‹ ํƒœ๊ทธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋Šฅ,
			//()์•ˆ์„ ๋น„์šฐ๋ฉด ์„ ํƒํ•œ ๋ถ€๋ชจ ํƒœ๊ทธ ์•ˆ์˜ ๋ชจ๋“  ์ž์‹ ํƒœ๊ทธ ์‚ญ์ œ
			tbodyTag.replaceChildren();
		},
	   error: function() {
		  alert('์‹คํŒจ');
	   }
    });
//ajax end
}

Controller์—์„œ selectํ•œ ํ•™๊ธ‰์˜ ํ•™์ƒ ๋ชฉ๋ก ์กฐํšŒ ๋ฐ์ดํ„ฐ return ํ•ด์ฃผ๊ธฐ

	//ํ•™๊ธ‰ ์…€๋ ‰ํŠธ ๋ฐ•์Šค ๋ณ€๊ฒฝ ์‹œ ํ•™์ƒ ๋ชฉ๋ก ajax๋กœ ์กฐํšŒ
	@ResponseBody
	@PostMapping("/listAjax")
	public List<StudentVO> listAjax(String classCode) { //js์—์„œ ๋˜์ง„ ๋ฐ์ดํ„ฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ธฐ
		
		//select ๋ฐ•์Šค๋กœ ์„ ํƒํ•œ ํ•™๊ธ‰์˜ ํ•™์ƒ ๋ชฉ๋ก ์กฐํšŒ
		return studentService.getStuListAjax(classCode);
		
	}

returnํ•ด์ค€ ๋ฐ์ดํ„ฐ๋ฅผ js์—์„œ result๊ฐ’์œผ๋กœ ๋“ค๊ณ  ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

js์—์„œ ํ…Œ์ด๋ธ” ๋งŒ๋“ค์–ด์„œ result๊ฐ’๋กœ ํ…Œ์ด๋ธ”์„ ๋‹ค์‹œ ์ฑ„์›Œ์ฃผ๋ฉด ๋จ.

**์กฐํšŒ๋œ ํ•™๊ธ‰์˜ ํ•™์ƒ ์ˆ˜๋งŒํผ (result์— ๋“ค์–ด๊ฐ„ ๋ฐ์ดํ„ฐ ์ˆ˜๋งŒํผ) tr ๋งŒ๋“ค์–ด์•ผ ๋จ > for๋ฌธ

ํƒœ๊ทธ ์ถ”๊ฐ€ ๋ฌธ๋ฒ• ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ” ์ถ”๊ฐ€

for๋ฌธ ๋Œ๋ฆด ๋•Œ ๊ธฐ๋ณธ for๋ฌธ์„ ์‚ฌ์šฉ. i๊ฐ’ ์ด์šฉํ•˜์—ฌ No ๋ถ€๋ถ„ ์ฑ„์›Œ์คŒ.

//์…€๋ ‰ํŠธ ๋ฐ•์Šค ๊ฐ’ ๋ณ€๊ฒฝ ์‹œ ํ•™์ƒ ๋ชฉ๋ก ์กฐํšŒ
function getStuList(){
	//selectํ•œ ํ•™๊ธ‰ ๊ฐ’
	const classCode = document.querySelector('#classSelect').value;
	
	//ajax start
	$.ajax({
		url: '/stu/listAjax', //์š”์ฒญ๊ฒฝ๋กœ
		type: 'post',    //์œ„์—์„œ ๋ฐ›์•„์˜จ ํ•™๊ธ‰ ๊ฐ’ ๋ณ€์ˆ˜
		data: {'classCode' : classCode}, //Controller์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ๋ณด๋‚ด์ฃผ๊ธฐ
		success: function(result) {
			//ํ•™์ƒ ๋ชฉ๋ก ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋‚ด์šฉ ์‚ญ์ œ
			const tbodyTag = document.querySelector('.stuListTable > tbody')
			//๋ถ€๋ชจํƒœ๊ทธ.replaceChildren(); -> ์„ ํƒํ•œ ๋ถ€๋ชจ ํƒœ๊ทธ ์•ˆ์—์„œ ()์•ˆ์— ๋“ค์–ด์˜จ ์ž์‹ ํƒœ๊ทธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋Šฅ,
			//()์•ˆ์„ ๋น„์šฐ๋ฉด ์„ ํƒํ•œ ๋ถ€๋ชจ ํƒœ๊ทธ ์•ˆ์˜ ๋ชจ๋“  ์ž์‹ ํƒœ๊ทธ ์‚ญ์ œ
			tbodyTag.replaceChildren();
			
			//์„ ํƒํ•œ ํ•™๊ธ‰ ๋ชฉ๋ก์ด ์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ๋กœ ๋‹ค์‹œ ํ…Œ์ด๋ธ”์˜ ๋‚ด์šฉ์„ ์ฑ„์šด๋‹ค.
			//์กฐํšŒ๋œ ํ•™๊ธ‰์˜ ํ•™์ƒ ์ˆ˜๋งŒํผ (result์— ๋“ค์–ด๊ฐ„ ๋ฐ์ดํ„ฐ ์ˆ˜๋งŒํผ) tr ๋งŒ๋“ค์–ด์•ผ ๋จ > for๋ฌธ
			let str = '';
				/*๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋ช‡๋ฒˆ์งธ ๋„๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Œ
				for(const stu of result){
					str += '<tr>';
					str += '<td></td>';
					str += `<td>${stu.className}</td>`;
					str += `<td>${stu.stuName}</td>`;
					str += `<td>${stu.stuAge}</td>`;
					str += '</tr>';
					
				}
				*/
				
				//๊ธฐ๋ณธ for๋ฌธ ์‚ฌ์šฉ(No ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด์„œ i๊ฐ’ ์‚ฌ์šฉ)
				for(let i = 0; i < result.length ; i++){
					str += '<tr>';
					str += `<td>${i + 1}</td>`; //์—ญ์ˆœ์œผ๋กœ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ result.length - i
					str += `<td>${result[i].className}</td>`;
					str += `<td><a href="javascript:void(0)" onclick="getScore(${result[i].stuNum});">${result[i].stuName}</a></td>`;
					str += `<td>${result[i].stuAge}</td>`;
					str += `<td><input type="button" value="์‚ญ์ œ" onclick="goDelete(${result[i].stuNum}, this);"></td>`;
					str += '</tr>';
					
				}
				
				//tag.insertAdjacentHTML(‘์ถ”๊ฐ€ํ•  ์œ„์น˜’, ‘์ถ”๊ฐ€ํ•  ํƒœ๊ทธ’)
				tbodyTag.insertAdjacentHTML('afterbegin', str) //์„ ํƒํ•œ ํƒœ๊ทธ๊ฐ€ ์‹œ์ž‘๋˜์ž ๋งˆ์ž ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€
		},
	   error: function() {
		  alert('์‹คํŒจ');
	   }
    });
//ajax end
}

 

ํ˜„์žฌ๊นŒ์ง€ ํ•™๊ธ‰์„ ์„ ํƒํ•˜๋ฉด ํ•™๊ธ‰์˜ ํ•™์ƒ ๋ชฉ๋ก ์กฐํšŒ ๋จ.

๊ทธ๋Ÿฌ๋‚˜ select ๋ฐ•์Šค ์ „์ฒด๋กœ ์„ ํƒํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์•ˆ ๋œฌ๋‹ค.

์ฟผ๋ฆฌ๋ฌธ ์ˆ˜์ •.

์ „์ฒด๋ฅผ ์„ ํƒํ•˜๋ฉด ์ฟผ๋ฆฌ ์‹คํ–‰ x ๊ทธ ์™ธ์— ์ฟผ๋ฆฌ ์‹คํ–‰  > ์ฟผ๋ฆฌ๋ฌธ์— if๋ฌธ ์‚ฌ์šฉ

	<!-- ajax ์‚ฌ์šฉํ•˜์—ฌ select ๋ฐ•์Šค ๋ณ€๊ฒฝํ•œ ํ•™์ƒ ๋ชฉ๋ก ์กฐํšŒ -->
	<select id="getStuListAjax" resultMap="stu">
		SELECT STU_NUM
			, STU_NAME
			, STU_AGE
			, CLASS_NAME
		FROM AJAX_STUDENT STU, CLASS_INFO CLS
		WHERE STU.CLASS_CODE = CLS.CLASS_CODE    <!-- ๋ฌธ์ž์—ด ๋น„๊ต ์ž๋ฐ”์™€ ๋™์ผํ•˜๊ฒŒ equals-->
		<!-- if๋ฌธ์— test="" ๋Œ€์‹  '' ์“ฐ๋Š” ์ด์œ  ๋ฌธ์ž์—ด ๋น„๊ต ์‹œ ""๋„ฃ์–ด์•ผ ๋จ (if๋ฌธ์— test="" ๋„ฃ์œผ๋ฉด ๋ฌธ์ž์—ด ๋น„๊ต์˜ "" ์ธ์‹x -->
		<!-- if๋ฌธ ์•ˆ์—์„œ๋Š” getter๋ฅผ ํ˜ธ์ถœํ•จ. classCode๋Š” String์ด๊ธฐ ๋•Œ๋ฌธ์— getter ์—†์Œ > ์˜ค๋ฅ˜. 1. ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉด getter๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ-->
		<if test='_parameter != null and !_parameter.equals("")'>
		AND CLS.CLASS_CODE = #{_parameter} <!-- 2. ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ๋„˜๊ฒจ์ค„ ๋•Œ๋Š” _parameter(๋นˆ๊ฐ’ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ๋„˜์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋“ค๊ณ ์˜ด) -->
		</if>
		ORDER BY CLASS_NAME, STU_NAME
	</select>

์ „์ฒด๋ฅผ ์„ ํƒํ–ˆ์„ ๋•Œ ์ฝ˜์†”์— ์ฟผ๋ฆฌ ๋ณด๋ฉด and ์กฐ๊ฑด์ด ๋น ์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

ํ•™์ƒ๋ช… ํด๋ฆญ ์‹œ ์šฐ์ธก ๋นˆ๊ณต๊ฐ„์— ํ•ด๋‹น ํ•™์ƒ์˜ ์ ์ˆ˜ ์ •๋ณด ์กฐํšŒ

ํ•™์ƒ๋ช… ๋‚˜์˜ค๋Š” ํƒœ๊ทธ์— aํƒœ๊ทธ์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ href ์†์„ฑ ์‚ฌ์šฉ X > ํŽ˜์ด์ง€ ์ด๋™ ๋จ. 

aํƒœ๊ทธ์—๋„ onclick ์†์„ฑ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์•„๋ž˜์ฒ˜๋Ÿผ href์— ์ž‘์„ฑํ•˜๋ฉด ํŽ˜์ด์ง€ ์ด๋™ ๊ธฐ๋Šฅ ์ž‘๋™X

<td><a href="javascript:void(0);" onclick="getScore();">[[${stu.stuName}]]</a></td>

์ฟผ๋ฆฌ ์ž‘์„ฑ์‹œ STU_NAME ํ•„์š” resultMap์— ์ถ”๊ฐ€ ScoreVO์—๋„ ์ถ”๊ฐ€

<select id="getScore" resultMap="score">
		SELECT SCORE_NUM
			, KOR_SCORE
			, ENG_SCORE
			, MATH_SCORE
			, (SELECT STU_NAME 
				FROM AJAX_STUDENT
				WHERE STU_NUM = STUDENT_SCORE.STU_NUM) AS STU_NAME
		FROM STUDENT_SCORE
		WHERE STU_NUM = #{stuNum}
	</select>

 

ํ•™์ƒ๋ช… ํด๋ฆญํ•˜๋ฉด stuNum๋„ ๊ฐ™์ด ๊ฐ€์ง€๊ณ  ์™€์•ผ ๋จ. > ์ฟผ๋ฆฌ ๋นˆ ๊ฐ’ ์ฑ„์›Œ์ฃผ๊ธฐ ์œ„ํ•ด

<td><a href="javascript:void(0);" th:onclick="getScore([[${stu.stuNum}]]);">[[${stu.stuName}]]</a></td>

 

js์— ํ•จ์ˆ˜ ์ƒ์„ฑ ํ›„ ajax ์‚ฌ์šฉ

html์—์„œ ๋„˜๊ฒจ์ค€ stuNum ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ณ  Controller์—์„œ stuNum ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ๋„˜๊ฒจ์คŒ.

//ํ•™์ƒ ์ด๋ฆ„ ํด๋ฆญ ์‹œ ํ•™์ƒ ์ ์ˆ˜ ์กฐํšŒ
function getScore(stuNum){
	//ajax start
	$.ajax({
	   url: '/score/getScore', //์š”์ฒญ๊ฒฝ๋กœ
	   type: 'post',
	   data: {'stuNum' : stuNum}, //Controller์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ๋„˜๊ฒจ์คŒ
	   success: function(result) {
	 
	   },
	   error: function() {
	      alert('์‹คํŒจ');
	   }
	});
//ajax end	
}

ScoreController์—์„œ ์„ฑ์  ์กฐํšŒ ๋ฉ”์†Œ๋“œ ์‹คํ–‰ํ•˜์—ฌ js๋กœ return

@Controller
@RequestMapping("/score")
public class ScoreController {
	
	@Resource(name = "scoreService")
	private ScoreService scoreService;
	
	//ํ•™์ƒ๋ช… ํด๋ฆญ ์‹œ ์„ฑ์  ์กฐํšŒ
	@ResponseBody //ํŽ˜์ด์ง€ ์ด๋™X์ธ ๊ฒƒ ์ง€์ •
	@PostMapping("/getScore")
	public ScoreVO getStuScore(int stuNum) {
		
		return scoreService.getScore(stuNum);
		
	}

}

html๋กœ ๋Œ์•„์™€์„œ score์ •๋ณด๊ฐ€ ๋‚˜์˜ฌ ๊ณต๊ฐ„ div๋กœ ๋งŒ๋“  ํ›„ js์—์„œ ํ…Œ์ด๋ธ” ๊ทธ๋ฆฌ๊ณ 

ํƒœ๊ทธ ์ถ”๊ฐ€ํ•ด์„œ ํ…Œ์ด๋ธ” ๋‚˜์˜ค๊ฒŒ 

ํ‰๊ท ์€ ๋ฏธ๋ฆฌ ๊ตฌํ•ด์„œ ๋ณ€์ˆ˜๋กœ ์คŒ

//ํ•™์ƒ ์ด๋ฆ„ ํด๋ฆญ ์‹œ ํ•™์ƒ ์ ์ˆ˜ ์กฐํšŒ
function getScore(stuNum){
	//ajax start
	$.ajax({
	   url: '/score/getScore', //์š”์ฒญ๊ฒฝ๋กœ
	   type: 'post',
	   data: {'stuNum' : stuNum}, //Controller์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ๋„˜๊ฒจ์คŒ
	   success: function(result) {
	      const divTag = document.querySelector('.scoreDiv')
	      
	      //์ ์ˆ˜ ํ‰๊ท 
	      const avg = (result.korScore + result.engScore + result.mathScore) / 3
	      
	      //์ ์ˆ˜ ์ •๋ณด ๋‚˜์˜ฌ ํ…Œ์ด๋ธ”
	      let str = '';
	      
		   	str  += ` <table>                      ` ;
			str	 += `		<tr>                   ` ;
			str	 += `			<td>์ด๋ฆ„</td>      ` ;
			str	 += `			<td>${result.stuName}</td>` ;
			str	 += `		</tr>                  ` ;
			str	 += `		<tr>                   ` ;
			str	 += `			<td>๊ตญ์–ด์ ์ˆ˜</td>  ` ;
			str	 += `			<td>${result.korScore}</td>` ;
			str	 += `		</tr>                  ` ;
			str	 += `		<tr>                   ` ;
			str	 += `			<td>์˜์–ด์ ์ˆ˜</td>  ` ;
			str	 += `			<td>${result.engScore}</td>` ;
			str	 += `		</tr>                  ` ;
			str	 += `		<tr>                   ` ;
			str	 += `			<td>์ˆ˜ํ•™์ ์ˆ˜</td>  ` ;
			str	 += `			<td>${result.mathScore}</td>` ;
			str	 += `		</tr>                  ` ;
			str	 += `		<tr>                   ` ;
			str	 += `			<td>ํ‰๊ท </td>      ` ;
			str	 += `			<td>${avg}</td>          ` ;
			str	 += `		</tr>                  ` ;
			str	 += `	</table>                   ` ;
			
			divTag.replaceChildren();
			divTag.insertAdjacentHTML('afterbegin', str);
	 
	   },
	   error: function() {
	      alert('์‹คํŒจ');
	   }
	});
//ajax end	
}

 

ํ˜„์žฌ ์ƒํƒœ์—์„œ ๋ฌธ์ œ

1. ์ „์ฒด ๋ฐ์ดํ„ฐ์—์„œ ์ด๋ฆ„ ํด๋ฆญ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ select ๋ฐ•์Šค๋กœ ํ•™๊ธ‰ ๋ฐ”๊พธ๋ฉด ์ด๋ฆ„ ํด๋ฆญ ๋ถˆ๊ฐ€

๊ฐœ๋ฐœ์ž๋ชจ๋“œ๋กœ ํ™•์ธํ•˜๋ฉด ํ•™๊ธ‰ ๋ฐ”๊พธ๋ฉด aํƒœ๊ทธ ์ฝ”๋“œ๊ฐ€ ์—†์Œ.

> js์˜ ajax์—์„œ for๋ฌธ ๋Œ๋ฉด์„œ ๊ทธ๋ƒฅ ํ…Œ์ด๋ธ”๋งŒ ๊ทธ๋ ค์คŒ. aํƒœ๊ทธ ์—†๋Š” ์ƒํƒœ์ž„.

ajax์—์„œ ๋งŒ๋“  ํ…Œ์ด๋ธ”๋„ aํƒœ๊ทธ ์ถ”๊ฐ€ํ•ด์ค˜์•ผํ•œ๋‹ค.

 

2. db์— ์—†๋Š” ํ•™์ƒ์˜ ์ ์ˆ˜๋ฅผ ์กฐํšŒํ•˜๋ฉด undefined(์˜ค๋ฅ˜) ๋œธ 

์˜ˆ๋ฅผ ๋“ค์–ด ์‹œ์Šคํ…œ ์ƒ์œผ๋กœ ๋ณด๋ฉด ์ฑ„์ ์„ ์•ˆ ํ•œ ํ•™์ƒ์€ ์ ์ˆ˜๊ฐ€ 0์œผ๋กœ ๋œจ๊ฒŒ ์„ค์ •.

์ฟผ๋ฆฌ ์ˆ˜์ •ํ•ด์•ผ ํ•จ.

์ˆ˜์ • ์ด์œ  : ์ด์ „ ์ž‘์„ฑํ•œ ์ฟผ๋ฆฌ๋Š” ์ ์ˆ˜ ์—†๋Š” ํ•™์ƒ ์กฐํšŒ ๋ชป ํ•˜๊ธฐ ๋•Œ๋ฌธ์—

	<select id="getScore" resultMap="score">
		SELECT SCORE_NUM
	    	, NVL(KOR_SCORE, 0) KOR_SCORE
	   		, NVL(ENG_SCORE, 0) ENG_SCORE
	    	, NVL(MATH_SCORE, 0) MATH_SCORE
	    	, STU_NAME
		FROM STUDENT_SCORE SCORE, AJAX_STUDENT STU
		WHERE SCORE.STU_NUM(+) = STU.STU_NUM 
		<!-- SCORE ํ…Œ์ด๋ธ”์—๋Š” 11๋ฒˆ์ด ์—†์–ด์„œ ๋ฐ์ดํ„ฐ ์•ˆ ๋‚˜์˜ด. > (+)์ถ”๊ฐ€ : NULL ๋‚˜์˜ด > 0์œผ๋กœ ๋ฐ”๊พธ๊ธฐ -->
		AND STU.STU_NUM = #{stuNum}
	</select>

 

 

ajax ์‚ฌ์šฉํ•˜์—ฌ ํ•™์ƒ ์‚ญ์ œ ๊ธฐ๋Šฅ

html์— ์‚ญ์ œ ๋ฒ„ํŠผ input ํƒœ๊ทธ๋กœ ์ถ”๊ฐ€ onclick ์†์„ฑ์œผ๋กœ js๋กœ ์ด๋™, ํ•ด๋‹น ํ•™์ƒ ์‚ญ์ œ > stuNum ๋„˜๊ฒจ์ค€๋‹ค.

ํ•™์ƒ ์‚ญ์ œ ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ํ›„ js๋กœ ๋Œ์•„์™€์„œ ์‚ญ์ œํ•œ ํ•™์ƒ์ด ํ™”๋ฉด์—์„œ ์ง€์›Œ์ง€๊ฒŒ ์ž‘์—….

์‚ญ์ œ ๋ฒ„ํŠผ์„ ๊ธฐ์ค€์œผ๋กœ ์ง€์šธ ํƒœ๊ทธ ์ฐพ์•„๊ฐ€๊ธฐ ์œ„ํ•ด ์‚ญ์ œ ๋ฒ„ํŠผ ํƒœ๊ทธ ์ž์ฒด๋ฅผ this๋กœ ๋„˜๊ฒจ์ค€๋‹ค.

<tbody>
	<tr th:each="stu, state : ${stuList}">
		<td>[[${state.count}]]</td>
		<td>[[${stu.className}]]</td>
		<td><a href="javascript:void(0);" th:onclick="getScore([[${stu.stuNum}]]);">[[${stu.stuName}]]</a></td>
		<td>[[${stu.stuAge}]]</td>
		<td><input type="button" value="์‚ญ์ œ" th:onclick="goDelete([[${stu.stuNum}]], this);"></td>
	</tr>
</tbody>

js ํ•™์ƒ ์‚ญ์ œ ํ•จ์ˆ˜ ์ƒ์„ฑ.

html์—์„œ ๋„˜๊ฒจ์ค€ ๋‘ ๋ฐ์ดํ„ฐ stuNum, this๋ฅผ js์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์คŒ.

Controller๋กœ ์ด๋™ํ•˜๋ฉด์„œ stuNum ๊ฐ€์ ธ๊ฐ€๊ธฐ(์ฟผ๋ฆฌ ๋นˆ๊ฐ’ ์ฑ„์›Œ์ฃผ๊ธฐ ์œ„ํ•ด)

//ํ•™์ƒ ์‚ญ์ œ            ๋‚ด๊ฐ€ ํด๋ฆญํ•œ ์‚ญ์ œ ๋ฒ„ํŠผ(this)
function goDelete(stuNum, selectedTag){
	
	//ajax start
	$.ajax({
	   url: '/stu/stuDelete', //์š”์ฒญ๊ฒฝ๋กœ
	   type: 'post',
	   data: {'stuNum' : stuNum}, //ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ
	   success: function(result) {
	   },
	   error: function() {
	      alert('์‹คํŒจ');
	   }
	});
//ajax end
}

StudentMapper๋กœ ๊ฐ€์„œ ํ•™์ƒ ์‚ญ์ œ ์ฟผ๋ฆฌ ์ž‘์„ฑ.

	<!-- ํ•™์ƒ ์‚ญ์ œ -->
	<delete id="stuDelete">
		DELETE AJAX_STUDENT
		WHERE STU_NUM = #{stuNum}
	</delete>

StudentService์— ๋ฉ”์†Œ๋“œ ์ƒ์„ฑ

	//ํ•™์ƒ ์‚ญ์ œ(ajax)
	int stuDelete(int stuNum);

StudentServiceImpl ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„

	//ํ•™์ƒ ์‚ญ์ œ(ajax)
	@Override
	public int stuDelete(int stuNum) {
		return sqlSession.delete("stuMapper.stuDelete", stuNum);
	}

StudentController๋กœ ์™€์„œ ๋ฉ”์†Œ๋“œ ์‹คํ–‰

//ํ•™์ƒ ์‚ญ์ œ
	@ResponseBody
	@PostMapping("/stuDelete")
	public int stuDelete(int stuNum) {
		//์ž๋ฃŒํ˜• int > 1ํ–‰์ด ์‚ญ์ œ > return ๊ฐ’ 1์ด ๋จ.
		return studentService.stuDelete(stuNum);
		
	}

๋ฉ”์†Œ๋“œ ์‹คํ–‰ ํ›„ js๋กœ ๋Œ์•„์™€ ์‚ญ์ œ ํ•™์ƒ ํ™”๋ฉด์—์„œ ์ง€์šฐ๋Š” ์ž‘์—… ํ•ด์ฃผ๊ธฐ.

๋‚ด๊ฐ€ ํด๋ฆญํ•œ ์‚ญ์ œ ๋ฒ„ํŠผ์„ ๊ธฐ์ค€์œผ๋กœ ํƒœ๊ทธ๋ฅผ ์„ ํƒํ•˜์—ฌ ๊ทธ ํƒœ๊ทธ ์ง€์›Œ์ฃผ๋ฉด ํ™”๋ฉด์ƒ์—์„œ๋„ ํ•™์ƒ ์‚ญ์ œ๋จ.

ํƒœ๊ทธ ์ฐพ์•„๊ฐ€๋Š” ๋ฐฉ๋ฒ• 2๊ฐ€์ง€, ํŽธํ•œ ๊ฒƒ ์‚ฌ์šฉ.

//ํ•™์ƒ ์‚ญ์ œ            ๋‚ด๊ฐ€ ํด๋ฆญํ•œ ์‚ญ์ œ ๋ฒ„ํŠผ(this)
function goDelete(stuNum, selectedTag){
	
	//ajax start
	$.ajax({
	   url: '/stu/stuDelete', //์š”์ฒญ๊ฒฝ๋กœ
	   type: 'post',
	   data: {'stuNum' : stuNum}, //ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ
	   success: function(result) {
		if(result == 1){ //result์—๋Š” ์‚ญ์ œ ์„ฑ๊ณต ์‹œ return๊ฐ’ 1์ด ์ €์žฅ๋จ.
			alert('ํ•™์ƒ์ด ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.')
			//๋ฐฉ๋ฒ•1. ์‚ญ์ œ ๋ฒ„ํŠผ(this)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ถ€๋ชจํƒœ๊ทธ์ธ td์˜ ๋ถ€๋ชจํƒœ๊ทธ tr์„ ์ง€์›€
			//selectedTag.parentElement.parentElement.remove();
			
			//๋ฐฉ๋ฒ•2. ์„ ํƒํ•œ ํƒœ๊ทธ๋ฅผ ๊ฐ์‹ผ ๋ถ€๋ชจํƒœ๊ทธ ์ค‘ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํƒœ๊ทธ๋ฅผ ์ฐพ์•„๊ฐ
			selectedTag.closest('tr').remove();
		}
		else {
			alert('์˜ˆ๊ธฐ์น˜ ์•Š์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.')
		}
				
	   },
	   error: function() {
	      alert('์‹คํŒจ');
	   }
	});
//ajax end
}