AWS S3에 νŒŒμΌμ„ μ €μž₯ν•˜κΈ° μœ„ν•΄μ„œ λ©€ν‹°νŒŒνŠΈ μ—…λ‘œλ“œλ₯Ό μˆ˜ν–‰ν•˜λŠ” κ²ƒμ²˜λŸΌ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ°”μ΄λ„ˆλ¦¬ 데이터λ₯Ό μ „λ‹¬ν•˜κΈ° μœ„ν•΄ λ©€ν‹°νŒŒνŠΈ 폼 데이터 ν˜•μ‹μœΌλ‘œ μ‚¬μš©μžκ°€ μ„ νƒν•œ νŒŒμΌμ„ μ „λ‹¬ν•©λ‹ˆλ‹€. μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬λ₯Ό 톡해 λ°±μ—”λ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μž‘μ„±ν•˜λŠ” 경우 μ•Œμ•„μ•Όν•  λ©€ν‹°νŒŒνŠΈμ— λŒ€ν•΄μ„œ κ°„λ‹¨νžˆ 정리해보렀고 ν•©λ‹ˆλ‹€.

MultipartFile 와 RequestPart

μŠ€ν”„λ§ 컨트둀러 ν•Έλ“€λŸ¬ ν•¨μˆ˜μ˜ MultipartFile νŒŒλΌλ―Έν„°λŠ” RequestParam, ModelAttribute 그리고 RequestPart μ–΄λ…Έν…Œμ΄μ…˜μ„ μ„ μ–Έν•˜μ—¬ 바인딩을 μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λŒ€λΆ€λΆ„ RequestParam κ³Ό ModelAttributeλ₯Ό μ‚¬μš©ν•˜μ§€λ§Œ 개인적으둜 μ½”λ“œ 가독성을 더 λͺ…ν™•ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄ λ©€ν‹°νŒŒνŠΈλ₯Ό μœ„ν•œ λͺ©μ μœΌλ‘œ μΆ”κ°€λ˜μ–΄μžˆλŠ” RequestPart둜 μ„ μ–Έν•˜μ—¬ μ‚¬μš©ν•˜λŠ” νŽΈμž…λ‹ˆλ‹€.

@RestController
public class FileController {
    @RequestMapping(value = "/file", method = {RequestMethod.POST, RequestMethod.PUT})
    public ResponseEntity<String> upload(@RequestPart("file") MultipartFile file) {
        return ResponseEntity.ok(file.getOriginalFilename());
    }
}

StandardServletMultipartResolver

λ©€ν‹°νŒŒνŠΈ 폼 데이터(multipart/form-data) μš”μ²­μ— λŒ€ν•΄μ„œ StandardServletMultipartResolverκ°€ λ©€ν‹°νŒŒνŠΈμ— ν¬ν•¨λ˜μ–΄μžˆλŠ” λ°”μ΄λ„ˆλ¦¬λ₯Ό StandardMultipartFile둜 λ³€ν™˜λ©λ‹ˆλ‹€. μ΄λ•Œ, λ©€ν‹°νŒŒνŠΈμ— ν¬ν•¨λœ λ°”μ΄λ„ˆλ¦¬λŠ” μž„μ‹œ 폴더에 μ €μž₯되며 μš”μ²­μ΄ 처리된 이후에 MultipartFiler에 μ˜ν•΄ μž„μ‹œλ‘œ μ €μž₯된 νŒŒμΌμ€ μ΅œμ’…μ μœΌλ‘œ μ‚­μ œλ©λ‹ˆλ‹€.

MaxUploadSizeExceededException πŸ’₯

μŠ€ν”„λ§ λ©€ν‹°νŒŒνŠΈ κΈ°λ³Έκ°’ 섀정에 μ˜ν•΄ 파일 λ‹Ή 1MB λ˜λŠ” μš”μ²­ λ‹Ή 10MB μ œν•œμœΌλ‘œ MaxUploadSizeExceededException이 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, 파일 μ—…λ‘œλ“œ κΈ°λŠ₯이 ν•„μš”ν•œ 경우 μ˜ˆμƒλ˜λŠ” 파일 μ΅œλŒ€ μ‚¬μ΄μ¦ˆμ— 따라 μ„€μ •ν•΄λ‘λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

application.properties
spring.servlet.multipart.max-file-size=10MB spring.servlet.mulitpart.max-request-szie=100MB

Multipart Temp Directory

λ©€ν‹°νŒŒνŠΈ 파일이 μ €μž₯λ˜λŠ” 경둜λ₯Ό μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ 운영체제의 μž„μ‹œ 디렉토리λ₯Ό μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€. 싀행쀑인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ˜€λž«λ™μ•ˆ 파일이 μ—…λ‘œλ“œλ˜μ§€ μ•Šμ•„μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μƒμ„±ν–ˆλ˜ 경둜λ₯Ό λ¦¬λˆ…μŠ€μ™€ 같은 μš΄μ˜μ²΄μ œμ—μ„œ μ •λ¦¬ν•΄λ²„λ¦¬λŠ” 경우 파일 μ—…λ‘œλ“œλ₯Ό μ‹€νŒ¨ν•˜λŠ” μ‚¬μœ κ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. μ–Έλ”ν† μš° μž„μ‹œ 디렉토리 μ‚­μ œ 방지와 같이 μž„μ‹œ 디렉토리λ₯Ό λ³΅κ΅¬ν•˜κ±°λ‚˜ λ©€ν‹°νŒŒνŠΈ λ°”μ΄λ„ˆλ¦¬λ₯Ό μž„μ‹œ μ €μž₯ν•˜κΈ° μœ„ν•œ 경둜λ₯Ό λ³„λ„λ‘œ μ§€μ •ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

spring.servlet.multipart.location=/home/ec2-user/tmp