๐Ÿ“‚ ํŒŒ์ผ ์—…๋กœ๋“œ (File Upload)

๐Ÿ” ๊ฐœ์š”

  • HTTP multipart/form-data ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Spring MVC์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ
  • MultipartResolver ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด๋ฅผ ํ†ตํ•ด ์—…๋กœ๋“œ๋œ ํŒŒ์ผ์„ ํŒŒ์‹ฑํ•˜๊ณ  ๋ฐ”์ธ๋”ฉ
  • ํŒŒ์ผ ์—…๋กœ๋“œ๋Š” ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ์—์„œ MultipartFile๋กœ ์ง์ ‘ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ

โ˜๐Ÿป ํ•œ์ค„ ์š”์•ฝ

MultipartResolver๋ฅผ ํ†ตํ•ด multipart ์š”์ฒญ์„ ํŒŒ์‹ฑํ•˜๊ณ , ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์†์‰ฝ๊ฒŒ ํŒŒ์ผ์„ ์ฒ˜๋ฆฌ


๐Ÿค” ์™œ ํ•„์š”ํ•œ๊ฐ€?

  • HTML <form> ํŒŒ์ผ ์ „์†ก์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ‘œ์ค€ ๋ฐฉ์‹ ์ง€์›
  • ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ์ฒ˜๋ฆฌ, ์ž„์‹œ ์ €์žฅ์†Œ ๊ด€๋ฆฌ, ๋ฉ”๋ชจ๋ฆฌยท๋””์Šคํฌ ์ €์žฅ ๋ฐฉ์‹ ๋ถ„๋ฆฌ ๊ฐ€๋Šฅ
  • ํŒŒ์ผ ์—…๋กœ๋“œ ๋กœ์ง๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•ด ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ

โš™๏ธ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ

1. MultipartResolver ์ธํ„ฐํŽ˜์ด์Šค

  • multipart ์š”์ฒญ์„ ์ผ๋ฐ˜ ์š”์ฒญ์ฒ˜๋Ÿผ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์Šคํ”„๋ง MVC ์ปดํฌ๋„ŒํŠธ
๊ตฌํ˜„์ฒดํŠน์ง•
StandardServletMultipartResolverServlet 3.0+ ์ง€์›, ์˜์กด์„ฑ ์ถ”๊ฐ€ ๋ถˆํ•„์š”
CommonsMultipartResolverApache Commons FileUpload ๊ธฐ๋ฐ˜, ์˜์กด์„ฑ ์ถ”๊ฐ€ ํ•„์š”

๐Ÿ”ง ์„ค์ • ๋ฐฉ๋ฒ•

(A) Bean ๋“ฑ๋ก

@Bean
public MultipartResolver multipartResolver() {
    return new StandardServletMultipartResolver();
    //CommonsMultipartResolver ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ณ„๋„์˜ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ด ์ค˜์•ผํ•จ
}

(B) Spring Boot ์‚ฌ์šฉ ์‹œ

  • application.properties์—์„œ ํ™œ์„ฑํ™”
spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=20MB
  • ๋ณ„๋„ Bean ๋“ฑ๋ก ์—†์ด ์ž๋™ ์„ค์ •๋จ

๐Ÿ“„ ์ปจํŠธ๋กค๋Ÿฌ ์˜ˆ์‹œ

@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
    if (!file.isEmpty()) {
        String filename = file.getOriginalFilename();
        Path path = Paths.get("/uploads/" + filename);
        file.transferTo(path.toFile());
    }
    return "redirect:/success";
}

์ฃผ์š” ๊ตฌํ˜„์ฒด

  • StandardServletMultipartResolver: Servlet 3.0 ์ด์ƒ์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„
  • CommonsMultipartResolver: Apache Commons FileUpload ๊ธฐ๋ฐ˜ ๊ตฌํ˜„ (์ถ”๊ฐ€ ์˜์กด์„ฑ ํ•„์š”)

โœ… Spring Boot์—์„œ๋Š” spring.servlet.multipart.enabled=true ์„ค์ • ์‹œ ์ž๋™์œผ๋กœ ๋“ฑ๋ก๋จ


โš ๏ธ ์ฃผ์˜ํ•  ์ 

  • ์—…๋กœ๋“œ ์ œํ•œ ํฌ๊ธฐ(max-file-size)๋ฅผ ๋ฐ˜๋“œ์‹œ ์„ค์ •ํ•  ๊ฒƒ
  • ๋ณด์•ˆ์ƒ ํ—ˆ์šฉ ํ™•์žฅ์ž, ์ €์žฅ ๊ฒฝ๋กœ ๊ฒ€์ฆ ํ•„์š”
  • ๋Œ€๊ทœ๋ชจ ํŒŒ์ผ์€ ์ŠคํŠธ๋ฆฌ๋ฐ ์ฒ˜๋ฆฌ ๊ณ ๋ ค
  • ์—…๋กœ๋“œ ๋””๋ ‰ํ† ๋ฆฌ ์ ‘๊ทผ ๊ถŒํ•œ ์„ค์ • ํ•„์ˆ˜

๐Ÿ”— ๊ด€๋ จ