[Spring] AWS S3 생성 & SpringBoot 연동

송현진·2023년 5월 18일
0
post-thumbnail

📚 S3 생성

1. S3 -> 버킷 -> 버킷 만들기 클릭

2. 버킷 이름을 적어주고 region은 서울, ACL은 활성화

3. 모든 퍼블릭 엑세스 차단을 다 풀어줌, 버전관리는 비활성화 -> 버킷 만들기 클릭

4. IAM 사용자를 추가 -> 권한 정책 AmazonS3FullAccess 권한 추가

5. 엑세스 키 생성 후 .csv 파일 저장

6. 버킷 정책 생성해줌

정책 생성기 눌러 아래와 같이 설정해준다.

만들어진 정책을 가져와 붙여넣는다. 💡 단, Resource에서 버킷 ARN 뒤에 /*이 없으면 추가해줘야함

Springboot 연동

(1). bulid.gradle에 추가

// ASW S3
    implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
    implementation "com.amazonaws:aws-java-sdk-s3:1.12.281"

(2). application.properties에 추가

cloud.aws.stack.auto=false
cloud.aws.region.static=ap-northeast-2
cloud.aws.s3.bucket=버킷 이름
cloud.aws.credentials.access-key=엑세스 키
cloud.aws.credentials.secret-key=보안 키

(3). S3Config 클래스 추가

@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 awsCreds = new BasicAWSCredentials(accessKey,secretKey);
        return (AmazonS3Client) AmazonS3ClientBuilder.standard()
                .withRegion(region)
                .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
                .build();
    }
}

(4). S3Uploader 클래스 추가

@RequiredArgsConstructor
@Service
public class S3Uploader {
    private final AmazonS3 amazonS3;

    @Value("${cloud.aws.s3.bucket}")
    private String bucket;
	
    // 파일 형식으로 오는 것 업로드
    public String uploadFile(MultipartFile multipartFile) throws IOException {
        String fileName = UUID.randomUUID().toString() + "_" + multipartFile.getOriginalFilename();
//        if (!fileName.toLowerCase().endsWith(".jpg")) {
//            fileName += ".jpg";
//        }
        ObjectMetadata objMeta = new ObjectMetadata();
        objMeta.setContentLength(multipartFile.getSize());
        amazonS3.putObject(bucket, fileName, multipartFile.getInputStream(), objMeta);

        return amazonS3.getUrl(bucket, fileName).toString();
    }

	// url 형식으로 오는 것 추가
    public String uploadImage(String image){
        ObjectMetadata objMeta = new ObjectMetadata();
        objMeta.setContentLength(image.length());
        amazonS3.putObject(bucket, image, image);

        return amazonS3.getUrl(bucket, image).toString();
    }

	// 파일 삭제
    public boolean delete(String fileUrl) {
        try {
            String[] temp = fileUrl.split("/");
            String fileKey = temp[temp.length-1];
            amazonS3.deleteObject(bucket, fileKey);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}

(5). Controller 적용

  • ~~Mapping에서 consumes으로 미디어 타입을 명시해준다. 그리고 @ReqeustPart로 받아준다.
@Operation(summary = "마이페이지 수정", description = "마이페이지 수정하는 메서드입니다.")
    @PutMapping(value = "/mypage",
            consumes = {MediaType.MULTIPART_FORM_DATA_VALUE,MediaType.APPLICATION_JSON_VALUE})
    public ResponseEntity<Message> profileUpdate(@RequestPart("imageFile")MultipartFile image,
                                                 @RequestPart ProfileRequestDto profileRequestDto,
                                                 @AuthenticationPrincipal UserDetailsImpl userDetails) throws IOException {
        return memberService.profileUpdate(image, profileRequestDto, userDetails.getMember());
    }

(6). Service
서비스 딴에는 S3Uploader 클래스에 있는 메서드를 이용해 값들을 넣어준다.

참고
https://velog.io/@chaeri93/SpringBoot-AWS-S3%EB%A1%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%97%85%EB%A1%9C%EB%93%9C%ED%95%98%EA%B8%B0

profile
개발자가 되고 싶은 취준생

0개의 댓글