본문 바로가기
프로젝트/장애인 PT 플랫폼, PTFD

NCP로 GCP 활용 부 변경

by 임지혁코딩 2024. 7. 4.

* 사용자의 프로필 등을 저장하는데 사용하는 기능

 

0. 왜 사용했는가?

우리는 사용자의 프로필, 올린 사진 등을 이미지로써 저장하게 될 것이다.

그 방안으로 최초에 DB에 직접 사진을 바이트 변환하여 저장하는 방식을 택했었다.

허나, 너무나 길어진 값 때문에 프론트와의 통신에서도 문제가 발생,

조회 시의 성능이 크게 감소하는 등의 문제가 있었다.

그러므로 이미지를 BUCKET에 저장→ 해당 URL을 DB에 저장하는 형태의 구축을 진행했다.

 

  1. 설정 변경

 

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를 활용해서 배포를 진행하게 될 것이다.

이 모든 과정에 최선을 다해서, 특정 플랫폼에 제한적이지 않은 배포 역량을 잘 길러보자.