๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

Project: ๐Ÿšฉcodefolio - ์ด๋ฏธ์ง€ ์ตœ์ ํ™”, ์„ฑ๋Šฅ ๊ฐœ์„ 

ยท ์•ฝ 3๋ถ„
Seung hyo, Lee
Front End Engineer @ Assistfit
๐ŸŽฏ๋ชฉ์ 

์ด๋ฏธ์ง€ ํŒŒ์ผ ์••์ถ• ์—…๋กœ๋“œ ๊ธฐ๋Šฅ ๊ตฌํ˜„, ์ตœ์ข… ์„ฑ๋Šฅ ๊ฐœ์„ ์— ๋Œ€ํ•œ ๊ธฐ๋ก

๋ชฉ์ฐจโ€‹

  1. ๋ฌธ์ œ์  ๋ฐœ๊ฒฌ
  2. ๋‘๋ฒˆ์งธ ์†”๋ฃจ์…˜ (์ด๋ฏธ์ง€ ์••์ถ• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ ์šฉ)
  3. ํŒŒ์ผ ์‚ฌ์ด์ฆˆ ๋น„๊ต
  4. ์–ป์–ด์ง„ ๊ฒฐ๊ณผ (Chrome LightHouse ์ ์ˆ˜)

1. ๋ฌธ์ œ์  ๋ฐœ๊ฒฌโ€‹

๊ฒŒ์‹œ๊ธ€์ด post๊ฐ€ ๋˜์–ด detail ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ๊ธ€์ด ๋ณด์—ฌ์ง€๊ฒŒ ๋œ๋‹ค

codefolio ํ”„๋กœ์ ํŠธ ํŠน์„ฑ์ƒ ๋‹ค๋Ÿ‰์˜ ์ด๋ฏธ์ง€๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋จ์— ๋”ฐ๋ผ editor์˜ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋„ ์ ์ง€ ์•Š์€๋ฐ, ๊ฑฐ๊ธฐ์— ๋” ์‚ฌ์ด์ฆˆ๊ฐ€ ํฐ ์ด๋ฏธ์ง€๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ๋ณด์—ฌ์ง€๊ฒŒ ๋˜๋ฉด์„œ detail ํŽ˜์ด์ง€์˜ ๋กœ๋”ฉ์†๋„๊ฐ€ ์ด๋ฏธ์ง€์˜ ์‚ฌ์ด์ฆˆ์™€ ์ˆ˜๋Ÿ‰์— ๋”ฐ๋ผ ๋น„๋ก€ํ•˜๊ฒŒ ์ฆ๊ฐ€ํ–ˆ๋‹ค.

๊ธฐ์กด์˜ staticํ•œ ์ด๋ฏธ์ง€๋Š” ํ”„๋ก ํŠธ์—์„œ next image๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”๋ฅผ ํ•˜๋ฉด์„œ ๋น ๋ฅด๊ฒŒ ๋กœ๋”ฉ ๋˜์—ˆ์ง€๋งŒ

๋ทฐ์–ด์—์„œ ๋ณด์—ฌ์ฃผ๋Š” ์ด๋ฏธ์ง€๋Š” ๊ฐœ๋ณ„์ ์œผ๋กœ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค. ๋˜ํ•œ supabase๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋Š” ์„œ๋ฒ„๋น„์šฉ์ด ๋Š˜์–ด๋‚จ์— ๋”ฐ๋ผ ์„œ๋น„์Šค ์ œํ•œ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์šฐ๋ ค๊ฐ€ ์žˆ์—ˆ๊ณ ,

๊ธฐ์กด์— ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ firebase์—์„œ ๊ฒช์€ ๋ฐ”์™€ ๊ฐ™์ด (์ผ์ผ ํ• ๋‹น ์šฉ๋Ÿ‰ ์ดˆ๊ณผ ์‹œ ์„œ๋ฒ„ ๋‹ค์šด..) ์„œ๋ฒ„ ๋น„์šฉ์„ ๋ฌด์‹œํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ์—ฌ๋Ÿฌ ์†”๋ฃจ์…˜์„ ์ฐพ๋˜ ๋„์ค‘ 3๊ฐ€์ง€ ๋ฐฉ์•ˆ์„ ์ฐพ์•˜๋‹ค.

  1. ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์กฐ์ • = ์œ ์ €์˜ ์ˆ˜๊ณ ๊ฐ€ ํ•„์š”
  2. ์ด๋ฏธ์ง€ ์••์ถ• = ๊ฐœ๋ฐœ ํ•„์š”
  3. ๋ ˆ์ด์ง€ ๋กœ๋”ฉ = ๋ทฐ์–ด ๋‚ด๋ถ€์—์„œ์˜ ์ ์šฉ์€ ์ œํ•œ

์œ„ ์…‹์ค‘ ์„œ๋ฒ„ ๋น„์šฉ์„ ์ค„์ด๋Š”๋ฐ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋‘” ์†”๋ฃจ์…˜์€ ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ๋ฅผ ์••์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์˜€๊ณ  ๊ทธ๋ ‡๊ฒŒ ์••์ถ• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์•˜๋‹ค,

v1.0.0 ๋ฒ„์ „์ด deploy ๋œ ์ƒํ™ฉ์—์„œ ์„œ๋ฒ„๊ฐ€ ๋‹ค์šด๋œ๋‹ค๋ฉด ์ •๋ง ์ตœ์•…์ด๋‹ค..

์ง€์ฒด ํ•  ์ด์œ ๊ฐ€ ์—†์—ˆ๊ณ  ๋ฐ”๋กœ ํŒ€์›๋“ค๊ณผ ํ˜„ ์ƒํ™ฉ์„ ๊ณต์œ ํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ์ ์šฉํ•ด๋ณด๊ฒ ๋‹ค๋Š” ๋œป์„ ๊ณต์œ ํ–ˆ๋‹ค.


2. ๋‘๋ฒˆ์งธ ์†”๋ฃจ์…˜ (์ด๋ฏธ์ง€ ์••์ถ• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ ์šฉ)โ€‹

browser-image-compression

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 = `![${file.name}](${uploadResult})`;
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 ์ ์ˆ˜ ์ธก์ • ํ›„ ๊ฐœ์„ ์ ์„ ๋ฐœ๊ฒฌํ•˜์˜€๋‹ค.

๊ฐœ์„  ์ „

์„ฑ๋Šฅ์ ‘๊ทผ์„ฑ๊ถŒ์žฅ์‚ฌํ•ญ๊ฒ€์ƒ‰์—”์ง„ ์ตœ์ ํ™”
749592100

Lighthouse๋Š” "๋„คํŠธ์›Œํฌ ํŽ˜์ด๋กœ๋“œ๊ฐ€ ์ปค์ง€์ง€ ์•Š๋„๋ก ๊ด€๋ฆฌํ•˜๊ธฐ" (์ด ํฌ๊ธฐ 4,701KiB)๋ฅผ ์ง€์ ํ–ˆ๊ณ , ๊ฐ€์žฅ ํฐ ํ•ญ๋ชฉ์€ fonts.gstatic.com์˜ Noto Sans KR ํฐํŠธ ํŒŒ์ผ(3,647.5 KiB)์ด์—ˆ๋‹ค. ๊ทธ ๋‹ค์Œ์ด supabase์— ์˜ฌ๋ผ๊ฐ„ ์ด๋ฏธ์ง€(255.6 KiB)์˜€๋‹ค.

๊ฐœ์„  ํ›„

์„ฑ๋Šฅ์ ‘๊ทผ์„ฑ๊ถŒ์žฅ์‚ฌํ•ญ๊ฒ€์ƒ‰์—”์ง„ ์ตœ์ ํ™”
999892100

์ด๋ฅผ ํ†ตํ•ด Chrome LightHouse ์„ฑ๋Šฅ์ ์ˆ˜๋ฅผ ๊ธฐ์กด 74์ ์—์„œ 99์ ์œผ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.


์ตœ์ข… ์ •๋ฆฌ
  1. ์ด๋ฏธ์ง€ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ์—ฌ๋Ÿฌ ์†”๋ฃจ์…˜์„ ์ฐพ๋˜ ๋„์ค‘ 3๊ฐ€์ง€ ๋ฐฉ์•ˆ์„ ์ฐพ์•˜๋‹ค.
  2. ๊ทธ์ค‘ ์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ์„œ๋ฒ„๋น„์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ์†”๋ฃจ์…˜์ธ browser-image-compression ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ ์šฉ.
  3. ์‚ฌ์šฉ์ž๊ฐ€ ์—…๋กœ๋“œํ•˜๋Š” ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์•ฝ 80% ์••์ถ•ํ•˜์—ฌ ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  4. ํฐํŠธ ์ตœ์ ํ™”, ์ด๋ฏธ์ง€ ์ตœ์ ํ™”, ์—๋””ํ„ฐ ๋ณ€๊ฒฝ์„ ํ†ตํ•ด LightHouse ์ ์ˆ˜๋ฅผ 99์ ์œผ๋กœ ๊ฐœ์„ ํ–ˆ๋‹ค.