๐ ํธ๋ค๋ฌ ํจ์ ๋ด๋ถ์์ ์ค๋ณต์ผ๋ก ์ฌ์ฉ๋๋ ํจ์ ๋ฆฌํฉํ ๋ง ํ๊ธฐ
React
๋ก ์ปดํฌ๋ํธ๊ฐ ์๋ ์ปดํฌ๋ํธ ๋ด๋ถ์์ onClick
์ ๋์ํ๋ handler
ํจ์๋ฅผ ๋ง๋ค๋ค ๋ณด๋ฉด, handler
ํจ์ ๋ด๋ถ์์ ์ฌ์ฉ๋๋ ํจ์๋ฅผ ์กฐ๊ฑด์ผ๋ก ๋ถ๊ธฐํ ๋ ํด๋น ํจ์๊ฐ ์ค๋ณต์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์ข
์ข
์๋ค. ์ด๋ฒ ํฌ์คํ
์ ์ ์์ผ ์ํํธ์จ์ด ๊ฐ๋ฐ ๋ฐฉ๋ฒ์ ํ๋์ธ ํ์ด ํ๋ก๊ทธ๋๋ฐ(Pair programming)
์ผ๋ก ์์
์ ํ๋ค๊ฐ ๋ค๋น๊ฒ์ดํฐ(navigator)
๋ฅผ ๋งก๊ณ ๊ณ์ ํค์ผ๋ฆฌ๊ฐ ๋ฐ๊ฒฌํด์ฃผ์ ์ผ์ด์ค์ธ๋ฐ, ์กฐ๊ฑด์ ์ํด ์ธ์ ๊ฐ์ด ๋ฐ๋์ด๋ ํจ์๋ ๋์ผํ๊ฒ ์ฌ์ฉํ ๋ ์ค๋ณต๋๋ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ํ๋๋ก ํฉ์ณค๋๊ฐ์ ๋ํด ์์ฑํด๋ณด๋ ค ํ๋ค. ํ๋จ ์ฝ๋๋ ๋ฆฌํฉํ ๋ง ์ clickEventHandler
ํจ์์ ์ฝ๋์ด๋ค.
์ด ์ฝ๋๋ก ์ปดํ์ผํ๋๋ฐ ์๋ฌ๋ ์์ง๋ง ๋ฆฌ์กํธ๋ฅผ ๋ค๋ค๋ณธ ๊ฐ๋ฐ์๋ผ๋ฉด ๊ฐ์ ์ญํ ์ ํ์ง๋ง ์ค๋ณต๋ ์ฝ๋๋ฅผ ๋ดค๋ค๋ฉด ํ๋๋ก ํฉ์น๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ฟ๋ฟ ํ ๊ฒ์ด๊ณ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๊ฐ์ ํ๋์ง์ ๋ํด ์์ฑํด๋ดค๋ค. ๋ฆฌํฉํ ๋ง์ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๊ณ , ๊ฐ๋ฐ์๋ง๋ค ๊ทธ ๋ฐฉ๋ฒ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ๋ฐฉ๋ฒ๋ ์๊ตฌ๋๋ผ๋ ๊ฒ์ ์ด์ ์ ๋ง์ถฐ์ฃผ๋ฉด ๊ฐ์ฌํ๊ฒ ๋ค.(๋๊ธ์ ํผ๋๋ฐฑ์ ๋ฌ์์ฃผ์๋ ๊ฒ๋ ๋ฌผ๋ก ํ์์ด๋ค.) ๊ทธ๋ผ ์ด๊ธฐ ์ฝ๋๋ฅผ ํ๋ฒ ์ดํด๋ณด์.(๋ฐ์์ง ์๋ค๋ฉด ์ง์ ๋ฆฌํฉํ ๋งํด๋ณด์.)
// AS-IS
function clickEventHandler(
onLinkClick?: LinkEventHandlerType,
onImageClick?: ImageEventHandlerType,
): ImageEventHandlerType {
return (event, image) => {
if (image.link && image.link.hash && onLinkClick) {
return onLinkClick(event, {
href: `#${image.link.hash}`,
})
}
if (image.link && image.link.href && onLinkClick) {
return onLinkClick(e, {
href: image.link.href,
})
} else if (onImageClick) {
return onImageClick(event, image)
}
}
}
์ค๋ณต๋๋ ์ฝ๋๋ฅผ ์ฐพ์๋๊ฐ? ๋๋ 7๋ฒ๊ณผ 12๋ฒ์ image.link && onLinkClick
์ฝ๋๊ฐ ์ค๋ณต๋๋ ๊ฒ์ ์ฐพ์๋ค. ๋ ์ข์ ๋ฐฉ๋ฒ๋ ์๊ฒ ์ง๋ง image.link && onLinkClick
๋ฅผ ํ๋์ ์กฐ๊ฑด๋ฌธ์ผ๋ก ํฉ์ณ๋ณด์๋ค.
function clickEventHandler(
onLinkClick?: LinkEventHandlerType,
onImageClick?: ImageEventHandlerType,
): ImageEventHandlerType {
return (event, image) => {
if (image.link && onLinkClick) {
if (image.link.hash) {
return onLinkClick(event, {
href: `#${image.link.hash}`,
})
}
if (image.link.href) {
return onLinkClick(e, {
href: image.link.href,
})
} else if (onImageClick) {
return onImageClick(event, image)
}
}
}
}
์ด๋ ๊ฒ ํ๋์ ์กฐ๊ฑด๋ฌธ์ผ๋ก ํฉ์น๊ณ ๋ฌ๋๋ฐ, ๋ค์์ ์ด๋ป๊ฒ ๋ฆฌํฉํ ๋งํ๋ฉด ์ข์๊น?! ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ง๋ง, ๋๋ onLinkClick
์ ์ค๋ณต ์ฌ์ฉ์ ์ค์ด๊ณ ์ถ์๋ค. ๊ทธ๋์ onLinkClick
ํจ์๋ฅผ ํ ๋ฒ๋ง ์ฌ์ฉํ๊ธฐ ์ํด image.link.hash
์ image.link.href
๊ฐ์ ์ผํญ ์ฐ์ฐ์๋ก ๋ฐ๋ก ๋นผ๋ด์ด ๋ณ์๋ก ์ ์ธํ๋ค.
function clickEventHandler(
onLinkClick?: LinkEventHandlerType,
onImageClick?: ImageEventHandlerType,
): ImageEventHandlerType {
return (event, image) => {
if (image.link && onLinkClick) {
const href = image.link.hash ? `#${image.link.hash}` : image.link.href
return onLinkClick(event, { href })
} else if (onImageClick) {
return onImageClick(event, image)
}
}
}
๋ง์ง๋ง์ผ๋ก ๊ตฌ์กฐ๋ถํดํ ๋น ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ ๋ง๋ฌด๋ฆฌํ๋ค. 7๋ฒ ๋ผ์ธ์์ href: prevHref
๋ก ์์ฑํ ์ด์ ๋ 8๋ฒ ๋ผ์ธ์์ href
๋ณ์๋ก ์ ์ธํด์ผ onLinkClick
ํจ์์ ๋ ๋ฒ์งธ ์ธ์๋ฅผ { href: href }
๋์ { href }
๋ก ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
function clickEventHandler(
onLinkClick?: LinkEventHandlerType,
onImageClick?: ImageEventHandlerType,
): ImageEventHandlerType {
return (event, image) => {
if (image.link && onLinkClick) {
const { hash, href: prevHref } = image.link
const href = hash ? `#${hash}` : prevHref
return onLinkClick(event, { href })
} else if (onImageClick) {
return onImageClick(event, image)
}
}
}
๊ฒฐ๋ก ์ ์ผ๋ก ๋ฆฌํฉํ ๋ง ์ ๊ณผ ํ์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
// AS-IS
function clickEventHandler(
onLinkClick?: LinkEventHandlerType,
onImageClick?: ImageEventHandlerType,
): ImageEventHandlerType {
return (event, image) => {
if (image.link && onLinkClick) {
if (image.link.hash) {
return onLinkClick(event, {
href: `#${image.link.hash}`,
})
}
if (image.link.href) {
return onLinkClick(e, {
href: image.link.href,
})
} else if (onImageClick) {
return onImageClick(event, image)
}
}
}
}
// TO-BE
function clickEventHandler(
onLinkClick?: LinkEventHandlerType,
onImageClick?: ImageEventHandlerType,
): ImageEventHandlerType {
return (event, image) => {
if (image.link && onLinkClick) {
const { hash, href: prevHref } = image.link
const href = hash ? `#${hash}` : prevHref
return onLinkClick(event, { href })
} else if (onImageClick) {
return onImageClick(event, image)
}
}
}
์ด๋ ๊ฒ ์ค๋ณต ์ฌ์ฉ๋์ด ๋ถํ์ํ๊ฒ ๊ธธ์ด์ง ๋์ ๋ถํ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํด๋ดค๋ค. ์ด๋ฒ ๋ฆฌํฉํ ๋ง์ ๊ท๋ชจ๋ ํฌ์ง ์์ง๋ง ์์ ์ฝ๋๋ถํฐ ๋ฆฌํฉํ ๋งํ๋ค๋ณด๋ฉด ์ธ์ ๊ฐ ๊ท๋ชจ๊ฐ ํฐ ์ฝ๋๋ ๊ธ๋ฐฉ ๋ฆฌํฉํ ๋ง ํ ์ ์์ง ์์๊น..?๋ผ๋ ์๊ฐ์ ํ๋ฉฐ ์ด๋ฒ ํฌ์คํ ์ ๋ง์น๋ค.
Reference
๋๊ธ