[스프링/Spring] MultipartFile을 이용한 파일 업로드 구현

dongbrown·2024년 9월 6일

Spring

목록 보기
9/23

스프링은 파일 업로드를 위한 MultipartFile 인터페이스를 제공하여 멀티파트 파일 처리를 매우 간단하게 구현할 수 있습니다. 서블릿을 직접 사용하는 방식보다 훨씬 편리한 방법을 알아보겠습니다.

1. 컨트롤러 구현

@Slf4j
@Controller
@RequestMapping("/spring")
public class SpringUploadController {

    @Value("${file.dir}")
    private String fileDir;

    @GetMapping("/upload")
    public String newFile() {
        return "upload-form";
    }

    @PostMapping("/upload")
    public String saveFile(
            @RequestParam String itemName,
            @RequestParam MultipartFile file,
            HttpServletRequest request) throws IOException {
        
        log.info("request={}", request);
        log.info("itemName={}", itemName);
        log.info("multipartFile={}", file);

        if (!file.isEmpty()) {
            String fullPath = fileDir + file.getOriginalFilename();
            log.info("파일 저장 fullPath={}", fullPath);
            file.transferTo(new File(fullPath));
        }

        return "upload-form";
    }
}

2. MultipartFile 인터페이스

MultipartFile 인터페이스는 멀티파트 파일을 처리하기 위한 다양한 메서드를 제공합니다.

주요 메서드

메서드설명
getOriginalFilename()업로드된 원본 파일명 반환
transferTo(File dest)파일을 지정된 경로에 저장
isEmpty()파일이 비어있는지 확인
getSize()파일 크기 반환
getBytes()파일 데이터를 바이트 배열로 반환
getContentType()파일의 컨텐츠 타입 반환

3. 파일 업로드 처리 방법

1) 파라미터 바인딩

@RequestParam MultipartFile file
  • HTML Form의 name 속성값과 일치하는 파라미터에 @RequestParam 적용
  • @ModelAttribute를 사용하는 객체 안에서도 동일하게 사용 가능

2) 파일 저장

if (!file.isEmpty()) {
    String fullPath = fileDir + file.getOriginalFilename();
    file.transferTo(new File(fullPath));
}
  • isEmpty()로 파일 존재 여부 확인
  • transferTo()를 사용하여 간단하게 파일 저장

4. 실행 결과

실행 시 다음과 같은 로그를 확인할 수 있습니다:

request=org.springframework.web.multipart.support.StandardMultipartHttpServletRequest@5c022dc6
itemName=상품A
multipartFile=org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile@274ba730
파일 저장 fullPath=/Users/kimyounghan/study/file/스크린샷.png

5. 서블릿 방식과의 비교

서블릿 방식

Collection<Part> parts = request.getParts();
for (Part part : parts) {
    // 파일 처리를 위한 여러 단계의 코드 필요
}

스프링 방식

@RequestParam MultipartFile file
file.transferTo(new File(fullPath));

스프링의 MultipartFile을 사용하면:
1. 코드가 매우 간단해짐
2. 파일 처리에 필요한 부가 작업들이 자동화됨
3. 직관적인 API 제공

정리

  • 스프링의 MultipartFile은 파일 업로드를 위한 매우 편리한 인터페이스를 제공합니다.
  • @RequestParam이나 @ModelAttribute를 통해 쉽게 파일을 바인딩할 수 있습니다.
  • transferTo() 메서드로 단 한 줄의 코드로 파일 저장이 가능합니다.
  • 서블릿 방식에 비해 코드가 매우 간단하고 직관적입니다.

스프링의 MultipartFile을 사용하면 복잡한 파일 업로드 처리를 매우 간단하게 구현할 수 있으며, 실무에서도 이 방식을 주로 사용합니다.

0개의 댓글