๐ฃ๏ธ '์ ์ธ์ ์ธ ์ฝ๋'์ ๋ํด์ ๋ค์ด๋ณด์ จ๋์?
๋ค์ด๋ ๋ดค๋๋ฐ.. ๋ญ์ง?
ํ ์ค ํ๋ก ํธ์๋ ์ฑํฐ์์๋ ์ ์ธ์ ์ธ ์ฝ๋ (Declarative Code)๋ฅผ ์ถ์ํ ๋ ๋ฒจ์ด ๋์์ง ์ฝ๋๋ผ๊ณ ์๊ฐํ๋ค๊ณ ํ๋ค.
์ถ์ํ ๋ ๋ฒจ์ด ๋์์ง ์ฝ๋๋?
๋ค์๊ณผ ๊ฐ์ด ๋ฐฐ์ด์ ํฉ์ ๊ตฌํ๋ ํจ์ sum์ ์ดํด๋ณด์.
sum([1,2,3]);
// sum ํจ์์ ๊ตฌํ
function sum(nums: number[]) {
let result = 0;
for (const num of nums) {
result += num;
}
return result;
}
sum ํจ์์ ์ด๊ธฐ๊ฐ์ 0์ด๊ณ , for๋ฌธ์ ๋๋ฉด์ ๋ฐฐ์ด์ ๊ฐ ์๋ฅผ ๋ํ๊ณ ,
๋ํด์ง ๊ฒฐ๊ด๊ฐ์ ๋ฆฌํดํด์ค๋ค.
์ด ์์ ์ด ์ถ์ํ๋์ด, sum ํจ์๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋์ ๋ด๋ถ์ ๋ณต์กํ ์ ์ด ํ๋ฆ์ ๋ํ ์ดํด ์์ด
๋ฐฐ์ด์ ํฉ์ ๊ตฌํ๋ ๋์์ ์ง์คํ์ฌ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ฆ, ์ ์ธ์ ์ธ ์ฝ๋๋ ๋ด๋ถ์ ์ ์ด ํ๋ฆ์ด ์ถ์ํ๋์ด
๋์์ ์ง์คํ ์ ์๋ ์ฝ๋๋ผ๊ณ ๋ณผ ์ ์๋ค.
// for of ๋ฌธ๋ ์ ์ธ์ ์ธ ์ฝ๋๋ค.
for (const num of nums) {
result += num;
}
// ๋ด๋ถ์ ์ผ๋ก ๋ฐฐ์ด์ ๊ฐ ์์๋ฅผ ์ํํ๋ ๋์์ด ์ถ์ํ๋ ๊ฒ์ด๋ค.
const iterator = nums[Symbol.iterator](); // Iterator ์์ฑํ๊ณ
let step;
while (!(step = iterator.next()).done) { // Iterator๊ฐ ์์ ๋๊น์ง
const num = step; // ๋ค์ ์์๋ฅผ ์ฐจ๋ก๋ก ๊ฐ์ ธ์จ๋ค
/* ๋์ ... */
}
// iterator ์ญ์ ๋์ ์๋ต..
ํญ์ ๋ค์ด์๋ silver bullet์ ์๋ค๋ ๋ง์ ์ ์ธ์ ์ธ ์ฝ๋๋ฅผ ์ธ ๋์๋ ์ ์ฉ๋๋ค.
ํ ์ค์์๋ ์ข์ ์ฝ๋๋ฅผ ํ๋จํ๊ธฐ ์ํ ์์น๋ค์ด ์๋๋ฐ ๊ทธ ์ค ์ 1์์น์ ๋ค์๊ณผ ๊ฐ๋ค.
"์์ ํ๊ธฐ ์ฌ์ด ์ฝ๋"
๋น์ฆ๋์ค ์๊ตฌ ์ฌํญ์ ํญ์ ๋น ๋ฅด๊ฒ ๋ณํ๊ณ , ๊ฐ๋ฐ์๋ ์ด์ ์ ์ํ๊ฒ ๋์์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์
์ ์ธ์ ์ฝ๋๋ฅผ ์์ ํ๊ธฐ ์ฌ์ด ๊ฒฝ์ฐ์ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์์ต๋๋ค.
<SignUpForm
onSubmit={result => {
/* ํ์๊ฐ์
๊ฒฐ๊ณผ์ ๋ฐ๋ผ์ ํน์ ๋์ ์ํ ... */
}}
/>โ
๐ ์ฌ์ด ๊ฒฝ์ฐ : ํ์ ๊ฐ์ ํผ์ ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฉํ๋ค๋ฉด ์ฌ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ํจ์จ์ ์ด๋ค.
์ฌ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ํ ๊ณณ๋ง ์์ ํ๋ฉด ๋ค๋ฅธ ๊ณณ์๋ ๋ฐ์๋์ด ๋น ๋ฅด๊ฒ ์์ ์ด ๊ฐ๋ฅํ๋ค.
๐ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ : ํ๋ฉด๋ง๋ค SignUpForm์ด ์กฐ๊ธ์ฉ ๋ค๋ฅด๋ค๋ฉด ๊ณตํตํ๋ ๊ฒ์ด ์คํ๋ ค ์ฝ๋์ ๋ณต์กํจ์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
์๋ฅผ ๋ค๋ฉด, SNS ํ์๊ฐ์ ์ ์ผ๋ฐ ์ด๋ฉ์ผ ํ์ ๊ฐ์ ๋ณด๋ค ๋จผ์ ๋ณด์ฌ์ค์ผ ํ๊ฑฐ๋,
ํ์ด์ง๋ง๋ค ํ
์คํธ๋ ์คํ์ผ์ด ์กฐ๊ธ์ฉ ๋ฌ๋ผ์ ธ์ผ ํ๋ ๊ฒฝ์ฐ ์ด ๋ญ์ผ vinylify ์นด๋ ์ปดํฌ๋ํธ์ด์ผ๊ธฐ ๊ฐ์๋ฐ?
์๋์ ๊ฐ์ด SignUpForm๋ ๋จ์ํ ํ์ ๊ฐ์ ์ ๋ด๋นํ๋ ์ญํ ๋ฟ๋ง ์๋๋ผ,
๋ฐ๋ ์ ์๋ ๋ถ๋ถ๊น์ง ๋ฐ์ํด์ ๋ด๋ถ ๊ตฌํ๊ณผ ์ธํฐํ์ด์ค๊ฐ ๋ณต์กํด์ง๊ณ , ์ฌ์ฉํ๋ ์ฌ๋ ์ ์ฅ์์๋ ๋ถํธํด์ง๋ค.
<SignUpForm
signUpOrder={['sns', 'normal']
title="์ฌ์ดํธ์ ์ด์ ์ค์ธ์"
subtitle="๋จผ์ ํ์๊ฐ์
์ ํด์ฃผ์ธ์."
primaryButtonColor={colors.blue}
secondaryButtonColor={colors.grey}
/* ๋ง์ Prop ๋ค ... */
onCancel={/* ... */}
onSubmit={result => {
/* ํ์๊ฐ์
๊ฒฐ๊ณผ์ ๋ฐ๋ผ์ ํน์ ๋์ ์ํ ... */
}}
/>
๋ฐ๋ผ์, ์ ์ธ์ ์ธ ์ฝ๋๋ ์ฝ๋์ ์ด๋ค ๋ถ๋ถ์ด ์์ ๋ ์ง ์์ธกํ๊ณ , ์ ์ ํ ์ ์ธ ๋ ๋ฒจ์ ๋ฐ๋ฅด๋ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค.
ํ ์ค ํ๋ก ํธ์๋ ์ฑํฐ์์ ์์ฃผ ์ฌ์ฉํ๊ณ ์๋ค๋ ์ ์ธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ํธ๋ฆฌํฐ์ธ useOverlay๋ฅผ ์ดํด๋ณด์.
const overlay = useOverlay();
// '๋ฐํ
์ํธ ์ด๊ธฐ' ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์์ ๊ฐ์ overlay๊ฐ ์ด๋ฆฐ๋ค.
<button
onClick={() => {
overlay.open(({ isOpen, close }) => {
return (
<BottomSheet open={isOpen} onClose={close}>
๋๋ ๋ฐํ
์ํธ์ผ
</BottomSheet>
);
})
}}
>
๋ฐํ
์ํธ ์ด๊ธฐ
</button>
// useOverLay๊ฐ ์๋ค๋ฉด ์ ์ด ํ๋ฆ์ ๋
ธ์ถ์์ผ์ผํ๋ค.
const [isSheetOpen, setIsSheetOpen] = useState(false);
<button onClick={() => setIsSheetOpen(true)}>
๋ฐํ
์ํธ ์ด๊ธฐ
</button>
<BottomSheet open={isSheetOpen} onClose={() => setIsSheetOpen(false)}>
๋๋ ๋ฐํ
์ํธ์ผ
</BottomSheet>
๋ ๋ค๋ฅธ ์ ์ธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ํธ ์ปดํฌ๋ํธ์ธ ImpressionArea๋
์ด๋ค ์์ญ์ด ๋ณด์ด๊ฑฐ๋ ์จ๊ฒจ์ง๋ฉด ์์๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ญํ ์ ํ๋ค.
<ImpressionArea onImpressionStart={() => { /* ๋ณด์ฌ์ก์ ๋ ์คํ */ }}>
<div>๋ด๊ฐ ๋ณด์ฌ์ก์ผ๋ฉด onImpressionStart๊ฐ ์คํ๋ผ</div>
</ImpressionArea>
// ImpressionArea๋ ๋ณต์กํ IntersectionObserver API๋
// ๋ณต์กํ Scroll ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ก์ง์ ์ฌ์ฉํ ํ์ ์์ด ๋ณด์ฌ์ก์ ๋์ ๋์์๋ง ์ง์คํ๋ฉด ๋๋ค.
๋ง์ง๋ง์ผ๋ก ํ ์ค๋ ๋ฐ์ดํฐ ์ฃผ๋ ์์ฌ๊ฒฐ์ ์ ์ํด ํ๋ฉด์ ์ง์ ํ๋ ์ฌ์ฉ์์ ์,
๊ทธ์ค ๋ช ๋ช ์ด ๋ฒํผ์ ๋๋ฅด๋ ์ง๋ฅผ ๊ธฐ๋กํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ, LoggingClick ์ปดํฌ๋ํธ๋
์ด ๋๋ฅด๋ ๋์์ ๋ํ ๊ธฐ๋ก์ ์ถ์ํํ๋ ์ญํ ์ ํ๋ค.
<LoggingClick params={{ price }}>
<button onClick={buy}>์ฌ๊ธฐ</button>
</LoggingClick>
// LoggingClick ์ปดํฌ๋ํธ๊ฐ ์๋ค๋ฉด
<button
onClick={() => {
log({ title: '์ฌ๊ธฐ', price });
buy();
}}
>
์ฌ๊ธฐ
</button>
๐ References
https://www.slash.page/libraries/react/impression-area/src/impressionarea.i18n/
๐ค TMI, ๋๋ ์
์ค๋์ ํ ์ค๊ฐ ์๊ฐํ๋ ์ ์ธ์ ์ฝ๋์ ๋ํด์ ์ดํด๋ดค๋ค.
์ข์ ์ ์ธ์ ์ฝ๋๋ ์ถ์ํ๊ฐ ์ ๋ ์ฝ๋์ด๋ค. ์ฆ, ๋ด๋ถ ๋ก์ง ํ๋ฆ์ ํ์ ํ๋๋ฐ ์ ๊ฒฝ์ ์ธ ํ์ ์์ด, ๋ด๊ฐ ํ๊ณ ์ ํ๋
๋์์๋ง ์ง์คํ๋ฉด ๋ผ์ ์ฐ๋ ์ฌ๋ ์ ์ฅ์์ ํธ๋ฆฌํ ์ ์๋ ์ฝ๋๋ค.
ํ์ง๋ง, ์ํ์ด ์ด๋ป๊ฒ ํ์ฅ๋ ์ง์ ๋ํ ๊ณ ๋ฏผ ์์ด ์ง๋์น๊ฒ ์ถ์ํ๋ฅผ ํ๋ฉด ์์ ํ๊ธฐ ๋ฒ๊ฑฐ๋กญ๊ณ ์ด๋ ค์ด ์ฝ๋๋ฅผ ๋ง๋ค ์ ์๋ค.
์ถ์ํ๋ฅผ ํ ๋ฒ์์ ๋ํ ๊ณ ๋ฏผ์ด ํ์ํ ๊ฒ ๊ฐ๋ค. LoggingClick, ImpressionArea, useOverlay ๋ชจ๋ ํ๋์ ์ญํ ์ ๋ด๋นํ๋ค๋ ๊ณตํต์ ์ด ์๋ ๊ฑฐ ๊ฐ๋ค.
LoggingClick์ ํด๋ฆญ ์ ๋ก๊น ๋ง,
ImpressionArea๋ ๋ด๋ถ์ ์ผ๋ก IntersectionObserver๋ฅผ ์ฌ์ฉํด์ ๊ฐ์งํ๋ ์ญํ ๋ง,
useOverlay๋ toast ui ๊ฐ์ ์ญํ (ํด๋ฆญ ์์ ํ ์คํธ ๋ณด์ฌ์ฃผ๊ณ , ๋ซ์ ๋ ์ฌ๋ผ์ง๊ฒ ํด ์ฃผ๊ธฐ)์ ํ๋ค.