EdgeSecu

Spring MVC 파일 업로드 정리: @RequestParam vs @ModelAttribute 활용법 본문

공부/Spring

Spring MVC 파일 업로드 정리: @RequestParam vs @ModelAttribute 활용법

Edgemine 2025. 7. 23. 15:05

@RequestParam 으로 개별 MultipartFile 을 바로 받는 것 외에도, 폼 데이터를 묶어서 전달할 때 사용하는 커맨드 객체(command object) 에도 MultipartFile 필드를 선언해 놓고, 그 객체를 @ModelAttribute 로 받아올 수 있다는 뜻이야.

즉, 이렇게 두 가지 방법이 있다는 거지:


1. 개별 파라미터로 받기 (@RequestParam)

@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
    // file.getOriginalFilename(), file.transferTo(...) 등 사용
    return "uploadResult";
}
  • HTML form 에 <input type="file" name="file" /> 으로 파일 입력을 만들면
    @RequestParam("file") 과 매핑되어 업로드된 파일을 받을 수 있어.

2. 커맨드 객체로 받기 (@ModelAttribute)

// 1) 업로드 폼 데이터와 파일을 담을 DTO 정의
public class ItemForm {
    private String itemName;
    private int price;
    private MultipartFile attachFile;    // 파일 한 개
    private List<MultipartFile> imageFiles; // 파일 여러 개
    
    // (getter, setter 생략)
}

// 2) 컨트롤러에서 @ModelAttribute 로 한 번에 받기
@PostMapping("/items/new")
public String saveItem(@ModelAttribute ItemForm form) throws IOException {
    // form.getAttachFile(), form.getImageFiles() 사용 가능
    MultipartFile file = form.getAttachFile();
    String filename = file.getOriginalFilename();
    file.transferTo(new File("/uploads/" + filename));
    // 나머지 form.getItemName(), form.getPrice() 등도 함께 사용
    return "redirect:/items";
}
  • HTML form 은 반드시
  • name="attachFile" 이 DTO의 attachFile 필드로,
    name="imageFiles"  imageFiles 리스트로 바인딩돼.
<form method="post" enctype="multipart/form-data">
    <input type="text" name="itemName" />
    <input type="number" name="price" />
    <input type="file" name="attachFile" />
    <input type="file" name="imageFiles" multiple />
    <button type="submit">저장</button>
</form>

요약하자면

  • @RequestParam MultipartFile file 은 “파일만 하나 받아올 때” 편리하고,
  • @ModelAttribute MyForm form 은 “폼의 여러 필드(텍스트, 숫자, 파일 등)를 한꺼번에 객체로 묶어서” 받고 싶을 때 유용해.
  • 이 둘 모두 내부적으로는 스프링의 MultipartResolver  MultipartFile 타입으로 업로드된 파일을 생성해 주는 건 똑같아.