본문 바로가기

Spring

Spring과 AWS S3 연동 파일 업로드

 

후기

 

구글링을 하면서 개발을 했는데 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