CoNet 프로젝트 백엔드 파트 기록
OverView
- AWS S3 bucket 설정
- AWS IAM user 생성
- Spring Project Setting (여기까지 이전 포스트)
- 이미지 업로드 및 객체 url 가져오기
- 이미지 삭제
- API Test
이전 포스트
이미지 업로드
Spring 프로젝트에서 S3에 이미지를 업로드하고 객체 url 사용하기
ex. 사용자의 프로필 이미지 업로드
Controller
클라이언트로부터 MultipartFile 타입의 파일을 받는다.
private final StorageService storageService;
@PostMapping("/image")
public BaseResponse<StorageImgResponse> uploadProfileImage(@RequestParam(value = "file") MultipartFile file) throws IOException {
StorageImgResponse response = storageService.uploadProfileImage(file, 8L);
return new BaseResponse<>(response);
}
Service
- fileName setting
- ex. userId-profileImage-SaveDateTime
- metadata 설정
- S3에 업로드
- S3에 업로드한 파일 URL 가져오기
@Value("${cloud.aws.s3.bucket}")
private String bucketName;
@Autowired
private AmazonS3Client amazonS3Client;
public StorageImgResponse uploadProfileImage(MultipartFile file, Long userId) throws IOException {
String fileName = userId + "-profileImage-" + String.valueOf(LocalDateTime.now());
fileName = fileName.replace(" ", "-").replace(":", "-").replace(".", "-") + ".png";
long size = file.getSize(); // 파일 크기
ObjectMetadata objectMetaData = new ObjectMetadata();
objectMetaData.setContentType(file.getContentType());
objectMetaData.setContentLength(size);
// S3에 업로드
amazonS3Client.putObject(
new PutObjectRequest(bucketName, fileName, file.getInputStream(), objectMetaData)
.withCannedAcl(CannedAccessControlList.PublicRead)
);
// URL 가져오기
String imgUrl = amazonS3Client.getUrl(bucketName, fileName).toString();
return new StorageImgResponse(fileName, imgUrl);
}
S3에 업로드한 파일(객체) url 가져오기
S3에 업로드한 파일의 url을 가져오는 방법은 간단하다.
getUrl이라는 메서드에 버킷 이름과 파일 이름만 전달하면 가져올 수 있다.
amazonS3Client.getUrl(bucketName, fileName);
이미지 삭제
형식
S3 버킷에 저장된 객체는 파일명으로 삭제할 수 있다.
amazonS3Client.deleteObject(bucketName, fileName);
객체 URL에서 파일 이름 추출
만약, 프로젝트에서 파일 이름이 아닌 객체 url을 저장하고 사용한다면 파일 이름을 추출한 후 삭제를 요청할 수 있다.
객체 URL
S3에 업로드 한 파일의 url은 https://<AWS S3 Bucket 도메인>/<파일 이름>
과 같다.
파일 이름 추출
따라서, ‘/’를 기준으로 split을 한 후 index 3에 해당하는 값으로 파일 이름을 추출할 수 있다.
private final String URL_SPLITER = "/";
String fileName = imgUrl.split(URL_SPLITER)[3];
// ["https:", "", "<AWS S3 Bucket 도메인>", "<파일 이름>"]
Example
CoNet 프로젝트의 회원 프로필 이미지 변경 API 구현 내용
사용자의 기존 프로필 이미지가 기본 이미지인지에 대한 검사를 진행한다.
- 기본 이미지
- 새로운 이미지 업로드 및 DB 업데이트
- 기본 이미지가 아닌 경우
- 기존 이미지를 S3에서 삭제
- 새로운 이미지 업로드 및 DB 업데이트
Code
// 유저의 프로필 이미지가 기본 프로필 이미지인지 확인 -> 기본 이미지가 아니면 기존 이미지를 S3에서 이미지 삭제
if (!userDao.isDefaultImage(userId)) {
String imgUrl = userDao.getUserImgUrl(userId);
String fileName = imgUrl.split(URL_SPLITER)[3];
storageService.deleteImage(fileName);
try {
amazonS3Client.deleteObject(bucketName, fileName);
} catch (AmazonServiceException e) {
throw new StorageException(BAD_REQUEST, e.getMessage());
}
}
API Test