이끌든지 따르든지 비키든지

Framework/Spring

[Spring] 애플리케이션과 NCP Object Storage 연결하기

SeongHo5 2024. 3. 25. 21:20

 

Spring 애플리케이션과 네이버 클라우드 플랫폼(NCP)의 Object Storage 간 연결을 구성하는 방법에 대해 알아보겠습니다.

 

💡Object Storage?
데이터를 객체 단위로 저장하는 서비스로, AWS의 S3와 유사한 서비스입니다.

 

 

1. Object Storage 버킷 생성하기


 

NCP 콘솔에 로그인하셨다면, 왼쪽 메뉴 중 Services를 클릭 후, Object Storage를 클릭해주세요.

 

 

 

 

최초로 해당 서비스에 접근하는 경우, 이용 신청 및 약관 동의를 먼저 진행해야 합니다.

동의 후, Bucket Management → 버킷 생성을 진행해 주세요.

 

 

 

 

다음으로, 생성할 버킷의 이름을 입력합니다.

버킷의 이름은 리전 내에서 유일한 이름이여야 합니다!

 

 

 

 

이후, 설정 관리(잠금 여부 및 저장 객체의 암호화 여부), 권한 관리(버킷 이용에 대한 전체 공개 여부)는 변경하지 않고, 버킷 생성을 마무리해줍니다.

 

 

버킷 생성 이후, 바로 파일을 업로드하려는 경우, 파일 올리기 버튼을 통해 네이버 MYBOX, Google Drive처럼 파일을 업로드할 수 있고, 새폴더 버튼으로 파일을 분류해 저장할 수 있습니다.

 

 

 

 

2. Access/Secret 키 발급하기


 

Spring 애플리케이션에서 Object Storage 등 서비스에 접근하려면 API 인증키가 필요합니다.

 

상단 메뉴의 계정 정보(개인 계정의 경우 본인의 이름이 나오는데, 가려두었습니다!) 계정 관리 메뉴로 진입해주세요.

 

 

 

 

인증키 관리 → 신규 API 인증키 생성을 진행해주세요!

 

 

 

 

생성 완료 후 표시되는 Access KeySecret Key를 연결 설정 프로퍼티로 사용하게 됩니다.

 

 

3. Spring에서 연결 설정 구성하기


 

AWS S3에서 제공하는 Java용 SDK를 이용해 네이버 클라우드 플랫폼의 Object Storage를 사용할 수 있습니다.

 

    // build.gradle
    implementation 'io.awspring.cloud:spring-cloud-starter-aws:{your_version}'
    implementation 'com.amazonaws:aws-java-sdk-s3:{your_version}'

 

 

AWS SDK에 대한 의존성을 추가하고, properties에 아래 내용을  추가합니다.

 

 

# application.yml
ncp:
  storage:
    region: kr-standard
    endpoint: https://kr.object.ncloudstorage.com
    accessKey: {위에서_발급한_ACCESS_KEY}
    secretKey: {위에서_발급한_SECRET_KEY}

 

 

그 후, Config 클래스를 작성해줍니다.

 

 

@Configuration
public class NCPStorageConfig {

    @Value("${ncp.storage.region}")
    private String region;

    @Value("${ncp.storage.endpoint}")
    private String endPoint;

    @Value("${ncp.storage.accessKey}")
    private String accessKey;

    @Value("${ncp.storage.secretKey}")
    private String secretKey;

    @Bean
    public AmazonS3Client objectStorageClient() {
        return (AmazonS3Client) AmazonS3ClientBuilder.standard()
                .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, region))
                .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
                .build();
    }

}

 

 

3. 코드 작성하기


 

구성한 연결 정보를 사용해 간단하게 MultipartFile을 업로드하고, URL을 반환하는 메서드와, 지정한 이름의 파일을 삭제하는 메서드를 작성합니다.

 

 

@Service
@RequiredArgsConstructor
public class FileService {

    private static final String BUCKET_NAME = "	grafika";
    private static final String DIRECTORY_SEPARATOR = "/";
    
    private final AmazonS3Client objectStorageClient;

    private String putFileToBucket(MultipartFile file, String fileName, ObjectMetadata objectMetadata) {
        try {
            PutObjectRequest request = new PutObjectRequest(BUCKET_NAME, fileName, file.getInputStream(), objectMetadata);
            objectStorageClient.putObject(request);
        } catch (IOException e) {
            throw new ServiceFailedException(FAILED_TO_UPLOAD_FILE);
        }
        return objectStorageClient.getUrl(BUCKET_NAME, fileName).toString();
    }

    private void deleteFileFromBucket(String url, String dirName) {
        final String[] split = url.split("/");
        final String fileName = dirName + DIRECTORY_SEPARATOR + split[split.length - 1];
        DeleteObjectRequest request = new DeleteObjectRequest(BUCKET_NAME, fileName);
        objectStorageClient.deleteObject(request);
    }

}

 

 

Postman Desktop을 활용하면, 파일 업로드 요청도 쉽게 테스트해볼 수 있습니다.

(Body → form-data → Text를 File 타입로 변경하고, 파일 선택)

 

 

 

 

※ 참고한 문서 및 더 자세한 정보

 

Java용 AWS SDK

 

guide.ncloud-docs.com