๊ณฐํ„ฐ๋ทฐ์™€ IDrive e2 (3) - AWS S3 SDK for JavaScript๋ฅผ ํ™œ์šฉํ•œ IDrive e2 ์‚ฌ์šฉ๋ฒ•

๊ณฐํ„ฐ๋ทฐ ์„œ๋น„์Šค์—์„œ IDrive e2๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—…๋กœ๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์„ค๋ช…๊ธ€์ž…๋‹ˆ๋‹ค.

Profile Picture
quiet-honey
2023-12-13

์›๋ณธ ๊ธ€ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

์ง€๋‚œ 1ํŽธ์—์„œ๋Š” ๊ณฐํ„ฐ๋ทฐ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์„ค๋ช…๊ณผ ๊ณฐํ„ฐ๋ทฐ์—์„œ Object Storage๋กœ ์™œ IDrive e2๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋Š”์ง€ ํฌ์ŠคํŒ…์„ ํ–ˆ์—ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ง€๋‚œ๋ฒˆ ํฌ์ŠคํŠธ์˜€๋˜ 2ํŽธ์—์„œ๋Š” ๊ณฐํ„ฐ๋ทฐ์—์„œ ์–ด๋–ค ๋กœ์ง์„ ํ†ตํ•ด IDrive e2์— ๋น„๋””์˜ค๋ฅผ ์ €์žฅํ•˜๊ณ , ์ด๋ฅผ ์–ด๋–ค ๋กœ์ง์œผ๋กœ ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋Š”์ง€ ํฌ์ŠคํŒ…ํ•ด๋ณด์•˜๋‹ค.
์ด๋ฒˆ์—๋Š” IDrive e2 ๊ด€๋ จ ๋งˆ์ง€๋ง‰ ํฌ์ŠคํŒ…์œผ๋กœ ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„์„ ์‹ค์ œ๋กœ ์ง„ํ–‰ํ•˜์˜€๋Š”์ง€, ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ์„ค๋ช…์„ ์ง„ํ–‰ํ•ด๋ณด๊ฒ ๋‹ค.
1ํŽธ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด IDrive e2๋Š” AWS S3 ๋Œ€์ฒด ์„œ๋น„์Šค๋กœ ์•„์ฃผ ์ €๋ ดํ•œ ๊ฐ€๊ฒฉ์œผ๋กœ S3์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ํ† ์ด ํ”„๋กœ์ ํŠธ์—์„œ ์ €๋ ดํ•œ ๊ฐ€๊ฒฉ์œผ๋กœ Object Storage Service๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค.

IDrive e2 ์‚ฌ์šฉ ์‹œ ๋งž๋‹ฅ๋œจ๋ฆฐ ๋ฌธ์ œ๋“ค

์šฐ์„  IDrive e2๋Š” 1ํŽธ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด AWS S3 ๋Œ€์ฒด ์„œ๋น„์Šค์ด๊ณ , ๊ทธ๋ ‡๊ธฐ์— AWS์—์„œ ์ œ๊ณตํ•˜๋Š” S3 ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋งˆ์น˜ AWS S3๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค!

์šฐ์„  ์„œ๋น„์Šค๋ฅผ JavaScript(TypeScript)๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•ด์•ผํ–ˆ๊ธฐ์—, IDrive e2 ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋“ค์–ด๊ฐ€์„œ ํ™•์ธํ•ด๋ณด์•˜๋‹ค. ํ•˜์ง€๋งŒ ์•„๋ž˜์— ์–ธ๊ธ‰ํ•œ ๋‘ ๊ฐ€์ง€ ๋ถ€๋ถ„์ด ๋ฌธ์ œ์ ์ด ์žˆ์—ˆ๋‹ค.

1. IDrive e2์˜ ๊ณต์‹ ๋ฌธ์„œ๋Š” ๋„ˆ๋ฌด ๋นˆ์•ฝํ•˜๋‹ค.
IDrive e2์˜ ๊ณต์‹ ๋ฌธ์„œ๋Š” AWS cli, JavaScript ๋“ฑ ๋‹ค์–‘ํ•œ ์–ธ์–ด์— ๋Œ€ํ•œ ์‚ฌ์šฉ๋ฒ•์„ ๋‹ด๊ณ  ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ •๋ง๋กœ ๋„ˆ๋ฌด ๊ฐ„๋‹จํ•œ ๋ฒ„ํ‚ท, ํŒŒ์ผ์— ๋Œ€ํ•œ CRUD ๊ธฐ๋Šฅ๋งŒ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์—ˆ๊ณ , ์• ์ดˆ์— JavaScript์˜ ๊ฒฝ์šฐ์—๋Š” ์ฝ”๋“œ ์˜ˆ์‹œ์กฐ์ฐจ๋„ ๋ชป ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๋‹ค.

2. IDrive e2์˜ ๊ณต์‹ ๋ฌธ์„œ์˜ ๋‚ด์šฉ์€ ์ตœ๊ทผ ๋ฒ„์ „์ธ v3๊ฐ€ ์•„๋‹Œ 2023๋…„์— deprecated๋œ v2์ด๋‹ค.
๊ณต์‹ ๋ฌธ์„œ์˜ ๋‚ด์šฉ์„ ๋”ฐ๋ผ ์•„์ฃผ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•ด๋ณด๋‹ˆ, ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜์ž๋งˆ์ž 2023๋…„์— v2๊ฐ€ deprecated ๋๋‹ค๋Š” ์ถฉ๊ฒฉ์ ์ธ ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์•„์ง ์‚ฌ์šฉ์„ ๋ชปํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ์— ํฐ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ์—ˆ์ง€๋งŒ, ๊ณฐํ„ฐ๋ทฐ ์„œ๋น„์Šค๋ฅผ ์˜ค๋žซ๋™์•ˆ ์šด์˜ํ•ด๋ณด๊ณ  ์‹ถ๊ธฐ์— deprecated๋œ ๊ฒฝ์šฐ๋ผ๋ฉด ๋ฌด์กฐ๊ฑด v3๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ด๋ผ๊ณ  ์—ฌ๊ฒจ์กŒ๋‹ค.

AWS S3 SDK for JavaScript

์œ„์˜ ์ด์œ ๋“ค ๋•Œ๋ฌธ์— ๋น„๋””์˜ค ์—…๋กœ๋“œ ๋กœ์ง์— ์–ด๋ ค์›€์ด ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์˜€๊ณ , ์—ญ์‹œ๋‚˜ ์‰ฝ์ง€ ์•Š์€ ์—ฌ์ •์ด์—ˆ๋‹ค. AWS S3 SDK for JavaScript v3์˜ ๊ณต์‹ ๋ฌธ์„œ ๋งˆ์ €๋„ ์ •๋ฆฌ๊ฐ€ ๊น”๋”ํ•˜๊ฒŒ ๋˜์ง€ ์•Š๊ณ , ์ „์ฒด์ ์ธ ๋‚ด์šฉ์ด ๋ชจ๋‘ ํ•œ ๋ฒˆ์— ์กด์žฌํ•˜๋Š” ๋Š๋‚Œ์ด ๋“ค์–ด์„œ ํ•„์š”ํ•œ ์ •๋ณด๋งŒ์„ ์ฐพ์•„๋‚ด๋Š”๋ฐ ์–ด๋ ค์›€์ด ์žˆ์—ˆ๋‹ค.
๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์ ์œผ๋กœ๋Š” IDrive e2๋Š” AWS S3๊ฐ€ ์•„๋‹ˆ๊ธฐ์— ๊ณต์‹ ๋ฌธ์„œ์— ์ ํ˜€์žˆ๋Š” ๋‚ด์šฉ๊ณผ ์กฐ๊ธˆ ๋‹ค๋ฅด๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.
์–ด์จŒ๋“  ๊ทธ๋ž˜๋„ AWS S3 SDK for JavaScript v3๋ฅผ ํ†ตํ•ด IDrive e2๋ผ๋Š” ์ƒˆ๋กญ๊ฒŒ ์ ‘ํ•˜๊ณ , ์ฐธ๊ณ ํ•  ์ž๋ฃŒ๋„ ๋งŽ์ด ์—†๊ณ , ๊ด€๋ จ ๊ณต์‹ ๋ฌธ์„œ๋งˆ์ € ๋ถ€์‹คํ•œ ์„œ๋น„์Šค๋ฅผ AWS S3๋ฅผ ์“ฐ๋Š” ๋ฐฉ๋ฒ•๋Œ€๋กœ ๊ทธ๋‚˜๋งˆ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

S3 Client ๊ตฌ์„ฑ

export const IDRIVE_CONFIG = {
  region: 'e2',
  endpoint: process.env.IDRIVE_ENDPOINT,
  credentials: {
    accessKeyId: process.env.IDRIVE_ACCESS_KEY_ID,
    secretAccessKey: process.env.IDRIVE_SECRET_ACCESS_KEY,
  },
};

S3 Client์— ์„ค์ •ํ•ด์•ผ ํ•  ๊ธฐ๋ณธ ๋กœ์ง์ด๋‹ค. ์–ด๋ ต์ง€ ์•Š์€ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์„ค๋ช…์ด๊ธฐ์— ๊ฐ„๋‹จํ•˜๊ฒŒ๋งŒ ์„ค๋ช…ํ•ด๋ณด๊ฒ ๋‹ค.

  1. ํ˜„์žฌ ์ง€์—ญ(region)์œผ๋กœ 'e2'๋ฅผ ์„ค์ •ํ•œ๋‹ค.
  2. endpoint(IDrive e2๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” API์˜ ์—”๋“œํฌ์ธํŠธ)๋ฅผ 'https:// + IDrive์—์„œ ๋ฒ„ํ‚ท์— ํ• ๋‹นํ•ด์ค€ endpoint'๋กœ ์„ค์ •ํ•œ๋‹ค.
    => v3์˜ AWS S3 SDK ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” endpoint์— ๋Œ€ํ•œ ๋ช…์‹œ๋ฅผ ํ•ด๋†“์ง€ ์•Š์•˜์œผ๋‚˜ IDrive๋ผ๋Š” ์™ธ๋ถ€ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ง์ ‘ ๋ช…์‹œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋˜ํ•œ https://๋ฅผ ์•ž์— prefix๋กœ ๋ถ™์ด๋Š” ๊ฒƒ์€ ๊ธฐ์กด v2 ๋กœ์ง๊ณผ์˜ ์ฐจ์ด์ ์ด๋‹ค.
  3. credentials๋ฅผ ์‚ฌ์šฉํ•ด S3 Client๊ฐ€ ์„ค์ •ํ•ด๋‘” ์ง€์—ญ๊ณผ endpoint๋ฅผ ๊ฐ€์ง„ ์„œ๋ฒ„์— ๊ถŒํ•œ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. accessKeyId์™€ secretAccessKey๋Š” IDrive์—์„œ ๋ฒ„ํ‚ท์„ ์ƒ์„ฑํ•  ๋•Œ ์ œ๊ณต๋œ๋‹ค.

S3 Client๋ฅผ ์‚ฌ์šฉํ•œ Pre-Signed Url ๋ฐœ๊ธ‰ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

import { PutObjectCommand, S3Client } from '@aws-sdk/client-s3';
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
import { IDRIVE_CONFIG } from 'src/config/idrive.config';

let s3Client: S3Client; // ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์œ ์ง€ํ•  S3 Client ์ธ์Šคํ„ด์Šค

const getIdriveS3Client = (): S3Client => { // S3 Client๋ฅผ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ
if (!s3Client) {
s3Client = new S3Client(IDRIVE_CONFIG);
}
return s3Client;
};

const getPutCommandObject = (key: string): PutObjectCommand => // Put ์š”์ฒญ์„ ์œ„ํ•œ Pre-Signed URL์„ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ PutObjectCommand๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ
new PutObjectCommand({ Bucket: 'videos', Key: key });

export async function getSignedUrlWithKey(key: string) { // ํŠน์ • key(ํŒŒ์ผ๋ช…)๋ฅผ ์„œ๋ฒ„์— ์—…๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” Put Pre-Signed URL ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ
  const s3 = getIdriveS3Client();
  const command = getPutCommandObject(key);
  const expiresIn = 10;

return await getSignedUrl(s3, command, { expiresIn });
}

v2์™€ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง„ ์ ์ด PutCommandObject๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Pre-Signed URL์„ ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
key๋Š” ์ €์žฅ๋  ํŒŒ์ผ์˜ ์ด๋ฆ„, bucket์€ ํŒŒ์ผ์„ ์ €์žฅํ•  ๋ฒ„ํ‚ท์˜ ์ด๋ฆ„์ด๋‹ค.

์œ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ Pre-Signed Url ๋ฐœ๊ธ‰

async getPreSignedUrl(member: Member) {
    // validateManipulatedToken(member);
    const key = `${uuidv4()}.mp4`;
    try {
      const preSignedUrl = await getSignedUrlWithKey(key);
      return new PreSignedUrlResponse(preSignedUrl, key); // ์ปค์Šคํ…€ ์‘๋‹ต ๊ฐ์ฒด์— ๋„ฃ์–ด ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜
    } catch (error) {
      throw new IDriveException();
    }
}

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜์˜€๋‹ค.
์›๋ž˜๋Š” v2๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ ์ž‘์„ฑ๊ณผ ํ…Œ์ŠคํŠธ, ์‹ค์ œ ๋ฐฐํฌ ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ๊นŒ์ง€ ๋ชจ๋‘ ์™„๋ฃŒํ–ˆ์—ˆ์œผ๋‚˜, ์„œ๋น„์Šค ์•ˆ์ •์„ฑ์ด๋‚˜ ์œ ์ง€ ๊ธฐ๊ฐ„์„ ๊ณ ๋ คํ•˜์˜€์„ ๋•Œ v3๋กœ ๋ณ€๊ฒฝํ•˜์ž๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด, ์ฒœ์ฒœํžˆ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ•˜์˜€๋‹ค. ์ด๋Š” ์„œ๋น„์Šค ๊ฐœ๋ฐœ์ž๋กœ์จ ์ข‹์€ ์ƒ๊ฐ์ด์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

Pre-Signed URL์„ ์‚ฌ์šฉํ•œ ๋น„๋””์˜ค ์—…๋กœ๋“œ ๋กœ์ง

์ด์ „ 2ํŽธ์—์„œ ์„ค๋ช…ํ–ˆ๋˜ ๋‚ด์šฉ์ด์ง€๋งŒ, Postman์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํ•˜๋Š” ๋ฐฉ๋ฒ•๊นŒ์ง€ ์ถ”๊ฐ€ํ•˜์—ฌ ์„ค๋ช…์„ ์ง„ํ–‰ํ•ด๋ณด๊ฒ ๋‹ค.
๋น„๋””์˜ค ์—…๋กœ๋“œ ๋กœ์ง ํ๋ฆ„๋„
์ „์ฒด์ ์ธ ํ๋ฆ„์€ ์œ„์˜ ์‚ฌ์ง„๊ณผ ๊ฐ™๋‹ค.

์„œ๋ฒ„์— ํด๋ผ์ด์–ธํŠธ๊ฐ€ Pre-Signed URL ์š”์ฒญ

Pre-Signed Url์„ Postman์œผ๋กœ ์š”์ฒญํ•œ ์‚ฌ์ง„ ์œ„์—์„œ ๊ตฌํ˜„ํ•œ getPreSignedUrl ๋ฉ”์„œ๋“œ๋ฅผ ์„œ๋ฒ„์˜ Pre-Signed ์š”์ฒญ ์—”๋“œํฌ์ธํŠธ์— ์—ฐ๊ฒฐ์‹œ์ผœ๋‘์–ด, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—…๋กœ๋“œ๋ฅผ ์›ํ•  ๋•Œ๋งˆ๋‹ค ๋ฐœ๊ธ‰ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๋‹ค.

๋ฐœ๊ธ‰๋ฐ›์€ URL๋กœ IDrive e2์— ๋น„๋””์˜ค ์—…๋กœ๋“œ

Pre-Signed Url์„ Postman์œผ๋กœ ์š”์ฒญํ•œ ์‚ฌ์ง„ ๋‹ค์Œ์œผ๋กœ ์œ„์˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ Pre-Signed URL ๋ฐœ๊ธ‰ ์š”์ฒญ์˜ ์‘๋‹ต์œผ๋กœ ๋“ค์–ด์˜จ preSignedUrl์„ ์‚ฌ์šฉํ•˜์—ฌ Patch ๋ฉ”์„œ๋“œ๋กœ ์—…๋กœ๋“œ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด, IDrive e2 ๋ฒ„ํ‚ท ์ƒ์—์„œ ์—…๋กœ๋“œ๋œ ํŒŒ์ผ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
์œ„์˜ ๊ณผ์ •์„ ๊ฑฐ์ณ ๊ณฐํ„ฐ๋ทฐ์—์„œ๋Š” ๋น„๋””์˜ค ์—…๋กœ๋“œ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.
๋น„๋””์˜ค ์†Œ๋น„ ๋กœ์ง์€ DB์— IDrive e2 ์ƒ์˜ ๋น„๋””์˜ค URL์„ ์ €์žฅํ•ด๋‘์–ด ์ด๋ฅผ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์š”์ฒญํ•˜์—ฌ ๋น„๋””์˜ค๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ์—…๋กœ๋“œ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ„๋‹จํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. ๋น„๋””์˜ค ์†Œ๋น„์˜ ๊ฒฝ์šฐ์—๋„ get ์š”์ฒญ์— ๋Œ€ํ•œ preSignedUrl์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ํ•„์š”์— ๋”ฐ๋ผ ์ฐธ๊ณ ํ•˜์—ฌ ์ด์šฉํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

AWS S3์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‹ ๊ทœ ๋ฒ„์ „๊ณผ ์™ธ๋ถ€ ์„œ๋น„์Šค๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋Š” ํŠน์ดํ•œ ์ƒํ™ฉ์ด์—ˆ๊ธฐ์— ์ฐธ๊ณ ํ• ๋งŒํ•œ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋ถ€์กฑํ•˜์—ฌ์„œ ์กฐ๊ธˆ ์–ด๋ ค์›€์„ ๊ฒช๊ธฐ๋„ ํ•˜์˜€์ง€๋งŒ ํ”„๋กœ์ ํŠธ์˜ ํ•ต์‹ฌ ๋กœ์ง์„ ์ž˜ ๊ตฌํ˜„ํ•œ ๊ฒƒ ๊ฐ™์•„ ๊ธฐ์˜๋‹ค.

ยฉ 2024 Adultlee. All rights reserved.Made with โค by ์ด์„ฑ์ธ