๐ŸŒ WEB/Spring

์ด๋ฏธ์ง€ ์—…๋กœ๋“œ (Spring+Ajax)

์• ์ •์“ฐ 2020. 5. 16. 22:58

 

Hyper - ํ™˜๊ฒฝ์„ค์ • - ๋ฐฐ๊ฒฝํ™”๋ฉด

 

Hyper ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ ๊ณผ์ • ์ค‘ ์–ด๋ ค์›Œํ–ˆ๋˜ ํŒŒ์ผ ์—…๋กœ๋“œ์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ ๊ณต๋ถ€ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

commons-fileupload๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ณ  pom.xml์— ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

Ajax๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋‹ˆ Controller์— @ResponseBody๋ฅผ ๋ถ™์—ฌ์ค˜์•ผ ํ•œ๋‹ค ์ด๊ฑฐ ๋˜ํ•œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด

pom.xml์— jackson-mapper๋ฅผ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

pom.xml์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๊ฒƒ. (mvnrepository.com)

1. commons-fileupload

2. jackson-mapper


์ œ์ผ ๋จผ์ € ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ๊ตฌํ˜„ ํ›„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ํ•˜๊ฒ ๋‹ค.

 

1. spring ํด๋”์—์„œ xxx-context.xml ์— ํŒŒ์ผ ๋ฆฌ์กธ๋ฒ„๋ฅผ ์ง€์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค. 

<!-- MultipartResolver ์„ค์ • -->
	<beans:bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<beans:property name="maxUploadSize" value="2000000" /><!-- 2MB -->
		<beans:property name="maxInMemorySize" value="2000000" />
		<beans:property name="defaultEncoding" value="UTF-8">
		</beans:property>
	</beans:bean>

+ application / servlet -context์˜ ์ฐจ์ด

๋”๋ณด๊ธฐ

 

application / servlet -context์˜ ์ฐจ์ด

์ด ๋‘ ํŒŒ์ผ์˜ ์ฐจ์ด๋Š” applciationContext๋Š” ์ „์ฒด ๊ณ„์ธต๊ตฌ์กฐ์—์„œ ์ตœ์ƒ๋‹จ์— ์œ„์น˜ํ•œ ์ปจํ…์ŠคํŠธ๋กœ

DB ์—ฐ๊ฒฐ, ๋กœ๊น… ๋“ฑ์„ ์ด์šฉํ•œ๋‹ค.

servlet-context๋Š” ์„œ๋ธ”๋ฆฟ์—์„œ๋งŒ ์ด์šฉ๋˜๋Š” ์ปจํ…์ŠคํŠธ์ด๋‹ค.

๋‘ ๊ฐœ์˜ ์ฐจ์ด์  ์ค‘์š”!


2. jspํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ค€๋‹ค

 

id๊ฐ€ preView์ธ div๊ฐ€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ๋ณด์—ฌ์ค„ ๊ณต๊ฐ„์ด๊ณ 

input์— ์š”์†Œ๋ฅผ type=file๋กœ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. 

 

3. ๊ทธ๋ฆฌ๊ณ  controller์—์„œ ํŒŒ์ผ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด MultipartHttpServletRequest ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์ค˜์•ผ ํ•œ๋‹ค.

์ถ”๊ฐ€๋กœ, Ajax๋ฅผ ์ด์šฉํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— @ResponseBody๋Š” ํ•„์ˆ˜๋‹ค. ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด view๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ

JSON์ด๋‚˜ Object๋กœ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

 

4. ํŒŒ์ผ ํ™•์ธ

 

์šฐ์„  getFile๋กœ ์„œ๋ฒ„์— ์—…๋กœ๋“œ๋œ ํŒŒ์ผ์˜ ์ •๋ณด๋ฅผ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค.

MultipartFile file = mtf.getFile("file");

ํŒŒ์ผ์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•ด์ฃผ๊ณ 
boolean isc = file.isEmpty();

 

ํŒŒ์ผ์ด ์—†์„ ๋•Œ๋Š” ์ž„์˜ ๊ฐ’์œผ๋กœ ์—…๋กœ๋“œํ•ด์ค€๋‹ค.

if(isc==true) {
File_Dto fDTO = new File_Dto(user_seq,"","",0);
isk = fService.imageUp(fDTO);
}else {

 

5. ํŒŒ์ผ ์—…๋กœ๋“œ

 

ํŒŒ์ผ์ด ์žˆ์„ ๊ฒฝ์šฐ

}else {
	String oriName = file.getOriginalFilename();
	long fileSize = file.getSize();
	String ext = oriName.substring(oriName.lastIndexOf("."));
	String stoName = UUID.randomUUID()+ext;
	String filePath = mtf.getSession().getServletContext().getRealPath("/upload");
	
    
	File dir = new File(filePath);
		if(!dir.exists()) {
			dir.mkdirs();
			}
			file.transferTo(new File(filePath,stoName));
			logger.info("๊ฒฝ๋กœ : "+filePath+"/"+stoName);
			File_Dto fDTO = new File_Dto(user_seq,oriName,stoName,fileSize);
			isk = fService.imageUp(fDTO);
			map.put("path", filePath+"/"+stoName);
		}
	map.put("isk", isk+"");
	return map;

 

file.getOriginalFilename() : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—…๋กœ๋“œํ•œ ํŒŒ์ผ ์›๋ณธ ์ด๋ฆ„

getSize() : ํŒŒ์ผ์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ๊ฐ€์ง€๊ณ  ์˜จ๋‹ค.

filePath = getSession().getServletContext().getRealPath().getContextPath("/upload")

ํŒŒ์ผ ์—…๋กœ๋“œ ์‹œ ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€ ํด๋”๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ง€๊ณ  ์™”๋‹ค.

 

Servers์—์„œ server.xml์— ๋งจ ๋ฐ‘ ๋ถ€๋ถ„์„ ๋ณด๋ฉด

 

 

 

<Context docBase="์‹ค์ œ ์ €์žฅ๋˜๋Š” ํŒŒ์ผ์˜ ์œ„์น˜๊ฒฝ๋กœ" path="์„œ๋ฒ„์—์„œ ์ฐพ๋Š” ํŒŒ์ผ์˜ ๊ฒฝ๋กœ" reloadreloadable="true"/>๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

์˜ˆ)

<Context docBase="C:\Users\aejeong\Programming\workspace\org.eclipse.wst.server.core\temp0\wtpwebapps\Hyper\upload" path="/Hyper/upload" reloadreloadable="true" />

์ด๋Ÿฐ ์‹์œผ๋กœ ์„ค์ •์„ ํ•ด๋†“์œผ๋ฉด /Hpyer/upload ๋ผ๋Š” ๊ฒฝ๋กœ๋ฅผ docBase์— ์„ค์ •ํ•œ ๊ฒฝ๋กœ์—์„œ ์ฐพ๊ฒŒ ๋œ๋‹ค.

 

 

dir.mkdirs() ํด๋”๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ

transferTo ์›ํ•˜๋Š” ์œ„์น˜์— ์ €์žฅํ•ด์ค€๋‹ค. InputStream์„ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ ํŽธํ•˜๋‹ˆ๊นŒ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

 

 

File_Dto ์•ˆ์— ์žˆ๋Š” ์ปฌ๋Ÿผ๋ช…

 

 

6. Ajax ์‚ฌ์šฉ

function ajaxFileUpload() {

    var form = jQuery("#fileForm")[0];
    var formData = new FormData(form);

    jQuery.ajax({
          url : "./imageIn"
        , type : "POST"
        , processData : false
        , contentType : false
        , data : formData
        , success:function(map) {
        }
    });
}

 

processData : ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊ฟ€์ง€์— ๋Œ€ํ•œ ๊ฐ’ true=์ผ๋ฐ˜๋ฌธ์ž/ false=๋ฐ์ดํ„ฐ๊ฐ์ฒด

contextType : ์ผ๋ฐ˜ text์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฐ’ true์ด๋ฉด ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.

data : var formData = new FormData(form)์—์„œ์˜ ๋ณ€์ˆ˜๋ช…์„ ์จ์ฃผ๋ฉด ๋œ๋‹ค.

 

ํŒŒ์ผ ์—…๋กœ๋“œ๋Š” ์™„์„ฑ! ๋‹ค์Œ์€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค!

 

๋ฐ˜์‘ํ˜•