Project: ๐ฉcodefolio - ์ด๋ฏธ์ง ์ต์ ํ, ์ฑ๋ฅ ๊ฐ์
์ด๋ฏธ์ง ํ์ผ ์์ถ ์ ๋ก๋ ๊ธฐ๋ฅ ๊ตฌํ, ์ต์ข ์ฑ๋ฅ ๊ฐ์ ์ ๋ํ ๊ธฐ๋ก
๋ชฉ์ฐจโ
- ๋ฌธ์ ์ ๋ฐ๊ฒฌ
- ๋๋ฒ์งธ ์๋ฃจ์ (์ด๋ฏธ์ง ์์ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฉ)
- ํ์ผ ์ฌ์ด์ฆ ๋น๊ต
- ์ป์ด์ง ๊ฒฐ๊ณผ (Chrome LightHouse ์ ์)
1. ๋ฌธ์ ์ ๋ฐ๊ฒฌโ
๊ฒ์๊ธ์ด post๊ฐ ๋์ด detail ํ์ด์ง์์ ์ฌ์ฉ์๊ฐ ์์ฑํ ๊ธ์ด ๋ณด์ฌ์ง๊ฒ ๋๋ค
codefolio ํ๋ก์ ํธ ํน์ฑ์ ๋ค๋์ ์ด๋ฏธ์ง๊ฐ ๋ค์ด๊ฐ๊ฒ ๋จ์ ๋ฐ๋ผ editor์ ๋ฒ๋ค ์ฌ์ด์ฆ๋ ์ ์ง ์์๋ฐ, ๊ฑฐ๊ธฐ์ ๋ ์ฌ์ด์ฆ๊ฐ ํฐ ์ด๋ฏธ์ง๊ฐ ์ฌ๋ฌ๊ฐ ๋ณด์ฌ์ง๊ฒ ๋๋ฉด์ detail ํ์ด์ง์ ๋ก๋ฉ์๋๊ฐ ์ด๋ฏธ์ง์ ์ฌ์ด์ฆ์ ์๋์ ๋ฐ๋ผ ๋น๋กํ๊ฒ ์ฆ๊ฐํ๋ค.
๊ธฐ์กด์ staticํ ์ด๋ฏธ์ง๋ ํ๋ก ํธ์์ next image๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง ์ต์ ํ๋ฅผ ํ๋ฉด์ ๋น ๋ฅด๊ฒ ๋ก๋ฉ ๋์์ง๋ง
๋ทฐ์ด์์ ๋ณด์ฌ์ฃผ๋ ์ด๋ฏธ์ง๋ ๊ฐ๋ณ์ ์ผ๋ก ์ต์ ํ ํ ์ ์์๋ค. ๋ํ supabase๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ์ฐ๋ฆฌ ํ๋ก์ ํธ๋ ์๋ฒ๋น์ฉ์ด ๋์ด๋จ์ ๋ฐ๋ผ ์๋น์ค ์ ํ์ด ์๊ธธ ์ ์๋ค๋ ์ฐ๋ ค๊ฐ ์์๊ณ ,
๊ธฐ์กด์ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ firebase์์ ๊ฒช์ ๋ฐ์ ๊ฐ์ด (์ผ์ผ ํ ๋น ์ฉ๋ ์ด๊ณผ ์ ์๋ฒ ๋ค์ด..) ์๋ฒ ๋น์ฉ์ ๋ฌด์ํ ์ ์์๋ค.
๊ทธ๋ ๊ฒ ์ฌ๋ฌ ์๋ฃจ์ ์ ์ฐพ๋ ๋์ค 3๊ฐ์ง ๋ฐฉ์์ ์ฐพ์๋ค.
- ์ด๋ฏธ์ง ํฌ๊ธฐ ์กฐ์ = ์ ์ ์ ์๊ณ ๊ฐ ํ์
- ์ด๋ฏธ์ง ์์ถ = ๊ฐ๋ฐ ํ์
- ๋ ์ด์ง ๋ก๋ฉ = ๋ทฐ์ด ๋ด๋ถ์์์ ์ ์ฉ์ ์ ํ
์ ์ ์ค ์๋ฒ ๋น์ฉ์ ์ค์ด๋๋ฐ ๊ด์ฌ์ฌ๋ฅผ ๋ ์๋ฃจ์ ์ ์ด๋ฏธ์ง ์ฌ์ด์ฆ๋ฅผ ์์ถํ๋ ๋ฐฉ๋ฒ์ด์๊ณ ๊ทธ๋ ๊ฒ ์์ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐพ์๋ค,
v1.0.0 ๋ฒ์ ์ด deploy ๋ ์ํฉ์์ ์๋ฒ๊ฐ ๋ค์ด๋๋ค๋ฉด ์ ๋ง ์ต์ ์ด๋ค..
์ง์ฒด ํ ์ด์ ๊ฐ ์์๊ณ ๋ฐ๋ก ํ์๋ค๊ณผ ํ ์ํฉ์ ๊ณต์ ํ๊ณ ๋น ๋ฅด๊ฒ ์ ์ฉํด๋ณด๊ฒ ๋ค๋ ๋ป์ ๊ณต์ ํ๋ค.
2. ๋๋ฒ์งธ ์๋ฃจ์ (์ด๋ฏธ์ง ์์ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฉ)โ
import imageCompression from "browser-image-compression";
const options = {
maxSizeMB: 1,
initialQuality: 0.55, // initial 0.7
};
const compressImg = async (blob: File): Promise<File | void> => {
const result = await imageCompression(blob, options)
.then((res) => res)
.catch((e) => console.log(e, "์์ถ ์๋ฌ"));
return result;
};
export default compressImg;
common ํด๋์ ๋ง๋ค์ด๋๊ณ ๋ค๋ฅธ ํ์๋ค๋ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ค์ด ๋์๋ค.
files.map(async (file) => {
const fileId = uuidv4();
const compressedFile = await compressImg(file);
if (!compressedFile) return;
const uploadResult = await uploadImage(
compressedFile,
"post-image",
`${isPostId}/${fileId}`
);
if (!uploadResult) return;
const insertString = ``;
const resultString = insertToTextArea(insertString);
setPostContent(resultString || "");
});
4,5 ๋ฒ์งธ ์ค์ ์ ์ฉํ ๋ชจ์ต์ด๋ค.
์ฝ๊ฒ ์ ์ฉํ ์ ์์๊ณ ๋ค๋ฅธ ์ด๋ฏธ์ง ์ ๋ก๋ ๋ถ๋ถ์์๋ ์ ๋ถ ์ ์ฉํ๋ค.
3. ํ์ผ ์ฌ์ด์ฆ ๋น๊ตโ
| ๊ตฌ๋ถ | ํ์ผ ํฌ๊ธฐ |
|---|---|
| TO-BE (์์ถ ์ ์ฉ ํ) | 1.21 KB |
| AS-IS (์์ถ ์ ์ฉ ์ ) | 6.17 KB |
- ํด๋ผ์ด์ธํธ๊ฐ ์ ์กํ๋ ๋ชจ๋ ์ด๋ฏธ์ง๋ ๋ค์๊ณผ ๊ฐ์ด ํ์ผํฌ๊ธฐ๋ฅผ ์ฝ 80% ์์ถํ์ฌ ์๋ฒ ๋ถํ๋ฅผ ์ค์ผ ์ ์์๋ค.
- ์๋๋ ์์ถ ์ ์ฉ ์ ์ ์ฌ์ด์ฆ์ด๊ณ , ์๊ฐ ์์ถ ์ ์ฉ ํ ์ฌ์ด์ฆ. (supabase storage ๋ฒํท ํ๋ฉด ๊ธฐ์ค)
4. ์ป์ด์ง ๊ฒฐ๊ณผ(Chrome LightHouse ์ ์)โ
ํฐํธ, ์ด๋ฏธ์ง ์ต์ ํ, ์๋ํฐ ๋ณ๊ฒฝ์ ํตํ ์ฑ๋ฅ ๊ฐ์
Chrome LightHouse ์ ์ ์ธก์ ํ ๊ฐ์ ์ ์ ๋ฐ๊ฒฌํ์๋ค.
๊ฐ์ ์
| ์ฑ๋ฅ | ์ ๊ทผ์ฑ | ๊ถ์ฅ์ฌํญ | ๊ฒ์์์ง ์ต์ ํ |
|---|---|---|---|
| 74 | 95 | 92 | 100 |
Lighthouse๋ "๋คํธ์ํฌ ํ ์ด๋ก๋๊ฐ ์ปค์ง์ง ์๋๋ก ๊ด๋ฆฌํ๊ธฐ" (์ด ํฌ๊ธฐ 4,701KiB)๋ฅผ ์ง์ ํ๊ณ , ๊ฐ์ฅ ํฐ ํญ๋ชฉ์ fonts.gstatic.com์ Noto Sans KR ํฐํธ ํ์ผ(3,647.5 KiB)์ด์๋ค. ๊ทธ ๋ค์์ด supabase์ ์ฌ๋ผ๊ฐ ์ด๋ฏธ์ง(255.6 KiB)์๋ค.
๊ฐ์ ํ
| ์ฑ๋ฅ | ์ ๊ทผ์ฑ | ๊ถ์ฅ์ฌํญ | ๊ฒ์์์ง ์ต์ ํ |
|---|---|---|---|
| 99 | 98 | 92 | 100 |
์ด๋ฅผ ํตํด Chrome LightHouse ์ฑ๋ฅ์ ์๋ฅผ ๊ธฐ์กด 74์ ์์ 99์ ์ผ๋ก ๊ฐ์ ํ ์ ์์์ต๋๋ค.
- ์ด๋ฏธ์ง ์ต์ ํ๋ฅผ ์ํ ์ฌ๋ฌ ์๋ฃจ์ ์ ์ฐพ๋ ๋์ค 3๊ฐ์ง ๋ฐฉ์์ ์ฐพ์๋ค.
- ๊ทธ์ค ์ฐ๋ฆฌ์๊ฒ ํ์ํ ์๋ฒ๋น์ฉ์ ์ค์ผ ์ ์๋ ์๋ฃจ์ ์ธ browser-image-compression ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฉ.
- ์ฌ์ฉ์๊ฐ ์ ๋ก๋ํ๋ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ฝ 80% ์์ถํ์ฌ ์๋ฒ ๋ถํ๋ฅผ ์ค์ผ ์ ์์๋ค.
- ํฐํธ ์ต์ ํ, ์ด๋ฏธ์ง ์ต์ ํ, ์๋ํฐ ๋ณ๊ฒฝ์ ํตํด LightHouse ์ ์๋ฅผ 99์ ์ผ๋ก ๊ฐ์ ํ๋ค.
