티스토리 뷰

Spring

Spring Boot AWS S3 FileUpload

Young_J 2021. 2. 1. 22:25

1. AWS 버킷 생성

docs.aws.amazon.com/ko_kr/AmazonS3/latest/user-guide/create-bucket.html

 

S3 버킷을 생성하려면 어떻게 해야 하나요? - Amazon Simple Storage Service

S3 버킷을 생성하려면 어떻게 해야 하나요? Amazon S3에 데이터를 업로드하기 전에, 먼저 AWS 리전 중 하나에 데이터를 저장할 버킷을 생성해야 합니다. 버킷을 생성하면, 해당 버킷에 데이터 객체를

docs.aws.amazon.com

 

2. 버킷 권한 변경

 

3. IAM 생성

- 사용자 추가 ( 프로그래밍 방식 엑세스 체크)

- 기존 정책에 연결 

- 사용자 만들기 ( Access key 와 Secret key 를 얻을 수 있음 )

 

4. pom.xml에 dependency 추가

<!-- AWS s3 -->
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-s3 -->
  <dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk</artifactId>
    <version>1.11.372</version>
  </dependency>

 

5.  application.properties 추가 

※ accessKey 와 secretKey는 git에 올리지 말 것. .gitignore에 application.properties 등록 필수

# AWS 
cloud.aws.credentials.accessKey=userAccessKey
cloud.aws.credentials.secretKey=userSecretKey
## AWS 
cloud.aws.s3.bucket=userProject
cloud.aws.region.static=ap-northeast-2
cloud.aws.stack.auto=false

 

6. S3Service 클래스 

package com.spring.web.service;

import java.io.IOException;
import java.util.UUID;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
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.PutObjectRequest;

@Service
public class S3Service {

	private AmazonS3 s3Client;

	@Value("${cloud.aws.credentials.accessKey}")
	private String accessKey;

	@Value("${cloud.aws.credentials.secretKey}")
	private String secretKey;

	@Value("${cloud.aws.s3.bucket}")
	private String bucket;

	@Value("${cloud.aws.region.static}")
	private String region;
	
	// @PostContstruct -> @PostConstruct 어노테이션을 설정해놓은 init 메소드는 WAS가 띄워질 때 실행된다.
	@PostConstruct
	public void setS3Client() {
		AWSCredentials credentials = new BasicAWSCredentials(this.accessKey, this.secretKey);

		s3Client = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(credentials))
				.withRegion(this.region).build();
	}

	public String upload(MultipartFile file) throws IOException {
		String fileName = file.getOriginalFilename(); //오리지널 파일이름
		String ext = fileName.substring(fileName.indexOf('.')); // 확장자
		String saveFileName = getUuid() + ext; // 저장 할 파일이름 -> 중복될 수 있기 때문에 고유값인 UUID를 통해 임시 파일명으로 업로드
		

		s3Client.putObject(new PutObjectRequest(bucket, saveFileName, file.getInputStream(), null)
				.withCannedAcl(CannedAccessControlList.PublicRead));
		
		// 저장된 이미지의 url 리턴
		return s3Client.getUrl(bucket, saveFileName).toString();
	}

	private static String getUuid() {
		return UUID.randomUUID().toString().replaceAll("-", "");
	}

}

- 파일명이 같은 파일은 여러개 업로드 되지 않기 때문에 고유값인 UUID (거의 중복이없는)를 파일명으로 해서 업로드

 

 

7. 컨트롤러에서 해당 매서드 호출

@PostMapping("upload")
	public String execWrite(@RequestPart MultipartFile file) throws IOException {
		
		logger.info("file upload method start");
        String imgPath = s3Service.upload(file);

        return imgPath;
    }

 

 

 

 

 

 

참고 : victorydntmd.tistory.com/334

 

[SpringBoot] AWS S3 연동 (1) - 파일 업로드 기본 (AmazonS3ClientBuilder)

Springboot S3 업로드를 구현하는 시리즈입니다. [SpringBoot] AWS S3 연동 (1) - 파일 업로드 기본 (AmazonS3ClientBuilder) [SpringBoot] AWS S3 연동 (2) - 파일 조작 및 Cloud Front 전체 소스 코드는 여..

victorydntmd.tistory.com

 

'Spring' 카테고리의 다른 글

JAVA_HOME not found in your environment 에러  (0) 2021.02.04
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함