[Spring Boot] AJAX (๐Ÿ’ซ ์—ฌ๋Ÿฌ ๊ฐ’ ์ „๋‹ฌํ•˜๊ณ  ๋ฐ›๊ธฐ)

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

Spring Boot

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

AJAX ๋กœ ์—ฌ๋Ÿฌ ๊ฐ’ ์ „๋‹ฌํ•˜๊ณ  ๋ฐ›๊ธฐ

์ด์ „ ํฌ์ŠคํŠธ์—์„œ AJAX๋กœ ์•„์ด๋”” ์ค‘๋ณต์ฒดํฌ๋ฅผ ํ•ด๋ณด์•˜๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด id ํ•˜๋‚˜์˜ ๊ฐ’์ด ์•„๋‹Œ ๋‹ค์–‘ํ•œ ๊ฐ’์„ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ์—๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์ž!

๋จผ์ € ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์—์„œ ์‚ดํŽด๋ณผ ์˜ˆ์ •์ธ๋ฐ, ์›๋ž˜๋Š” ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ajax๋กœ ํ•  ๊ฒฝ์šฐ ๋ณด์•ˆ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค! ๋Š” ์ ์„ ๊ธฐ์–ตํ•˜๊ณ  ์•„๋ž˜ ๋‚ด์šฉ์€ ์ฐธ๊ณ ๋งŒ ํ•˜๋„๋ก ํ•˜์ž ๐Ÿ˜…

๐Ÿ”ฝ view (html / jaca script)

html

<body>
	<table>
		<tr>
			<th>ID</th>
			<td><input type = "text" name = "id"/></td>
		</tr>
		<tr>
			<th>PW</th>
			<td><input type = "password" name = "pw"/></td>
		</tr>
		<tr>
			<th colspan = "2">
				<button id="login">LOGIN</button>
				<a href = "join.go">ํšŒ์›๊ฐ€์ž…</a>
			</th>
		</tr>
	</table>
</body>

java script

<script>
	$('#login').on('click', function(){
		var id = $('input[name="id"]').val();
		var pw = $('input[name="pw"]').val();
		
		$.ajax({
			type: 'post',
			url: 'login.ajax',
			data: {'id':id, 'pw':pw},
			dataType: 'JSON',
			success: function(data){
				if(data.login){
					alert(id + '๋‹˜ ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค.');
					location.href='list.go';
				}else{
					alert('์•„์ด๋”” ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”.');
				}
			},error: function(e){
				console.log(e);
			}
		});
	});
</script>
  • id ๊ฐ€ login ์ธ ๋ฒ„ํŠผ์— ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด function() ์„ ์‹คํ–‰ํ•œ๋‹ค.
  • input[name=id|pw] ์ธ ์š”์†Œ์˜ value๋ฅผ ๊ฐ€์ ธ์™€ ๋ณ€์ˆ˜์— ๋‹ด์•„์ค€๋‹ค.
  • ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋œ login ๋ฉ”์„œ๋“œ์˜ ๊ฐ’์ด true ์ด๋ฉด list.go ๋ฉ”์„œ๋“œ๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ๊ณ , false ์ผ ๊ฒฝ์šฐ ์•Œ๋ฆผ์„ ๋ณด๋‚ธ๋‹ค.

๐Ÿ”ฝ controller

@PostMapping(value= "/login.ajax")
@ResponseBody
public Map<String, Object> login(String id, String pw, HttpSession session) {
		
	Map<String, Object> result = new HashMap<String, Object>();
	if(member_service.login(id, pw)) {
		result.put("login", true);
		session.setAttribute("loginId", id);
	}else {
		result.put("login", false);
	}
	return result;
}
  • post ํ˜•์‹์œผ๋กœ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— @PostMapping ์–ด๋…ธํ…Œ์ด์…˜ ์„ ์–ธ (RequestMapping ๋ฅผ ์จ๋„ ๋œ๋‹ค.)
  • ajax์™€ ์—ฐ๊ฒฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— @ResponseBody ์–ด๋…ธํ…Œ์ด์…˜ ์„ ์–ธ
  • Map ํ˜•ํƒœ๋กœ ๋ฐ›์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Map ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•˜๊ณ  ์„ฑ๊ณต ์—ฌ๋ถ€์— ๋”ฐ๋ผ true / false ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.

๐Ÿ”ฝ service / dto / mapper

service

public boolean login(String id, String pw) {
	boolean success = false;
	if(member_mapper.login(id,pw)>0){
		success = true;
	}
	return success;
}

dto

int login(String id, String pw);

mapper

<select id="login" resultType="int">
	SELECT COUNT(id) FROM member WHERE id = #{param1} AND pw = #{param2}
</select>

โœจ ajax๋กœ list ํ‘œํ˜„ํ•˜๊ธฐ

์ด๋ฒˆ์—๋Š” ๋” ๋งŽ์€ ๊ฐ’์„ ๋ฐ›๋Š” ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.
๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•  ๊ฒฝ์šฐ ํšŒ์›์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” list.jsp ๋กœ ์ด๋™ํ•˜๋ฉฐ, list.jsp ์—๋Š” ํšŒ์›์˜ ์ด๋ฆ„, ๋‚˜์ด, ์„ฑ๋ณ„, ์ด๋ฉ”์ผ์ด ๋…ธ์ถœ๋œ๋‹ค.

โœ… view

html

<button onclick="location.href='insert.go'">์ž…์‚ฌ์ž ๋“ฑ๋ก</button>
<table>
	<thead>
		<tr>
			<th>ID</th> <th>์ด๋ฆ„</th> <th>๋‚˜์ด</th> <th>์ด๋ฉ”์ผ</th>
		</tr>
	</thead>
	<tbody id="list"></tbody>
</table>

java script

<script>
	$.ajax({
		type: 'GET',
		url: 'list.ajax',
		data: {}, // ๋ณด๋‚ด๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๋นˆ ์ƒํƒœ๋กœ ๋ณด๋‚ธ๋‹ค.
		dataTyle: 'JSON',
		success: function(data){
			console.log(data);
			if(data.login){
				drawList(data.list); 
			}else{
				alert('๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.');
				location.href='./';
			}
		}, error: function(e){
			console.log(e);
		}
	});
	
	function drawList(list){
		var content = '';
		list.forEach(function(item,idx){
			content += '<tr>';
			content += '<td>'+item.id+'</td>';
			content += '<td>'+item.name+'</td>';
			content += '<td>'+item.age+'</td>';
			content += '<td>'+item.email+'</td>';
			content += '</tr>';
			console.log(item.id, item.age, item.name, item.email); 
		});
		$('#list').html(content);
	}
</script>
  • success ์—์„œ login ์—ฌ๋ถ€์— ๋”ฐ๋ผ list๋ฅผ ๋ณด์—ฌ์ฃผ๊ฑฐ๋‚˜ or ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋Œ๋ ค๋ณด๋‚ด์ค€๋‹ค.
    โ†’ session ์ฒดํฌ๋Š” ์„œ๋ฒ„์—์„œ ์ง„ํ–‰(controller)
  • forEach ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ณ„์†ํ•ด์„œ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

โœ… controller

@GetMapping(value="/list.go")
public String list() {
	return "list";
}
	
@GetMapping(value="/list.ajax")
@ResponseBody
public Map<String, Object> list(HttpSession session){
		
	Map<String, Object> map = new HashMap<String, Object>();
		
	if(session.getAttribute("loginId") != null) {
		map.put("login", true); 
		List<HashMap<String, Object>> list = member_service.list(); 
		map.put("list", list);
	}else {
		map.put("login", false);
	}
	return map;
}
  • get ํ˜•์‹์œผ๋กœ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— @GetMapping ์–ด๋…ธํ…Œ์ด์…˜ ์„ ์–ธ
  • ajax์™€ ์—ฐ๊ฒฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— @ResponseBody ์–ด๋…ธํ…Œ์ด์…˜ ์„ ์–ธ
  • session ์ด ์žˆ์„ ๊ฒฝ์šฐ login ์— true ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค. (key : value)
  • List ๋กœ ๋ฐ›์•„์˜จ ๊ฐ’์„ map ์— ๋„ฃ์–ด์ค€๋‹ค
    โŒ java์—์„œ๋Š” Object๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ casting์„ ํ•ด์ค˜์•ผ ํ•˜์ง€๋งŒ js ์—์„œ๋Š” ๋”๋ธ”์ฟผํ„ฐ๋กœ๋งŒ ๊ตฌ๋ถ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Object๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ๋Š”๊ฒŒ ํŽธํ•˜๋‹ค!

โœ… service / dto / mapper

service

public List<HashMap<String, Object>> list() {
	return member_mapper.list();
}

dto

List<HashMap<String, Object>> list();

mapper

<select id="list" resultType="map">
	SELECT id, name, age, email FROM member
</select>
  • AJAX๋Š” * ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ธธ ๊ฒฝ์šฐ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค ๋ณด์—ฌ์ฃผ๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์—ฌ์ค„ ์ปฌ๋Ÿผ๋งŒ ์ง€์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
profile
๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ณด์ž

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