* 사용자의 프로필 등을 저장하는데 사용하는 기능
0. 왜 사용했는가?
우리는 사용자의 프로필, 올린 사진 등을 이미지로써 저장하게 될 것이다.
그 방안으로 최초에 DB에 직접 사진을 바이트 변환하여 저장하는 방식을 택했었다.
허나, 너무나 길어진 값 때문에 프론트와의 통신에서도 문제가 발생,
조회 시의 성능이 크게 감소하는 등의 문제가 있었다.
그러므로 이미지를 BUCKET에 저장→ 해당 URL을 DB에 저장하는 형태의 구축을 진행했다.
- 설정 변경
2. NCP 활용 SERVICE 부 구현
private AmazonS3Client amazonS3Client;
@PostConstruct
private void init() {
BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials(accessKey, secretKey);
this.amazonS3Client = (AmazonS3Client) AmazonS3ClientBuilder
.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, regionName))
.withCredentials(new AWSStaticCredentialsProvider(basicAWSCredentials))
.build();
} //일단 s3 client 생성
public String imageUpload(MultipartFile profileImg) {
String originalFileName = profileImg.getOriginalFilename();
String uploadFileName = getUuidFileName(originalFileName); //파일명 유일하게
String uploadFileUrl = "";
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(profileImg.getSize());
objectMetadata.setContentType(profileImg.getContentType()); //타입 그대로 설정
try (InputStream inputStream = profileImg.getInputStream()) {
String keyName = "profile-image" + uploadFileName;
amazonS3Client.putObject(
new PutObjectRequest(bucketName, keyName, inputStream, objectMetadata)
.withCannedAcl(CannedAccessControlList.PublicRead));
uploadFileUrl = amazonS3Client.getUrl(bucketName, keyName).toString();
log.info("image save clear");
} catch (IOException e) {
e.printStackTrace();
}
return uploadFileUrl;
}
private String getUuidFileName(String originalFileName) {
return UUID.randomUUID().toString() + "_" + originalFileName;
} //파일명 unique화
public void imageDelete(String email) {
Optional<Member> member = memberRepository.findByEmail(email);
member.orElseThrow();
String profileImageUrl = member.get().getProfileImage();
if (profileImageUrl == null || profileImageUrl.isEmpty()) {
log.info("no Profile Image");
return;
}
String keyName = profileImageUrl.substring(profileImageUrl.lastIndexOf("/") + 1);
try {
amazonS3Client.deleteObject(new DeleteObjectRequest(bucketName, keyName));
log.info("Image delete clear");
} catch (Exception e) {
log.error("can't delete image");
}
}
간단한 설명을 추가하자면
기존 S3에서 활용하는 AWSS3CLIENT를 활용해서 이미지를 저장한다.
Multpartifle, image/jpeg 형태로 받아서 이를 저장한다.
저장한 후에는, 다시 client의 저장 url을 받아온다.
삭제 또한 동일하다.
이 url이 저장되어있던 db에서 url을 받아오고, 해당 url을 활용해서 다시 접근.
이후 삭제를 진행한다
3. 깨달은 점
- Cloud 생태계끼리 경쟁 중이다.
우리는 현재 공모전을 NCP를 활용하는 형태로 구축할 예정이고, 이전에는 GCP를 활용했었다.
하지만 위에서 볼 수 있듯이, S3 CLIENT를 활용해서 NCP의 BUCKET을 사용한 형태로 쉽게 변환이 가능했다.
CLOUD 생태계 끼리도 이처럼 경쟁을 진행 중임을 알 수 있었다.
- 그러므로, 플랫폼에 너무나 제한되지 않은 넓은 활용 역량이 필요하다.
AWS만을 활용해서 CLOUD를 올릴 수 있는 것은 분명히 추가적인 역량이자 스펙이 되지만,
기업에서 어떠한 클라우드를 쓸 지, 혹은 이후에도 AWS를 쓸지는 모른다.
다양한 CLOUD 기술 활용 경험을 갖추어야 될 것이다.
- 그러므로, 이후 클라우드 기반 K8S 배포도 잘 준비하자.
현재 제공받은 NCP의 서버엔, EKS, ECS와 같은 기능이 존재하지 않는다.
내가 직접 K8S를 활용해서 클라우드 기반 배포를 진행해야 될 것이다.
그 이후에 부트캠프에선 AWS를 활용해서 배포를 진행하게 될 것이다.
이 모든 과정에 최선을 다해서, 특정 플랫폼에 제한적이지 않은 배포 역량을 잘 길러보자.
'프로젝트 > 장애인 PT 플랫폼, PTFD' 카테고리의 다른 글
CI/CD (0) | 2024.07.08 |
---|---|
NCP + K8S의 DB를 LOCAL에서 사용하기 (0) | 2024.07.06 |
1차 완성, 코드 리뷰 (2) | 2024.04.16 |
Spring Security (MSA)를 하며 만난 문제들 (0) | 2024.04.08 |
RESTFUL URL 규칙 + 협업시 지켜야 할 것들 (0) | 2024.04.06 |