이미지 업로드
HTTP 멀티파트 요청 처리
파일 업로드를 구현할 때, 사용자는 웹폼을 통해 파일을 선택하고 서버에 전송합니다.
이때, 웹 브라우저는 HTTP 메시지를 생성하며, 이 메시지의 Content-Type 속성은 multipart/form-data로 설정됩니다
서버는 이를 처리하기 위해 멀티파트 메시지를 받아 각 파트로 분리하여 처리합니다.
Content-Type
HTTP(request와 response)는 위 이미지와 같이 4개의 파트로 나눌 수 있습니다.
여기서 Message Body에 들어가는 데이터 타입을 HTTP Header에 명시해줄 수 있습니다. 이 때 명시할 수 있도록 해주는 필드가 바로 Content-type입니다.
multipart/form-data
웹 폼에서 파일 업로드와 같이 여러 종류의 데이터를 동시에 전송할 때 사용되는 데이터 전송 형식 중 하나입니다.
일반적으로 HTTP 프로토콜을 통해 데이터를 전송할 때, 웹 브라우저에서 폼을 통해 업로드한 파일과 텍스트 데이터를 함께 전송해야 하는 경우에 이 형식이 사용됩니다.
멀티파트 형식은 여러 파트로 이루어져 있으며, 각 파트는 하나의 데이터 조각을 나타냅니다.
각 부속 문서는 boundary로 구분되어 있어 서버가 각 파트를 식별할 수 있습니다. 서버 측에서는 멀티파트 파싱을 수행하여 각 데이터 파트를 추출하고 처리합니다.
이미지 업로드 구현
ReviewImage 엔티티
리뷰 컨트롤러
-> 이미지 업로드
Review Service
Image Service
-> 파일 이름을 생성하고 이미지가 저장될 경로를 저장되며 해당 이미지가 리뷰와 연결
-> MultipartFile을 File로 변환하고 S3에 저장, 변환하면서 생성된 임시파일을 삭제
FileManager
->MultipartFile을 로컬에 저장 (파일로 변환하기 위해서)
멀티파트로 업로드 VS 파일로 변환해서 업로드
멀티파트 업로드:
용도 : 대용량 파일을 효율적으로 업로드하기 위한 방법
동작 : 큰 파일을 여러 부분으로 나누어 병렬로 업로드하고, 각 부분을 나중에 조합하여 하나의 객체로 완성
장점 : 대용량 파일 업로드가 가능하며, 네트워크 문제나 업로드 중 실패해도 특정 부분만 다시 업로드 가능 빠른 업로드 속도와 효율적인 자원 사용.
단점:일반적으로 작은 파일에 대해선 오히려 추가 오버헤드가 발생할 수 있음
파일로 변환해서 업로드:
용도 : 주로 작은 파일 또는 완전한 파일이 이미 로컬에 있는 경우 사용
동작: MultipartFile 등의 파일 객체를 File 객체로 변환한 후, 해당 파일을 S3에 업로드
장점 : 작은 파일에 대해 간편하게 업로드 가능. 업로드 전에 파일의 내용을 수정하거나 가공할 수 있음
단점 : 대용량 파일의 경우 전체를 메모리에 로드해야 하므로 메모리 사용량이 높을 수 있음 업로드가 실패하면 처음부터 다시 전체를 업로드해야 함
ImageInfo
UploadImageS3
ImageSort
-> 파일 경로 정보를 담음
이미지 업로드 테스트
이미지 업로드 성공!!