์ด๊ฒ์ react-window
์ ๋ค๊ฐ์ค๋ ๋ฒ์ 2.0 ๋ฆด๋ฆฌ์ค์ ๋ํ ๋ด ๊ณํ์ ๊ณต์ ํ๊ธฐ์ํ ํฌ๊ด์ ์ธ ๋ฌธ์ ์
๋๋ค.
ํผ๋๋ฐฑ์ ์ฃผ์ ์ ๊ฐ์ฌ ๋๋ฆฌ๋ฉฐ ๊ณ ๋ คํ ๊ฒ์ ๋๋ค. ๋ชจ๋ ์์ฒญ์ ์์ฉ ํ ์์๋ ๊ฒฝ์ฐ ์ดํดํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ๋ฒ๋ค ํฌ๊ธฐ, ๋ฐํ์ ์ฑ๋ฅ ๋ฐ ์ ์ง ๊ด๋ฆฌ ๋ฌธ์ ์ ๋น๊ตํ์ฌ ๊ธฐ๋ฅ ์์ฒญ์ ํ๊ฐํ๊ธฐ ์ํด ์ต์ ์ ๋คํ ๊ฒ์ ๋๋ค.
๋ฒ์ 1์์ 2๋ก ์ ๊ทธ๋ ์ด๋ ํ๋ ค๋ฉด ์๋นํ ์ฝ๋ ๋ณ๊ฒฝ์ด ํ์ํ ์ ์์ผ๋ฉฐ ๋๋ถ๋ถ ์ฝ๋ ๋ชจ๋๋ก ์๋ํ ํ ์ ์์ต๋๋ค. ์ด ๋๋ฌธ์ ํนํ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์ ๊ฒฝ์ฐ ๊ฐ๋ ฅํ ์ด์ ๊ฐ์๋ ํ (์ : ๋์ ํฌ๊ธฐ ์ฝํ ์ธ ์ ๋ํ ์ง์์ด ํ์ํจ) ๊ธฐ์กด ์ฝ๋๋ฅผ ์ ๊ทธ๋ ์ด๋ํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ํ ํ์ฌ ๋ฌธ์๋ฅผ react-window-v1.now.sh ๋๋ฉ์ธ์
onScroll
์ฝ๋ฐฑ ํ์ด๋ฐ ๋ณ๊ฒฝ๋ณต์ก์ฑ์ ๊ด๋ฆฌํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ง์ํ๋ ๊ตฌ์ฑ ์์ ์ ๋ฅผ
SimpleList
(์ด์ FixedSizeList
)List
(์ด์ DynamicSizeList
)ResizeObserver
API (๋๋ polyfill)๊ฐ ํ์ํฉ๋๋ค.Grid
(์ด์ VariableSizeGrid
)react-virtualized
์์ react-window
react-virtualized
๋ก์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ ์ค ํ๋๋ children
๋ฅผ ๋ ๋๋ง ์ํ (์ : children(props)
)์ด ์๋ React ์์ (์ : React.createElement(children, props))
)๋ก ์ฒ๋ฆฌํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒ์
๋๋ค. children(props)
).
์ด๋ฅผ ์ํด ๋ช ๊ฐ์ง ๋๊ธฐ๊ฐ์์์ต๋๋ค.
React.memo
, useMemo
, shouldComponentUpdate
)์ ์ ๊ณตํ๋ฏ๋ก ํญ๋ชฉ ๋ ๋๋ฌ์ ๋ํ ์์ฒด ์บ์ฑ ์ถ์ํ๋ฅผ ๊ตฌํํ ํ์๊ฐ ์์ต๋๋ค.cloneElement
ํธ์ถ์์ด react-window
๋ก ๊ด๋ฆฌ ํ ์ โโ์์ต๋๋ค.๋ถํํ๋ ๋ช ๊ฐ์ง ๋จ์ ์ด ์์ต๋๋ค.
itemData
๋ฐ ์ฌ์ฉ์ ์ง์ areEqual
๋น๊ต ๋ด๋ณด๋ด๊ธฐ์ ๊ฐ์ API๊ฐ ํ์ํ์ต๋๋ค.์์ ์ฅ๋จ์ ์ ๊ณ ๋ คํ ํ react-window
์ ๋ ๋๋ง ์ํ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ์ ํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค . ์ด๊ฒ์ ๋ค์ ๊ณผ ๊ฐ์ ๋ณต์กํ ์์ ๋ฅผ ๋ ์ฝ๊ฒ ๋ค์ ์์ฑํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
const Example = ({ height, items, toggleItemActive, width }) => (
<List
height={height}
itemCount={items.length}
itemRenderer={({ index, key, style }) => {
const item = items[index];
return (
<div key={key} onClick={() => toggleItemActive(index)} style={style}>
{item.label} is {item.isActive ? "active" : "inactive"}
</div>
);
}}
itemSize={35}
width={width}
/>
);
์ด์ ์๋ ๋ชฉ๋ก ๊ตฌ์ฑ ์์๊ฐ ๊ฐ๋ก ๋ฐ ์ธ๋ก ๋ ์ด์์ ๋ชจ๋๋ฅผ ๋ชจ๋ ์ง์ํ์ต๋๋ค. ๊ตฌํ ๋ฐ ์ ์ง ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๊ณ ์๋์ ์ผ๋ก ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ง ๋ชฉ๋ก์ด๋ฏ๋ก layout="horizontal"
์ง์์ ์ ๊ฑฐํฉ๋๋ค.
๊ทธ๋ฆฌ๋ ๊ตฌ์ฑ ์์๋ ๊ณ์ direction="RTL"
๋ฅผ ์ง์ํ์ง๋ง ๋ชฉ๋ก์ ์ง์ํ์ง ์์ต๋๋ค (์์ง ๋ ์ด์์ ๋ง ์ง์ํ๋ฏ๋ก). ์ด ์ ์ถฉ์์ ๋ชฉ๋ก์ ๋ ์๊ณ ์ ์งํ๊ธฐ ์ฝ๊ฒํ๊ธฐ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค.
onItemsRendered
๋ฐ onScroll
์ฝ๋ฐฑ ๋ณ๊ฒฝ๋ชฉ๋ก ๋ฐ ๊ทธ๋ฆฌ๋ ๊ตฌ์ฑ ์์๋ ํ์ฌ onItemsRendered
๋ฐ onScroll
์ฝ๋ฐฑ ์ํ์ ์ง์ํฉ๋๋ค. ์ด๋ฌํ ์ฝ๋ฐฑ์ ์ปค๋ฐ ๋จ๊ณ (๋ชฉ๋ก ๋๋ ๊ทธ๋ฆฌ๋๊ฐ ๋ ๋๋ง์ ์๋ฃ ํ ํ) ์ค์ ํธ์ถ๋ฉ๋๋ค. ์ด๋ ์ด๋ฌํ ์ฝ๋ฐฑ์ ๋ํ ์๋ต์ผ๋ก ๋ถ์์ฉ (๋ถ์ ๋ก๊น
๊ณผ ๊ฐ์)์ ์ํํ๋ ๊ฒ์ด ํญ์ ์์ ํ๋ค๋ ์ ์์ ์ ์ฉ ํ ์ ์์ง๋ง ๋จ์ ๋ ์์ต๋๋ค. ์คํฌ๋กค ๋๊ธฐํ ๋ ์
๋ฐ์ดํธ๋ ๋ ๋ฒ์งธ ( "๊ณ๋จ์") ๋ ๋๋ง์์ ์ํ๋์ด์ผํฉ๋๋ค. .
๋ฒ์ 2๋์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด onScroll
์ฝ๋ฐฑ์ ๋ณ๊ฒฝํฉ๋๋ค. onScroll
์ฝ๋ฐฑ์ ์ด๋ฒคํธ์ ๋์คํจ์น์ฃผ๊ธฐ ๋์ ํธ์ถ ๋์ด ๋ชจ๋ ์
๋ฐ์ดํธ๊ฐ ๋ชฉ๋ก ๋๋ ๊ทธ๋ฆฌ๋์ ์์ฒด ์
๋ฐ์ดํธ๋ก ์ผ๊ด ์ฒ๋ฆฌ (React์ ์ํด)๋ฉ๋๋ค.
onItemsRendered
์ฝ๋ฐฑ์ onItemsDisplayed
prop๋ก ๋์ฒด ๋์ง๋ง ์ปค๋ฐ์ฃผ๊ธฐ ๋์ ๊ณ์ ํธ์ถ๋ฉ๋๋ค. ์ด ๋ณ๊ฒฝ์ ๋ชฉ๋ก ๊ตฌ์ฑ ์์๊ฐ ์ ํด ์ฐ์ ์์๋ก ์ฌ์ ๋ ๋๋งํ์ฌ ๋ ๋๋ง ์ฑ๋ฅ์๋ณด๋ค ์ ๊ทน์ ์ผ๋ก ์ต์ ํํ๊ณ ๋์คํ๋ ์ด ์ ๊ธ ๊ณผ ๊ฐ์ ์คํ์ API๋ฅผ ์ฌ์ฉํ ์ ์๋๋กํ๊ธฐ์ํ ๊ฒ์
๋๋ค.
์ ๊ฑฐ ๋ ๋ช ๊ฐ์ง ๋ณด๋ฅ์ค์ธ ์ง์ ์ค๋จ (DEV ๊ฒฝ๊ณ ํฌํจ)์ด ์์ต๋๋ค.
innerTagName
๋ฐ outerTagName
. (๋์ innerElementType
๋ฐ outerElementType
์ฌ์ฉ)overscanCount
, overscanColumnsCount
๋ฐ overscanRowsCount
. (๋์ overscanColumnCount
๋ฐ overscanRowCount
์ฌ์ฉ)overscanCount
๋ ๋์ ์ค๋ฒ ์ค์บ ๋ฐฉ์์ ์ํด ๋ชฉ๋ก ๊ตฌ์ฑ ์์์์ ์ ๊ฑฐ๋ฉ๋๋ค.direction
๋ํ "horizontal"๋ฐ "vertical"๊ฐ. (์ด๋ค์ layout
๋ก ์ด๋๋์์ง๋ง ๋ฒ์ 2์์๋ ์์ ํ ์ ๊ฑฐ๋ฉ๋๋ค.)itemData
์ํ (๋ฐ ํญ๋ชฉ ๋ ๋๋ฌ์ ์ ๋ฌ ๋ ํด๋น data
์ํ)์ ๋ ๋๋ง ์ํ API์ ๋ํ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ๋ ์ด์ ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ ๊ฑฐ๋ฉ๋๋ค.useIsScrolling
์ํ (๋ฐ ํญ๋ชฉ ๋ ๋๋ฌ์ ์ ๋ฌ ๋ ํด๋น isScrolling
์ํ)์ ์ฌ์ ๋ ๋๋ง ๋ฐ ๋์คํ๋ ์ด ์ ๊ธ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ๊ตฌํ ๋น์ฉ์ด ๋ ๋ง์ด ๋ค๊ธฐ ๋๋ฌธ์ ์ ๊ฑฐ๋ฉ๋๋ค.์์ ์ฌ์ฉ๋์ง ์๋ ์ํ ์ค ์ผ๋ถ๋ ๊ณํ๋ ๋ค๋ฅธ ๋ณ๊ฒฝ ์ฌํญ์ ๊ณ ๋ คํ ๋ ์ฌ์ ํ ๊ด๋ จ์ด ์์ ์ ์์ง๋ง ์ด์จ๋ ์์ ์ฑ์ ์ํด ์ฌ๊ธฐ์ ๋์ดํฉ๋๋ค.
์ํ ๋ชฉ๋ก์ ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ๋ชจ๋ฐ์ผ์์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ปจํธ๋กค๊ณผ ๊ฐ์ ๋ฌดํ ์คํฌ๋กค ๊ฐ๋ฅํ ์บ ๋ฌ์ ์๋ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. IMO๋ ๋ชจ๋ฐ์ผ์ ๋ญ๊ฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผํฉ๋๋ค.
@istarkov ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ณต์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ํ ์๋์ฐ์ ๋ํด _any_ ์ ํจํ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ ์๋๋๋ค. ๋๋ ๊ทธ๋ค์ด ํจ์ฌ ๋ ์ผ๋ฐ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. (์บ ๋ฌ์ ์ ๊ฒฝ์ฐ์๋ ๋ง์ ์ฌ๋๋ค์ด "์คํฌ๋กค"์ด๋ฒคํธ ๊ธฐ๋ฐ ์๋์ฐ๋ฅผ ํ์๋กํ์ง ์๋ ์ผ์ชฝ / ์ค๋ฅธ์ชฝ ํ์ดํ ํ์์ ์ฌ์ฉํฉ๋๋ค.) ์ผ๋ถ๋ฅผ ์์ํ๊ธฐ ์ํด v2์ ๋ํ ์ง์์ ์ค๋จํ๋ ๊ฒ์ด ์ฌ์ ํ ๋ ๋์ ๊ฒฝ๋ก๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ ๋ ๋๋ง, ๋์ ํฌ๊ธฐ ์กฐ์ ๋ฑ์ผ๋ก ์๊ฐ ํ ๋ณต์ก์ฑ์
๋ ๊ฐ๋จํ๊ณ , ์ฑ๋ฅ์ด ๋ฐ์ด๋๋ฉฐ, ๋ ๊ฐ๋จํ ์ฝ๋๋ก ์ด์ด์ง์ด ๋ ๊ฐ๊ฒฐํ ์ ๊ทผ ๋ฐฉ์์ ์ ๋ง ๊ธฐ์ฉ๋๋ค.
ํฐ. ๊ทธ๋ฌ๋ ๊ฐ๋ณ ํฌ๊ธฐ ๋ชฉ๋ก์ ์ญ์ ํ๋ ๊ฒ์ ๋ํด์๋ ๊ฑฐ์ ๊ฑฑ์ ํ์ง ์์ต๋๋ค. ๊ฐ๋ณ ํฌ๊ธฐ ๋ชฉ๋ก์ DynamicList๋ก ๋์ฒด ํ ๊ณํ์ด์ง๋ง ํญ๋ชฉ์ผ๋ก ์คํฌ๋กค ํ ์์๋ ๋์ ๋ชฉ๋ก์ ๋ฌธ์ ๋ ์ผ๋ถ ๊ตฌ์ฑ ์์์ ๋งค์ฐ ์ ์ฉํ ๊ธฐ๋ฅ ์ผ ์ ์์ผ๋ฉฐ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ด๋ฌํ ์๊ตฌ ์ฌํญ์ด ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ์์ธกํ ์ ์์ต๋๋ค. ๋ฐ์ ์ฐฝ์ ๊ทํ์ ์๊ตฌ์ ๋ง์ต๋๋ค.
๋ ๋ฒ์งธ ๋ฌธ์ ๋ ๋์ ๋ชฉ๋ก ์ฑ๋ฅ์
๋๋ค. ๊ฐ๋ณ ํฌ๊ธฐ ๋ชฉ๋ก๊ณผ ๋์ผํ ์ฑ๋ฅ์ ๋์ ๋ชฉ๋ก์ ์ ๊ณต ํ ์ ์๋ค๋ฉด scrollToItem์ ์ง์ํ์ง ์๋๋ผ๋ ๋๋กญํด๋ ๊ด์ฐฎ์ ์ ์์ง๋ง ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๊ฐ๋ฐ์๊ฐ ์ ๊ธธ ์ ์์ต๋๋ค. ๋์ ๋ชฉ๋ก์ด ๋๋ฆฌ๊ณ ํญ๋ชฉ์ ๋ํ ์คํฌ๋กค์ด ์ง์๋์ง ์๋ ์ด์ํ ์ํฉ, ๋ชฉ๋ก์๋ ๊ณ ์ ๋ ํญ๋ชฉ ๋์ด ๋ง ์์ต๋๋ค.
๊ฐ๋ณ ํฌ๊ธฐ ๋ชฉ๋ก์ DynamicList๋ก ๋ฐ๊ฟ ๊ณํ์ด์ง๋ง ํญ๋ชฉ์ผ๋ก ์คํฌ๋กค ํ ์์๋ ๋์ ๋ชฉ๋ก์ ๋ฌธ์
๋๋ ์ด๊ฒ์ด ๋ด์ฌ ๋ ์ ํ์ด ์๋๋ผ ํ์ฌ ๊ตฌํ ์ค ํ๋ ์ผ ๋ฟ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ ๊ธฐ๋ฅ์ ์ด๋ป๊ฒ ์ ๊ณต ํ ์ ์์์ง ์์ด๋์ด๊ฐ ์์ต๋๋ค. ๋ด๊ฐ ๊ทธ๊ฒ์ ํด๊ฒฐํ ์๊ฐ์ด ์๋์ง ์ฌ๋ถ๋ ๋ ๋ค๋ฅธ ์ง๋ฌธ์ ๋๋ค.
๋ ๋ฒ์งธ ๋ฌธ์ ๋ ๋์ ๋ชฉ๋ก ์ฑ๋ฅ์ ๋๋ค. ๊ฐ๋ณ ํฌ๊ธฐ ๋ชฉ๋ก๊ณผ ๋์ผํ ์ฑ๋ฅ์ ๋์ ๋ชฉ๋ก์ ์ ๊ณต ํ ์ ์๋ค๋ฉด scrollToItem์ ์ง์ํ์ง ์๋๋ผ๋ ๋๋กญํด๋ ๊ด์ฐฎ์ ์ ์์ง๋ง ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๊ฐ๋ฐ์๊ฐ ์ ๊ธธ ์ ์์ต๋๋ค. ๋์ ๋ชฉ๋ก์ด ๋๋ฆฌ๊ณ ํญ๋ชฉ์ ๋ํ ์คํฌ๋กค์ด ์ง์๋์ง ์๋ ์ด์ํ ์ํฉ, ๋ชฉ๋ก์๋ ๊ณ ์ ๋ ํญ๋ชฉ ๋์ด ๋ง ์์ต๋๋ค.
๊ทธ๊ฒ๋ ์ ๋ ์ง ๋งํ๊ธฐ ์ด๋ ต๋ค. ๋์ ๋ชฉ๋ก์ด ๋ ๋ง์ ์์ ์ ์ํํด์ผํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ์ ๋๋ก ์ํ๋์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์๋ง๋ ์ฐจ์ด๊ฐ ํด ์๋ ์๊ณ ์๋ ์๋ ์์ต๋๋ค. ํ์ฌ ์ง์ํ์ง ์๋ ๋ถ๋ถ์ ์ง์ํ๊ณ ์ถ์๋ฐ, ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ค๋ฉด ๋ฒ์๋ฅผ ์ค์ฌ์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ฌ ๋ณ์ ๋ชฉ๋ก์ ๋ง์กฑํ๋ค๋ฉด v2๋ก ์ ๊ทธ๋ ์ด๋ ํ ์ด์ ๊ฐ ์์ต๋๋ค (์ ์ด๋ ์กฐ๋ง๊ฐ).
@bvaughn ์ด๊ฒ์ ๋์๊ฒ ๋ฌธ์์ฒ๋ผ ๋ณด์
๋๋ค!
์ง๋ ์ฌ๋ฆ๋ถํฐ์ด ์์
์ ํด์๋์? ;-)
์ข ๋ ์ง์งํ๊ฒ ๋ง์ ๋๋ฆฌ๋ฉด ์ ๊ฐ ํฌ์ด ์๋๋๋ผ๋ ๋ ๋๋ง ์ํ์ด์ด ๋งฅ๋ฝ์์ ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋์, ์ค๋ ์์นจ์ ์ผ์ต๋๋ค. ๐ ํผ๊ณคํฉ๋๋ค.
๋๋ ํฌ์ด ์๋์ง๋ง ๋ ๋๋ง ์ํ์ด์ด ๋งฅ๋ฝ์์ ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ํฌ์ด ์๋์ง ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
์ํ ๋ชฉ๋ก / ๊ทธ๋ฆฌ๋ ์ง์์ด AutoSizer
(react-virtualized-auto-sizer)์ ๊ฐ์ ์ตํธ ์ธ ๊ธฐ๋ฅ์ผ๋ก ์๋ฏธ๊ฐ ์์ต๋๊น?
์ํ ๋ชฉ๋ก์ react-virtualized์ react-window๋ฅผ ๋ชจ๋ ์ฌ์ฉํ์ผ๋ฉฐ react-window API๊ฐ ํจ์ฌ ๋ ๊ฐ๋จํฉ๋๋ค. ๋ ๊ฐ๋จํ API๋ฅผ ์ํ๋ฉด์ ์ง์ ์ค๋จ์ ํ์์ฑ์ ์ดํดํ๊ณ ์์ต๋๋ค.
๊ทธ๋ฆฌ๋ ์ง์์ ์์ง ๊ณํ ์ค์ ๋๋ค. ์ํ ์ง์์ ์ ํํ์ญ์์ค. ๋๋ ๊ทธ๊ฒ์ด ๋ง์ด๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
@bvaughn ์ ๋ ์ผ๋ฐ์ ์ผ๋ก render props๋ฅผ ์ข์ํ๊ณ ์ฌ๋ฌ๋ถ์ด ์ค๋ช ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ ๋๋ค.ํ์ง๋ง ์ค์ฒฉ ๋ ๋ ผ๋ฆฌ๋ฅผ ํฌํจ ํ ์๋ ์๊ณ ํฌํจํ์ง ์์ ์๋์๋ ์ธ๋ผ์ธ ํจ์๋ฅผ ๊ถ์ฅํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๐ค ์ฌ๊ธฐ์์ ๋ชจ๋ ๊ฒฐํจ์ ์ฌ์ฉ์์๊ฒ ์์ต๋๋ค. ๐
๋ฒฝ๋ ๊ฒฉ์๋ฅผ ๊นจ๋ฌ์ ์ ์์ต๋๊น?
@nikitapilgrim ์๋์. react-virtualized
์ Masonry
๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
https://github.com/bvaughn/react-virtualized/blob/master/docs/Masonry.md
๊ฐ์ฌํฉ๋๋ค.ํ์ง๋ง ๋ฐ์ ๊ฐ์ํ์์๋ง ์๋ํฉ๋๊น?
@nikitapilgrim ์. ๐
React-virtualized๋ react-window๊ฐ ์ง์ํ์ง ์๋ ๋ง์ ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค.
react-window์ ๋ฒ์๊ฐ ๋ํญ ์ถ์๋์ด ํจํค์ง๋ฅผ ๋ ์๊ณ ๋น ๋ฅด๊ฒ ๋ง๋๋ ๋ฐ ์ด์ ์ ๋ง ์ถฅ๋ ๋ค. ๐
react-virtualized์ ๊ธฐ๋ฅ์ด ํ์ํ ๊ฒฝ์ฐ ๊ณ์ํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฌ์ ํ ํ๋ฅญํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค!
์ด react-virtualized
babel 7
๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ
์ ์ฐพ๊ณ ์์๊ธฐ ๋๋ฌธ์ react-window
๋ฐ๊ฒฌ ํ์ต๋๋ค . react-virtualized
Masonry
๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๊ณ ์์ง๋ง babel
์
๊ทธ๋ ์ด๋ ํ ํ์๋ ๋ ์ด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋ฐ์ ๊ฐ์ํ ๋ฌธ์ ๋ฅผ๋ณด๊ณ ํ๋ ๊ณณ์ด ์๋๋๋ค.
@bvaughn์ ๋์ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ ๊ณผ @babangsund๋ ๊ฒ์ ์์ @nikitapilgrim์ ๋๋ต Masonry
๊ตฌ์ฑ ์์๊ฐ ๋์
๋์ง ์์ต๋๋ค react-window
์ฌ์ฉํ๋ ๋์ ์ํ๊ณ react-virtualized
. ๊ทธ๋ฌ๋ ์ฌ์ฉ์๊ฐ ์ต์ [email protected]
๋ฐ [email protected]
(์ : create-react-app
) ์ธ ๊ฒฝ์ฐ react-virtualized
๊ฐ ๋ฐ๋์ ์๋ํ๋ ๊ฒ์ ์๋๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๊ฐ์ ํ ๋ผ ๊ตฌ๋ฉ์ ๋ด๋ ค๊ฐ๋ ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ์ ์ฉํ ์ ๋ณด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
ยฏ \ _ (ใ) _ / ยฏ
๋ฒ์ 2๋ฅผ ๋ค์ด๋ก๋ ํ ์์๋ ๋์ ํฌ๊ธฐ ๋ชฉ๋ก์ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค. ์๋๋ฉด ๋ฐ์ ๊ฐ์ํ๋ฅผ ์ฌ์ฉํด์ผํฉ๋๊น?
์ด๊ฒ์ด ๋ด ๋ชฉ๋ก์ด ๊ฐ๋ณ ํฌ๊ธฐ ๋ชฉ๋ก์ผ๋ก ๋ณด์ด๋ ๋ฐฉ์์ ๋๋ค.
์ด๊ฒ์ ์ผ๋ฐ์ ์ธ ์ง์ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ์ฃผ์ ์ ๋ํ ์๊ฒฌ์ ๋จ๊ฒจ์ฃผ์ธ์.
ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค
๋๋ trello์ ๊ฐ์ ์ ํ์ react-window
๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์ฌ๊ธฐ์ ๋ช ๊ฐ์ง ์๊ฐ์ด ์์ต๋๋ค.
์ํ ๋ ๋๋ง
์ด๊ฒ์ ๋จ์ํจ๊ณผ ์ธ๊ธ ๋ ๋จ์ ์ ํผํ๊ธฐ์ํ ์ข์ ๋ณํ์ฒ๋ผ ๋ณด์ ๋๋ค. ๋ํ api๋ react-native์ FlatList์ ๋ ์ ์ฌํฉ๋๋ค. https://github.com/bvaughn/react-window/issues/85 ์์ ํ ๋ก ์ ์ฝ์๋ ๊ฒ์ ๊ธฐ์ตํฉ๋๋ค
๋ ์ ์ ๊ตฌ์ฑ ์์
๋ ์ด์ ์ํ ๋ชฉ๋ก ์ง์ ์์
์ ๋ horizontal
์ง์ ๋ฐ VariableSizeList
์ ๊ฑฐ์ ๋ํด ์ ๊ทน ํฌํํฉ๋๋ค. ์์ํ ์ ์๋ฏ์ด ์ด๊ฒ์ด ์ ๊ฐ ์ฌ์ฉํ๋ ์ฃผ์ ๋ ๊ฐ์ง์
๋๋ค. ๊ทธ๋ค์ ๊ตฌํ์ ์ ์งํ๊ธฐ์๋ ๋๋ฌด ๋ง์ ๋ถ๋ด์ด ์์ต๋๊น? ๊ทธ๋ ์ง ์๋ค๋ฉด ์ฌ๊ณ ํ๊ณ ์ ์งํ์๊ธฐ ๋ฐ๋๋๋ค.
๋ค๋ฅธ ๋ณํ์ ๋ํ ๊ฐํ ์๊ฒฌ์ ์์ต๋๋ค. overscanCount
์ ๊ฑฐ๋ ์ฝ๊ฐ ๊ฑฑ์ ๋์ง๋ง ์์ง ์ฌ์ฉ์ ์ง์ ๊ฐ์ด ํ์ํ ์ฌ์ฉ ์ฌ๋ก์ ์ง๋ฉดํ์ง ์์์ผ๋ฏ๋ก ๊ด์ฐฎ์ ๊ฒ์
๋๋ค.
์๋ ํ์ธ์ @bvaughn! ์ด ํจํค์ง์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ์ง์ฅ์์ ๋ด ํ๋ก์ ํธ์ ๋ฒ์ 2๋ฅผ ํตํฉํ๋ ค๊ณ ํฉ๋๋ค. ์ด๊ฒ์ด ์ธ์ ์ถ์ ๋ ์ง์ ๋ํ ์ผ๊ตฌ์ฅ์ด ์์ต๋๊น?
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ฌ ๋๋ฆฌ๋ฉฐ ํฅํ ์ถ์ ๊ณํ์ ๊ณต์ ํ๋ฉด ๊ธฐ์ ๋ถ์ฑ๋ฅผ ์ค์ด๋ ๋ฐ ํฐ ๋์์ด๋ฉ๋๋ค.
์ต์ react-window
์ด์ ๋ฒ์ 2๋ฅผ ์ฌ์ฉํ์ฌ WindowScroller
๋์์ ์ํํ๋ "๊ฐ๋จํ"๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์ด๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ฉด์ด ๋ฒ์ 2์ ๊ฒฝ๊ณ๋ฅผ ๋ฒ์ด๋ ๊ฒ์ผ๊น ์? ์๋๋ฉด ๋์ค์ ์ถ๊ฐ ํ ์ ์์ต๋๊น?
๋ด ์ปจํ
์คํธ์๋ ๋ด ๋ ์ด์์์ ๋ฐ๋ฅ ๊ธ์ด ํฌํจ๋์ด ์์ผ๋ฉฐ DynamicSizeList
์ ๊ฐ์ ํ๋์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋ ๋ฒ์งธ ์คํฌ๋กค ๋ง๋๊ฐ ๋์
๋ฉ๋๋ค (ํ๋๋ ํ์ด์ง ์ฉ, ๋ค๋ฅธ ํ๋๋ ์ ํ ๋ชฉ๋ก ์ฉ).
ํ๋ฅญํ ํจํค์ง. ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ ๋์ด ๋ชฉ๋ก์ ๊ฐ์ ํ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค. ํ์ฌ ๋ ๋๋ง ๋ ํ ๋์ด๋ฅผ ์์ ๋ชฉ๋ก์ ๋ค์ ์ ๋ฌํ๊ธฐ์ํ ์ฌ์ฉ์ ์ง์ ๋ ผ๋ฆฌ๋ฅผ ์์ฑํ์ต๋๋ค. ์ด ์ ๋ฒ์ ์ ์ฌ์ฉํ์ฌ ํด๋น ๋ ผ๋ฆฌ๋ฅผ ์ ๊ฑฐ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
ํธ์ ๋ด์ ๊ฐ๊ธฐ
์ด๋ฏธ ์ฐฝ ์คํฌ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
https://github.com/bvaughn/react-window/issues/30#issuecomment -428868071
์คํฌ๋กคํ๋ ๋ฐฉ๋ฒ ์ข์ฐ ์๋ฐฉํฅ์ผ๋ก ๋ฌดํ ์คํฌ๋กค !!!
react-virtualized
์ ์์กดํ์ง ์๊ณ WindowScroller
์ (๋ฅผ) ๊ฐ์ง๊ณ ์๋ค๋ฉด ๊ทธ๊ฒ์ ์ข์ ๊ฒ์
๋๋ค. ๋ค์ ๋ชฉํ ๋๋ฌธ์ react-window
๊ทธ๊ฒ์์ ๋นํด ํจ์ฌ ํจ์จ์ ์ด๊ณ ์ ์ ์ฝ๋ ๋ง๋ react-virtualized
์ ๋, ๋ด๊ฐ ์ฌ์ฉํ์ง ์์ผ๋ ค๋ WindowScroller
์์ react-virtualized
. ๋์ react-virtualized-auto-sizer
์ ๊ฐ์ ๋ณ๋์ ํจํค์ง๋ฅผ ์ฐพ์ผ์ญ์์ค.
๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
@prabusamvel ํ ..
๋ณ๋ ํจํค์ง์ ์ฅ์ ์ ๋ฌด์์
๋๊น?
์๋ก์ด DynamicSizeList๋ฅผ ๊ฐ์ง๊ณ ๋์์ต๋๋ค. ์์ฃผ ๋ฉ์ง๋ค! ๋๋ ๋ฐฉํฅ ์ ํ์ 'ttb'์ 'btt'(์์์ ์๋๋ก, ์๋์์ ์๋ก)๋ฅผ ํฌํจํ๋ ๊ฒ์ด ํฐ ํฅ์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ์ฌ ์์ชฝ์ผ๋ก ์คํฌ๋กค๋๋ ๋ชฉ๋ก์ ๊ตฌํํ๋ ๊นจ๋ํ ๋ฐฉ๋ฒ์ ์์ง๋ง ๋ค๋ฅธ ๋ชจ๋ ๋ฐฉํฅ์ ์ง์๋ฉ๋๋ค.
@toddmacintyre ์ด ๋ฒ์ ์ ์ฐพ์ ์ ์์ต๋๋ค. 2. ๋๊ตฌ๋ ์ง ๋๋ฅผ ์๋ด ํ ์ ์์ต๋๊น?
@muhammedmagdi npm install react-window@next
๋ฒ์ 2๊ฐ ์ฌ๊ธฐ ์ฌ์์์ ์๊ตฌํ๋ DOM ๊ตฌ์กฐ๋ฅผ ์ง์ํ ์ ์๋ค๋ฉด ํ๋ฅญ ํ ๊ฒ์ ๋๋ค. # 217์ ์ฌ์ ํ โโ๋ฌธ์ ์ด๋ฏ๋ก https://www.w3.org/TR/wai-aria-1.1/#grid . ๋ด๊ฐ ๋งํ ์์๋ ํ ๋ฒ์ 2์ ๋ํ ์ ์์ ๊ทธ๋ ์ง ์์ต๋๋ค.
@mjurkowski @bvaughn yarn add react-window@next
์ค์น 1.6.0-alpha.1
. ๋ํ ๋์ ๋ชฉ๋ก ์๋ ๋ฐ์ค ์์ https://react-window-next.now.sh/#/examples/list/dynamic -size๋ฅผ ์คํํ๋ ค๊ณ ํ๋ฉด Error importing GitHub repository: Could not find package.json
๊ทธ๋ฆฌ๋์์๋ index
๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? :)
์ ํ๋ฆฌ์ผ์ด์ ์ ์ผ๋ถ์๋ ๊ฐ๋ณ ๋๋น ์ด ํค๋๊ฐ์๋ ๊ทธ๋ฆฌ๋๊ฐ ํ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๋์ ๊ฒฐํฉ ๋ ์ํ ๊ฐ๋ณ ํฌ๊ธฐ ๋ชฉ๋ก์ ์ฌ์ฉํ๊ณ ๋์ ์คํฌ๋กค์ ๋๊ธฐํํ์ฌ์ด๋ฅผ ๋ฌ์ฑํ์ต๋๋ค.
๊ฐ๋ก ๋ชฉ๋ก์ ์ ๊ฑฐํ๋ฉด ํด๋น UI๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค (๋๋ ์ด ๋จธ๋ฆฌ๊ธ ๊ทธ๋ฆฌ๋์ ๋จ์ผ ํ์ด์๋ ๋ ๊ฐ์ ๊ทธ๋ฆฌ๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ ์ด๋ ๋ค์ ์์ฑํด์ผํฉ๋๋ค.
๋ค์ ์ ํ์ ๋๋์ต๋๋ค. ๊ทธ๋ฌ๋ ์ํ ๋ฐ ์์ง์ด ๋ชจ๋ ํ์ํ๋ฏ๋ก https://www.npmjs.com/package/react-infinite-grid-scroller์์ ์ง์ ๋ง๋ค์์ต๋๋ค
ํผ๋๋ฐฑ์ ํ์ํฉ๋๋ค.
๋์ ๋์ ํ ์์๋ฅผ ์ง์ํ๋ ๊ฒ์ด ๋ฐ์ ์ฐฝ์ ํฐ ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋งค์ฐ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ด๋ฉฐ ๋ชฉ๋ก๊ณผ ๊ทธ๋ฆฌ๋ ๋ชจ๋์ ๋ํด ๊ตฌํํ๋ ๊ฒ์ด ๊ฐ๋จํฉ๋๋ค.
API๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<Grid
// First 2 columns are sticky
stickyLeft={2}
// Last column is not sticky (default value)
stickyRight={0}
// First and last rows are sticky
stickyTop={1}
stickyBottom={1}
/>
๋์ ์์ด ์๋ํ๋๋กํ๋ ๋ ๊ฐ์ง ํต์ฌ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
position: sticky
๋์ absolute
๋ฐ ์ฌ์ฉ margin-x
๋์ left
๋ฐ top
๋์ ํ์ง ์์ ์ถ์์ด๋ฌํ ํ๋ฅญํ ๊ธฐ๋ฅ์ ๋น์ฉ์ ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์ ๋๋ค.
position: sticky
์ง์ํ์ง ์๋ ์ฌ๋๋ค์ ์ผ๋ฐ ๋ฒ์ ์ ์ฐธ์กฐํ์ญ์์ค.์ด ์ฌ์ฉ ์ฌ๋ก๊ฐ์๋ ๊ทธ๋๋ก ์ง์ํ๊ธฐ์๋ ๋๋ฌด ๊ตฌ์ฒด์ ์ด๋ผ๊ณ ์๊ฐํ๋ค๋ฉด ํฌ์ธํธ 1 ๋ง ์ง์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ ์ ๋ ๋๋งํด์ผํ๋์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ ์ ์์ผ๋ฉด ๊ณ ์ ์ฑ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
ํ์ํ ๊ฒฝ์ฐ ๊ธฐ๊บผ์ด ๋์ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
ํฌ๊ธฐ ์๋ ์ธก์ ๋ฐ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ๊ฝค ํฐ ๋จ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ด๊ฐ ์์ฑํ ๊ฑฐ์ ๋ชจ๋ ๊ทธ๋ฆฌ๋์ ๋ํด 3 ๊ฐ ๋๋ 4 ๊ฐ์ ๊ณ ์ ๋๋น ์ด (์ํ ๋ ์ด๋ธ, ์ผ๋ถ ๋ฉํ ๋ฐ์ดํฐ, ํด๋ฆญ ์ ๋ ๋ฌธ์ ๋ฑ)๊ณผ ๋๋จธ์ง ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณต๊ฐ์ ์ฐจ์งํ๋ 1 ๊ฐ์ ๋์ ๋๋น ์ด์ด ํ์ํฉ๋๋ค.
"์ง์ํ์ง ์๋๋ค"๋ ๊ฒ์ด Autosizer์ ๊ฐ์ ์ถ๊ฐ ์ฝ๋ ๋ฐ ๊ตฌ์ฑ ์์๋ฅผ ์ถ๊ฐํ์ฌ ์ด๊ฒ์ด ๊ฐ๋ฅํ์ง ์๋ค๋ ๊ฒ์ ๋ฐ๋์ ์๋ฏธํ๋ ๊ฒ์ ์๋๋ผ๋ ์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ด๋ฌํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ ๊ณ ๋ คํ๊ณ ํ์ํ ์๋ฃจ์ ์ ๋ฌธ์ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ค์ด๋๋ฏน ์ปฌ๋ผ์ด์ง๋ง ๊ทธ๊ฒ์ด ๊ฐ์ ธ ์ค๋ ๋ชจ๋ ์ํ๋ฌผ์ ๋ํด ๋ฐ์ ๊ฐ์ํ๋ฅผ ์ํ์ง๋ ์์ต๋๋ค.
์ด๋ฌํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ ๊ณ ๋ คํ๊ณ ๋์ ์ด์ด ํ์ํ ์ฌ์ฉ์๋ฅผ ์ํด ์๋ฃจ์ ์ ๋ฌธ์ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์์ ํ ์ดํด๋์์ง๋ง ์ค์ ๋ก ๋ ๋ง์ ๋ ธ๋ ฅ ์ด ํ์ํ๋ฉฐ์ด ๋์๊ด์ ์ฌ๋์ ๋ ธ๋์ด์์ต๋๋ค (์ ๋ฃ ๋ ธ๋ ฅ์ด ์๋). ๋ถํํ๊ฒ๋ ๋, ๋ด ์๋๋ก ๋ฒ์ v2์ ๋ ธ๋ ฅ์ ์๋ฃ ํผ์ ์๋ฌด๊ฒ๋ ๋ ๊ณต๊ฒฉ์ ์ผ๋ก ํ ์๊ฐ์ด ์์์ด์. ๐
์ด๋ฌํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ ๊ณ ๋ คํ๊ณ ๋์ ์ด์ด ํ์ํ ์ฌ์ฉ์๋ฅผ ์ํด ์๋ฃจ์ ์ ๋ฌธ์ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์์ ํ ์ดํด๋์์ง๋ง ์ค์ ๋ก ๋ ๋ง์ ๋ ธ๋ ฅ ์ด ํ์ํ๋ฉฐ์ด ๋์๊ด์ ์ฌ๋์ ๋ ธ๋์ด์์ต๋๋ค (์ ๋ฃ ๋ ธ๋ ฅ์ด ์๋). ๋ถํํ๋ ๋๋ ๋ ๊ณต๊ฒฉ์ ์ธ ๊ฒ์ ๋งํ ๊ฒ๋์๊ณ ๋์ _scoped down_ v2 ๋ ธ๋ ฅ์ ๋ง์น ์๊ฐ์กฐ์ฐจ ์์์ต๋๋ค. ๐
์. ์๊ฒ ์ต๋๋ค. ๋ฐ๋ผ๊ฑด๋ ๊ทธ๋ฌํ ๋ ธ๋ ฅ์ด ์ง์ญ ์ฌํ๋ฅผ ์ด๋ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ฉ์ง ๊ฒ ์ง๋ง ์ ๊ฒฝํ์ผ๋ก๋ ๊ฒฐ์ฝ ์ผ์ด๋์ง ์์ต๋๋ค.
์ ๋ DynamicSizedList์ ํจ๊ป WindowScroller
๋ฅผ ์ฌ์ฉํ ์ ์์์ต๋๋ค. ์๋ง๋ just-in-time ๋ ๋๋ง์ผ๋ก ์ธํด scrollTo๊ฐ ์ ์๋ํ์ง ์๊ธฐ ๋๋ฌธ์ผ ๊ฒ์
๋๋ค. ์ ๋ฒ์ ์์๋ ๊ฐ๋ฅํฉ๋๊น?
๋๋์ด ๋
ธ๋ ฅ์ ๋ง์น ์๊ฐ์ด๋ ์๋์ง๊ฐ ์๋ค๋ ์ฌ์ค์ ๋ฐ์ ๋ค์๋ค. ๋๊ตฌ๋ ์ง ๋ด๊ฐ ์์ํ ์ง์ ์ ๋ค์ด๊ฐ์ ๋๋ด๊ณ ์ถ๋ค๋ฉด ๋น์ ์ ๋์์ ํ์ํฉ๋๋ค. ( List
๋ฐ Grid
์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ฌธ์ # 6์ ์ฐธ์กฐํ์ฌ Just-In-Time ์ธก์ ์ ์ง์ํด์ผํฉ๋๋ค.)
์๋
ํ์ธ์ @bvaughn ,
์์์ ๋ฉ๋ชจ๋ฅผ ์ฌ์ฉํ์ฌ ํฌํฌ์ ๋ํ ํ ๋ก ์ ๋ง๋ค์์ต๋๋ค.
๋ชฉ๋ก์ ํฌํจ๋์ง ์์์ผํ๊ฑฐ๋ ์ฌ๋ฐ๋ฅด์ง ์์ ๊ฒ์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ญ์์ค. ์งํํ ๋ ๋ชฉ๋ก์ ์์ฑํ๊ฒ ์ต๋๋ค.
์ข์ ๋ฌผ๊ฑด ๊ฐ๋ค์
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ํ ๋ชฉ๋ก์ ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ๋ชจ๋ฐ์ผ์์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ปจํธ๋กค๊ณผ ๊ฐ์ ๋ฌดํ ์คํฌ๋กค ๊ฐ๋ฅํ ์บ ๋ฌ์ ์๋ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. IMO๋ ๋ชจ๋ฐ์ผ์ ๋ญ๊ฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผํฉ๋๋ค.