spring:
servlet:
multipart:
max-file-size: 5MB #하나의 파일 용량 제한
max-request-size: 10MB #하나의 요청 내 전체 파일 용량 제한
resolve-lazily: true #실제 파일에 접근하는 시점에 파일 용량 체크 (스프링 MVC에서 예외 throw)
resolve-lazily: true는 파일 용량이 제한을 넘는 경우 발생하는 MaxUploadSizeExceededException 예외를 GlobalExceptionHandler에서 처리하기 위한 설정입니다. 참고
업로드 가능한 파일 1개의 최대 사이즈는 5MB, 하나의 요청으로 여러 개의 파일을 업로드하는 경우 총 용량은 최대 10MB까지 가능합니다. 만약 용량 제한을 풀어야 하는 경우 해당 부분 수정하면 됩니다.
🗣️ For 리뷰어
개발, 운영 환경에 따라 버킷 분리
개발 환경에서는 fora-dev 버킷을, 운영 환경에서는 fora-prd 버킷을 사용합니다. 따라서 각 환경에 맞게 AWS_S3_BUCKET 환경 변수값을 각각 fora-dev 또는 fora-prd로 설정해주어야 합니다.
이미지 종류에 따라 폴더 분리
저장되는 이미지의 종류(ex. 유저 프로필 이미지, 게시글 이미지 등)에 따라 저장 폴더를 분리하기 위해 경로 prefix를 다음 enum에서 관리하며, 이미지 업로드 요청 시 해당 값을 전달합니다. (아래 스크린샷처럼 요청해주세요. 참고로 요청 시 토큰 필요합니다.)
@Getter
@RequiredArgsConstructor
public enum ImagePathPrefix {
DEFAULT_IMAGE("image/");
private final String path;
}
다음과 같이 fora-dev/image 아래 저장됩니다. 이미지 관리를 위해 폴더 구분이 필요하다면 폴더 생성 후 ImagePathPrefix enum도 업데이트해주세요.
CloudFront 사용을 위한 이미지 경로 반환
이미지 업로드 후 https://fora-dev.s3.ap-northeast-2.amazonaws.com/image/0cd89fde4d6e45178812b432123e648d_259x320.png 와 같이 전체 URL이 아닌 image/0cd89fde4d6e45178812b432123e648d_259x320.png 와 같은 부분 경로만 반환됩니다. 이는 S3 객체에 직접 접근하는 것보다는 CloudFront를 통해 접근하는 것이 비용 절감 + 접근 속도 향상 측면에서 더 좋은 것으로 알고 있습니다.(관련 문서) 이 경우 EC2가 떠 있어야 하며 관련 내용 공부도 필요하여 아직은 미구현 상태입니다. 혹시 이미지 업로드 업로드 후 객체에 직접 접근하고 싶다면 앞에 s3 경로 붙여주시면 됩니다.
💻 구현 내용
🛠️ 개발 오류 사항
파일 용량 제한 설정
resolve-lazily: true
는 파일 용량이 제한을 넘는 경우 발생하는MaxUploadSizeExceededException
예외를GlobalExceptionHandler
에서 처리하기 위한 설정입니다. 참고🗣️ For 리뷰어
개발, 운영 환경에 따라 버킷 분리
fora-dev
버킷을, 운영 환경에서는fora-prd
버킷을 사용합니다. 따라서 각 환경에 맞게AWS_S3_BUCKET
환경 변수값을 각각 fora-dev 또는 fora-prd로 설정해주어야 합니다.이미지 종류에 따라 폴더 분리
저장되는 이미지의 종류(ex. 유저 프로필 이미지, 게시글 이미지 등)에 따라 저장 폴더를 분리하기 위해 경로 prefix를 다음 enum에서 관리하며, 이미지 업로드 요청 시 해당 값을 전달합니다. (아래 스크린샷처럼 요청해주세요. 참고로 요청 시 토큰 필요합니다.)
다음과 같이
fora-dev/image
아래 저장됩니다. 이미지 관리를 위해 폴더 구분이 필요하다면 폴더 생성 후ImagePathPrefix
enum도 업데이트해주세요.CloudFront 사용을 위한 이미지 경로 반환
이미지 업로드 후
https://fora-dev.s3.ap-northeast-2.amazonaws.com/image/0cd89fde4d6e45178812b432123e648d_259x320.png
와 같이 전체 URL이 아닌image/0cd89fde4d6e45178812b432123e648d_259x320.png
와 같은 부분 경로만 반환됩니다. 이는 S3 객체에 직접 접근하는 것보다는 CloudFront를 통해 접근하는 것이 비용 절감 + 접근 속도 향상 측면에서 더 좋은 것으로 알고 있습니다.(관련 문서)이 경우 EC2가 떠 있어야 하며 관련 내용 공부도 필요하여 아직은 미구현 상태입니다. 혹시 이미지 업로드 업로드 후 객체에 직접 접근하고 싶다면 앞에 s3 경로 붙여주시면 됩니다.https://d37m2jfdnaemwx.cloudfront.net/image/355adf940d4f4a809c2793fe9964c69d_259x320.png (CloudFront를 통한 이미지 접근) / https://fora-dev.s3.ap-northeast-2.amazonaws.com/image/355adf940d4f4a809c2793fe9964c69d_259x320.png (S3에 직접 이미지 접근) => 두번째의 경우 AccessDenied 에러 발생합니다.(퍼블릭 엑세스 차단 활성화하고, CloudFront를 통해서만 접근 가능하도록 설정했기 때문) 따라서 이미지 업로드 api 호출 후 응답으로 전달되는 경로에 CloudFront 배포 도메인(https://d37m2jfdnaemwx.cloudfront.net/) 붙여서 호출해야 합니다.
참고 참고2 참고3
close #31