๊ด€๋ฆฌ ๋ฉ”๋‰ด

Coding Planet

๋ฉ€ํ‹ฐํŒŒํŠธ(Multipart)๋ž€? Multipart ์ „์†ก๊ณผ MultipartResolver ๋ฅผ ํ†ตํ•œ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ณธ๋ฌธ

๐ŸŒฑSPRING

๋ฉ€ํ‹ฐํŒŒํŠธ(Multipart)๋ž€? Multipart ์ „์†ก๊ณผ MultipartResolver ๋ฅผ ํ†ตํ•œ ์š”์ฒญ ์ฒ˜๋ฆฌ

jhj.sharon 2023. 5. 18. 21:19
๋ฐ˜์‘ํ˜•

 
 
 

1. ๋ฉ€ํ‹ฐํŒŒํŠธ(Multipart)๋ž€?

  • ๋ฉ€ํ‹ฐํŒŒํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์— ์ „์†ก๋˜๋Š” HTTP ์š”์ฒญ ๋˜๋Š” ์‘๋‹ต์—์„œ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ํŒŒ์ผ ์—…๋กœ๋“œ์™€ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š”๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
  • HTTP ํ”„๋กœํ† ์ฝœ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์˜ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ํ•˜์ง€๋งŒ ํŒŒ์ผ๊ณผ ๊ฐ™์€ ์ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ด์•ผํ•  ๋•Œ๋Š” ์ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ํ…์ŠคํŠธ ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ์ด ๋น„ํšจ์œจ์ ์ด๊ณ  ์ œํ•œ์ด ์žˆ๋‹ค. ๋ฉ€ํ‹ฐํŒŒํŠธ๋Š” ์ด๋Ÿฌํ•œ ์ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ฝ”๋”ฉํ•˜์ง€ ์•Š๊ณ  ์›๋ณธ ํ˜•์‹์œผ๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.
  • ๋ฉ€ํ‹ฐํŒŒํŠธ ์š”์ฒญ์€ 'Content-Type' ํ—ค๋”์— 'multipart/form-data'๊ฐ’์„ ๊ฐ€์ง€๋ฉฐ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŒŒํŠธ(part)๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ๊ฐ ํŒŒํŠธ๋Š” ๊ฐœ๋ณ„์ ์ธ ๋ฐ์ดํ„ฐ ์กฐ๊ฐ์œผ๋กœ ํŒŒ์ผ์ด๋‚˜ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ ๋“ฑ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ํŒŒํŠธ๋Š” ํ—ค๋”์™€ ๋ณธ๋ฌธ(body)์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ ํ—ค๋”์—๋Š” ํŒŒํŠธ์˜ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ณ  ๋ณธ๋ฌธ์—๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ๋‹ค.
  • ๋ฉ€ํ‹ฐํŒŒํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„œ๋ฒ„ ์ธก์—์„œ ๋ฉ€ํ‹ฐํŒŒํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•˜๊ณ  ํ•ด์„ํ•˜๋Š” ๋กœ์ง์ด ํ•„์š”ํ•˜๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ€ํ‹ฐํŒŒํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ€ํ‹ฐํŒŒํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๊ณ  ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • SpringMVC์—์„œ๋Š” 'MultipartResolver'๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ€ํ‹ฐํŒŒํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 
 
 

2. ๋ฉ€ํ‹ฐํŒŒํŠธ๋กœ ํผ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๊ธฐ

  • ์•„๋ž˜ ์ฝ”๋“œ๋Š” ๊ฒŒ์‹œํŒ์—์„œ ๊ธ€์„ ์ž‘์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ์œ„ํ•œ formํƒœ๊ทธ ์ฝ”๋“œ์ด๋‹ค.
  • enctype="multipart/form-data"๋Š” HTML <form> ์š”์†Œ์˜ ์†์„ฑ ์ค‘ ํ•˜๋‚˜๋กœ, ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•  ๋•Œ ๋ฐ์ดํ„ฐ์˜ ์ธ์ฝ”๋”ฉ ํƒ€์ž…์„ ์ง€์ •ํ•œ๋‹ค.
  • multipart/form-data๋Š” ํผ ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์ „์†ก๋˜๋ฉฐ, ๊ฐ ๋ถ€๋ถ„์€ ๋…๋ฆฝ์ ์œผ๋กœ ์ธ์ฝ”๋”ฉ๋จ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ด ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์€ ํผ ๋ฐ์ดํ„ฐ์— ํŒŒ์ผ ์—…๋กœ๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์„ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ๊ฒŒ์‹œํŒ์—์„œ๋Š” ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— multipart/form-data ํ˜•์‹์„ ์ง€์ •ํ–ˆ๋‹ค.
  • ์ด ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋ฉด ํผ ๋ฐ์ดํ„ฐ์˜ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์ด ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ๋ณ€๊ฒฝ๋˜์–ด ์„œ๋ฒ„์—์„œ ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  <form action="${boarCode}" enctype="multipart/form-data" method="POST" class="board-write"
            onsubmit="return writeValidate()">

 
 
 
 
 

3. ์„œ๋ฒ„์—์„œ MultipartResolver๋ฅผ ํ†ตํ•œ ์š”์ฒญ ์ฒ˜๋ฆฌ

  • MultipartResolver๋Š” Spring MVC์—์„œ ํŒŒ์ผ ์—…๋กœ๋“œ์™€ ๊ฐ™์€ ๋ฉ€ํ‹ฐํŒŒํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.
  • MultipartResolver๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์ „์†ก๋œ HTTP ์š”์ฒญ์—์„œ ๋ฉ€ํ‹ฐํŒŒํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ํ•ด์„ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
  • MultipartResolver๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋ฉ€ํ‹ฐํŒŒํŠธ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๋ฉ€ํ‹ฐํŒŒํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ํŒŒ์ผ ์—…๋กœ๋“œ์™€ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•œ๋‹ค.
  • Spring MVC์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” MultipartResolver ๊ตฌํ˜„์ฒด๋Š” CommonsMultipartResolver์ด๋‹ค. ์ด ๊ตฌํ˜„์ฒด๋Š” Apache Commons FileUpload ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฉ€ํ‹ฐํŒŒํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. CommonsMultipartResolver๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ํŒŒ์‹ฑํ•˜์—ฌ MultipartFile ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์ด๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ์— ์ „๋‹ฌํ•œ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ์—์„œ๋Š” MultipartFile ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์—…๋กœ๋“œ๋œ ํŒŒ์ผ์˜ ์ •๋ณด์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • MultipartResolver๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด Spring MVC ๊ตฌ์„ฑ ํŒŒ์ผ์ธ servlet-context.xml์— ํ•ด๋‹น ๋นˆ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ๋“ฑ๋กํ•ด์•ผ ํ•œ๋‹ค.

 

<!-- ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•œ MutipartResolver ๊ตฌํ˜„์ฒด CommonsMultipartResolver  bean ๋“ฑ๋ก 
	-> CommonsMultipartResolver๋ฅผ bean์œผ๋กœ ๋“ฑ๋กํ•˜๋ฉด multipart/form-data ํ˜•์‹์œผ๋กœ ์š”์ฒญ ์‹œ  
       input type="file" ํƒœ๊ทธ๋ฅผ ์ž๋™์ ์œผ๋กœ ์ธ์‹ํ•˜์—ฌ MultipartFile ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ 
		ํŒŒ์ผ ์™ธ์˜ ๋ฐ์ดํ„ฐ(์ •์ˆ˜, ๋ฌธ์ž์—ด ๋“ฑ์˜ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ)๋Š” ๊ธฐ์กด์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ 
        (MultipartRequest ํ•„์š” ์—†์Œ)
	-->
	<bean id="multipartResolver" 
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		 <property name="maxUploadSize" value="104857600"/>
		 <property name="maxUploadSizePerFile" value="104857600"/>
		 <property name="maxInMemorySize" value="104857600"/>
	</bean>
	<!-- 
		104857600 byte == 100MB
		20971520 byte == 20MB
		
		maxUploadSize 
			: ํ•œ ์š”์ฒญ๋‹น ์—…๋กœ๋“œ๊ฐ€ ํ—ˆ์šฉ๋˜๋Š” ์ตœ๋Œ€ ์šฉ๋Ÿ‰์„ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์„ค์ •.
			-1 ์€ ์ œํ•œ์ด ์—†๋‹ค๋Š” ๋œป์œผ๋กœ ์ด ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์„๋•Œ ๊ธฐ๋ณธ๊ฐ’.
		
		maxUploadSizePerFile
		 : ํ•œ ํŒŒ์ผ๋‹น ์—…๋กœ๋“œ๊ฐ€ ํ—ˆ์šฉ๋˜๋Š” ์ตœ๋Œ€ ์šฉ๋Ÿ‰์„ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์„ค์ •.
			-1 ์€ ์ œํ•œ์ด ์—†๋‹ค๋Š” ๋œป์œผ๋กœ ์ด ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์„๋•Œ ๊ธฐ๋ณธ๊ฐ’.
			
		maxInMemorySize 
			: ๋””์Šคํฌ์— ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€ํ•˜๋„๋ก 
			ํ—ˆ์šฉํ•˜๋Š” ๋ฐ”์ดํŠธ ๋‹จ์œ„์˜ ์ตœ๋Œ€ ์šฉ๋Ÿ‰์„ ์„ค์ •.
			
	 		์‚ฌ์ด์ฆˆ๊ฐ€ ์ด๋ณด๋‹ค ํด ๊ฒฝ์šฐ ์ด ์‚ฌ์ด์ฆˆ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ๋Š” ํŒŒ์ผ์— ์ €์žฅ. 
			 ๊ธฐ๋ณธ๊ฐ’์€ 10240 ๋ฐ”์ดํŠธ.
	 -->
๋ฐ˜์‘ํ˜•
Comments