이번 프로젝트에서 배운 파일에 대한 요청과 응답 처리
가물가물했지만 예전부터 프로젝트에서 이미지처리를 위해서 img src에서 외부 경로로 참조하는것을 임시로 처리하면서 기본적인 CRUD에서도 파일에 대한 처리의 미흡함이 있었다. 이번 프로젝트에서 왜 안되는가에 대해 구현에 집중하다보니까 깨달은 부분이 있다.
분명히 예전에 배운 내용인데, 코드인데 파일 자체를 접근하는 방법에 대해서 감을 잡은게 크다. Base64로만 해보고있지만 다양한 알고리즘 인코딩 방법들을 알아가보면 효율적인게 있지 않을까? 우선은 기능 구현 자체에 문제가 있던 부분들이 해결되면서 뭔가 안되던것들을 해결해나가는 자신감이 생겼다.
영상 목록의 포스터에서 시청화면으로 진입
ResponseDto를 통한 이미지, 영상 인코딩과 미리보기, 재생 등을 위한 준비
미리보기, 영상 재생 등은 결국 조회에서 발생하기 때문에 ResponseDto를 통해 조절하게 되었다.
기본적으로 해당 요청이 필요한 컨트롤러를 구성하고 반환되는 결과를 조절하면된다.
이 과정에서 영상 자체를 DB에 기록할 필요는 없었으며 DB에는 URL을 저장하고 시스템 경로에 저장된 파일을 인코딩하게 된다.
public VideoResponseDto(Video video){
this.videoId = video.getVideoId();
this.formattedCreatedAt = formatDateTime(video.getCreatedAt());
this.videoTitle = video.getVideoTitle();
this.videoWriter = video.getVideoWriter();
this.videoContents = video.getVideoContents();
this.videoType = video.getVideoType();
// Video 엔티티에서 fileList를 가져와 FileResponseDto로 변환하여 할당
this.fileList = FileResponseDto.fromFileList(video.getFileList());
// 이미지 파일 인코딩
this.imgFileContent = getImgFileContent();
// 영상 파일 인코딩
this.videoFileContent = getVideoFileContent();
}
Java
복사
public String getImgFileContent() {
// VideoTypeEnum.IMG 타입인 파일 중 마지막 파일의 내용을 Base64로 인코딩하여 반환
return fileList.stream()
.filter(file -> file.getFileType() == FileTypeEnum.IMG)
.reduce((first, second) -> second) // 마지막 파일 선택
.map(file -> encodeFileContent(file.getFileUrl()))
.orElse("");
}
public String getVideoFileContent() {
// VideoTypeEnum.Video 타입인 파일 중 마지막 파일의 내용을 Base64로 인코딩하여 반환
return fileList.stream()
.filter(file -> file.getFileType() == FileTypeEnum.VIDEO)
.reduce((first, second) -> second) // 마지막 파일 선택
.map(file -> encodeFileContent(file.getFileUrl()))
.orElse("");
}
// 파일 내용을 Base64로 인코딩하는 메서드
private String encodeFileContent(String filePath) {
try {
byte[] fileBytes = Files.readAllBytes(Path.of(filePath));
return Base64.getEncoder().encodeToString(fileBytes);
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
public String getImgFileUrl() {
// 파일 리스트가 비어있지 않다면 마지막 이미지 파일의 파일 URL 반환
return fileList.stream()
.filter(file -> file.getFileType() == FileTypeEnum.IMG)
.reduce((first, second) -> second) // 마지막 이미지 파일 선택
.map(FileResponseDto::getFileUrl)
.orElse("");
}
public String getVideoFileUrl() {
// 파일 리스트가 비어있지 않다면 마지막 비디오 파일의 파일 URL 반환
return fileList.stream()
.filter(file -> file.getFileType() == FileTypeEnum.VIDEO)
.reduce((first, second) -> second) // 마지막 비디오 파일 선택
.map(FileResponseDto::getFileUrl)
.orElse("");
}
public void setImgFileContent(String fileContent) {
this.imgFileContent = fileContent;
}
public void setVideoFileContent(String fileContent) {
this.videoFileContent = fileContent;
}
}
Java
복사
브라우저 크기에 따라 동적으로 영상 크기 조절