본문으로 건너뛰기
Advertisement

3.6 파일 업로드 처리 (MultipartFile)

웹 애플리케이션에서 이미지나 문서를 서버로 업로드할 때 사용하는 MultipartFile 처리 방법과 관련 설정을 알아봅니다.

1. 파일 업로드의 원리 (multipart/form-data)

파일은 텍스트가 아닌 대용량 바이너리 데이터입니다. 따라서 일반적인 application/json으로는 효율적으로 보내기 어렵습니다. HTTP는 이를 위해 multipart/form-data 라는 특수한 인코딩 방식을 사용하며, 스프링 매개변수에서는 이를 MultipartFile 인터페이스로 받습니다.

2. 파일 업로드 구현 예제

컨트롤러 구현

@RestController
@Slf4j
public class FileUploadController {

@PostMapping("/api/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException {
if (file.isEmpty()) {
return "파일이 없습니다.";
}

log.info("파일명: {}", file.getOriginalFilename());
log.info("파일 크기: {} bytes", file.getSize());
log.info("컨텐츠 타입: {}", file.getContentType());

// 로컬 디렉토리에 저장 예시
String fullPath = "C:/uploads/" + file.getOriginalFilename();
file.transferTo(new File(fullPath));

return "업로드 성공: " + fullPath;
}
}

3. 업로드 용량 제한 설정 (application.yml)

스프링 부트는 기본적으로 파일 업로드 용량이 작게 설정되어 있습니다. 대용량 파일을 허용하려면 application.yml 파일에 설정을 추가해야 합니다.

spring:
servlet:
multipart:
max-file-size: 10MB # 파일 하나당 최대 용량
max-request-size: 50MB # 한 번의 HTTP 요청에 담긴 전체 최대 용량

4. 실무 고려 사항

  1. 파일명 중복 방지: 사용자가 올린 파일명을 그대로 쓰면 덮어쓰기가 발생할 수 있습니다. UUID 등을 사용하여 고유한 파일명을 생성하는 것이 안전합니다.
  2. 보안: 업로드된 파일이 실행 가능한 스크립트(.php, .sh)인 경우 서버가 해킹될 수 있습니다. 확장자 검증이나 이미지 프로세싱을 거치는 것이 좋습니다.
  3. 저장소 선택: 초기에는 서버 로컬 디렉토리에 저장하지만, 서비스 규모가 커지면 ** AWS S3**같은 전용 클라우드 스토리지에 저장하는 것이 일반적입니다.
Advertisement