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 ๋ฐ์ดํธ.
-->
๋ฐ์ํ
'๐ฑSPRING' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์คํ๋ง ์ ๋ฌธ] ์คํ๋ง ์น ๊ฐ๋ฐ ๊ธฐ์ด- ์ ์ ์ปจํ ์ธ , MVC2 ํจํด๊ณผ ํ ํ๋ฆฟ ์์ง, API (0) | 2023.07.28 |
---|---|
๋ก๊ทธ ๋ ๋ฒจ(Log level)์ด๋? ๋ก๊ทธ๋ ๋ฒจ ์ค์ ํ๊ธฐ (0) | 2023.05.18 |
Handler Mapping๊ณผ Request Mapping์ด๋? (0) | 2023.05.18 |
AOP(Aspect-Oriented Programming)๋? ์์ ํฌํจ (0) | 2023.05.18 |
Spring JDBC์ ์ ์์ ํน์ง (2) | 2023.05.18 |
Comments