[[내일배움캠프-Sparta]/Spring 6기 ( + TIL )] - TIL 81 - [ Spring 최종 프로젝트 ( Day 17 ) - 코드 리팩토링, S3 초기 세팅 ]
TIL 81 - [ Spring 최종 프로젝트 ( Day 17 ) - 코드 리팩토링, S3 초기 세팅 ]
⚡ 코드 리팩토링timeLimit 데이터 타입 변경 ( Long, Swagger 재수정 ) ✅Difficulty Enum (난이도) 로직 변경 ✅컬럼(DTO?) 추가 필요 ( 정답 제출 , 총 제출 수 )⚙ S3 AWS에서 제공하는 인터넷 스토리지 서비스
dimenshun.tistory.com
❌ S3 잘못된 사용
1️⃣ buildgradle에서 호환성 문제가 발견되었다. AmazonS3가 동작하지 않아서 호환성 문제 이슈가 발생했다.
// S3 SDK
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
그래서 S3 buld.gradle을 기존 것을 지우고, 새로운 것으로 하니 되었다.
2️⃣ 처음에는 S3 Bucket 을 문제 이미지 로만 만들었다. ( 버킷은 하나의 기능으로 구분지어서 해야한다고 생각 함 )


하지만, 이렇게 한다면 비용적인 측면에서 큰 타격을 입을 수 있다.
만약 문제 이미지와 프로필 이미지를 구현하려고 하는데, 하나 하나 씩 버킷을 만들어서 한다면 AWS에서 버킷 마다 따로 따로 요금을 청구 하게 되어, 비용 면에서 큰 손해를 볼수 있다.

그리고 만든 버킷 마다 하나 하나의 불필요한 클래스와 properties에 하나만 추가 되어야하는데 여러개의 변수명으로 써야 한다는 단점이 있었다.
그래서 곧장 하나로 고쳐서 S3를 사용하는 팀원들에게 공유하면서 작업을 진행하였다.
S3 Bucket 프로젝트 단위로 생성 해주는 것이 바람직 하다는 것을 깨달았다.
🤔 기능 구현
먼저 인프라 패키지에 S3 패키지를 추가해서 @Bean으로 등록해주어야 하기 때문에 config를 작성해주었다.
@Configuration
@RequiredArgsConstructor
public class S3Config {
@Value("${cloud.aws.credentials.access-key}")
private String accessKey;
@Value("${cloud.aws.credentials.secret-key}")
private String secretKey;
@Value("${cloud.aws.region.static}")
private String region;
@Bean
public AmazonS3 amazonS3() {
BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
return AmazonS3ClientBuilder.standard()
.withRegion(region)
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.build();
}
}
기술 블로그를 참고하면서 S3에 IAM accessKey와 secretKey 그리고 region 정보를 변수로 가져와서 저장해주며, AmazonS3를 빈에 등록한다.
@Component
@RequiredArgsConstructor
public class S3Uploader {
private final AmazonS3 amazonS3;
@Value("${cloud.aws.s3.bucket}")
private String bucket;
public String upload(MultipartFile multipartFile, String dirName) throws IOException {
String fileName = dirName + "/" + UUID.randomUUID() + "-" + multipartFile.getOriginalFilename();
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(multipartFile.getSize());
metadata.setContentType(multipartFile.getContentType());
amazonS3.putObject(bucket, fileName, multipartFile.getInputStream(), metadata);
return amazonS3.getUrl(bucket, fileName).toString(); // 업로드 파일 URL로 변환 ( 문자열 )
}
}
그리고 여기서 버킷 정보를 변수에 저장해 가져온다.
upload 메소드는 이제 dirName 부분에서 prefix로 만약 프로필 이미지면 profile, 문제 이미지면 problem 이런 식으로 구분 할수 있다.
아직 기능을 구현을 다하지 못했지만, 얼른 기능을 완성하고 추후에 커스텀 예외처리를 적용해야 겠다.
[참고]
[공부정리] AWS S3를 이용한 파일 저장
이번 게시글에서는 AWS S3를 이용하여 새 파일을 저장하는 과정을 기술하겠다. 본래에는 도커를 이용하여 파일을 관리할 생각이었으나, S3를 사용하면 얻는 장점이 많기도 하고 CloudFront를 적용하
velog.io
'[내일배움캠프-Sparta] > Spring 6기' 카테고리의 다른 글
| TIL 84 - [ Spring 최종 프로젝트 ( Day 20 ) - S3 문제 이미지 기능 구현, contextLoads() 에러 ] (0) | 2025.06.25 |
|---|---|
| TIL 83 - [ Spring 최종 프로젝트 ( Day 19 ) - S3 문제 이미지 기능 구현, 브로셔 작업 ] (0) | 2025.06.24 |
| TIL 81 - [ Spring 최종 프로젝트 ( Day 17 ) - 코드 리팩토링, S3 초기 세팅 ] (0) | 2025.06.21 |
| TIL 80 - [ Spring 최종 프로젝트 ( Day 16 ) - 문제 찾기,, ] (0) | 2025.06.19 |
| TIL 79 - [ Spring 최종 프로젝트 ( Day 15 ) - 문제 파트 의사결정 ] (0) | 2025.06.18 |