๐Ÿ“ฑ ๋ฐฐ๋„ˆ ๊ตฌํ˜„ + PWA ๋ชจ๋ฐ”์ผ ๋น„์œจ ๋งž์ถ”๊ธฐ + ๊ฑฐ๋ž˜๊ฒŒ์‹œ๊ธ€ ์ด๋™ (feat. ํŒ€์›๊ณผ ํ˜‘์—…)

์กฐ์ค€ํ˜•ยท2025๋…„ 4์›” 2์ผ
0

CHOP!

๋ชฉ๋ก ๋ณด๊ธฐ
6/20
post-thumbnail

์ด๋ฒˆ ์ž‘์—…์€ ์„ธ ๊ฐ€์ง€ ํฌ์ธํŠธ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค.

  • Slick Slider๋ฅผ ํ™œ์šฉํ•œ ๋ฉ”์ธ ๋ฐฐ๋„ˆ ๊ตฌ์„ฑ
  • ํŒ€์›์ด ๋””์ž์ธํ•œ ๊ฑฐ๋ž˜ ๊ฒŒ์‹œ๊ธ€ ํŽ˜์ด์ง€๋กœ ์ด๋™ ๊ธฐ๋Šฅ
  • PWA ํ™˜๊ฒฝ์—์„œ ๋ชจ๋ฐ”์ผ ๋น„์œจ ๊ณ ์ •ํ•˜๊ธฐ (ํŽ˜์ด์Šค๋ถ ์ฐธ๊ณ )

โœ… Slick Slider๋กœ ๋ฐฐ๋„ˆ ๋งŒ๋“ค๊ธฐ

๊ธฐ๋ณธ์ ์œผ๋กœ react-slick์„ ํ™œ์šฉํ•ด์„œ ์Šฌ๋ผ์ด๋”๋ฅผ ๊ตฌ์„ฑํ–ˆ๋‹ค. Banner.tsx์—์„œ ์„ค์ •์„ ์ง€์ •ํ•˜๊ณ , ๊ฐ ์Šฌ๋ผ์ด๋“œ๋Š” BannerContainer๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€ props๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š” ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑํ–ˆ๋‹ค.

const settings = {
  dots: true,
  infinite: false,
  speed: 500,
  slidesToShow: 1,
  slidesToScroll: 1,
};

์Šฌ๋ผ์ด๋”๋Š” ์ค‘์•™ ์ •๋ ฌ์„ ์œ„ํ•ด absolute์™€ transform์„ ์ ์ ˆํžˆ ํ™œ์šฉํ–ˆ๊ณ , CSS๋กœ ๋น„์œจ์„ ์กฐ์ ˆํ–ˆ๋‹ค.

const SliderContainer = styled.div`
  width: 95%;
  height: 60%;
  position: absolute;
  top: 40%;
  left: 50%;
  transform: translate(-50%, -50%);
`;

์ด๋ฏธ์ง€๋Š” BannerImage ์ƒ์ˆ˜์—์„œ key๋ฅผ ํ†ตํ•ด ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹์ด๋ผ ์ถ”ํ›„ ์ด๋ฏธ์ง€ ๊ต์ฒด๋‚˜ ์ถ”๊ฐ€๋„ ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ–ˆ๋‹ค.

โœ… World ์•„์ด์ฝ˜ ํด๋ฆญ โ†’ ๊ฑฐ๋ž˜ ๊ฒŒ์‹œ๊ธ€๋กœ ์ด๋™

ํŒ€์›์ด ๋งŒ๋“  ๋””์ž์ธ์„ ์ฐธ๊ณ ํ•ด์„œ, WorldSelectButton์—์„œ ๊ฐ ์•„์ด์ฝ˜ ํด๋ฆญ ์‹œ /trade ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ๋‹ค.
์ด ํŽ˜์ด์ง€๋Š” App.tsx์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ผ์šฐํŒ…๋˜๊ณ  ์žˆ๋‹ค:

<Route path='/trade' element={<TitleList filter={filter} setFilter={setFilter} />} />

๋•๋ถ„์— ์›ํ•˜๋Š” ์›”๋“œ ํ•„ํ„ฐ ๊ฐ’๋„ ์ถ”ํ›„ ๋„˜๊ธธ ์ˆ˜ ์žˆ๊ฒŒ ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌ์„ฑํ•ด๋†“์•˜๋‹ค.
(์ง€๊ธˆ์€ filter ์—†์ด ์ด๋™๋งŒ ๊ตฌํ˜„ํ•ด๋‘” ์ƒํƒœ)

โœ… PWA์ฒ˜๋Ÿผ ๋ชจ๋ฐ”์ผ ๋น„์œจ ๊ฐ•์ œํ•˜๊ธฐ

PWA๋กœ ์•ฑ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด AppContent์˜ ์Šคํƒ€์ผ์— ๋น„์œจ ๊ณ ์ •์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

const AppContent = styled.div max-width: calc(100vh * 5 / 9);;

์ด ๋น„์œจ์€ 5:9๋กœ ์„ค์ •ํ–ˆ๋Š”๋ฐ, ์ด๊ฑด ํŽ˜์ด์Šค๋ถ์—์„œ ์˜๊ฐ์„ ์–ป์—ˆ๋‹ค. ๋•๋ถ„์— ์–ด๋–ค ๊ธฐ๊ธฐ์—์„œ๋“  ์ •ํ•ด์ง„ ๋น„์œจ๋กœ ๋ชจ๋ฐ”์ผ ์•ฑ์ฒ˜๋Ÿผ ๋ณด์ด๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ๋‹ค.
๋‹จ์ ์€ PC์—์„œ ๋ณด๋ฉด ๊ธฐ์กด์˜ ์›นํŽ˜์ด์ง€์™€๋Š” ui๊ฐ€ ๋‹ค์†Œ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์–ด์ƒ‰ํ•˜๋‹ค๊ณ  ๋А๋‚„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด์—ˆ์ง€๋งŒ, ๋ชฉํ‘œ๊ฐ€ ๋ชจ๋ฐ”์ผ ์ตœ์ ํ™”๋ผ ์ด ์ •๋„๋Š” ๊ดœ์ฐฎ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

๐Ÿค ํŒ€์›๊ณผ์˜ ํ˜‘์—…

์ด๋ฒˆ ์ž‘์—…์€ ํŠนํžˆ ํ˜‘์—…์ด ํ•ต์‹ฌ์ด์—ˆ๋‹ค.
๋””์ž์ธ ๊ฐ€์ด๋“œ๋ฅผ ๋ฏธ๋ฆฌ ๊ณต์œ ๋ฐ›๊ณ , ๋ผ์šฐํŒ… ๊ตฌ์กฐ๋‚˜ ์Šฌ๋ผ์ด๋“œ ๋ฐฉ์‹๋„ ์ƒ์˜ํ•˜๋ฉด์„œ ์ง„ํ–‰ํ–ˆ๋‹ค. ๋•๋ถ„์— ๊ฐ์ž์˜ ํŒŒํŠธ๊ฐ€ ๋ช…ํ™•ํžˆ ๋‚˜๋‰˜์—ˆ๊ณ , ์ถฉ๋Œ ์—†์ด ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๐Ÿ’ก ํšŒ๊ณ 

์ฒ˜์Œ์—๋Š” Slider์˜ ์œ„์น˜ ์กฐ์ •์ด ๊นŒ๋‹ค๋กœ์› ๋‹ค. ํŠนํžˆ ์Šฌ๋ผ์ด๋“œ ์•ˆ์˜ ์ด๋ฏธ์ง€ ๋น„์œจ์ด ์•ˆ ๋งž์•„์„œ object-fit: cover๋กœ ํ•ด๊ฒฐ.

PWA ๋น„์œจ ์„ค์ •์€ ์ƒ๊ฐ๋ณด๋‹ค ๋ณต์žกํ–ˆ๋Š”๋ฐ, ๊ธฐ์ค€์ ์„ vh๋กœ ํ•ด์„œ 5/9๋ฅผ ๊ณฑํ•ด์„œ ์ผ์ •ํ•œ ๋น„์œจ์„ ์œ ์ง€์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ์ฑ„ํƒํ–ˆ๋‹ค.

ํŒ€์›๊ณผ์˜ ํ˜‘์—…์œผ๋กœ ๋‚ด๊ฐ€ ๋งก์€ ์˜์—ญ ์™ธ์— ํฐ ๊ทธ๋ฆผ์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค๋Š” ์ ์ด ์ข‹์•˜๋‹ค.

๐Ÿ’ก๊ฐœ์„ ํ•  ์ 

ํ˜„์žฌ๋Š” max-width๋กœ ํ™”๋ฉด ๋น„์œจ์„ ๊ฐ•์ œ๋กœ ์„ค์ •ํ–ˆ๋Š”๋ฐ, ๋‹ค์Œ์—๋Š” ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ(media query) ๋ฅผ ํ™œ์šฉํ•ด์„œ ๋””๋ฐ”์ด์Šค ํ•ด์ƒ๋„์— ๋งž์ถฐ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฐ˜์‘ํ˜•์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค. ๊ทธ๊ฒŒ ๋” ์›น ์ ‘๊ทผ์„ฑ์—๋„ ์ข‹๊ณ  ์œ ์ง€๋ณด์ˆ˜๋„ ์‰ฌ์šธ ๊ฒƒ ๊ฐ™๋‹ค.

profile
์ฝ”๋ฆฐ์ด

0๊ฐœ์˜ ๋Œ“๊ธ€