rigood

[React] ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋” ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• 1 ๋ณธ๋ฌธ

๐ŸŽจ ํ”„๋ก ํŠธ์—”๋“œ/React

[React] ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋” ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• 1

rigood 2022. 12. 19. 21:25

๋ฆฌ์•กํŠธ๋กœ ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋”๋ฅผ ๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ˆœ์ˆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ 2๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

1. position: absolute์™€ opacity๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

2. tranform: translateX๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

 

1๋ฒˆ ๋ฐฉ๋ฒ•์€ position: absolute๋กœ ์ด๋ฏธ์ง€๋ฅผ ๊ฒน์ณ ๋†“์€ ์ƒํƒœ์—์„œ

opacity๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งจ ์œ„์— ๋ณด์—ฌ์ง€๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๊ฐ„ํŽธํ•œ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ์ด๋ฏธ์ง€๊ฐ€ ์˜†์œผ๋กœ ์Šค์œฝ- ์ด๋™ํ•˜๋Š” ํšจ๊ณผ๋Š” ๋‚ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

2๋ฒˆ ๋ฐฉ๋ฒ•์€ ์ด๋ฏธ์ง€๊ฐ€ ์˜†์œผ๋กœ ์ด๋™ํ•˜๋Š” ํšจ๊ณผ๋Š” ๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ

๋งˆ์ง€๋ง‰ ์Šฌ๋ผ์ด๋“œ์—์„œ ๋‹ค์Œ ์Šฌ๋ผ์ด๋“œ(๋งจ ์ฒ˜์Œ ์Šฌ๋ผ์ด๋“œ)๋กœ ์ด๋™ํ•  ๋•Œ

์™”๋˜ ๊ธธ์„ ๋‹ค์‹œ ๋˜๋Œ์•„ ๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” 1๋ฒˆ ๋ฐฉ๋ฒ•์œผ๋กœ ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋”๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ณ ,

2๋ฒˆ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ ๊ธ€์—์„œ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

1๋ฒˆ ๋ฐฉ๋ฒ•(position: absolute, opacity)์œผ๋กœ ๊ตฌํ˜„

 


absolute์™€ z-index๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋” ๋งŒ๋“ค๊ธฐ

โ€ป CSS๋Š” styled-components ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

 

1. useState๋กœ ๋งจ ์œ„์— ๋ณด์—ฌ์งˆ ์Šฌ๋ผ์ด๋“œ ๋ฒˆํ˜ธ ์ง€์ •

function Slider() {
  const [slideIndex, setSlideIndex] = useState(1);

๋จผ์ € useState๋ฅผ ์ด์šฉํ•˜์—ฌ slideIndex๋ผ๋Š” state๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

๋งจ ์œ„์— ๋ณด์—ฌ์งˆ ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋“œ์˜ ๋ฒˆํ˜ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” state์ž…๋‹ˆ๋‹ค.

dummy ๋ฐ์ดํ„ฐ์˜ id๋ฅผ 1๋ถ€ํ„ฐ ์ง€์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐ๊ฐ’์„ 1๋กœ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

2. ์Šฌ๋ผ์ด๋“œ ๋‚˜์—ด, ์ด๋™ ๋ฒ„ํŠผ ์ƒ์„ฑ

  return (
    <Container>
      <Arrow direction="prev">์ด์ „</Arrow>
      {data.map((character) => (
        <Slide
          key={character.id}
          className={character.id === slideIndex ? "active" : null}
        >
          <Photo
            src={process.env.PUBLIC_URL + `/img/slider/${character.img}`}
          />
          <Name>{character.name}</Name>
          <Nickname>{character.nickname}</Nickname>
        </Slide>
      ))}
      <Arrow direction="next">๋‹ค์Œ</Arrow>
    </Container>
  );
}

์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋“œ๋ฅผ ๋‹ด์„ Container๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ ,

๊ทธ ์•ˆ์— map ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด Slide๋ฅผ ๋‚˜์—ดํ•ด์ค๋‹ˆ๋‹ค.

 

์Šฌ๋ผ์ด๋“œ์˜ id์™€ slideIndex๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” (๋งจ ์œ„์— ๋ณด์—ฌ์งˆ ์Šฌ๋ผ์ด๋“œ)

Slide ์ปดํฌ๋„ŒํŠธ์— active ๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋ถ€์—ฌํ•ด์ค๋‹ˆ๋‹ค.

 

์Šฌ๋ผ์ด๋“œ ์ด๋™ ๋ฒ„ํŠผ๋„ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

Container ์•ˆ์— Arrow ๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด Slide ์œ„ ์•„๋ž˜ ๋ฐฐ์น˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋ฒ„ํŠผ ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ css ์†์„ฑ์„ ๋‹ฌ๋ฆฌ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— props๋กœ direction์„ ์ „๋‹ฌํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

3. CSS ์†์„ฑ ์ง€์ •

const Container = styled.div`
// Container ํฌ๊ธฐ ์ง€์ •
  width: 400px;
  height: 400px;
  
// ์œ— ์—ฌ๋ฐฑ ์ง€์ •, Container ์ปดํฌ๋„ŒํŠธ ๊ฐ€์šด๋ฐ ์ •๋ ฌ
  margin: 200px auto;
  
// Container ๋‚ด๋ถ€ ๊ฐ€์šด๋ฐ ์ •๋ ฌ
  display: flex;
  justify-content: center;
  align-items: center;
  
// position: absolute์ธ Arrow, Slide ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐฐ์น˜ํ•˜๊ธฐ ์œ„ํ•ด
  position: relative;
`;

const Arrow = styled.button`
// Container ์ปดํฌ๋„ŒํŠธ ๊ธฐ์ค€์œผ๋กœ ๋ฐฐ์น˜
  position: absolute;
  
// ์ˆ˜์ง ๊ฐ€์šด๋ฐ ์ •๋ ฌ
  top: 0;
  bottom: 0;
  margin: auto 0;
  
// Prev ๋ฒ„ํŠผ์ธ ๊ฒฝ์šฐ left: 0, Next ๋ฒ„ํŠผ์ธ ๊ฒฝ์šฐ right: 0
  left: ${({ direction }) => direction === "prev" && "0px"};
  right: ${({ direction }) => direction === "next" && "0px"};
  
// ํฌ๊ธฐ, ์Šคํƒ€์ผ ์ง€์ •
  width: 50px;
  height: 50px;
  border-radius: 50%;
  background-color: pink;

// Prev ๋ฒ„ํŠผ์ด Slide ์ปดํฌ๋„ŒํŠธ์— ๊ฐ€๋ ค์ง€์ง€ ์•Š๊ธฐ ์œ„ํ•ด z-index ์ง€์ • 
  z-index: 1;
`;

const Slide = styled.div`
// Container ์ปดํฌ๋„ŒํŠธ ๊ธฐ์ค€์œผ๋กœ ๋ฐฐ์น˜
  position: absolute;

// Slide ๋‚ด๋ถ€ ๊ฐ€์šด๋ฐ ์ •๋ ฌ, ๊ฐญ ์ง€์ •
  display: flex;
  flex-direction: column;
  align-items: center;
  row-gap: 20px;

// โ˜…โ˜… ๊ธฐ๋ณธ์ ์œผ๋กœ opacity๋ฅผ 0์œผ๋กœ ํ•˜์—ฌ ์•ˆ๋ณด์ด๊ฒŒ ํ•˜๊ณ ,
// active ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด opacity๋ฅผ 1๋กœ ๋ฐ”๊ฟ” ๋ณด์ด๊ฒŒ ํ•จ
  opacity: 0;
  &.active {
    opacity: 1;
  }
  
// opacity์— ํŠธ๋žœ์ง€์…˜ ์ ์šฉ
  transition: opacity 0.3s ease-in-out;
`;

const Photo = styled.img``;

const Name = styled.div``;

const Nickname = styled.div``;

 

Slide ์ปดํฌ๋„ŒํŠธ๋ฅผ absolute๋กœ ํฌ์ง€์…”๋‹ ํ•˜์—ฌ

์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋“œ๊ฐ€ ๊ฒน์ณ ์Œ“์ด๋„๋ก ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

 

โ–ผ absolute ํฌ์ง€์…”๋‹ ์ „, ์ผ๋ ฌ๋กœ ๋‚˜์—ด๋˜์—ˆ๋˜ ์ด๋ฏธ์ง€๋“ค์ด...

 

โ–ผ absolute ํฌ์ง€์…”๋‹ ํ›„ ๊ฒน์ณ์ง„ ๋ชจ์Šต

 

opacity๋ฅผ 0์œผ๋กœ ์ง€์ •ํ•˜์—ฌ ๋ชจ๋‘ ์•ˆ๋ณด์ด๊ฒŒ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

์Šฌ๋ผ์ด๋“œ id์™€ slideIndex๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š”

active ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด opacity๊ฐ€ 1์ด ์ ์šฉ๋˜๋ฏ€๋กœ ํ™”๋ฉด ์ƒ์— ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

useState์˜ ์ดˆ๊ธฐ๊ฐ’์ด 1์ด๋ฏ€๋กœ ์ฒซ๋ฒˆ์งธ ์ด๋ฏธ์ง€๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

 

โ–ผ opacity ์กฐ์ ˆ ํ›„ ๋ชจ์Šต

 

4. ์ด์ „, ๋‹ค์Œ ๋ฒ„ํŠผ ํด๋ฆญ ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

์ด์ „, ๋‹ค์Œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์‹คํ–‰๋  ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ 

onClick ์ด๋ฒคํŠธ์— ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๋‹ฌ์•„์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

  const moveToPrevSlide = () => {
    if (slideIndex !== 1) {
      setSlideIndex((prev) => prev - 1);
    } else {
      setSlideIndex(data.length);
    }
  };

  const moveToNextSlide = () => {
    if (slideIndex !== data.length) {
      setSlideIndex((prev) => prev + 1);
    } else {
      setSlideIndex(1);
    }
  };
  
 
 <Arrow direction="prev" onClick={moveToPrevSlide}>
 <Arrow direction="next" onClick={moveToNextSlide}>

๋จผ์ € ์ด์ „ ๋ฒ„ํŠผ ํด๋ฆญ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ, ์ด์ „ ๋ฒ„ํŠผ ํด๋ฆญ์‹œ slideIndex๋ฅผ 1์”ฉ ์ค„์ด๋˜,

์ฒซ๋ฒˆ์งธ ์Šฌ๋ผ์ด๋“œ์ธ ๊ฒฝ์šฐ, ์ด์ „ ์ด๋ฏธ์ง€๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋งจ ๋งˆ์ง€๋ง‰ ์Šฌ๋ผ์ด๋“œ๋กœ ์ด๋™ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

if/else๋ฌธ๊ณผ setSlideIndex๋ฅผ ์ด์šฉํ•˜์—ฌ

slideIndex๊ฐ€ 1์ด ์•„๋‹Œ ๊ฒฝ์šฐ(์ฒซ๋ฒˆ์งธ ์Šฌ๋ผ์ด๋“œ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ) slideIndex๋ฅผ 1์”ฉ ์ค„์ด๊ณ ,

slideIndex๊ฐ€ 1์ธ ๊ฒฝ์šฐ(์ฒซ๋ฒˆ์งธ ์Šฌ๋ผ์ด๋“œ์ธ ๊ฒฝ์šฐ) ๋งจ ๋งˆ์ง€๋ง‰ ์Šฌ๋ผ์ด๋“œ ๋ฒˆํ˜ธ(=๋ฐฐ์—ด ๊ธธ์ด)๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.

 

๋‹ค์Œ ๋ฒ„ํŠผ ํด๋ฆญ ํ•จ์ˆ˜๋„ ๋กœ์ง์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ slideIndex๋ฅผ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋˜,

๋งจ ๋งˆ์ง€๋ง‰ ์Šฌ๋ผ์ด๋“œ๋งŒ ๋‹ค์Œ ๋ฒ„ํŠผ ํด๋ฆญ์‹œ slideIndex๋ฅผ 1๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.

 

โ–ผ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ด๋ฏธ์ง€๊ฐ€ ๋ฐ”๋€Œ๋Š” ๋ชจ์Šต

 

5. ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ตฌํ˜„ํ•˜๊ธฐ

const moveDot = (index) => {
    setSlideIndex(index);
  };
 
 <DotContainer>
        {data.map((character) => (
          <Dot
            key={character.id}
            className={character.id === slideIndex ? "active" : null}
            onClick={() => moveDot(character.id)}
          />
        ))}
 </DotContainer>

ํŽ˜์ด์ง€๋„ค์ด์…˜ ๋ฒ„ํŠผ์„ ๋‹ด์„ DotContainer๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๊ณ ,

์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋“œ๋ฅผ ๋‚˜์—ดํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ Dot๋„ ๋‚˜์—ดํ•ด์ค๋‹ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, id์™€ ํ˜„์žฌ slideIndex๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ active๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋‹ฌ์•„์ค๋‹ˆ๋‹ค.

 

Dot์„ ํด๋ฆญํ•˜๋ฉด ํ˜„์žฌ id๋ฅผ ์ธ์ž๋กœ ๋‹ด์•„ moveDot ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•˜์—ฌ

slideIndex๋ฅผ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ํ•ด๋‹น ๋ฒˆํ˜ธ์— ๋งž๋Š” ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋“œ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

const DotContainer = styled.div`
// Container ์ปดํฌ๋„ŒํŠธ ๊ธฐ์ค€์œผ๋กœ ๋งจ ์•„๋ž˜ ๋ฐฐ์น˜
  position: absolute;
  bottom: 0;
  
// ๋„ˆ๋น„ ์ง€์ •
  width: 150px;
  
// Dot ๋ฐฐ์น˜
  display: flex;
  justify-content: space-between;
`;

const Dot = styled.div`
  width: 12px;
  height: 12px;
  border-radius: 50%;
  background-color: pink;
  cursor: pointer;
  
// ํ˜„์žฌ ์Šฌ๋ผ์ด๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Dot์€ ๋ฐฐ๊ฒฝ์ƒ‰์„ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •
  &.active {
    background-color: skyblue;
  }
`;

DotContainer๋„ position: absolute ์†์„ฑ์„ ํ†ตํ•ด Container ๋งจ ์•„๋ž˜ ์ชฝ์— ๋ฐฐ์น˜ํ•ด์ค๋‹ˆ๋‹ค.

Dot ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” active ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ํ™œ์„ฑํ™”๋œ Dot๋งŒ ๋ฐฐ๊ฒฝ์ƒ‰์„ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ๊นŒ์ง€ ํ•˜๋ฉด ์™„์„ฑ์ž…๋‹ˆ๋‹ค^^

 

 

์ „์ฒด ์ฝ”๋“œ

import { useState } from "react";
import styled from "styled-components";
import data from "./data";

function Slider() {
  const [slideIndex, setSlideIndex] = useState(1);

  const moveToPrevSlide = () => {
    if (slideIndex !== 1) {
      setSlideIndex((prev) => prev - 1);
    } else {
      setSlideIndex(data.length);
    }
  };

  const moveToNextSlide = () => {
    if (slideIndex !== data.length) {
      setSlideIndex((prev) => prev + 1);
    } else {
      setSlideIndex(1);
    }
  };

  const moveDot = (index) => {
    setSlideIndex(index);
  };

  return (
    <Container>
      <Arrow direction="prev" onClick={moveToPrevSlide}>
        ์ด์ „
      </Arrow>
      {data.map((character) => (
        <Slide
          key={character.id}
          className={character.id === slideIndex ? "active" : null}
        >
          <Photo
            src={process.env.PUBLIC_URL + `/img/slider/${character.img}`}
          />
          <Name>{character.name}</Name>
          <Nickname>{character.nickname}</Nickname>
        </Slide>
      ))}
      <Arrow direction="next" onClick={moveToNextSlide}>
        ๋‹ค์Œ
      </Arrow>
      <DotContainer>
        {data.map((character) => (
          <Dot
            key={character.id}
            className={character.id === slideIndex ? "active" : null}
            onClick={() => moveDot(character.id)}
          />
        ))}
      </DotContainer>
    </Container>
  );
}

export default Slider;

const Container = styled.div`
  width: 400px;
  height: 400px;
  margin: 200px auto;
  display: flex;
  justify-content: center;
  align-items: center;
  position: relative;
`;

const Arrow = styled.button`
  position: absolute;
  top: 0;
  bottom: 0;
  margin: auto 0;
  left: ${({ direction }) => direction === "prev" && "0px"};
  right: ${({ direction }) => direction === "next" && "0px"};
  width: 50px;
  height: 50px;
  border-radius: 50%;
  background-color: pink;
  z-index: 1;
`;

const Slide = styled.div`
  position: absolute;
  display: flex;
  flex-direction: column;
  align-items: center;
  row-gap: 20px;
  opacity: 0;
  transition: opacity 0.3s ease-in-out;
  &.active {
    opacity: 1;
  }
`;

const Photo = styled.img``;

const Name = styled.div``;

const Nickname = styled.div``;

const DotContainer = styled.div`
  position: absolute;
  bottom: 0;
  width: 150px;
  display: flex;
  justify-content: space-between;
`;

const Dot = styled.div`
  width: 12px;
  height: 12px;
  border-radius: 50%;
  background-color: pink;
  cursor: pointer;
  &.active {
    background-color: skyblue;
  }
`;
// data.js

const data = [
  {
    id: 1,
    name: "์šฐ์˜์šฐ",
    nickname: "์ฒœ์žฌ ๋ณ€ํ˜ธ์‚ฌ",
    img: "youngwoo.jpg",
  },
  {
    id: 2,
    name: "์ด์ค€ํ˜ธ",
    nickname: "์„ญ์„ญํ•œ๋ฐ์š”",
    img: "junho.jpg",
  },
  {
    id: 3,
    name: "์ •๋ช…์„",
    nickname: "์œ ๋‹ˆ์ฝ˜ ์ƒ์‚ฌ",
    img: "myeongseok.jpg",
  },
  {
    id: 4,
    name: "์ตœ์ˆ˜์—ฐ",
    nickname: "๋ด„๋‚ ์˜ ํ–‡์‚ด",
    img: "suyeon.jpg",
  },
  {
    id: 5,
    name: "๊ถŒ๋ฏผ์šฐ",
    nickname: "๊ถŒ๋ชจ์ˆ ์ˆ˜",
    img: "minwoo.jpg",
  },
];

export default data;

 

 

Comments