오늘은 파일 업로드 기능을 추가했다. 예상치 못한 여러 에러로 이틀이나 고생했지만, 마지막 에러는 에러가 아니라 내 오타로 인해 문제가 발생했던거였다.. 해결하고 참 허무했지만 덕분에 파일 업로드 강의 복습도 하고 좋.. 았다.
배포할 때는 s3를 연결해서 업로드 하고 개발할 때는 로컬 db에 업로드해야한다. 항상 연결해놓으면 좋겠지만 취준생의 money 이슈가.. 🤤
그래서 일단 LocalFileStorageService에 주요 로직들을 넣어두었고 배포 전 s3랑 연결할 땐 FileService 인터페이스를 하나 만들어서 LocalFileStorageService와 S3FileStorageService를 번갈아가며 사용할 때 구현체만 쉽게 바꿔낄 예정이다.
파일 관리 테이블에 대해서 간략하게 설명하자면, 원본 파일 이름과 업로드 후 저장되는 파일 이름을 각각 따로 저장해줄 MultiPart db를 생성했다.

이렇게 저장하는 이유는 사용자가 지정한 원본 파일 이름이 db에 저장될 때 충돌하지 않도록 하기 위함이다.
Post

이렇게 사용자가 서로 같은 이름의 파일을 업로드 해도
Multipart

Multipart 테이블엔 각각 고유의 storedFileName으로 변환되어 저장된다.
Multipart 테이블에서 파일을 찾아올 땐 FileName과 postId 로 찾아오도록 했다.
파일 다운로드 api 중 일부
// 파일 다운로드
@GetMapping("/file/download/{postId}/{filename}")
public ResponseEntity<Resource> downloadImage(@PathVariable String filename, @PathVariable Long postId) throws MalformedURLException {
Multipart multipart = multipartRepository.findByOriginalFileNameAndPostId(filename, postId);
String storedFilename = multipart.getStoredFileName();
String originalFileName = multipart.getOriginalFileName();
타임리프에서 다운로드 api 사용하기

+)

혹시 이렇게 다운로드.json 사이트에서 사용할 수 없는 파일, 사이트를 사용할 수 없음
이라는 파일이 다운로드 된다면

Multipart db에선 해당 postId의 알맞은 파일을 찾아오기 위해 이런 쿼리를 사용했다.
파일/이미지 업로드 개발 시 김영한 강사님의 Spring MVC2 강의를 참고했습니다.