EC2 서버를 이용하여 프로젝트를 배포하고 나니, 게시글 이미지와 회원 프로필 이미지에 대한 부분이 개인 로컬 PC에 저장되도록 구현되어 있는 부분을 S3 서버를 적용하여 파일을 관리하고자 적용해보려고 합니다.
[ 기존 설정 ]
upload:
post:
image:
location: /Users/zerozae/Desktop/sharing_platform_server/post/
member:
image:
location: /Users/zerozae/Desktop/sharing_platform_server/member/
- 기존 yml 설정을 통해 개인 로컬 PC에 이미지에 대한 파일 관리를 하고 있었습니다.
이제, 이전에 생성한 IAM과 버킷을 이용해 S3 서버를 통해 스프링 부트와 연동하여 파일을 관리해보는 부분을 적용해보겠습니다.
Spring Boot 연동
1. build.gradle 의존관계 추가
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
2. yml 설정
cloud:
aws:
s3:
bucket: sharingplatformbucket
stack:
auto: false
region:
static: ap-northeast-2 // 지역 - 서울
credentials:
access-key:
secret-key:
- IAM (사용자) 생성을 통해 발급 받았던 공개키와 비밀키를 설정해줍니다.
- 버킷을 생성할 때 지정한 버킷 이름을 설정해줍니다.
- region : 아시아 태평양 (서울) -> ap-northeast-2
gitignore
: 발급 받은 AccessKey와 SecretKey 처럼 민감한 정보는 꼭 github에 올라가지 않도록 설정해줍니다.
3. 스프링 설정 추가
@Configuration
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 AmazonS3Client amazonS3Client() {
BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
return (AmazonS3Client) AmazonS3ClientBuilder.standard()
.withRegion(region)
.withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
.build();
}
}
- @Value 어노테이션을 사용해 application.yml 파일에서 설정 값을 가져와 해당 필드에 주입 해줍니다.
- 각각의 필드는 AWS 계정의 액세스 키, 비밀 키, 그리고 지역(region) 정보를 저장하게 됩니다.
- @Bean 어노테이션을 사용해 amazonS3Client 메소드를 정의합니다. 이 메소드는 Spring의 Bean으로 등록되어 필요한 곳에서 Amazon S3 클라이언트를 주입받아 사용할 수 있게 됩니다.
- AmazonS3ClientBuilder 클래스를 사용해 Amazon S3 클라이언트를 구성하고 생성합니다.
- withRegion() 메소드로 지역 정보를 설정합니다.
- withCredentials() 메소드로 액세스 키와 비밀 키를 제공하여 자격 증명을 구성합니다.
- 최종적으로 build() 메소드를 호출하여 Amazon S3 클라이언트를 생성하고 반환합니다.
4. PostFileService ( 로컬 -> S3 서버 저장으로 수정)
@Service
@RequiredArgsConstructor
public class PostFileService {
@Value("${cloud.aws.s3.bucket}")
private String BUCKET;
private final AmazonS3Client amazonS3Client;
public void upload(MultipartFile file, String filename) {
try {
ObjectMetadata metadata= new ObjectMetadata();
metadata.setContentType(file.getContentType());
metadata.setContentLength(file.getSize());
amazonS3Client.putObject(BUCKET + "/post", filename, file.getInputStream(), metadata);
} catch(IOException e) {
throw new FileUploadFailureException();
}
}
public void delete(String fileName){
DeleteObjectRequest request = new DeleteObjectRequest(BUCKET + "/post", fileName);
amazonS3Client.deleteObject(request);
}
}
- upload() 메소드를 이용해 MultipartFile 형식의 파일과, 파일 이름을 입력으로 받아 해당 파일을 AWS S3 버킷에 업로드 합니다.
- ObjectMetadata를 생성하여 파일의 메타데이터를 설정한 후, amazonS3Client를 사용해 파일을 업로드 합니다.
- 업로드 경로는 BUCKET + "/post"로 파일 이름과 스트림, 메타데이터를 함께 전달해 파일을 업로드 합니다.
- delete() 메소드는 AWS S3 버킷에서 특정 파일을 삭제하는 역할을 합니다.
- DeleteObjectRequest를 생성하여 삭제할 파일의 경로와 파일 이름을 설정합니다.
- 설정 후, amazonS3Client를 사용하여 파일을 삭제합니다.
Postman 테스트
1) 업로드
- 게시글 생성 시 , 이미지 파일과 함께 생성하게 되면 해당 이미지 파일이 서버에 업로드 됩니다.
- 데이터베이스 내에는 파일의 originName과 uniqueName이 저장됩니다.
2) 업로드 파일 삭제
- 게시글 수정을 통해 게시글을 생성할 때 등록했던 이미지 파일을 deleteImage로 요청하여 수정을 진행합니다.
- S3 서버에서 해당 파일에 대해 삭제되었다는 문구를 확인할 수 있습니다.
< 참고 >
[Spring boot] AWS S3 를 이용한 파일 업로드
개인 프로젝트를 하며 이미지 서버로 사용하기 위해 AWS S3 버킷을 만들고 Spring 을 연동하는 방법을 정리해보았다. [1] AWS S3 개요 AWS S3 란? S3는 Simple Storage Service 의 약자로 주로 파일 서버로 사용
gaeggu.tistory.com