[Spring Boot] AJAX (๐ŸŒˆ ๋ณต์žกํ•œ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ์ „์†กํ•˜๊ธฐ)

yihyunยท2024๋…„ 9์›” 19์ผ

Spring Boot

๋ชฉ๋ก ๋ณด๊ธฐ
18/33

AJAX ๋กœ ๋ณต์žกํ•œ ํ˜•ํƒœ ์ „์†กํ•˜๊ธฐ

AJAX๋Š” JSON ํ˜•ํƒœ๋กœ ๊ฐ’์„ ์ „์†กํ•œ๋‹ค.

JSON ํ˜•ํƒœ๋Š” ๊ธฐ๋ณธ key : value ํ˜•ํƒœ๋กœ ์ „์†ก๋˜์ง€๋งŒ Objcet ์—๋Š” ๋ชจ๋“  ๊ฐ’์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— value์— ๋ฐฐ์—ด, ๋ฐฐ์—ด์•ˆ์— ์˜ค๋ธŒ์ ํŠธ, ๊ทธ ์•ˆ์— ๋ฐฐ์—ด ๋“ฑ๋“ฑ.. ๊ต‰์žฅํžˆ ๋ณต์žกํ•œ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ธฐ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ณต์žกํ•œ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ฒจ์žˆ์„ ๊ฒฝ์šฐ ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ ๋ฐฉ์‹์ด ์•„๋‹Œ ๋ณ„๋„์˜ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•œ๋ฐ ์•„๋ž˜์— ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๊ณ ์ž ํ•œ๋‹ค.

๋ณ„๋„๋กœ ์ž‘์„ฑ๋œ html ๋ฌธ์„œ๋ฅผ insert.jsp ์— ๋ณด์—ฌ์ฃผ๋Š” ํ˜•ํƒœ๋กœ ์ง„ํ–‰!!


๐Ÿ“Œ jquery ๋กœ ๋‹ค๋ฅธ ํŽ˜์ด์ง€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

jquery ๋กœ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ํ•ด๋‹น ํŽ˜์ด์ง€์— ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋Š”๋ฐ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

$('ํ‘œํ˜„ํ•  ์œ„์น˜').load(๋ถˆ๋Ÿฌ์˜ฌํŽ˜์ด์ง€๊ฒฝ๋กœ ์…€๋ ‰ํ„ฐ, [์ฝœ๋ฐฑํ•จ์ˆ˜]);
โŒ views ํด๋”์— ์žˆ๋Š” ๊ฒฝ์šฐ controller ์—์„œ๋งŒ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— static์— html ํด๋”๋ฅผ ์ถ”๊ฐ€ํ•ด html ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•ด์ค€๋‹ค.


์ด์ œ html ๋ฌธ์„œ๋ฅผ ๋ณ„๋„๋กœ ์ž‘์„ฑํ•ด๋ณด์ž

<div id="career_card">
	<table>
		<tr>
			<th>์ด๋ฆ„</th>
			<td><input type="text" name="name" value=""/></td>
			<th>์„ฑ๋ณ„</th>
			<td>
				<input type="radio" name="gender" value="๋‚จ"/>๋‚จ
				&nbsp;&nbsp;
				<input type="radio" name="gender" value="์—ฌ"/>์—ฌ				
			</td>
			<th rowspan="2">
				<input type="button" class="row2" value="๋“ฑ๋ก" onclick="regiest()"/>
			</th>
		</tr>
		<tr>
			<th>์ƒ๋…„์›”์ผ</th>
			<td><input type="date" name="birth_date" value=""/></td>
			<th>์ž…์‚ฌ์ผ</th>
			<td><input type="date" name="hire_date" value=""/></td>
		</tr>
	</table>
	
	<div class="career">๊ฒฝ๋ ฅ ์‚ฌํ•ญ</div>
	<div>
		<ul class="career">
			<li>
				<input type="text" name="co_name" placeholder="ํšŒ์‚ฌ๋ช…"/>
				<input type="date" name="start_date"/>
				<input type="date" name="end_date"/>
				<input type="text" name="desc" placeholder="์—…๋ฌด๋‚ด์šฉ"/>
				<button onclick="addList(this)">์ถ”๊ฐ€</button> 
			</li>
		</ul>
	</div>
</div>
  • ์œ„ html ๋ฌธ์„œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๊ฐœ์ธ์˜ ๊ธฐ๋ณธ์ •๋ณด์™€ ๊ทธ ์‚ฌ๋žŒ์˜ ์ปค๋ฆฌ์–ด ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž‘์„ฑ๋˜์–ด ์žˆ๋‹ค.

  • โ“ ๊ทธ๋ ‡๋‹ค๋ฉด ํ•ด๋‹น ํ…Œ์ดํ„ฐ๋“ค์„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด์„  ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

  • โ“ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๊ฒฝ๋ ฅ ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„  ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? (๊ฒฝ๋ ฅ์€ n๊ฐœ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—)

โœจ ํŽ˜์ด์ง€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ + ๋ถ€๋ชจ์š”์†Œ๋ฅผ ์ฐพ์•„ ์ถ”๊ฐ€ํ•˜๊ธฐ

<script>
	$('body').load('html/card.html #career_card', function(res,stat){
		console.log(res); 
		console.log(stat); 
	});

	function addList(elem){ 
		var html = $(elem).parent().html(); // elem=this=button ์˜ ํ•œ๋‹จ๊ณ„ ์œ„์— ์žˆ๋Š” html์„ ๊ฐ€์ ธ์˜จ๋‹ค
		console.log(html);
		$('ul.career').append('<li>'+html+'</li>');
	}
</script>
  • .load() ๋ฅผ ์‚ฌ์šฉํ•ด ๋‹ค๋ฅธ ํŽ˜์ด์ง€์— ์žˆ๋Š” ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜จ๋‹ค.
  • ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๊ฒฝ์šฐ <li> ์š”์†Œ๋“ค๋งŒ ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ elem = button ์˜ ๋ถ€๋ชจ์ธ li ์˜ html์„ ๊ฐ€์ ธ์™€ .append() ํ•ด์ค€๋‹ค.
    โ†’ <li> ์— html ๋‚ด์šฉ๋งŒ ๊ฐ€์ ธ์™”๊ธฐ ๋•Œ๋ฌธ์— ์•ž ๋’ค์— <li></li>๋ฅผ ์ถ”๊ฐ€๋กœ ๋ถ™์—ฌ์„œ append ํ•ด์ค€๋‹ค.

์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ์–ด์™€ ๊ฐ€์ ธ์™”๋‹ค๋ฉด, ์ด์ œ ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์— ์ „์†กํ•ด DB์— ์ž…๋ ฅํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

โฐ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์ „์†กํ•˜๊ธฐ

ํ˜„์žฌ ๋“ฑ๋ก ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด onclick ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ regiest() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„์™€ ์„œ๋ฒ„์— ์ „์†กํ•ด์ค˜์•ผ ํ•˜๋Š”๋ฐ ์ „์†กํ•  ๋ฐ์ดํ„ฐ๋Š”

  • ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ : ์ด๋ฆ„, ์„ฑ๋ณ„, ์ƒ๋…„์›”์ผ, ์ž…์‚ฌ์ผ
  • ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ : ๊ฒฝ๋ ฅ์‚ฌํ•ญ (1๊ฐœ~n๊ฐœ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์–ด ๋ฐฐ์—ด๋กœ ๋‹ด์•„์•ผ ํ•œ๋‹ค)

๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ์—๋Š” ์กฐ๊ธˆ ๋” ์‹ ๊ฒฝ์จ์ค˜์•ผ ํ•˜๋Š” ๋ถ€๋ถ„๋“ค์ด ์žˆ๋Š”๋ฐ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด์ž!

๐Ÿ”ฝ view (js)

<script>
	function resiest(){
  		// โ–ผ ๊ธฐ๋ณธ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
		var name = $('input[name=name]').val();
		var gender = $('input[name=gender]:checked').val();
		var birth_date = $('input[name=birth_date]').val();
		var hire_date = $('input[name=hire_date]').val();
  
  		// โ–ผ ๊ฒฝ๋ ฅ์‚ฌํ•ญ ๊ฐ€์ ธ์˜ค๊ธฐ
  		var list = []; // ๋ฐฐ์—ด ์ƒ์„ฑ
  		
  		// 2์ค‘ for ๋ฌธ์„ ์‚ฌ์šฉํ•ด 0๋ฒˆ ์ธ๋ฑ์Šค์— ํ•˜๋‚˜์˜ ๊ฒฝ๋ ฅ์ด ๋‹ด๊ธฐ๋„๋ก ์ง„ํ–‰
  		$('ul.career li').each(function(item, idx){
        	var career = {}; // Object ์ƒ์„ฑ
            $(item).find('input').each(function(elem, idx){
            	// input ์š”์†Œ์˜ name์„ key๋กœ value๋ฅผ ๊ฐ’์œผ๋กœ ๋„ฃ๋Š”๋‹ค (Object ํ˜•ํƒœ)
            	career[$(elem).attr('name')] = $(elem).val();
            });
	        list.push(career);
        });
  
        // ์„œ๋ฒ„๋กœ ์ „์†กํ•  ํŒŒ๋ผ๋ฏธํ„ฐ (Object)
        var param = {};
        param.name = name;
        param.gender = gender;
        param.birth_date = birth_date;
        param.hire_date = hire_date;
        param.list = list;
        console.log('์„œ๋ฒ„์— ์ „์†กํ•  ๋ฐ์ดํ„ฐ : ' , param);

        // AJAX
        $.ajax({
            type: 'POST',
            url: 'insert.ajax',
            data: JSON.stringify(param),
            dataType: 'JSON',
            contentType: 'application/json; charset=UTF-8',
            success: function(data){
                console.log(data);
            },error: function(e){
                console.log(e);
            }
        });
	}
</script>

โœ” ๊ธฐ๋ณธ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

  • ๋ณ€์ˆ˜์— ์…€๋ ‰ํ„ฐ($)๋กœ ์š”์†Œ๋ฅผ ๋ถˆ๋Ÿฌ์™€ .val() ๋กœ ์š”์†Œ์— value๋ฅผ ๋‹ด์•„์ค€๋‹ค.

โœ” ๊ฒฝ๋ ฅ์‚ฌํ•ญ ๊ฐ€์ ธ์˜ค๊ธฐ

  • n๊ฐœ๊ฐ€ ๋‹ด๊ธธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์„ ์ค€๋น„ํ•œ๋‹ค.
  • ์…€๋ ‰ํ„ฐ($)๋กœ class๊ฐ€ career์ธ ul ํƒœ๊ทธ์˜ ์ž์‹ ์š”์†Œ์ธ li ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
  • ๋ฐฐ์—ด ์ธ๋ฑ์Šค ์•ˆ์— ๋‹ด๊ธธ ์ •๋ณด(๊ฒฝ๋ ฅ์‚ฌํ•ญ)๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•ด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ค€๋น„ํ•œ๋‹ค.
  • 2์ค‘ for๋ฌธ์„ ์‚ฌ์šฉํ•ด ํ•˜๋‚˜์˜ ์ธ๋ฑ์Šค์— ๊ฒฝ๋ ฅ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด์•„์ค€๋‹ค.
  • ๊ฒฝ๋ ฅ์‚ฌํ•ญ์€ input ํƒœ๊ทธ์˜ name์„ ์˜ค๋ธŒ์ ํŠธ์˜ key๋กœ value๋ฅผ ๊ฐ’์œผ๋กœ ๋„ฃ์–ด์ค€๋‹ค.
  • 2๋ฒˆ์งธ for๋ฌธ์ด ๋๋‚˜๋ฉด (์ธ๋ฑ์Šค ํ•˜๋‚˜์— ๊ฐ’์ด ๋“ค์–ด๊ฐ”์œผ๋ฉด) .push(career) ๋กœ ๋ฐฐ์—ด์— ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋‹ด์•„์ค€๋‹ค.

โœ” ์„œ๋ฒ„๋กœ ์ „์†กํ•  ํŒŒ๋ผ๋ฏธํ„ฐ

  • ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , value์— ์•ž์—์„œ ๋„ฃ์–ด์ค€ ๋ณ€์ˆ˜(์ž…๋ ฅ ๋ฐ›์€ ๋ฐ์ดํ„ฐ)๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.
    param.name = name; : ์˜ค๋ธŒ์ ํŠธ.key = value;
  • โŒ Object๋ฅผ console๋กœ ์ถœ๋ ฅํ•  ๋•Œ์—๋Š” +๊ฐ€ ์•„๋‹Œ ,๋กœ ํ•ด์ค˜์•ผ ํ•œ๋‹ค!

โœ” AJAX (๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ๋•Œ ๊ทœ์น™!!)

  • 1) ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ์—๋Š” POST ๋ฐฉ์‹์œผ๋กœ ์ „์†กํ•ด์•ผ ํ•œ๋‹ค.
    โ†’ GET ๋ฐฉ์‹์€ ๋‚ด์šฉ์ด ๋งŽ์„ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๊ฐ€ ๋Š๊ธธ ์ˆ˜ ์žˆ๋‹ค.
  • 2) ๋ณด๋‚ด๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” json ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด ์ด์–ด์•ผ ํ•œ๋‹ค.
    โ†’ JSON.stringify() ๋กœ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค.
    โ€ป ํ…์ŠคํŠธ๋ฅผ JSON์œผ๋กœ ๋ฐ”๊พธ๊ธฐ : JSON.parse()
  • 3) contentType ์ด json ์ด๋ผ๊ณ  ๋ช…์‹œํ•ด ์ค˜์•ผํ•œ๋‹ค.
    โ†’ application/json;
    โ–ถ ํ•œ๊ธ€์ด ์žˆ์„ ๊ฒฝ์šฐ charset=UTF-8 ๊นจ์ง ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ๊ฐ™์ด ์‚ฌ์šฉํ•ด์ค˜์•ผ ํ•œ๋‹ค.

๐Ÿ”ฝ controller (์„œ๋ฒ„)

@PostMapping(value="/insert.ajax")
@ResponseBody
public Map<String, Object> insert(@RequestBody Map<String, Object> param){
	String name = (String) param.get("name");
	String gender = (String) param.get("gender");
	String birth_date = (String) param.get("birth_date");
	String hire_date = (String) param.get("hire_date");
    logger.info("name : {}, gender : {}, birth_date : {}, hire_date : {}", name,gender,birth_date,hire_date);
        
    List<Map<String, String>> list = (List<Map<String, String>>) param.get("list");
    
    // view์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ „๋‹ฌ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
    Map<String, Object> result = new HashMap<String, Object>();
	result.put("success", true);
        
    return result;

}

โŒ AJAX๋กœ ์ „๋‹ฌํ•œ ์ด๋ฆ„๊ณผ ์„œ๋ฒ„์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š” ์ด๋ฆ„์€ ์ •ํ™•ํ•˜๊ฒŒ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค!
โ€ป logger ๋กœ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  • ๋ณต์žกํ•œ ํ˜•ํƒœ๋กœ ๋ฐ›์„ ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” @RequestBody ๋กœ ๋ฐ›์•„์ค˜์•ผ ํ•œ๋‹ค.
  • ๊ธฐ๋ณธ ์ •๋ณด๋Š” String ๋กœ ๋ฐ›์•„์ค€๋‹ค.
  • ๊ฒฝ๋ ฅ ์‚ฌํ•ญ(=๋ณต์žกํ•œ ์ •๋ณด) ๋Š” List์— Map ํ˜•ํƒœ๋กœ ๋ฐ›์•„์ค€๋‹ค.
  • view ์—์„œ success ์— true๊ฐ€ ๋‚˜์˜ค๋ฉด ์„œ๋กœ ์—ฐ๊ฒฐ์ด ์ž˜ ๋œ๊ฒƒ์ด๋‹ค.
profile
๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ณด์ž

0๊ฐœ์˜ ๋Œ“๊ธ€