Lv3-12: S3 이미지 업로드 API 구현 정리

박화랑·2025년 5월 7일
1

Spring_6기_5CH

목록 보기
2/2

1. 사용 기술 및 목적

항목설명
AWS S3이미지 파일 저장을 위한 스토리지 서비스
Spring Cloud AWSS3 클라이언트 구성 및 연동
멀티파트 업로드MultipartFile 사용한 파일 업로드 처리

2. 📄 주요 클래스 요약

S3Controller

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

    private final S3Service s3Service;

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

S3Service

@Service
@RequiredArgsConstructor
public class S3Service {

    private final S3Adapter s3Adapter;

    public String upload(MultipartFile file) {
        return s3Adapter.upload(file);
    }
}

S3Adapter

@Component
@RequiredArgsConstructor
public class S3Adapter {

    private final S3Client s3Client;
    private final S3Properties properties;

    public String upload(MultipartFile file) {
        String key = UUID.randomUUID() + "." + extractExtension(file.getOriginalFilename());

        try {
            PutObjectRequest putObjectRequest = PutObjectRequest.builder()
                .bucket(properties.getBucket())
                .key(key)
                .contentType(file.getContentType())
                .acl(ObjectCannedACL.PUBLIC_READ)
                .build();

            s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(file.getInputStream(), file.getSize()));

            return properties.getUrl() + "/" + key;
        } catch (IOException e) {
            throw new RuntimeException("S3 업로드 실패", e);
        }
    }

    private String extractExtension(String filename) {
        return Optional.ofNullable(filename)
            .filter(f -> f.contains("."))
            .map(f -> f.substring(filename.lastIndexOf(".") + 1))
            .orElse("");
    }
}

✅ 완성 결과

  • 클라이언트에서 파일 업로드 시 S3에 저장됨
  • 고유 key로 저장 후 public URL 반환
  • 업로드된 이미지 URL을 클라이언트에 제공하여 활용 가능
profile
개발자 희망생

0개의 댓글