1. 사용 기술 및 목적
항목 | 설명 |
---|
AWS S3 | 이미지 파일 저장을 위한 스토리지 서비스 |
Spring Cloud AWS | S3 클라이언트 구성 및 연동 |
멀티파트 업로드 | 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을 클라이언트에 제공하여 활용 가능