본문 바로가기
네이버클라우드/JAVA 웹 프로그래밍

JAVA 60일차 (2023-08-16) 자바 프로그래밍_60. 첨부파일을 네이버 클라우드의 스토리지 서비스에 저장하기_개인프로젝트 - 마트 관리 시스템

by prometedor 2023. 8. 16.

 

## 60. 첨부파일을 네이버 클라우드의 스토리지 서비스에 저장하기

- 네이버 스토리지 서비스 사용법
- 첨부파일을 스토리지 서비스에 업로드하는 방법

 

ㄴ Services > All > Storage > Object Storage 선택

=>

ㄴ Bucket Management 선택

=>

ㄴ [+ 이용신청] 선택

=>

ㄴ 이용신청 > [v 적용] 선택

=>

ㄴ 상품 이용 중이라고 노출됨

=>

ㄴ [+ 버킷 생성] 선택

=>

ㄴ 버킷 이름 설정

=>

ㄴ [다음 >] 선택

=>

ㄴ 전체 공개 > 공개 선택 > [다음] 선택

=>

ㄴ 최종 확인 후 [v 버킷 생성] 선택

=>

ㄴ 버킷 생성됨을 확인 후 [새폴더] 선택

=>

ㄴ board 입력 > [v 저장] 선택

=>

ㄴ board 라는 이름의 폴더가 생성됨을 확인

 

 

amazonaws s3 라이브러리 추가

https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-s3/1.12.531

 

Maven Central: com.amazonaws:aws-java-sdk-s3:1.12.531

Discover aws-java-sdk-s3 in the com.amazonaws namespace. Explore metadata, contributors, the Maven POM file, and more.

central.sonatype.com

 

ㄴ amazonaws s3 검색하여 aws-java-sdk-s3 선택

=>

ㄴ Gradle (short) 선택 후 [Copy to clipboard] 선택

=>

build.gradle

ㄴ Amazon AWS Java SDK s3 라이브러리 추가하는 코드 추가

=>

ㄴ gradle 재설정

=>

ㄴ 프로젝트 Refresh 해주기

=>

ㄴ 라이브러리 추가됨을 확인

=>

ㄴ NcpObjectStorageService 라는 이름의 클래스를 생성

=>

NcpObjectStorageService.java

package bitcamp.util;

import java.io.InputStream;
import java.util.UUID;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;

public class NcpObjectStorageService {
  final AmazonS3 s3;

  public NcpObjectStorageService(NaverConfig naverConfig) {
    s3 = AmazonS3ClientBuilder.standard()
        .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(
            naverConfig.getEndPoint(), naverConfig.getRegionName()))
        .withCredentials(new AWSStaticCredentialsProvider(
            new BasicAWSCredentials(naverConfig.getAccessKey(), naverConfig.getSecretKey())))
        .build();
  }

  @Override
  public String uploadFile(String bucketName, MultipartFile file) {
    if (file.isEmpty()) {
      return null;
    }

    try (InputStream fileIn = file.getInputStream()) {
      String filename = UUID.randomUUID().toString();

      ObjectMetadata objectMetadata = new ObjectMetadata();
      objectMetadata.setContentType(file.getContentType());

      PutObjectRequest objectRequest =
          new PutObjectRequest(bucketName, filename, fileIn, objectMetadata)
              .withCannedAcl(CannedAccessControlList.PublicRead);

      s3.putObject(objectRequest);

      return s3.getUrl(bucketName, filename).toString();

    } catch (Exception e) {
      throw new RuntimeException("파일 업로드 오류", e);
    }
  }
}

=>

ㄴ NcpConfig 라는 이름의 클래스 생성

=>

NcpConfig.java

=>

NcpConfig.java

=>

ㄴ [Select All] 선택하여 Getter/Setter 추가해주기

 

 

 

=>

ㄴ Object Storage > [자세히 보기 >] 선택

=>

ㄴ [사용 가이드] 선택

=>

ㄴ Storage > Object Storage > Amazon S3 API 활용 예제 > Java용 AWS SDK 선택

=>

ㄴ 해당 코드 복사

=>

NcpConfig.java

ㄴ 복사한 코드 붙여넣기

=>

ㄴ 해당 코드 복사

=>
NcpConfig.java

ㄴ 복사한 코드 붙여넣기

=>

ㄴ 마이페이지 > 인증키 관리 선택

=>

ㄴ Access Key  복사하기

=>

NcpConfig.java

ㄴ 복사한 Access Key 붙여넣기

=>

ㄴ Secret Key > [보기] 선택 > Secret Key 복사하기

=>

NcpConfig.java

ㄴ 복사한 Secret Key 붙여넣기

=>

=>

ㄴ 네이버에 "나의 IP" 검색하여 내 아이피 알아내기

=>

ㄴ 알아낸 ip 입력 > [저장] 선택

=>

NcpObjectStorageService.java

ㄴ NaverConfig -> NcpConfig 로 변경

=>

NcpObjectStorageService.java

=>

NcpObjectStorageService.java

=>

NcpObjectStorageService.java

ㄴ MultipartFile -> Part 로 변경해주기

ㄴ file -> part 로 변경해주기

ㄴ isEmpty() -> getSize() == 0 으로 변경해주기

=>

NcpObjectStorageService.java

ㄴ file -> part 로 변경해주기

=>

NcpObjectStorageService.java

ㄴdirPath 를 추가로 받도록 함

=>

NcpObjectStorageService.java

ㄴ filename 에 dirPath 추가해주기

=>

NcpObjectStorageService.java

ㄴ @Override 애노테이션 제거

=>

NcpObjectStorageService.java

 

 

InitServlet.java

ㄴ NcpObjectStorageService 를 필드에 선언

=>

InitServlet.java

ㄴ NcpConfig 클래스의 인스턴스를 생성
ㄴ 생성된 NcpConfig 인스턴스를 사용하여 NcpObjectStorageService 인스턴스를 생성하도록 함

 

 

BoardAddServlet.java

ㄴ 업로드 파일 경로인 uploadFileUrl 에 NcpObjectStorageService의 uploadFile 메서드를 호출하여 얻은 값을 저장

=>

BoardAddServlet.java

ㄴ 설정한 uploadFileUrl 값을 파일경로로 설정해주기

=>

App.java

ㄴ App.java 실행

=>

=>

=>

=>

=>

=>

ㄴ 게시글이 정상적으로 등록됨을 확인

=>

ㄴ 클라우드에 board 폴더 안에 등록한 이미지 들어가있는지 확인

 

 

NcpObjectStorageService.java

ㄴ 해당 코드 주석처리 후 filename 만 출력 해보도록 하기

=>

=>

=>

=>

ㄴ 경로를 찾지 못하는 문제 발생

=>

ㄴ 업로드된 파일 Link 복사하기

=>

BoardDetailServlet.java

ㄴ 복사한 Link 붙여넣기

=>

BoardDetailServlet.java

ㄴ board/ 이후는 파일 이름이므로 제거 후 %s 를 이용하여 파일 이름을 받아 출력하도록 함

=>

ㄴ 게시글 상세보기 페이지에서 파일 링크 선택 시 정상적으로 출력됨을 확인

 

 

github 에 commit 시 Access Key 값, Secret Key 값 업로드하지 않도록 해주기

ㄴ Run Configurations... 선택

=>

ㄴ -DaccessKey 에는 accessKey 값을 넣어줌

ㄴ -DsecretKey 에는 secretKey 값을 넣어줌

ㄴ [Run] 선택

=>

 

 

NcpConfig.java

ㄴ 생성자를 이용하여 해당 프로퍼티 값 출력해보도록 함

=>

ㄴ 각 키 값을 정상적으로 출력함을 확인

=>

NcpConfig.java

ㄴ 이렇게 설정해주면 코드에서는 해당 accessKey, secretKey 값을 노출하지 않을 수 있음

=>

App.java 실행

=>

ㄴ 서버가 정상적으로 실행됨을 확인

=>

=>

=>

=>

=>

ㄴ 클라우드의 Storage 에 파일 업로드됨을 확인

 

 

 

ㄴ src/main/webapp/upload/board 폴더에 존재하는 파일 모두 삭제해주기