후기
구글링을 하면서 개발을 했는데 AWS 인증하는 방식이 과거방식과 최신방식 2개가 있는 것 같았다. 과거 방식은 곧 deprecated된다고 해서 최신 방식으로 시도를 했는데 이유는 못 찾았는데 결국 잘 안되서 과거 방식으로 구현했다.
참고로 최신방식으로 구현한 코드는 아래와 같은데 왜 안되는지 잘 모르겠다..ㅜㅜ
public AWSs3(){
try{
BasicAWSCredentials creds = new BasicAWSCredentials(accessKey, secretKey);
this.s3Client = AmazonS3ClientBuilder
.standard()
.withCredentials(new AWSStaticCredentialsProvider(creds))
.withRegion("ap-northeast-2")
.build();
}catch(Exception e){
System.out.println(e);
e.printStackTrace();
}
}
아무튼 이제 과거방식으로 aws 인증해서 서버로부터 나의 aws s3 로 객체를 만드는 방법을 설명하겠다
참고로 accessKey나 secretKey는 aws 계정에서 나의보안자격증명에 가면 얻을 수 있고
s3 생성 및 버킷생성은 매우 간단하므로 구글링하면 된다.
pom.xml
<!-- 아마존 s3 -->
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-s3 -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.11.699</version>
</dependency>
AWS 자바객체 만들기
AWS S3 관련 객체를 만들건데 이 객체가 하는일은
1. 생성자를 정의하면서 S3 AccessKey와 secretKey로 나의 s3와 인증을 한다
2. s3에 객체(여기서 말하는 객체는 s3객체를 말함) 업로드/삭제 등등의 메소드 구현
이를 할 수 있는 AWSs3객체는 아래와 같다
@Component
public class AWSs3 {
private String accessKey ="s3 accessKey를 넣어주세요";
private String secretKey ="s3 secretKey를 넣어주세요";
private AmazonS3 s3Client;
private AWSs3() {
AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setProtocol(Protocol.HTTP);
this.s3Client = new AmazonS3Client(credentials, clientConfig);
s3Client.setEndpoint("s3.ap-northeast-2.amazonaws.com"); // 아시아 태평양 서울
}
public void fileupload(String bucketName,String fileName, File file) throws FileNotFoundException{
String fileExt = file.getName().split("[.]")[1];
this.s3Client.putObject(new PutObjectRequest(bucketName, "bucket하위 경로/"+fileName+"."+fileExt, file)
.withCannedAcl(CannedAccessControlList.PublicRead));
}
}
[AWSs3 생성자]
accessKey와 secretKey를 이용해서 AWSCredential타입 객체 "credentials"를 만들어주고
ClientConfiguration타입 객체 "clientConfig"를 생성해서 프로토콜을 지정해준다
(http로 하든 https로 하든 상관없었다)
이 두개의 객체 "credentials"와 "clientConfig" 를 인자로 AmazonS3타입 객체 "s3client" 를 만들고 엔드포인트를 위와 같이 정해준다
s3Client객체가 업로드나 삭제 관련 기능을 수행해주겠지?
[fileupload 메소드]
@service로 부터 인자는 buckentName, fileName, file을 받아오는데 인자에 대한 설명은 아래와 같다
bucketName : s3버킷이름이다
fileName : 파일의 originalName과 다른 naming을 하고 있어서 @service로부터 받아왔다
file : 파일 데이터 자체인데 여기서 타입이 multipartFile이 아닌 자바 File 타입이라는것이 중요하다 즉, @Service에서 @contorller에서 받은 multipartFile을 자바 File타입으로 바꿔주어야 한다
이제 아까 생성자에서 만든 s3client 객체의 putObject메소드를 사용하는 일만 남았다. putObject메소드 안에 PutObjectRequest객체를 인자로 넣어주면 되는데 이때 PutObjectRequest의 인자에 대한 설명은 아래와 같다.
[ PutObjectRequest 인자 설명]
첫번째 인자
업로드할 버킷의 이름
두번째 인자
s3에서는 key라고 한다. 나중에 업로드 되고나서 실제로 s3 들어가서 객체의 개요를 보면 정확히 key라는 이름으로 명시가 되어있는 것을 확인할 수 있는데 버킷 하위의 경로(파일이름까지 포함되어야한다)를 의미한다.
예를 들어 버킷이름은 temp이고 하위에 image라는 폴더아래에 img1.jpg가 있다면 key는 "image/img1.jpg"라는 문자열이 된다.
세번째 인자
파일 데이터를 담고 있는 자바 File 객체
'Spring' 카테고리의 다른 글
Spring +STOMP+SOCKJS 채팅 구현(STOMP 작동방식) (2) | 2020.02.06 |
---|---|
Spring maven 프로젝트 생성 (0) | 2019.08.27 |