Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

지석이의 일기

Aws s3를 사용해서 파일(이미지)를 저장하자 본문

Java

Aws s3를 사용해서 파일(이미지)를 저장하자

91년도에 철산에서 태어난 최지석 2024. 5. 14. 13:54

낮은 사양의 서버를 호스팅하거나, 대량의 이미지 파일들을 저장할경우 cdn 을 사용하거나 다른 nas를 사용해서 파일을 저장한다.

 

S3는 Amazon Simple Storage Service의 약자로, 웹에서 데이터를 저장하고 검색할 수 있는 무한한 저장 공간을 제공한다.

S3 특징들
1. 무한한 저장 공간
너의 모든 데이터를 무한히 저장할수 있고,사용한 만큼만 비용을 지불한다.

2. 높은 내구성과 가용성
내가 올린 데이터를 여러 저장소에 저장하기에 물리적으로 문제가 생긴다해도 내 파일의 무결성을 보장한다.

3. 보안
데이터는 전송 중이나 저장 중일 때도 암호화된다.

4. 간편한 데이터 관리
데이터 라이프 사이클 관리, 자동 아카이빙 등 다양한 기능을 통해 데이터를 쉽게 관리할 수 있다.

 

S3를 사용하기 앞서서, AWS 콘솔에 접근해서

1.버킷을 생성하고,

2.IAM 계정을 생성해야한다.

 

1. AWS S3 버킷 설정
AWS Management Console에 로그인.
S3 서비스로 이동하여 Create bucket을 클릭

 

 

 

버킷 이름을 입력하고, 이후 설정은 기본값으로 두고, Create bucket을 클릭하여 버킷을 생성.

 

 

 

매우 손쉽게 버킷을 만들수 있다.

 

2. IAM 사용자 생성 및 권한 설정
IAM 서비스로 이동하여 Users(사용자)를 클릭한 다음, Add user(사용자 생성)를 클릭

 

 


사용자 이름을 얼추 입력하고 Attach existing policies directly(직접 정책 연결)를 선택하고, AmazonS3FullAccess 정책을 체크

 

생성된 iam 유저를 보면

 

 

 

 

액새스 키와 옆에 비밀 액세스 키를 받았을것이다.

 

 

JAVA에서 구현해보기

 

gradle에 의존성 추가

    implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'

 

yaml 추가하기

cloud:
  aws:
    credentials:
      access-key: 액세스키
      secret-key: 비밀엑시스 키

      bucket : danbam
    region:
      static: (리전명)us-east-2
    stack:
      auto: false

 

Config 파일 추가

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

 

서비스 추가

@RequiredArgsConstructor
public class S3Service {
    @Value("${cloud.aws.bucket}")
    private final String bucketName;
    
    private final AmazonS3 s3client;

    // 이미지 업로드
    public String uploadFile(MultipartFile file) {
        String fileName = file.getOriginalFilename();
        try {
            s3client.putObject(new PutObjectRequest(bucketName, fileName,
                    file.getInputStream(), null)
                    .withCannedAcl(CannedAccessControlList.PublicRead));
            return s3client.getUrl(bucketName, fileName).toString();
        } catch (IOException e) {
            e.printStackTrace();
            return "업로드 실패";
        }
    }

    // 이미지 조회
    public byte[] downloadFile(String fileName) {
        S3Object s3object = s3client.getObject(bucketName, fileName);
        S3ObjectInputStream inputStream = s3object.getObjectContent();
        try {
            byte[] content = IOUtils.toByteArray(inputStream);
            return content;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

 

컨트롤러 추가

@RestController
public class S3Controller {

    @Autowired
    private S3Service s3Service;

    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) {
        return s3Service.uploadFile(file);
    }

    @GetMapping("/download/{fileName}")
    public ResponseEntity<byte[]> downloadFile(@PathVariable String fileName) {
        byte[] data = s3Service.downloadFile(fileName);
        return ResponseEntity.ok()
                .contentType(MediaType.IMAGE_JPEG)
                .body(data);
    }
}

 

여기까지 s3를 할당해서 java 에서 s3 기능을 사용하는 것까지의 실습을 해보앗다!..

 

실질적으로 이미지를 올린 뒤에

 

 

이미지를 올린것이 확인가능하다.

 

s3의 비용정산은, 얼마나 많은 양의 파일을 얼마나 오래 저장하느냐 + 얼마나 많은 사람들이 자주 이미지를 호출 했느냐 2가지에 의해서 비용이 정산된다.