공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.
이번 장에서는 업로드된 파일들을 조회하고, 각 파일의 정보를 확인할 수 있는 기능을 구현한다. 사용자는 업로드된 파일을 다운로드하거나 파일 목록을 확인할 수 있다.
1. ApplicationController에 파일 조회 메서드 추가
파일 다운로드 메서드
클라이언트가 요청한 파일을 다운로드할 수 있도록 @GetMapping을 사용하여 파일 다운로드 기능을 구현한다.
@GetMapping("/files")
public ResponseEntity<Resource> download(@RequestParam(value = "fileName") String fileName) {
Resource file = fileStorageService.load(fileName);
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getFilename() + "\"")
.body(file);
}
- fileStorageService.load(fileName)를 호출하여 파일을 로드한다.
- 로드한 파일을 ResponseEntity로 감싸서 클라이언트에게 다운로드할 수 있도록 제공한다.
파일 정보 조회 메서드
업로드된 모든 파일의 이름과 URL을 조회할 수 있는 메서드를 추가한다.
@GetMapping("/files/infos")
public ResponseDTO<List<FileDTO>> getFileInfos() {
List<FileDTO> fileInfos = fileStorageService.loadAll().map(path -> {
String fileName = path.getFileName().toString();
return FileDTO.builder()
.name(fileName)
.url(MvcUriComponentsBuilder.fromMethodName(ApplicationController.class, "download", fileName).build().toString())
.build();
}).collect(Collectors.toList());
return ok(fileInfos);
}
- fileStorageService.loadAll()을 사용해 모든 파일 경로를 조회하고, 각 파일의 이름과 다운로드 URL을 FileDTO에 담아 반환한다.
2. FileDTO 클래스 추가
파일 정보(이름, URL)를 담기 위한 FileDTO 클래스를 추가한다.
package com.example.loan.dto;
import lombok.*;
import java.io.Serializable;
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
@Setter
public class FileDTO implements Serializable {
private String name;
private String url;
}
- 파일 이름과 URL을 관리하는 DTO 객체로, 파일 목록 조회 시 사용된다.
3. ResultType에 에러 코드 추가
파일이 존재하지 않을 때의 예외 처리를 위해 ResultType에 새로운 에러 코드를 추가한다.
NOT_EXIST("4001", "file not exist"),
- NOT_EXIST 에러 코드를 추가하여 파일이 존재하지 않을 때 이를 처리할 수 있게 한다.
4. FileStorageService에 메서드 추가
파일을 로드하고 모든 파일 목록을 불러오기 위한 인터페이스에 메서드를 추가한다.
Resource load(String fileName);
Stream<Path> loadAll();
5. FileStorageServiceImpl에 메서드 구현체 추가
파일 로드 구현
파일을 로드하는 load 메서드의 구현체를 추가한다.
@Override
public Resource load(String fileName) {
try {
Path file = Paths.get(uploadPath).resolve(fileName);
Resource resource = new UrlResource(file.toUri());
if (resource.isReadable() || resource.exists()) {
return resource;
} else {
throw new BaseException(ResultType.NOT_EXIST);
}
} catch (Exception e) {
throw new BaseException(ResultType.SYSTEM_ERROR);
}
}
- 파일 경로를 기반으로 UrlResource를 생성하고, 파일이 존재하거나 읽을 수 있을 경우 반환한다.
- 파일이 존재하지 않으면 NOT_EXIST 예외를 던진다.
모든 파일 로드 구현
파일 경로에서 모든 파일을 불러오는 메서드를 구현한다.
@Override
public Stream<Path> loadAll() {
try {
return Files.walk(Paths.get(uploadPath), 1)
.filter(path -> !path.equals(Paths.get(uploadPath)));
} catch (Exception e) {
throw new BaseException(ResultType.SYSTEM_ERROR);
}
}
- Files.walk 메서드를 사용하여 설정된 경로에서 모든 파일을 가져오고, 해당 경로는 제외한다.
6. 실행 테스트
1) 파일 다운로드 테스트
Postman을 통해 파일을 다운로드하는 요청을 보낸 결과, 파일이 정상적으로 다운로드되었다. 다운로드된 파일은 아래와 같다.
- 파일 이름: image_with_white_bg.png
- 저장 위치: Downloads 폴더
다운로드한 파일을 정상적으로 열어볼 수 있고, 파일 손상 없이 그대로 사용 가능했다.
2) 파일 정보 조회 테스트
업로드된 파일들의 정보를 조회한 결과, 파일 목록과 각 파일의 URL을 정상적으로 조회할 수 있었다. 이는 Postman을 통해 파일 목록 API를 호출한 후 얻은 결과이다. 각 파일의 이름과 다운로드 가능한 URL을 확인할 수 있었다.
결론
이번 테스트를 통해 다음 기능이 정상적으로 동작함을 확인했다.
- 파일 업로드 기능
- 파일 다운로드 기능
- 파일 정보 조회 기능
이를 통해 관리자는 업로드된 파일들을 확인하고, 개별 파일을 다운로드하거나 파일 목록을 조회할 수 있게 되었다. 파일 업로드와 조회, 다운로드 관련 관리 기능이 모두 완성되었다.
'BackEnd > Project' 카테고리의 다른 글
[Loan] Ch03. 대출 신청 서류 매핑 기능 구현 (2) | 2024.09.12 |
---|---|
[Loan] Ch03. 대출 신청 서류 삭제 기능 구현 (0) | 2024.09.12 |
[Loan] Ch03. 대출 신청 서류 등록 기능 구현 (0) | 2024.09.12 |
[Loan] Ch03. 대출 신청 이용 약관 등록 기능 구현 (0) | 2024.09.12 |
[Loan] Ch03. 약관 조회 기능 구현 (0) | 2024.09.12 |