[Spring Boot] AJAX (๐Ÿ’พ ํŒŒ์ผ ์—…๋กœ๋“œ)

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

Spring Boot

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

AJAX ๋กœ ํŒŒ์ผ ์—…๋กœ๋“œ ํ•˜๊ธฐ

AJAX ๋กœ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” FormData ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

โ— IE8 ๋ฒ„์ „์—์„œ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค!

๊ทธ๋Ÿผ ๋จผ์ € html ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž

๐Ÿ”ฝ view

html

<form>
	<table>
		<caption>๊ธ€์“ฐ๊ธฐ</caption>
		<tr>
			<th>์ž‘์„ฑ์ž</th>
			<td>
				<input type="text" name="user_name"/>
			</td>
		</tr>
		<tr>
			<th>์ œ๋ชฉ</th>
			<td>
				<input type="text" name="subject" />
			</td>
		</tr>
		<tr>
			<th>๋‚ด์šฉ</th>
			<td>
				<textarea name="content"></textarea>
			</td>
		</tr>
		<tr>
			<th>ํŒŒ์ผ</th>
			<td><input type="file" name="files" multiple="multiple" onchange="readFile(this)"/>
			<div id="img_list"></div></td>
		</tr>
		<tr>
			<th colspan = "2">
			  <input type="button" value="๊ธ€ ์“ฐ๊ธฐ" onclick="save()"/>
			</th>
		</tr>
	</table>
</form>
  • ๊ธ€์“ฐ๊ธฐ button ์„ ๋ˆ„๋ฅด๋ฉด onclick ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ save() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

java script

function save(){
	var form = new FileData($('form')[0]);
  
  	$.ajax({
    	type: 'POST',
      	url: 'write.ajax',
      	enctype: 'multipart/form-data',
      	processData: false,
      	contentType: false,
      	data: form,
      	dataType: 'JSON',
      	success: function(data){
        	if(data.success){
            	location.href=data.page;
            }
        },error: function(e){
        	console.log(e);
        }
    })
}
  • FormData ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์ด๊ณ , $(์…€๋ ‰ํ„ฐ) ๋Š” ๋ฌด์กฐ๊ฑด ๋ฐฐ์—ด๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค๋ฅผ ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค.
  • enctype: 'multipart/form-data' : file์„ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ์ง€์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
  • success ๊ฐ€ true ์ผ ๊ฒฝ์šฐ page์— ๋‹ด๊ธด ์œ„์น˜๋กœ ์ด๋™ํ•œ๋‹ค.

๐Ÿ”ฝ controller

@PostMapping(value="/write.ajax")
@ResponsBody
public Map<String, Object> write(MultipartFile[] files, @RequestParam Map<String, Object> param){

	boolean success = false;
    
    int idx = service.write(param, files); // DB๋กœ ๋ถ€ํ„ฐ ๋ฐ›์•„์˜จ idx(PK) ์ •๋ณด๋ฅผ ๋‹ด์•„์ค€๋‹ค.
    
    String page = "";
    
    if(idx != 0){
    	success = true;
        page = "./detail.go?idx="+idx;
    }
    
    Map<String, Object> result = new HashMap<String, Object>();
    result.put("success", success);
    result.put("page", page);
    
    return result;
}
  • ajax ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด @ResponsBody ์–ด๋…ธํ…Œ์ด์…˜ ์„ ์–ธ
  • MultipartFile[] : ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŒŒ์ผ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด ์„ ์–ธ
  • @RequestParam ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๊ธฐ ์œ„ํ•ด ์„ ์–ธ
  • DB๋กœ ๋ถ€ํ„ฐ ๋ฐ›์•„์˜จ idx(PK) ๊ฐ’์„ ๋ณ€์ˆ˜์— ๋‹ด์•„ ๋ณ€์ˆ˜๊ฐ€ 0 ์ด์ƒ์ผ ๊ฒฝ์šฐ success๋ฅผ true๋กœ ๋ฐ”๊พธ๊ณ  page๋ฅผ ๋ฐฉ๊ธˆ ์ƒ์„ฑ๋œ idx ๊ฐ’์œผ๋กœ ๋„ฃ์–ด ์ƒ์„ธ๋ณด๊ธฐ ํŽ˜์ด์ง€๋กœ ์ด๋™์‹œ์ผœ์ค€๋‹ค.

๐Ÿ”ฝ service / dto / mapper

service

public int write(Map<String, String> param, MultipartFile[] files) {

	BoardDTO dto = new BoardDTO;
    dto.setUser_name(param.get("user_name"));
	dto.setSubject(param.get("subject"));
	dto.setContent(param.get("content"));
    
    int row = dao.write(dto);
    int idx = dto.getIdx();

	if(idx>0&&row>0) {
		saveFile(files, idx);
	}
	return idx;
}
  • ์ƒˆ๋กญ๊ฒŒ ์ž…๋ ฅํ•œ ๊ฒŒ์‹œ๊ธ€์— ์ƒ์„ธ๋ณด๊ธฐ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด DTO ์— set์œผ๋กœ ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.
  • DTO์— ๋„ฃ์–ด์ค€ ๊ฐ’์œผ๋กœ write() ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , idx๊ฐ’์„ ๊ฐ€์ ธ์™€ ๋ณ€์ˆ˜์— ๋„ฃ์–ด์ค€๋‹ค.
  • ๊ธ€ ์ •๋ณด๊ฐ€ ์™„์ „ํžˆ ์ž…๋ ฅ๋  ๊ฒฝ์šฐ file์„ ์ €์žฅํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

dto

int write(BoardDTO dto);

mapper

<insert 
	useGeneratedKeys="true"
	keyColumn="idx"
	keyProperty="idx"	
	
id="write" parameterType="kr.co.gudi.dto.BoardDTO">
	INSERT INTO bbs(user_name,subject,content) 
		VALUES(#{user_name}, #{subject},#{content})
</insert>
  • ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฌธ์œผ๋กœ ์ƒ์„ฑ๋œ idx(PK) ๊ฐ’์„ ์•Œ๊ธฐ ์œ„ํ•ด GeneratedKey ์‚ฌ์šฉ
profile
๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ณด์ž

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