반응형
오늘은 Spring Boot를 사용하여 웹 애플리케이션에서 파일 업로드 및 다운로드 기능을 구현하는 방법을 학습하겠습니다.
1. 파일 업로드의 기본 흐름
- 클라이언트 요청: 파일을 업로드하려는 사용자로부터 파일과 데이터를 전송받습니다.
- 서버 처리: 서버에서 파일을 저장할 위치를 지정하고 저장합니다.
- 응답 반환: 파일 저장 결과를 클라이언트에 반환합니다.
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. 업로드와 다운로드 시 유의사항
- 파일 크기 제한
- application.properties 또는 YAML 파일에서 파일 크기를 제한합니다.
spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB
- 보안 강화
- 사용자 입력으로 경로 탐색 공격(Path Traversal)이 발생하지 않도록 유효성을 검증합니다.
- 업로드된 파일의 확장자를 확인하거나 특정 폴더로만 저장을 제한합니다.
- 중복 파일명 처리
- 동일한 파일명이 업로드되었을 때 중복을 피하기 위해 고유 식별자를 추가하거나 시간 기반 파일명을 생성합니다.
6. 실무 활용 팁
- AWS S3와 같은 클라우드 스토리지 연계
- 대용량 파일 관리가 필요한 경우 로컬 파일 시스템 대신 클라우드 스토리지를 활용할 수 있습니다.
- 파일 메타데이터 관리
- 데이터베이스에 파일 이름, 크기, 업로드 시간 등의 정보를 저장해 관리합니다.
반응형
'개발 > 전자정부프레임워크' 카테고리의 다른 글
RESTful API의 검색 기능 구현 및 최적화 (0) | 2025.01.03 |
---|---|
RESTful API에 인증과 권한 관리 추가하기 (0) | 2025.01.03 |
RESTful API와 Pagination 구현 (0) | 2025.01.03 |
JDBC 배치 처리와 성능 최적화 (0) | 2025.01.02 |
JDBC를 사용한 트랜잭션 처리 심화 학습 (0) | 2025.01.02 |