๊ณฐํฐ๋ทฐ ์๋น์ค์์ IDrive e2๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ก๋๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง์ ๋ํ ์ค๋ช ๊ธ์ ๋๋ค.
์ง๋ 1ํธ์์๋ ๊ณฐํฐ๋ทฐ์ ๋ํ ๊ฐ๋จํ ์ค๋ช
๊ณผ ๊ณฐํฐ๋ทฐ์์ Object Storage๋ก ์ IDrive e2๋ฅผ ์ฌ์ฉํ๊ฒ ๋์๋์ง ํฌ์คํ
์ ํ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ง๋๋ฒ ํฌ์คํธ์๋ 2ํธ์์๋ ๊ณฐํฐ๋ทฐ์์ ์ด๋ค ๋ก์ง์ ํตํด IDrive e2์ ๋น๋์ค๋ฅผ ์ ์ฅํ๊ณ , ์ด๋ฅผ ์ด๋ค ๋ก์ง์ผ๋ก ์๋น์ค์์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋์ง ํฌ์คํ
ํด๋ณด์๋ค.
์ด๋ฒ์๋ IDrive e2 ๊ด๋ จ ๋ง์ง๋ง ํฌ์คํ
์ผ๋ก ๊ทธ๋ ๋ค๋ฉด ์ด๋ค ๋ฐฉ์์ผ๋ก ๊ตฌํ์ ์ค์ ๋ก ์งํํ์๋์ง, ์ฝ๋๋ฅผ ๋ณด๋ฉฐ ์ค๋ช
์ ์งํํด๋ณด๊ฒ ๋ค.
1ํธ์์ ์ธ๊ธํ๋ฏ์ด IDrive e2๋ AWS S3 ๋์ฒด ์๋น์ค๋ก ์์ฃผ ์ ๋ ดํ ๊ฐ๊ฒฉ์ผ๋ก S3์ ๋์ผํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋ ๊ธฐ์ ํ ์ด ํ๋ก์ ํธ์์ ์ ๋ ดํ ๊ฐ๊ฒฉ์ผ๋ก Object Storage Service๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ์ฌ๋๋ค์๊ฒ ์ด ๊ธ์ด ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ๋ค.
์ฐ์ 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 v3์ ๊ณต์ ๋ฌธ์ ๋ง์ ๋ ์ ๋ฆฌ๊ฐ ๊น๋ํ๊ฒ ๋์ง ์๊ณ , ์ ์ฒด์ ์ธ ๋ด์ฉ์ด ๋ชจ๋ ํ ๋ฒ์ ์กด์ฌํ๋ ๋๋์ด ๋ค์ด์ ํ์ํ ์ ๋ณด๋ง์ ์ฐพ์๋ด๋๋ฐ ์ด๋ ค์์ด ์์๋ค.
๋ ๋ค๋ฅธ ๋ฌธ์ ์ ์ผ๋ก๋ IDrive e2๋ AWS S3๊ฐ ์๋๊ธฐ์ ๊ณต์ ๋ฌธ์์ ์ ํ์๋ ๋ด์ฉ๊ณผ ์กฐ๊ธ ๋ค๋ฅด๊ฒ ์์ฑํด์ผ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋ ๋ฌธ์ ๊ฐ ์์๋ค.
์ด์จ๋ ๊ทธ๋๋ AWS S3 SDK for JavaScript v3๋ฅผ ํตํด IDrive e2๋ผ๋ ์๋กญ๊ฒ ์ ํ๊ณ , ์ฐธ๊ณ ํ ์๋ฃ๋ ๋ง์ด ์๊ณ , ๊ด๋ จ ๊ณต์ ๋ฌธ์๋ง์ ๋ถ์คํ ์๋น์ค๋ฅผ AWS S3๋ฅผ ์ฐ๋ ๋ฐฉ๋ฒ๋๋ก ๊ทธ๋๋ง ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์๋ค.
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์ ์ค์ ํด์ผ ํ ๊ธฐ๋ณธ ๋ก์ง์ด๋ค. ์ด๋ ต์ง ์์ ๊ฐ์ฒด์ ๋ํ ์ค๋ช ์ด๊ธฐ์ ๊ฐ๋จํ๊ฒ๋ง ์ค๋ช ํด๋ณด๊ฒ ๋ค.
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์ ํ์ผ์ ์ ์ฅํ ๋ฒํท์ ์ด๋ฆ์ด๋ค.
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๋ก ๋ณ๊ฒฝํ์๋ ์๊ฐ์ด ๋ค์ด, ์ฒ์ฒํ ๋ง์ด๊ทธ๋ ์ด์
์ ์งํํ์๋ค. ์ด๋ ์๋น์ค ๊ฐ๋ฐ์๋ก์จ ์ข์ ์๊ฐ์ด์๋ค๊ณ ์๊ฐํ๋ค.
์ด์ 2ํธ์์ ์ค๋ช
ํ๋ ๋ด์ฉ์ด์ง๋ง, Postman์ ์ฌ์ฉํ์ฌ ํ
์คํธ ํ๋ ๋ฐฉ๋ฒ๊น์ง ์ถ๊ฐํ์ฌ ์ค๋ช
์ ์งํํด๋ณด๊ฒ ๋ค.
์ ์ฒด์ ์ธ ํ๋ฆ์ ์์ ์ฌ์ง๊ณผ ๊ฐ๋ค.
์์์ ๊ตฌํํ getPreSignedUrl ๋ฉ์๋๋ฅผ ์๋ฒ์ Pre-Signed ์์ฒญ ์๋ํฌ์ธํธ์ ์ฐ๊ฒฐ์์ผ๋์ด, ํด๋ผ์ด์ธํธ๊ฐ ์ ๋ก๋๋ฅผ ์ํ ๋๋ง๋ค ๋ฐ๊ธ ๋ฐ์ ์ ์๋๋ก ํ์๋ค.
๋ค์์ผ๋ก ์์ ์ฌ์ง์ฒ๋ผ Pre-Signed URL ๋ฐ๊ธ ์์ฒญ์ ์๋ต์ผ๋ก ๋ค์ด์จ preSignedUrl์ ์ฌ์ฉํ์ฌ Patch ๋ฉ์๋๋ก ์
๋ก๋๋ฅผ ์งํํ๋ฉด, IDrive e2 ๋ฒํท ์์์ ์
๋ก๋๋ ํ์ผ์ ํ์ธํ ์ ์๋ค.
์์ ๊ณผ์ ์ ๊ฑฐ์ณ ๊ณฐํฐ๋ทฐ์์๋ ๋น๋์ค ์
๋ก๋ ๋ก์ง์ ๊ตฌํํ์๋ค.
๋น๋์ค ์๋น ๋ก์ง์ DB์ IDrive e2 ์์ ๋น๋์ค URL์ ์ ์ฅํด๋์ด ์ด๋ฅผ ํ์ํ ๋๋ง๋ค ์์ฒญํ์ฌ ๋น๋์ค๋ฅผ ๋ณผ ์ ์๊ฒ ์
๋ก๋๋ณด๋ค ํจ์ฌ ๊ฐ๋จํ ๋ฐฉ์์ผ๋ก ๊ตฌํํ์๋ค. ๋น๋์ค ์๋น์ ๊ฒฝ์ฐ์๋ get ์์ฒญ์ ๋ํ preSignedUrl์ ์์ฑํ ์ ์์ผ๋ ํ์์ ๋ฐ๋ผ ์ฐธ๊ณ ํ์ฌ ์ด์ฉํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
AWS S3์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๊ท ๋ฒ์ ๊ณผ ์ธ๋ถ ์๋น์ค๋ฅผ ๋์์ ์ฌ์ฉํ์ฌ ๊ตฌํํ๋ ํน์ดํ ์ํฉ์ด์๊ธฐ์ ์ฐธ๊ณ ํ ๋งํ ๋ ํผ๋ฐ์ค๊ฐ ๋ถ์กฑํ์ฌ์ ์กฐ๊ธ ์ด๋ ค์์ ๊ฒช๊ธฐ๋ ํ์์ง๋ง ํ๋ก์ ํธ์ ํต์ฌ ๋ก์ง์ ์ ๊ตฌํํ ๊ฒ ๊ฐ์ ๊ธฐ์๋ค.