Notion ์ด๋ ฅ์์ ํ๋ซํผ์์ ์ ๊ณต๋๋ ์ด๋ ฅ์ ์์์ ๋ถํธํจ์ ๊ฐ์ ํ๊ณ ์ ๊ธฐํ/์ ์ํ๊ฒ ๋ ๊ฐ์ธ ์ด๋ ฅ์ ํ๋ก์ ํธ์ ๋๋ค.
๋ฐฐํฌ ๋งํฌ์๋ ๊ฐ์ธ ์ ๋ณด๊ฐ ๋ด๊ฒจ์ ธ ์์ด ๋ฐ๋ก ๋ช ์ํ๊ณ ์์ง ์์ต๋๋ค.
๊ธฐ์กด์ ๋ฆฌ์กํธ ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑํ ๋ CRA(Create-React-App)์ ํ์ฉํ๋ ๋ฐฉ์์ ์ฌ์ฉํด์์ต๋๋ค. CRA๋ Webpack์ ๊ธฐ๋ฐ์ผ๋ก ํ ๋น๋ ์์คํ ์ ์ฌ์ฉํ๊ณ ์๊ณ ์ด๊ธฐ ์ค์ ์ด ๋์ด ์์ด ๊ฐํธํ๋ค๋ ์ ์ ์์ด์ ๋ง์ด ์ด์ฉํ์์ง๋ง ์ด๋ฒ ํ๋ก์ ํธ์์๋ ๋ณด๋ค ๋น ๋ฅด๊ฒ ๋น๋๋ฅผ ์ฒ๋ฆฌํ๋ค๋ Vite๋ฅผ ์ฌ์ฉํด๋ณด๊ณ ์ ํ์ต๋๋ค.
Vite๋ Webpack Dev Server์๋ ๋ค๋ฅด๊ฒ ๋ก์ปฌ ๊ฐ๋ฐ ์ ๋ฒ๋ค๋ง์ ํ์ง ์๊ณ ESM ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๋ก์ปฌ ์๋ฒ ๊ตฌ๋ ์๋์์ ์ฅ์ ์ ๊ฐ์ง๊ณ ์์์ต๋๋ค. ์ด๋ฒ ํ๋ก์ ํธ์ ๊ท๋ชจ๊ฐ ํฌ์ง ์์ ์ค์ ํฐ ์ฐจ์ด๋ฅผ ๋๋ผ์ง ๋ชปํ์ง๋ง Webpack ์ธ์ ์๋ก์ด ๋น๋ ํด์ ์ฌ์ฉํด๋ณผ ์ ์์ด์ ์ข์ ๊ฒฝํ์ด์์ต๋๋ค.
์ด๋ ฅ์์ ํ์ํ ์ ๋ณด(์๊ธฐ์๊ฐ, ํ๋ก์ ํธ, ๊ฐ์ธ์ ๋ณด ๋ฑ)๋ค์ ํ์ฌ ๋งํฌ๋ค์ด ํ์ผ๋ก ์์ฑ๋์ด ์์ต๋๋ค. ๊ธฐ์กด์๋ Express๋ก ์๋ฒ๋ฅผ ๊ตฌ์ฑํ์ฌ ๋ก์ปฌ ํ์ผ์์ ๋งํฌ๋ค์ด ํ์ผ๋ค์ ์ฐพ์ ์๋ต ๊ฐ์ผ๋ก ๋ณด๋ด์ฃผ๋ ์๋ฒ๋ฅผ ๊ตฌ์ถํ์๊ณ , ์ด๋ฅผ ๋ฐฐํฌํ์ฌ ์ฌ์ฉํ๊ธฐ ์ํด์๋ AWS EC2๋ฑ์ ํ์ฉํ ๋ฐฐํฌ๊ฐ ํ์ํ์ต๋๋ค.
ํ์ง๋ง ํ์ฌ ์ฌ์ฉ๋๊ณ ์๋ HTTP Method๋ get
์ ์ฌ์ฉํ์ฌ ํด๋น ๋งํฌ๋ค์ด ํ์ผ์ json ํํ๋ก ์ฝ์ด์ค๋ ๊ฒ์ด์์ผ๋ฏ๋ก AWS EC2
๋ฅผ ํตํ ๋ฐฐํฌ๋ ๋ฌ๋ ์ปค๋ธ์ ๋น์ฉ ์ธก๋ฉด์์ ํจ์จ์ ์ด์ง ์๋ค๊ณ ์๊ฐํ์ต๋๋ค. AWS Lambda
๋ ์๋ฒ๋ฆฌ์ค ์ปดํจํ
์๋น์ค๋ก ์๋ฒ๋ฅผ ๊ด๋ฆฌํ์ง ์์๋ ๋๊ณ , ํ์ฌ ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ๋ ์ฌ์ฉ์๊ฐ ๋ง์ง ์๊ธฐ ๋๋ฌธ์ ๋น์ฉ์ ์ธ ์ธก๋ฉด์์๋ EC2๋ณด๋ค ์ ํฉํ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ๋ํ S3๋ฅผ ์ฌ์ฉํ์ฌ ๋ก์ปฌ์ ํ์ผ์ ๋ฐ๋ก ์ ์ฅํ์ง ์์๋ ๋์ด ๊ธฐ์กด์ Express ์๋ฒ์ ๊ตฌ์ฑ์์ ๋ณ๊ฒฝํ๊ฒ ๋์์ต๋๋ค.
๐ค ํธ๋ฌ๋ธ ์ํ
๋ฌธ์ ์ฌํญ 1. AWS Lambda ํจ์์์ ์ด๋ฒคํธ ๊ฐ์ฒด๊ฐ ๋น ๊ฐ์ผ๋ก ์ถ๋ ฅ
์์ฒญ URL์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ ์ํด์๋ ๋๋ค ํจ์์ handler
ํจ์์์ event
๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ง๋ง ๊ณ์ํด์ event ๊ฐ์ฒด๋ ๋น ๊ฐ์ผ๋ก ์ถ๋ ฅ๋๊ณ ์์๊ณ ์ด ๋ฌธ์ ๋ API Gateway์์ Lambda ํ๋ก์ ํตํฉ์ ํ์ฑํํ์ง ์์์ ์๊ธด ๋ฌธ์ ์์ต๋๋ค.
API Gateway๊ฐ ๋งค๊ฐ๋ณ์๋ฅผ ํฌํจํ ์ด๋ฒคํธ ์ธ๋ถ ์ ๋ณด๋ฅผ Lambda์ ์ ๋ฌํ๊ธฐ ์ํด์๋ ์ด ์ต์ ์ด ํ์ฑํ๋์ด์ผ ํ์ต๋๋ค. ์ด๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ฐฑ์๋์์ ๋จ์ผ Lambda ํจ์๋ฅผ ํธ์ถํ ์ ์๋๋ก ํฉ๋๋ค.
๋ฌธ์ ์ฌํญ 2. S3.GetObjectCommand์ ์ธ์คํด์ค์์ Body ๊ฐ์ฒด๋ฅผ ๋ฐฐ์ด์ ์ ์ฅํ ์ ์๋ ์ค๋ฅ
export const handler = async (event) => {
// (...)
for (const key of contentsKey) {
const commandGetObject = new GetObjectCommand({
Bucket: BUCKET,
Key: `data/${dirname}/${key}`,
});
const { Body } = await s3Client.send(commandGetObject);
if (!Body) {
return {
statusCode: 500,
body: JSON.stringify({ error: "๊ฐ์ ธ์ฌ ํ์ผ์ด ์กด์ฌํ์ง ์์ต๋๋ค." }),
};
}
const content = await Body.toString();
contentsData.push(content); // ERROR
}
};
Lambda์ handler ํจ์์์๋ S3 ๋ฒํท ๊ฐ์ฒด์์ ๊ฐ์ ธ์จ ํ์ผ์ contentsData
๋ฐฐ์ด์ ๋ฃ์ด์ฃผ๋ ๋ก์ง์ด ์กด์ฌํฉ๋๋ค.
Body?: Readable | ReadableStream | Blob;
ํ์ง๋ง Body
์ ์ ํ์ Readable | ReadableStream | Blob
(cf. type) ์ผ๋ก ๋ฐฐ์ด์ ์ ์ฅํ ์ ์์์ต๋๋ค. ReadableStream ํ์
์ ๋น๋๊ธฐ ์คํธ๋ฆผ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋๋ ๊ฐ์ฒด๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ํจ๊ป ํน์ API๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ณ๋์ streamToString
ํจ์๋ฅผ ๋ง๋ค์ด ReadableStream ํ์
์ String ํ์์ผ๋ก ๋ณ๊ฒฝํ์ฌ ๋ฐฐ์ด์ ์ ์ฅํ์์ต๋๋ค. (cf. AWS sdk Github Issue)
portfolio/src/hooks/useData.jsx
Lines 4 to 31 in 90d579e
useData() ์ปค์คํ ํ ์ API๋ฅผ ์์ฒญํ๊ณ ์๋ต ๊ฐ์ผ๋ก ๋ฐ์ ํ์ผ ์ ๋ณด์ ํจ์นญ ๋ก๋ฉ ์ํ๋ฅผ ๋ฐํํฉ๋๋ค. ์ด ๋ React Hook ์ค ํ๋์ธ useReducer๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ์๋ฒ์ ์ํ ์ ๋ฐ์ดํธ ๋ก์ง์ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
portfolio/src/hooks/useData.jsx
Lines 14 to 17 in 90d579e
useState๋ฅผ ์ฌ์ฉํด๋ ์ํ๋ฅผ ์ ๋ฐ์ดํธ ํ ์ ์์ง๋ง useReducer๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ํ ์ ๋ฐ์ดํธ ๋ก์ง์ ์ปดํฌ๋ํธ ์ธ๋ถ๋ก ๋ถ๋ฆฌํ ์ ์์๊ณ , ์ฌ์ฌ์ฉ์ฑ์ ์ฆ๊ฐ์ํฌ ์ ์์์ต๋๋ค.
ํ๊ทธ | ์ค๋ช (ํ๊ตญ์ด๋ก๋ง ์์ฑํ๊ธฐ) |
---|---|
โจ FEAT: |
์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ (๋ณ์๋ช ๋ณ๊ฒฝ ํฌํจ) |
๐ FIX: |
๋ฒ๊ทธ ํด๊ฒฐ |
๐ DESIGN: |
CSS ๋ฑ ์ฌ์ฉ์ UI ๋์์ธ ๋ณ๊ฒฝ |
๐จ STYLE: |
์ฝ๋ ํฌ๋งท ๋ณ๊ฒฝ, ์ธ๋ฏธ ์ฝ๋ก ๋๋ฝ, ์ฝ๋ ์์ ์ด ์๋ ๊ฒฝ์ฐ |
โป๏ธ REFACTOR: |
ํ๋ก๋์ ์ฝ๋ ๋ฆฌํฉํ ๋ง |
๐ฌ COMMENT: |
ํ์ํ ์ฃผ์ ์ถ๊ฐ ๋ฐ ๋ณ๊ฒฝ |
๐ DOCS: |
๋ฌธ์๋ฅผ ์์ ํ ๊ฒฝ์ฐ |
โ๏ธ CHORE: |
๋น๋ ํ ์คํฌ ์ ๋ฐ์ดํธ, ํจํค์ง ๋งค๋์ ์ค์ (ํ๋ก๋์ ์ฝ๋ ๋ณ๊ฒฝ X) |
๐๏ธ RENAME: |
ํ์ผ ํน์ ํด๋๋ช ์ ์์ ํ๊ฑฐ๋ ์ฎ๊ธฐ๋ ์์ |
๐ REMOVE: |
ํ์ผ์ ์ญ์ ํ๋ ์์ ๋ง ์ํํ ๊ฒฝ์ฐ |
๐ INIT: |
์ด๊ธฐ ์ปค๋ฐ์ ์งํํ ๊ฒฝ์ฐ |