์๋ก
์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ์๋ฒ์์ ๋ฐ์์ฌ๋, ์ด๋ฏธ์ง src ํ๊ทธ๋ก ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ string ํํ๋ก ๋ฐ๋ก ๋ฐ์์ฌ ์ ์๋ ๊ฒ์ด ์๋, ์ด๋ฏธ์ง ๋ฐ์ดํฐ ์ ๋ณด + ์ด๋ฏธ์ง ํ์ผ ๋ค์ด๋ก๋๋ฅผ ํตํด ์ด๋ฏธ์ง๋ฅผ ํ๋ฉด์ ๋์ธ ์ ์๋ค.
1. ์ด๋ฆ, ๋ ์ง ๋ฑ์ด ํฌํจ๋์ด์๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ api๋ฅผ ๋จผ์ ํธ์ถ
2. ์ด๋ฏธ์ง๋ฅผ ๋ฐ์์ค๊ธฐ ์ํ ์ด๋ฏธ์ง ํ์ผ์ ๋ค์ด๋ก๋ํ๋ api๋ฅผ ํธ์ถ
๋ ๊ฐ์ง๋ฅผ api๋ฅผ ํ์ฉํด์ ํ๋ฉด์ ์ด๋ฏธ์ง๋ฅผ ๋์ด๋ค.
๋ฌธ์
์ด๋ฏธ์ง ๋ชฉ๋ก์ ํ๋ฉด์ ๋์ธ๋ string ํํ์ ์ด๋ฏธ์ง ๊ด๋ จ ๋ฐ์ดํฐ๋ง ๋์ฐ๋ ๊ฒ์ด ์๋ ์ด๋ฏธ์ง ํ์ผ์ ๋ค์ด๋ก๋ ๋ฐ์์ ํ๋ฉด์ ํ์ถํด์ผํ๋, ์ด๋ฏธ์ง ๋ฐ์ดํฐ ๋ชฉ๋ก์ ๋จผ์ ์ฟผ๋ฆฌ๋ก ๋ฐ์์ค๊ณ , ๋ฐ์์จ ๋ชฉ๋ก ์ ๋ณด๋ก ์ด๋ฏธ์ง ํ์ผ์ ๋ค์ด๋ก๋ ๋ฐ๊ณ ๋์ ํ๋ฉด์ ๋ ๋๋งํ๊ฒ ํ๋ค.
๊ทธ๋ฌ๋๋ ์ ์ฒด ์ด๋ฏธ์ง๊ฐ ๋ค์ด๋ฐ์์ ธ์ผ์ง๋ง ํ๋ฉด์ ๋ ๋๋ง๋๋, get ํด์ค๋ ๋์์๋ ๋ง์น ํ๋ฉด์ ์๋ฌด๊ฒ๋ ์๋ ๊ฒ ๊ฐ์ด ๋ก๋ฉ ์๊ฐ์ด ์กฐ๊ธ ๊ธธ๊ฒ ๋๊ปด์ก๋ค.
๊ฐ์
- ์ฃผ์ ๊ฐ์ ์
์์ง ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ฐ์ง ์์ ์ด๋ฏธ์ง๋ฅผ ๋ณผ ์ ์๋๋ผ๋ ์ด๋ฏธ์ง ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ํ๋ฉด์ ๋์ฐ๊ณ ์ดํ์ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ฐ๊ฒ ํ์ฌ, ์ฌ์ฉ์์๊ฒ ๋จผ์ ๋ณด์ฌ์ค ์ ์๋ ์ปจํ ์ธ ๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก ๋ณ๊ฒฝํ๋ค. ํฌ๋กฌ๋ธ๋ผ์ฐ์ ์ Performance insights ํด์ ํ์ฉํด์ First Contentful Paint ์๊ฐ์ ์ธก์ ํ๊ณ , ์ฝ 1.1์ด ๊ฐ๋ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ค.
- ์ถ๊ฐ ๊ฐ์ ์
์ด๋ฏธ์ง ์์ดํ ์ปดํฌ๋ํธ์์ ์์ ๋ฒํผ์ ๋๋ฅด๋ฉด ์ด๋ฏธ์ง ๋ชจ๋ฌ์ด ์ด๋ฆฌ๋๋ฐ, ์ด์ ์ ๋ชจ๋ฌ ์ปดํฌ๋ํธ๊ฐ ๊ฐ๋ณ ์ด๋ฏธ์ง ์์ดํ ์ปดํฌ๋ํธ ๋ด๋ถ์ ํฌํจ ๋์ด์์๋ค. ์ด ๊ฒฝ์ฐ ์ด๋ฏธ์ง ๋ชฉ๋ก์ด ์์ญ๊ฐ๊ฐ ๋๋ค๋ฉด DOM ๋ ธ๋ ์๋ x2๋ฐฐ๋ก ์ฆ๊ฐํ๋ค๋ ๋ฌธ์ ๊ฐ ๋ณด์๋ค.
๋ฐ๋ผ์ ์ปจํ ์ด๋์์ ์์ ๋ชจ๋ฌ์ ํ ๊ฐ๋ง ํฌํจ์ํค๊ณ , ์ด๋ฏธ์ง ๋ชฉ๋ก ์ค ํ์ฌ ํด๋ฆญํ๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ ํ์ฌ ๋ชจ๋ฌ์ ์ด๋ฉด ํด๋น ๋ฐ์ดํฐ๊ฐ ๋จ๋๋ก ๊ฐ์ ํ์๋ค.
๊ฐ์ ์ด์ vs ์ดํ ์ฝ๋
๊ฐ์ ์ด์ ์ฝ๋
1. ์ด๋ฏธ์ง ํ์ผ ๋ค์ด๋ก๋ ๋ก์ง
PhotosContainer
const { data: photosData, isSuccess: isSuccessGetPhotos } =
useGetPhotosQuery(siteId);
const [photosList, setPhotosList] = useState<
(void | undefined | Photo)[]
>([]); //์๋ฒ์์ ๋ฐ์ ์ฌ์ง๋ชฉ๋ก ๋ฐ์ดํฐ์ ๋ค์ด๋ก๋๋ฐ์ ํ์ผ์ ์ถ๊ฐํ ๋ด๋ถ ์ํ๊ฐ
useEffect(() => {
if (isSuccessGetPhotos) {
const imgFileIncludedPromiseList = photosData.map((el: Photo) => {
if (el.id)
return downloadSiteImageFile(el.siteId, el.id)
.then((res) => {
// console.log(res, '๋ค์ด๋ก๋์ฌ์งํ์ผ res'); //Blob{size: 38229, type: 'image/png'}
if (res) {
return {
...el,
imgFile: res,
imgUrl: URL.createObjectURL(res),
};
}
})
.catch((err) => console.log(err));
});
Promise.all(imgFileIncludedPromiseList) //์ด๋ฏธ์ง ํ์ผ ํฌํจ๋ ํ๋ผ๋ฏธ์ค ํํ์ ๋ฆฌ์คํธ
.then((values) => setPhotosList(values))
.catch((err) => console.log(err));
}
}, [isSuccessGetPhotos]);
์๋ฒ์์ ๋ฐ์์ค๋ ๊ธฐ๋ณธ ์ด๋ฏธ์ง ๋ฐ์ดํฐ ๋ชฉ๋ก์ธ `photosData`๋ฅผ loop์ผ๋ก ๋๋ฆฌ๋ฉด์ ํด๋น id๋ฅผ ๊ฐ์ง๊ณ ์ฌ์ง ํ์ผ์ ๋ค์ด๋ก๋ ๋ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ด๋ก๋ ๋ฐ์ ๊ฒฐ๊ณผ๊ฐ์ ํ๋ผ๋ฏธ์ค๋ก ์ ์ฅํด์ ํ๋ฉด์ ๋์ธ `photosList`๋ผ๋ ์ํ๊ฐ์ ์ ์ฅํ๋ค.
PhotoCard
<Card sx={{ maxWidth: 160 }}>
<CardMedia
sx={{
width: 160,
height: 160,
}}
image={photoData.imgUrl}>
<Box display={'flex'}justifyContent={'space-between'}>
<IconButton onClick={() => handleChangeOpenPhotoModal(true)}>
<ModeEditIcon />
</IconButton>
<IconButton onClick={handleThumbnailImg}>
<CheckCircleIcon
color={photoData.isThumbnail ? 'primary' : 'inherit'}
/>
</IconButton>
<IconButton onClick={handleDeletePhotoData}>
<CancelIcon />
</IconButton>
</Box>
</CardMedia>
<CardContent>
<Box>
<Typography
noWrap
color='text.secondary'
sx={{ wordBreak: 'break-word' }}>{photoData.description}</Typography>
<Stack direction='row' spacing={1}>
<Typography>๊ตฌ์ญ์ ๋ณด: </Typography>
<Typography
color='text.secondary'
sx={{ wordBreak: 'break-word' }}>{photoData.area.siteAreaName ?? '์ ์ฒด'}</Typography>
</Stack>
</Box>
</CardContent>
</Card>
์์์ปจํ ์ด๋์์ ์ฟผ๋ฆฌ์์ ๋ฐ์์จ `photoData` ๋ฐ์ดํฐ๋ฅผ props๋ก ๊ทธ๋๋ก ์ ๋ฌ ๋ฐ์์ ํ๋ฉด์ ๊ทธ๋๋ก ๋ ๋๋งํ๋ view ์ญํ ์ ํ๋ค.
2. ์์ ๋ชจ๋ฌ
PhotoCard
<PhotoModal
photoData={photoData}
areasList={areasList}
handleUpdatePhoto={handleUpdatePhotoData}
isPhotoModalOpen={isPhotoModalOpen}
onChangeOpenPhotoModal={handleChangeOpenPhotoModal}
/>
PhotoCard ์ปดํฌ๋ํธ ๋ด๋ถ์์ PhotoModal ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ค.
ํ๋ฉด์์๋ ์์ ๋ฒํผ์ ๋๋ฅด๋ฉด ํด๋นํ๋ ๋ชจ๋ฌ์ด ํ ๊ฐ๋ง ๋จ๋ ๊ฒ์ด๋ผ ๋ชจ๋ฌ ์ ์ดํ๋ ๋ก์ง ๋ฐ ๋ชจ๋ฌ ์ปดํฌ๋ํธ๋ ํ๊ฐ๋ง ํ์ํ๋ฐ, ์ด๋๋ก๋ผ๋ฉด PhotoCard ์ปดํฌ๋ํธ ๊ฐ์๋งํผ๋ชจ๋ฌ ์ปดํฌ๋ํธ์ ๊ฐ์๊ฐ์๊ธฐ๋ ๋ฌธ์ ๊ฐ ์๋ค. ์ฆ ์ธ๋ฐ ์๋DOM ๋ ธ๋๊ฐ ์์ฑ๋๋ค.
๊ฐ์ ์ดํ ์ฝ๋
1. ์ด๋ฏธ์ง ํ์ผ ๋ค์ด๋ก๋ ๋ก์ง
PhotosContainer
<Box display='flex' flexWrap='wrap' gap={2}>
{isSuccessGetPhotos &&
photosData?.map((el) => (
<PhotoCard
key={el.id}
photoData={el}
onChangeOpenPhotoModal={handleOpenEditPhotoModal}
onSetCurrentPhotoData={(data) =>
setCurrentPhotoData(data)
}></PhotoCard>
))}
</Box>
์ด๋ฏธ์ง ํ์ผ์ ๋ค์ด๋ก๋ ๋ฐ๊ธฐ ์ ์ ์ฟผ๋ฆฌ์์ ๋ฐ์์จ ๊ธฐ๋ณธ๋ฐ์ดํฐ `photosData`๋ฅผ PhotoCard ์ปดํฌ๋ํธ์ props๋ก ๋๊ฒจ์ค๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ด๋ฏธ์ง๊ฐ ํ๋ฉด์ ๋ณด์ด์ง ์์๋ ๊ด๋ จ ํ ์คํธ ๋ฐ์ดํฐ๋ ๋จผ์ ํ๋ฉด์ ๋ฐ ์ ์๊ฒ ๋๋ค.
PhotoCard
useEffect(() => {
//์ฌ์งํ์ผ ๋ค์ด๋ก๋
if (photoData.id) {
downloadImageFile(photoData.siteId, photoData.id)
.then((res) => {
setDownloadedImgUrl(URL.createObjectURL(res));
setDownloadedImgFile(res);
})
.catch((err) => console.log(err));
}
return () => {
URL.revokeObjectURL(downloadedImgUrl);
};
}, [photoData.imgFileId]);
๊ทธ๋ฆฌ๊ณ ๋์ ํ์ ์นด๋ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ์ฌ์ง ํ์ผ์ ๊ฐ๋ณ๋ก ๋ค์ด๋ก๋ํ๋๋ก ํ๋ค.
2. ์์ ๋ชจ๋ฌ
PhotoCard ๋ด๋ถ์ ์์ ๋ฒํผ์ ์ด๋ฉด ํด๋น ํฌํ ์นด๋ ์ปดํฌ๋ํธ์ ํด๋น๋๋ ๋ฐ์ดํฐ๋ก ์ฑ์์ง ๋ชจ๋ฌ์ด ์ด๋ ค์ผํจ์ผ๋ก์ปจํ ์ด๋์์ ๋ชจ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ํ ๊ฐ๋ง ๊ฐ์ง๊ณ ์๋๋ก ๋ณ๊ฒฝํ๊ณ , ํด๋ฆญํ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ชจ์์ ์ํ๊ฐ์ผ๋ก ์ถ์ ํ๋ค.
PhotosContainer
const initialSitePhoto = {
siteId: siteId,
imgFile: null,
imgUrl: '',
description: '',
area: {},
isThumbnail: false,
};
const [currentPhotoData, setCurrentPhotoData] = useState(initialPhoto);
const [isEditPhotoModalOpen, setIsEditPhotoModalOpen] = useState(false); //์ฌ์ง ์์ ๋ชจ๋ฌ ์ํ
{/* ์์ ๋ชจ๋ฌ */}
{isSuccessGetAreasFlatData && (
<PhotoModal
areasList={areasFlatData}
isPhotoModalOpen={isEditPhotoModalOpen}
onChangeOpenPhotoModal={handleOpenEditPhotoModal}
type='edit'
photoData={currentPhotoData}
onUpdatePhoto={handleUpdatePhotoData}
isThumbnailImg={currentPhotoData.isThumbnail}
onUpdateThumbnailImg={handleUpdateThumbnailImg}
/>
)}
ํด๋ฆญํ ์นด๋์ ๋ฐ๋ผ ํด๋น ๋ฐ์ดํฐ๋ฅผ PhotoModal ์ปดํฌ๋ํธ๋ก ๋๊ฒจ์ฃผ์ด์ผ ํจ์ผ๋ก ํด๋ฆญํ ๋ฐ์ดํฐ๋ฅผ `currentPhotoData` ๋ผ๋ ์ํ๊ฐ์ผ๋ก ๊ด๋ฆฌํ๋ค.
๊ตฌ์กฐ
โฃ PhotosContainer
โฃ PhotoCard
โฃPhotoModal
์ด์ ํด๊ฒฐ
์ฌ๊ธฐ์ ์ด์๋ฅผ ํ๋ ๋ง๋ฌ๋ค.
์์ ๋ชจ๋ฌ์ด ๋์ํ๊ธธ ์ํ๋ ๋ก์ง์ ์์๋ ์๋์ ๊ฐ์๋ค.
1. ํ์ ํฌํ ์นด๋ ์ปดํฌ๋ํธ์์ ์์ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์์ ๋ถ๋ชจ ์ปจํ ์ด๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ค๋ค.
2. ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ ํ์์์ ์ ๋ฌ๋ฐ์์จ ๋ฐ์ดํฐ๋ก `currentPhotoData` ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ค.
3. ์ปจํ ์ด๋์์ ๋ณ๊ฒฝ๋ ํด๋น ์ํ๊ฐ์ ํ์ ๋ชจ๋ฌ ์ปดํฌ๋ํธ์ ๋๊ฒจ์ค๋ค.
๊ทธ๋ฐ๋ฐ ๋ชจ๋ฌ์ ์ด๋ฉด ์ต์ ์`currentPhotoData` ์ํ๊ฐ ์๋ ์ด์ ์ ๋๋ ๋ ๋ฐ์ดํฐ๊ฐ ๋จ์์๋ ๋ฌธ์ ๊ฐ ์์๋ค. ์ฆ ์ปจํ ์ด๋์์ ์ํ๊ฐ์ด ๋ณ๊ฒฝ๋๊ธฐ ์ด์ ์ ๋ชจ๋ฌ์ด ์ด๋ฆฌ๊ณ , ๋ณ๊ฒฝ๋๊ธฐ ์ด์ ๊ฐ์ด ๋ชจ๋ฌ์ ์ด๋ ๋ํ๋๋ ์ฑํฌ ๋ฌธ์ ์๋ค.
๊ฒฐ๊ตญ ๋ชจ๋ฌ์ปดํฌ๋ํธ์์ useEffect๋ฅผ ํ์ฉํด์ props๋ก ๋ฐ์์ค๋ `currentPhotoData` ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ค์ ๋ชจ๋ฌ์ ๋ ๋๋ง ํ ์ ์๋๋ก ํด๊ฒฐํ๋ค.
๊ฐ์ ์ด์ vs ์ดํ ์ฑ๋ฅ ๋น๊ต
CPU No throttling
FCP(First Contentful Paint)
FCP์ธ ์ต์ด ์ปจํ ์ธ ๋ ๋๋ง ์๊ฐ์ ๊ฐ์ ์ ํ ๊ฐ๊ฐ 0.26์ด, 0.25์ด๋ก ๊ฑฐ์ ๋น์ทํ๋ค. ๊ทธ๋ฐ๋ฐ ์ด FCP ์๊ฐ์ ๋จ๋ ํ๋ฉด ์บก์ณ๋ฅผ ๋ณด๋ฉด ์ฐจ์ด๊ฐ ํ์ฐํ ๋๋ค.
- ๊ฐ์ ์ด์
- FCP ์๊ฐ์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๊ฐ ์์์ ์ ์ ์กฐ์ฐจ ์๋ค. ์ด๋ฏธ์ง ์ปจํ ์ด๋๋ฅผ ๊ฐ์ธ๊ณ ์๋ div ๋ฐ์ค์ ๋ณด๋๋ง ๋ณด์ผ ๋ฟ์ด๋ค.
- ๊ฐ์ ์ดํ
- 0.25์ด๋ง์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ๋ผ๋๊ฐ ํ๋ฉด์ ๋ ๋๋ง ๋๋ค. ์์ง ์ด๋ฏธ์ง๋ ๋ณด์ด์ง ์์ง๋ง ์ฌ์ฉ์๋ ์ด๋ฏธ์ง ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ์ ํ ์ ์๊ณ ์ค์ ์ฌ์ง ์ด๋ฏธ์ง๊ฐ ์์ ๊ฑฐ๋ผ๋ ๊ฒ์ 0.25์ด๋ง์ ์ธ์ง ํ ์ ์๋ค.
LCP(Largest Contentful Paint)
์ด์ ๊ฐ์ฅ ํฐ ์ด๋ฏธ์ง์ ๋ ๋๋ง ์๊ฐ์ ์ธก์ ํ๋ LCP ์๊ฐ(์ฝํ ์ธ ๊ฐ ํฌํจ๋ ์ต๋ ํ์ธํธ ์๊ฐ)์ ์ธก์ ํ๋ค.
- ๊ฐ์ ์ด์
- LCP ์๊ฐ์ผ๋ก ์ธก์ ๋ 1.35์ด ๋ฐ๋ก ์ง์ ์ ์ด๋ฏธ์ง์ ๋ผ๋๊ฐ ๋ํ๋ฌ๋ค.
- ์ฆ 1.35์ด์ ๊ฐ๊น์์ ธ์ผ ์ด๋ฏธ์ง ์์ดํ ์ ๋ผ๋๊ฐ ๋ํ๋๋ ๊ฒ์ผ๋ก, ์ด ๋ง์ ์ฌ์ฉ์๊ฐ ์ด๋ฏธ์ง๊ฐ ์๋ค๋ ๊ฒ์ ์ธ์งํ๋ ค๋ฉด ๊ฑฐ์ 1.35์ด์ ๊ฐ๊น์ด ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค๋ ๊ฒ์ด๋ค. ๊ทธ ๋์์ ๋ก๋ฉ skeleton ui๋ฅผ ๋ฐ๋ก ๋์ฐ์ง ์๋ ์ด์ ์ฌ์ฉ์๋ ์ด๋ฏธ์ง ์ ๋ณด๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒ์ธ์ง ๋ฐ์ดํฐ๊ฐ ๋ก๋ฉ ์ค์ธ ๊ฒ์ธ์ง ๋ชจ๋ฅธ๋ค.
- ๊ฐ์ ์ดํ
- LCP ์๊ฐ์ 1.16์ด๋ก ์ด ์๊ฐ์ ๊ฐ์ฅ ํฐ ์ด๋ฏธ์ง๊ฐ ํ ๊ฐ๊ฐ ๋ ๋๋ง๋๊ธฐ ์์ํ๊ณ ์ดํ์ ์ฐจ๋ก์ฐจ๋ก ๋ค์ด๋ฐ์ ์ด๋ฏธ์ง ํ์ผ์ด ๋ ๋๋ง๋๋ค.
๋ฐ๋ผ์ FCP ์์ฒด ์ธก์ ๋ ์๊ฐ์ 0.25์ด ์ ๋๋ก ๊ฐ์ ์ ์ด๋ ํ๋ ์๊ฐ์ฐจ๊ฐ ์๊ฒ ๋๊ปด์ ธ๋, ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ๋ผ๋๊ฐ ํ๋ฉด์ ์ต์ด๋ก ๋จ๋ ์๊ฐ์ ๊ณ ๋ คํด๋ณธ๋ค๋ฉด ๊ฐ์ ์ ํ๊ฐ 1์ด๊ฐ ๋๋ ์๊ฐ ์ฐจ์ด๊ฐ ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
LCP ๋ชจ๋ ์ฌ์ง ๋ค์ด๋ก๋
๋ฐ๋ก ์ฑ๋ฅ ์ธก์ ํญ๋ชฉ์ ํ์๋์ง ์์ง๋ง, ๊ถ๊ธํด์ ๋ชจ๋ ์ฌ์ง์ ๋ค์ด๋ก๋ ๋ฐ์๋ ๊น์ง์ ์๊ฐ์ ์ธก์ ํด๋ณด์๋ค.
- ๊ฐ์ ์ด์
- LCP ์๊ฐ์ธ 1.35์ด์ ๋ค์ด๋ก๋ ๋ฐ์์ง ์ฌ์ง์ด ๋ชจ๋ ๋ํ๋ฌ๋ค.
- ๊ฐ์ ์ดํ
- ์ต์ด ํ ์ฅ์ ์ฌ์ง์ด ๋ค์ด๋ฐ์์ก๋ LCP ์๊ฐ์ธ 1.16์ด์์ ์กฐ๊ธ ์ดํ์ธ 1.42์ด๊ฐ ๋์ด์ผ ๋ค์ด๋ก๋ ๋ฐ์์ง ์ฌ์ง์ด ๋ชจ๋ ๋ํ๋ฌ๋ค.
FCP ์ฑ๋ฅ์ ๊ฐ์ ํ์ง๋ง ๋ชจ๋ ์ฌ์ง์ด ๋ค์ด๋ก๋ ๋ ๋๊น์ง์ ์๊ฐ์ ์ฌ์ค ๋ ๋๋ ค์ก๋ค. ์ด์ ์๋ ์ปจํ ์ด๋์์ ๋ชจ๋ ์ฌ์ง์ ๋ค์ด๋ก๋ ๋ฐ๊ณ ๋ ์ดํ์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์ ๋ ๋๋ง ํ๋ค๋ฉด, ๊ฐ์ ์ดํ์๋ PhotoCard๋ผ๋ ๊ฐ๋ณ ์ด๋ฏธ์ง ์์ดํ ์ปดํฌ๋ํธ๋ฅผ map ์ผ๋ก ๋๋ฉด์ ์์ดํ ์ปดํฌ๋ํธ์์ ์ฌ์ง์ ๋ค์ด๋ก๋ ๋ฐ๋ ๋ก์ง์ด ์๋ค๋ณด๋ ๋ชจ๋ ์ฌ์ง์ด ๋ค์ด๋ก๋ ๋ ๋ ๊น์ง๋ ์กฐ๊ธ ๋ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฐ ๊ฒ ๊ฐ๋ค.
์ด๋ก์จ ์ฒซ ๋ ๋๋ง์ ์ด๋ฏธ์ง ๋ผ๋๋ฅผ ๋นจ๋ฆฌ ๋์ธ ๊ฒ์ธ๊ฐ? vs ์ฒซ ๋ ๋๋ง ์๊ฐ์ ์ข ๊ฑธ๋ฆฌ๋๋ผ๋ ์ฌ์ง์ด ๋ชจ๋ ๋ค ๋ค์ด๋ก๋ ๋ ํ๋ฉด์ ๋นจ๋ฆฌ ๋์ธ ๊ฒ์ธ๊ฐ? ๋ฅผ ๋๊ณ ๊ณ ๋ฏผ์ ํ๊ฒ ๋์๋๋ฐ, ์ฐ์ ์ฒซ ๋ ๋๋ง์ ๋ก๋ฉ์๊ฐ์ด ๋๋ ธ๋ ๊ฒ์ด ์ฃผ๋ ๋ฌธ์ ์ ์ด์์ผ๋ฏ๋ก FCP ๊ฐ์ ์ ์ด์ ์ ๋ง์ถ์๋ค.
CPU 6๋ฐฐ ๊ฐ์
์ฑ๋ฅ ์ธก์ ์ CPU No Throttling์ผ๋ก ํ๋ฉด ํฐ ์ฐจ์ด๊ฐ ๋๊ปด์ง์ง ์์, CPU 6๋ฐฐ ๊ฐ์์ด๋ผ๋ ์ต์ ์ ์ ํํด์ ๊ฐ์ ํ๊ฒฝ์์ ๋์ผํ ๋ฉํธ๋ฆญ์ ์ธก์ ํด ๋ณด์๋ค.
FCP
FCP 1.21์ด vs 1.08์ด
์ญ์ ์ ์ ํธ๋ํฝ ์์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก FCP์์ ๊ฐ์ ์ด์ ์ ์๋ฌด๋ฐ ํ๋ฉด์ด ์๋ณด์ด๊ณ ๊ฐ์ ์ดํ๋ ์ด๋ฏธ์ง ํ ์คํธ ๋ฐ์ดํฐ ๋ผ๋๊ฐ ๋ฐ๋ก ๋ํ๋ฌ๋ค.
LCP
LCP 2.68์ด vs 2.71์ด
์ ์ ํธ๋ํฝ ์์ ์๋ ๋ค๋ฅด๊ฒ ์ฑ๋ฅ ๊ฐ์ ์ดํ์ LCP๊ฐ ์กฐ๊ธ ๋ ๋๋๊ฒ ๋์๋ค.
๊ฐ์ ์ด์ ์ LCP์ ๊ทผ์ ํ ๋ฐ๋ก ์ด์ ์ ์ด๋ฏธ์ง ๋ผ๋๊ฐ ๋ํ๋ฌ๊ณ , ๊ฐ์ ์ดํ์๋ LCP ์๊ฐ์ ๊ทผ์ ํด ์๋ ์๊ฐ ์ดํ์ ์ด๋ฏธ์ง ์ฌ์ง์ด ํ ๊ฐ ๋ค์ด๋ก๋ ๋ฐ์์ก๋ค.
LCP ๋ชจ๋ ์ฌ์ง ๋ค์ด๋ก๋
๋ชจ๋ ์ฌ์ง์ ๋ค์ด๋ก๋ ๋ฐ๋ ์๊ฐ์ ๊ฐ์ ์ด์ ์๋ LCP ์๊ฐ์ ์ ํํ ๋ชจ๋ ์ฌ์ง์ด ๋ค์ด ๋ฐ์์ก๊ณ , ๊ฐ์ ์ดํ์๋ LCP ๊ฐ ์กฐ๊ธ ํ์ฐธ ์ง๋ 3.06์ด๊ฐ ๋ค ๋์ด์์ผ ๋ชจ๋ ์ฌ์ง์ด ๋ค์ด๋ก๋ ๋ฐ์์ก์์ ์ธก์ ํ ์ ์์๋ค.
์ด๋ฒ ์คํ์ ํตํด ์ต์ด์ ๋ ๋๋ง ์๊ฐ์ ๋น ๋ฅด๊ฒ ํ ๊ฒ์ธ์ง, ๋ชจ๋ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ ๋ฐ์ ๋ณด์ฌ์ฃผ๊ธฐ๊น์ง์ ์๊ฐ์ ๋น ๋ฅด๊ฒ ํ ๊ฒ์ธ์ง๋ฅผ ๋๊ณ trade-off ๊ฐ ์์์์ ๋๋ ์ ์๋ค. FCP LCP ๋ ๋ฉํธ๋ฆญ์ด ๋ค GOOD์ ํด๋น๋๋ ์งํ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด FCP๋ LCP ์ค ์ด๋ค๊ฒ ๋ ์ค์ํ์ง์ ๋ํ ์ ๋ต์ ์๋ ๊ฒ ๊ฐ๋ค. ์๋น์ค/์ ์ ๊ฐ ํ์ํ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ์ด๋ค ๊ฒ์ด ๋ ์ค์ํ ๊ฐ์น๋ฅผ ๊ฐ์ง๋์ง๋ฅผ ๋๊ณ ์ฑ๋ฅ ๊ฐ์ ์ ๋ต์ ์ง๋ ๊ฒ์ด ํ์ํ ๊ฒ ๊ฐ๋ค.
์ด๋ฒ์ FCP๋ฅผ ์ค์ ์ผ๋ก ๊ฐ์ ์ ํ๋๋ฐ, ๋ชจ๋ ์ฌ์ง์ ๋ค์ด๋ก๋ ๋ฐ๋ ์๊ฐ์ ๊ฐ์ ํ๊ธฐ ์ด์ ๋ณด๋ค ์กฐ๊ธ ๋ ๋๋ ค์ ธ์ ์ด ๋ถ๋ถ์ ๋ ๋ ์ด๋ป๊ฒ ๊ฐ์ ํ ์ ์์์ง ๊ณ ๋ฏผํด๋ณด๊ณ ์ ์ฉํด๋ณด๊ณ ์ถ๋ค.
References
https://developer.chrome.com/docs/devtools/performance-insights?hl=ko
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
html a ํ๊ทธ ๊ฐ์ด๋ฐ ์ ๋ ฌํ๊ธฐ (0) | 2024.04.16 |
---|---|
javascript๋ก ์น๋ทฐ์์ ์คํ ๋๋์ง ๊ฐ์งํ๊ธฐ flutter - react (0) | 2024.04.15 |
vite public html ํ์ผ iframe์ผ๋ก ๋์ฐ๊ธฐ (0) | 2024.02.21 |
Form ์ปดํฌ๋ํธ์ ๊ด์ฌ์ฌ ๋ถ๋ฆฌํ๊ธฐ - ์ ์ฒด input ์ํ๊ฐ์ ํ๋์ handler ํจ์๋ก ๊ด๋ฆฌ (0) | 2024.02.16 |
debounce๋ก ์ค์๊ฐ ๊ฒ์์ด api ํธ์ถ ์ค์ด๊ธฐ (0) | 2024.02.07 |