개요

이전까지 AWS S3를 위한 버킷과 IAM 사용자를 생성했다

 

https://steadi1y.tistory.com/245

 

[AWS] IAM 사용자 개념과 계정 생성하는 방법

개요루트 사용자 계정으로 AWS를 사용해서는 안 된다고 해서 IAM 사용자 개념에 대해 찾아보고, 설정하려고 한다.개념- 루트 사용자 : AWS 계정 생성 시 만든 기본 사용자 - IAM (Identity and Access Managem

steadi1y.tistory.com

 

이제는 Spring Boot 프로젝트에서 S3에 이미지를 업로드 하기


개념

클라이언트가 이미지 업로드 -> Spring Boot에서 이미지 처리 후 S3에 전송 

-> S3에 저장 -> 파일에 접근할 수 있는 url 반환

https://techblog.woowahan.com/11392/


설정

Spring Boot 2.7.18

Java 17

Maven

 

공식 문서 보면서 따라하기

 

메이븐에 의존성 추가 : 버전 참고

      <dependency>
         <groupId>software.amazon.awssdk</groupId>
         <artifactId>s3</artifactId>
         <version>2.29.38</version>
      </dependency>

 

AWS SDK for Java 2.x 사용 : 버전 1은 2025년 12월 말에 지원 종료라고 되어 있다.

 

application.properties에 값 추가해야 한다.

외부에 노출되지 않게 추가로 application-private.properties 만들어서 값 넣는다.

 

application.properties

aws.credentials.accessKey=${ACCESS_KEY}
aws.credentials.secretKey=${SECRET_KEY}
aws.s3.bucketName=${BUCKET_NAME}
aws.region.static=${REGION}

application-private.properties

ACCESS_KEY=
SECRET_KEY=
BUCKET_NAME=
REGION=

 

s3 클라이언트 설정 config 파일

@Configuration
public class S3Config {
    @Value("${aws.credentials.accessKey}")
    private String accessKey;
    @Value("${aws.credentials.secretKey}")
    private String secretKey;
    @Value("${aws.region.static}")
    private String region;

    @Bean
    public S3Client s3Client() {
        AwsBasicCredentials credentials = AwsBasicCredentials.create(accessKey, secretKey);

        return S3Client.builder()
                .region(Region.of(region))
                .credentialsProvider(StaticCredentialsProvider.create(credentials))
                .build();
    }
}

 

Controller

@RestController
@RequestMapping("/api/S3")
@RequiredArgsConstructor
public class S3Controller {

    private final S3Service s3Service;

    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) {
        try {
            String fileUrl = s3Service.uploadFile(file);
            return fileUrl;
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
    }

}

 

Service

@Service
@RequiredArgsConstructor
public class S3Service {
    private final S3Client s3Client;

    @Value("${aws.s3.bucketName}")
    private String bucketName;

    private String createFileName(String originalFileName) {
        return UUID.randomUUID() + "_" + originalFileName;
    }

    public String uploadFile(MultipartFile file) {
        String fileName = createFileName(file.getOriginalFilename());
        try {
            PutObjectRequest objectRequest = PutObjectRequest.builder()
                    .bucket(bucketName)
                    .key(fileName)
                    .contentType(file.getContentType())
                    .contentLength(file.getSize())
                    .build();
            s3Client.putObject(objectRequest, RequestBody.fromBytes(file.getBytes()));

            return getFileUrl(fileName);
        } catch (IOException e) {
            throw new RuntimeException(e.getMessage());
        }
    }

    private String getFileUrl(String fileName) {
        GetUrlRequest request = GetUrlRequest.builder()
                .bucket(bucketName)
                .key(fileName)
                .build();

        URL url = s3Client.utilities().getUrl(request);
        return url.toString();
    }
}

 

Postman으로 테스트

 

url로 들어가면 이미지 업로드 성공


참고

https://jaehee1007.tistory.com/162

https://stackoverflow.com/questions/10975475/amazon-s3-upload-file-and-get-url/10975577

https://docs.aws.amazon.com/ko_kr/sdk-for-java/latest/developer-guide/java_s3_code_examples.html