๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐ˜์‘ํ˜•

Cloudinary๋ž€?

Cloudinary๋Š” ์ด๋ฏธ์ง€๋‚˜ ๋™์˜์ƒ์„ ์‰ฝ๊ฒŒ ์—…๋กœ๋“œํ•˜๊ณ , ์ €์žฅํ•˜๊ณ , ๋ณด์—ฌ์ฃผ๊ณ , ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์„œ๋น„์Šค
์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด,“์ด๋ฏธ์ง€์šฉ ํด๋ผ์šฐ๋“œ ์ €์žฅ์†Œ + ์ด๋ฏธ์ง€ ๋ณ€ํ™˜ ์ž๋™ํ™” ๋„๊ตฌ”

 

์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์„œ๋ฒ„๋‚˜ ํ”„๋ก ํŠธ์—์„œ ์ด๋ฏธ์ง€ ๋ณด๋‚ด๋ฉด ์ €์žฅ๋จ
์ž๋™ URL ๋ฐœ๊ธ‰ ์—…๋กœ๋“œํ•˜๋ฉด ๊ณง๋ฐ”๋กœ ์ด๋ฏธ์ง€ ์ฃผ์†Œ(URL) ๋ฐ˜ํ™˜
์ด๋ฏธ์ง€ ์ตœ์ ํ™” ์ž๋™ ์••์ถ•, ๋ฆฌ์‚ฌ์ด์ฆˆ, ์ธ๋„ค์ผ ์ƒ์„ฑ
CDN ์ œ๊ณต Cloudinary ์„œ๋ฒ„๊ฐ€ ์ „ ์„ธ๊ณ„์— ํผ์ ธ ์žˆ์–ด์„œ ๋น ๋ฅด๊ฒŒ ๋กœ๋”ฉ
๋™์˜์ƒ๋„ ์ง€์› ์ด๋ฏธ์ง€๋ž‘ ๊ฑฐ์˜ ๋˜‘๊ฐ™์ด ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

Amazon์— S3์ฒ˜๋Ÿผ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค!

 

https://cloudinary.com/

 

Image and Video Upload, Storage, Optimization and CDN

Streamline media management and improve user experience by automatically delivering images and videos, enhanced and optimized for every user.

cloudinary.com

์‚ฌ์ดํŠธ์— ๊ฐ€์ž…ํ•˜๊ฒŒ ๋˜๋ฉด

๋ผ๋Š” ๋ฉ”์„ธ์ง€๊ฐ€ ๋œจ๋Š”๋ฐ ์šฐ๋ฆฌ๋Š” ๊ฐœ๋ฐœ์ž๋‹ˆ๊นŒ ์œ„์—๊ป„ ์„ ํƒํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ€๋Š”๋ฐ ์—ฌ๊ธฐ์„œ view key ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์‚ฌ์šฉํ•  api key๋ฅผ ๋ณผ์ˆ˜์žˆ๋‹ค.

 

์ด์ œ build.gradle๊ณผ application.properties์— ํด๋ผ์šฐ๋””๋„ˆ๋ฆฌ ๊ด€๋ จ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค

implementation 'com.cloudinary:cloudinary-http44:1.37.0'

 

# Cloudinary ์„ค์ •
cloudinary.cloud-name=YOUR_NAME
cloudinary.api-key=YOUR_API_KEY
cloudinary.api-secret=YOUR_SECRET_KEY

 

์ด์ œ ์‚ฌ์šฉ์ž๊ฐ€ ์—…๋กœ๋“œํ•œ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ cloudinary ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•˜๊ณ  url์„ ๋ฐ›์•„์„œ ๋ฆฌํ„ดํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

 

CloudinaryConfig

@Configuration
public class CloudinaryConfig {
    @Value("${cloudinary.cloud-name}")
    private String cloudName;

    @Value("${cloudinary.api-key}")
    private String apiKey;

    @Value("${cloudinary.api-secret}")
    private String apiSecret;

    @Bean
    public Cloudinary cloudinary() {
        Map<String, String> config = new HashMap<>();
        config.put("cloud_name", cloudName);
        config.put("api_key", apiKey);
        config.put("api_secret", apiSecret);
        return new Cloudinary(config);
    }
}

 

CloudinaryService

@Service
@RequiredArgsConstructor
public class CloudinaryService {
    private final Cloudinary cloudinary;

    public String uploadImage(MultipartFile file) {
        try {
            Map uploadResult = cloudinary.uploader().upload(file.getBytes(), Map.of());
            return uploadResult.get("secure_url").toString();
        } catch (IOException e) {
            throw new RuntimeException("์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์‹คํŒจ", e);
        }
    }
}

 

๋ฐ˜์‘ํ˜•