## 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
ㄴ 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 폴더에 존재하는 파일 모두 삭제해주기