반응형

오늘은 Spring Boot를 사용하여 웹 애플리케이션에서 파일 업로드 및 다운로드 기능을 구현하는 방법을 학습하겠습니다.


1. 파일 업로드의 기본 흐름

  1. 클라이언트 요청: 파일을 업로드하려는 사용자로부터 파일과 데이터를 전송받습니다.
  2. 서버 처리: 서버에서 파일을 저장할 위치를 지정하고 저장합니다.
  3. 응답 반환: 파일 저장 결과를 클라이언트에 반환합니다.

2. 파일 업로드 구현

Controller 코드

@RestController
@RequestMapping("/api/files")
public class FileController {

    private final String UPLOAD_DIR = "C:/uploads/";

    @PostMapping("/upload")
    public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
        try {
            // 저장 경로 생성
            Path filePath = Paths.get(UPLOAD_DIR + file.getOriginalFilename());
            Files.copy(file.getInputStream(), filePath, StandardCopyOption.REPLACE_EXISTING);

            return ResponseEntity.ok("File uploaded successfully: " + file.getOriginalFilename());
        } catch (IOException e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                                 .body("File upload failed: " + e.getMessage());
        }
    }
}

3. 파일 다운로드 구현

Controller 코드

@GetMapping("/download/{filename}")
public ResponseEntity<Resource> downloadFile(@PathVariable String filename) {
    try {
        Path filePath = Paths.get(UPLOAD_DIR + filename);
        Resource resource = new UrlResource(filePath.toUri());

        if (resource.exists() || resource.isReadable()) {
            return ResponseEntity.ok()
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"")
                .body(resource);
        } else {
            return ResponseEntity.status(HttpStatus.NOT_FOUND)
                                 .body(null);
        }
    } catch (Exception e) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                             .body(null);
    }
}

4. 테스트

업로드 테스트

  • API 호출 방법:
    POST /api/files/upload
    요청 본문에 file 필드를 포함하여 파일을 전송합니다.
  • 성공 응답 예:
  • File uploaded successfully: example.pdf

다운로드 테스트

  • API 호출 방법:
    GET /api/files/download/example.pdf
  • 결과: 요청한 파일이 다운로드됩니다.

5. 업로드와 다운로드 시 유의사항

  1. 파일 크기 제한
    • application.properties 또는 YAML 파일에서 파일 크기를 제한합니다.
    spring.servlet.multipart.max-file-size=10MB
    spring.servlet.multipart.max-request-size=10MB
    
  2. 보안 강화
    • 사용자 입력으로 경로 탐색 공격(Path Traversal)이 발생하지 않도록 유효성을 검증합니다.
    • 업로드된 파일의 확장자를 확인하거나 특정 폴더로만 저장을 제한합니다.
  3. 중복 파일명 처리
    • 동일한 파일명이 업로드되었을 때 중복을 피하기 위해 고유 식별자를 추가하거나 시간 기반 파일명을 생성합니다.

6. 실무 활용 팁

  1. AWS S3와 같은 클라우드 스토리지 연계
    • 대용량 파일 관리가 필요한 경우 로컬 파일 시스템 대신 클라우드 스토리지를 활용할 수 있습니다.
  2. 파일 메타데이터 관리
    • 데이터베이스에 파일 이름, 크기, 업로드 시간 등의 정보를 저장해 관리합니다.
반응형

+ Recent posts