일단 맨 처음엔 외국 문서위주로 읽었는데 대충 알겠는데 감이 잘 안옴... 코드는 알겠어... 근데 순서를 어떻게 설정하지?
한국 문서 먼저 여러가지를 쭉 읽었슴다..
https://charlie-choi.tistory.com/236
이 두 가지를 제일 많이 참고했어요 감사합니다...ㅎㅎ
그리고
https://www.baeldung.com/aws-s3-java
이걸 읽고 제일 필요한 핵심기능이 뭔지 감을 잡고, 설정하는 부분이라던지 비즈니스 로직은 저 두 분의 문서를 보면서
최대한 코린이인 저의 눈높이에 맞게 추출했습니다. 필요한 기능이 업로드밖에 없어서요..ㅜㅜ 넘 간단하네요
1. AWS 연결 하기
일단 pom.xml에 디펜던시를 가지고 옵니다
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.12.12</version>
</dependency>
Configuration 파일을 하나 만들어줬습니다.
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
@Configuration
@EnableWebMvc
public class AWSConfiguration implements WebMvcConfigurer{
@Value("${aws.accesskey}")
private String accessKey;
@Value("${aws.secretkey}")
private String secretKey;
@Bean
public BasicAWSCredentials AwsCredentials() {
BasicAWSCredentials AwsCreds = new BasicAWSCredentials(accessKey, secretKey);
return AwsCreds;
}
@Bean
public AmazonS3 AwsS3Client() {
AmazonS3 s3Builder = AmazonS3ClientBuilder.standard()
.withRegion(Regions.AP_NORTHEAST_2)
.withCredentials(new AWSStaticCredentialsProvider(this.AwsCredentials()))
.build();
return s3Builder;
}
}
깃 이그노어 처리를 위해 properties에 비밀키를 전부 넣어주시구요
AWS 설정하는 빈은 따로 관리할 수 있게 해주시고요
2. AWS S3 Service
@Service
public class AwsS3Biz {
@Autowired
private AmazonS3 s3Client;
@Value("${aws.bucketname}")
private String bucketName;
public String uploadObject(MultipartFile multipartFile, String storedFileName) throws IOException {
String filePath = "/" + storedFileName;
// 1. bucket name, 2. key : full path to the file 3. file : new File로 생성한 file instance
// 2. PutObjectRequest로 구현 가능
s3Client.putObject(new PutObjectRequest(bucketName, filePath, multipartFile.getInputStream(), null));
return s3Client.getUrl(bucketName, filePath).toString();
}
public void deleteObject( String storedFileName) throws AmazonServiceException {
s3Client.deleteObject(new DeleteObjectRequest(bucketName + "/" , storedFileName));
}
}
저는 정말 쓰는 코드가 이것밖에 없어서 업로드, 삭제만 가져다 좋았구요 삭제는 사실 사용안할거 같긴합니다만,
실서비스에서는 이것도 주기적으로 관리가 될 수 있는 시스템이 필요하겠죠?
언제 쓸 지 몰라서 일단 하나 만들어 두긴 했습니다.
필요한 기능이 추가로 있으시면 여러가지 기능이 아주 많아요 필요하신 분들은 쭉 읽어보시고 적용하시구요...
3. Controller 연결
@Controller
public class FileUploadController {
private static final Logger logger = LoggerFactory.getLogger(FileUploadController.class);
@Autowired
private AwsS3Biz s3Service;
@Value("${aws.accesskey}")
private String accessKey;
// 파일 업로드 처리
@RequestMapping(value = "/image.do", method = RequestMethod.POST)
@ResponseBody
public String uploadFile(HttpServletRequest request, MultipartFile file) throws Exception {
String originalFileName = file.getOriginalFilename();
// ========= 파일명 중복 방지 처리 ========= //
String uuidFileName = getUuidFileName(originalFileName);
// ========= 이미지 파일 사이즈 체크 ========= //
int[] imageSize = checkImageSize(file);
System.out.println("width = "+ imageSize[0] + "height = " + imageSize[1]);
// ========= 서버에 파일 저장 ========= //
String res = s3Service.uploadObject(file, uuidFileName);
System.out.println(res);
return "<버킷주소>"+uuidFileName;
}
private static String getUuidFileName(String originalFileName) {
return UUID.randomUUID().toString() + "_" + originalFileName;
}
}
버킷주소는 https://<버킷이름>.s3.ap-northeast-2.amazonaws.com/+ 폴더이름
이런 식으로 형성 됩니다.
'Back-end > Spring' 카테고리의 다른 글
HTTP Request Body, Header 값 받기 (0) | 2021.07.03 |
---|---|
[Spring MVC] 이미지 업로드시 S3 Bucket 에 업로드하기 (1) - AWS 계정 설정, 버킷 생성, 권한 설정 (0) | 2021.06.27 |