πŸš€ Spring Bootμ—μ„œ AWS S3에 파일 μ—…λ‘œλ“œν•˜κΈ° (비속어 μŒμ„± 관리)

μœ€μž¬μ€Β·2025λ…„ 2μ›” 22일
post-thumbnail

0. κ°œμš”

ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©° μ‚¬μš©μžμ˜ 비속어 μŒμ„± νŒŒμΌμ„ μ €μž₯ν•΄μ•Ό ν•˜λŠ” κΈ°λŠ₯이 μΆ”κ°€λ˜μ–΄.
이λ₯Ό μœ„ν•΄ AWS S3에 νŒŒμΌμ„ μ—…λ‘œλ“œ 및 κ΄€λ¦¬ν•˜κΈ°λ‘œ κ²°μ •ν–ˆλ‹€.

이번 κΈ€μ—μ„œλŠ” AWS S3 버킷 생성뢀터 Spring Bootμ—μ„œ 파일 μ—…λ‘œλ“œ μ½”λ“œ κ΅¬ν˜„κΉŒμ§€ λ‹€λ£° μ˜ˆμ •μ΄λ‹€.


1. πŸ› οΈ μ€€λΉ„λ¬Ό

βœ” AWS 계정
βœ” Spring Boot ν”„λ‘œμ νŠΈ


2. πŸ” IAM μ‚¬μš©μž 생성

2-1. IAM 이동 ν›„ μ‚¬μš©μž 클릭

IAM 이동

2-2. μ‚¬μš©μž 생성 클릭

μ‚¬μš©μž 생성

2-3. 이름 등둝 ν›„ AmazonS3FullAccess κΆŒν•œ λΆ€μ—¬

S3 κΆŒν•œ λΆ€μ—¬

2-4. 둜컬 μ½”λ“œ 선택

둜컬 μ½”λ“œ 선택

2-5. 이름 λΆ€μ—¬ 및 μ—‘μ„ΈμŠ€ ν‚€ μ €μž₯

μ—‘μ„ΈμŠ€ ν‚€ 생성

πŸ›‘ μ€‘μš”: μ—‘μ„ΈμŠ€ 킀와 λΉ„λ°€ μ—‘μ„ΈμŠ€ ν‚€λŠ” ν•œ 번만 μ œκ³΅λ˜λ―€λ‘œ CSV 파일 λ‹€μš΄λ‘œλ“œ λ˜λŠ” λ³„λ„λ‘œ μ•ˆμ „ν•˜κ²Œ 보관해야 ν•œλ‹€.


3. πŸ“¦ AWS S3 버킷 생성

3-1. S3 이동 ν›„ 버킷 생성 클릭

버킷 생성

3-2. 버킷 이름 μ„€μ •

버킷 이름 μ„€μ •

3-3. 버킷 μ„€μ •

버킷 μ„€μ •

⚠️ μ‹€λ¬΄μ—μ„œλŠ” λͺ¨λ“  퍼블릭 μ•‘μ„ΈμŠ€λ₯Ό μ°¨λ‹¨ν•˜λŠ” 것이 μΌλ°˜μ μ΄μ§€λ§Œ, ν…ŒμŠ€νŠΈ ν™˜κ²½μ—μ„œλŠ” 일뢀 ν•΄μ œν•  수 μžˆλ‹€.


4. πŸ“ Spring Boot μ„€μ •

4-1. build.gradle에 AWS S3 μ˜μ‘΄μ„± μΆ”κ°€

// AWS S3
implementation 'com.amazonaws:aws-java-sdk-s3:1.12.510'

4-2. application.yml μ„€μ • μΆ”κ°€

aws:
  access-key-id: YOUR_AWS_ACCESS_KEY
  secret-access-key: YOUR_AWS_SECRET_KEY
  s3:
    bucket-name: 버킷 이름
    region: ap-northeast-2

4-3. Amazon S3 μ„€μ • 클래슀

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AmazonS3Config {
    @Value("${aws.access-key-id}")
    private String awsAccessKey;

    @Value("${aws.secret-access-key}")
    private String awsSecretKey;

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

    @Bean
    public AmazonS3 amazonS3() {
        BasicAWSCredentials awsCredentials = new BasicAWSCredentials(awsAccessKey, awsSecretKey);
        return AmazonS3ClientBuilder.standard()
                .withRegion(region)
                .withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
                .build();
    }
}

5. πŸ“€ S3 파일 μ—…λ‘œλ“œ κ΅¬ν˜„

5-1. Service 클래슀 μž‘μ„±

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.ObjectMetadata;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;

@Service
public class S3Service {
    private final AmazonS3 amazonS3;

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

    public S3Service(AmazonS3 amazonS3) {
        this.amazonS3 = amazonS3;
    }

    public String uploadFile(MultipartFile file) {
        String fileName = "uploads/" + System.currentTimeMillis() + "_" + file.getOriginalFilename();

        try {
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(file.getSize());
            metadata.setContentType(file.getContentType());
            
            amazonS3.putObject(bucketName, fileName, file.getInputStream(), metadata);
            return amazonS3.getUrl(bucketName, fileName).toString();
        } catch (IOException e) {
            throw new RuntimeException("파일 μ—…λ‘œλ“œμ— μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€.", e);
        }
    }
}

5-2. Controller μΆ”κ°€

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequestMapping("/files")
public class S3Controller {
    private final S3Service s3Service;

    public S3Controller(S3Service s3Service) {
        this.s3Service = s3Service;
    }

    @PostMapping("/upload")
    public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
        String fileUrl = s3Service.uploadFile(file);
        return ResponseEntity.ok(fileUrl);
    }
}

πŸŽ‰ 마무리

이제 Spring Bootμ—μ„œ AWS S3에 νŒŒμΌμ„ μ—…λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€! πŸ₯³
μΆ”κ°€μ μœΌλ‘œ μ‚­μ œ 및 쑰회 κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λ©΄ λ”μš± μ™„λ²½ν•œ κΈ°λŠ₯을 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

profile
항상 μ—΄μ •μ μœΌλ‘œ μž„ν•©λ‹ˆλ‹€!

0개의 λŒ“κΈ€