Today, What I learned?
๋ผ์ดํธํ์ฐ์ค์ ์งํ๋ฅผ ๋ณด๊ณ ํ๋กํ ์ด๋ฏธ์ง์ ํ์ฅ์๋ฅผ webp๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ข๊ฒ ๋ค๊ณ ํ๋จ๋์ด์..
๋ค๋ฅธ ์ด๋ฏธ์ง ํ์ฅ์๋ฅผ ๋ฐ๊พธ๋ ๊ณผ์ ์์ ํ๋กํ ์ด๋ฏธ์ง ํ์ฅ์๋ ํ๋ฉด๊ณต์ ๋ฅผ ํตํด ํ์ ๋ถ์ด ๋ณ๊ฒฝํด ์ฃผ์ จ์ง๋ง,
๊ทธ ๊ณผ์ ์์ ๋ด๊ฐ ๋ ์ค์ํ(!) ์ฝ๋๊ฐ ์์ด์ ์ ๋ฆฌํด๋ณด๋ ค ํ๋ค ^^ใ
์ฐ์ ํ์ฌ ๋ผ์ดํธ ํ์ฐ์ค๋ ์ด๋ ๋ค.
์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ฆ
์ฐ๋ฆฌ ํ๋ก์ ํธ์์๋ ์ด๋ฏธ์ง ์ฌ์ด์ฆ ์ต์ ํ๋ฅผ ์ํด react-image-file-resizer
๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๊ณ ์๋ค.
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ์ฅ์๋ฅผ jpg, png ๋ฟ๋ง ์๋๋ผ webp๋ ํจ๊ป ์ ๊ณตํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฉ๋์ด ์๋ ๋ฆฌ์ฌ์ด์ฆ ํฌ๋งท์ ์๋์ ๊ฐ๋ค.
const resizeFile = (file: File) =>
new Promise((resolve) => {
Resizer.imageFileResizer(
file,
230,
230,
'JPEG',
70,
0,
(uri) => {
resolve(uri);
},
'base64',
);
});
ํ์ผ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฆฌ๋ฉด ํ์ผ์ ๋ฆฌ์ฌ์ด์ฆํด์ ํ์ด์ด๋ฒ ์ด์ค ์คํ ๋ฆฌ์ง์ ์ฌ๋ฆฌ๊ณ , ๋ด๋ ค๋ฐ์ ์ด๋ฏธ์ง url์ ๋ฆฌํด ๋ฐ์ state์ ์ ์ฅํด ์ฃผ๋ ๋ฐฉ์์ด๋ค.
...
const file = e.target.files[0];
const reader = new FileReader();
reader.readAsDataURL(file as Blob);
const resizedImage = await resizeFile(file);
// ์ด๋ฏธ์ง๋ฅผ ์คํ ๋ฆฌ์ง์ ์
๋ก๋ ํ ๋ฐํ๋ฐ์ ์ด๋ฏธ์ง url์ ์ํ(profileImg)๋ก ์ ์ฅ
uploadProfileImg(resizedImage, uid).then((res) =>
setProfileImg(resizedImage as string),
);
๋ฌธ์ ๋ webp ํ์ฅ์๋ก ๋ฐ๊พผ ์ดํ์ธ๋ฐ, ํ์ด์ด๋ฒ ์ด์ค์๋ base64 ๋ฐฉ์์ผ๋ก webp ์ด๋ฏธ์ง๋ฅผ ์ฌ๋ฆด ์ ์์ด blob์ผ๋ก ๋ณ๊ฒฝํ๋๋ฐ ํ๋กํ ์์ ๋ค ๋ฐ๋ก ๋ณ๊ฒฝ๋ ์ด๋ฏธ์ง๊ฐ ๋ฐ์์ด ๋์ง ์์๋ค.
const resizeFile = (file: File) =>
new Promise((resolve) => {
Resizer.imageFileResizer(
file,
230,
230,
'WEBP',
100,
0,
(uri) => {
resolve(uri);
},
'blob',
);
});
์ด์ ๋.. ์ฝ์์ ์ฐ์ด๋ณด๋ ์๋์ฒ๋ผ blob ๊ฐ์ฒด๋ฅผ ์ด๋ฏธ์งํ๊ทธ src์ ๋ฃ๊ณ ์์ด์์๋๋ฐ,
์ด ๋ถ๋ถ์์ setState์ blob ๊ฐ์ฒด๋ฅผ string ํ์ ์ผ๋ก ๋ฃ์ด์ฃผ๊ณ ์์๊ธฐ ๋๋ฌธ์ด๋ค..
// ์ด๋ฏธ์ง๋ฅผ ์คํ ๋ฆฌ์ง์ ์
๋ก๋ ํ ๋ฐํ๋ฐ์ ์ด๋ฏธ์ง url์ ์ํ(profileImg)๋ก ์ ์ฅ
uploadProfileImg(resizedImage, uid).then((res) =>
setProfileImg(resizedImage as string),
);
๊ทธ๋์ ๊ตณ์ด string์ผ๋ก ํ์ ์ ์ง์ ํด์ฃผ์ง ์๊ณ promise์ ๋ฐํ๊ฐ์ setState์ ๋ฃ์ด์ ์ ๋๋ก ์ ์ฉ ์๋ฃ!..
// ์ด๋ฏธ์ง๋ฅผ ์คํ ๋ฆฌ์ง์ ์
๋ก๋ ํ ๋ฐํ๋ฐ์ ์ด๋ฏธ์ง url์ ์ํ(profileImg)๋ก ์ ์ฅ
uploadProfileImg(resizedImage, uid).then((res) => setProfileImg(res));
์ด๋ ๊ฒ ์ด๋ฏธ์ง ์์ ์ด ๋ฐ๋ก ๋๋ค.
์ต์ ํ๊ฐ ์ผ๋ง๋ ๋์๋์ง? ์ด๋ฏธ์ง ์ฉ๋ ๋น๊ต
๋์ผํ ์ด๋ฏธ์ง๋ฅผ ๋น๊ตํด ๋ณด๋ ์์ฃผ ํฐ ์ฐจ์ด๊ฐ ์์๋ค.
์๋ 2.54MB์๋ ํ์ผ์ด 52.58KB๊น์ง ์ค์ด๋ค์๋ค. ๊ฑฐ์ 98%์ ๊ฐ๊น์ด ๊ฐ์์จ?!...
์ด๋ ๊ฒ ์ด๋ฏธ์ง ์ต์ ํ๋ฅผ ์๋ฃํ๋ค. ๐
'๐ Studying > ๐ TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] React.memo๋ก ์ต์ ํํ๊ธฐ (0) | 2023.03.02 |
---|---|
[React] ์ด๋ฏธ์ง ํ๊ทธ ๋์ ๊ฒฝ๋ก ์ถ๊ฐ src require (0) | 2023.02.28 |
[React] React.memo, useMemo, useCallback (0) | 2023.02.24 |
[React] useEffect์ ์คํ ์์ (1) | 2023.02.23 |
๋ง์ดํ์ด์ง ๋ฒ๊ทธ, ์ ๋ณด ๋ณ๊ฒฝ ํ์ธ ์ ํจ์ฑ ๊ฒ์ฌ ๐ค (0) | 2023.02.21 |
Comment