[Spring MVC] 이미지 업로드시 S3 Bucket 에 업로드하기 (2) - S3연결 및 비즈니스 로직짜기

Back-end/Spring

[Spring MVC] 이미지 업로드시 S3 Bucket 에 업로드하기 (2) - S3연결 및 비즈니스 로직짜기

조커린 2021. 6. 27. 15:44

일단 맨 처음엔 외국 문서위주로 읽었는데 대충 알겠는데 감이 잘 안옴... 코드는 알겠어... 근데 순서를 어떻게 설정하지?

한국 문서 먼저 여러가지를 쭉 읽었슴다..

 

https://charlie-choi.tistory.com/236

https://ecsimsw.tistory.com/entry/AWS-%EC%82%AC%EC%9A%A9%EA%B8%B0-S3-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0?category=989733

이 두 가지를 제일 많이 참고했어요 감사합니다...ㅎㅎ

 

그리고 

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/+ 폴더이름

 

 

이런 식으로 형성 됩니다.