๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[๊ฐœ๋ฐœ] Practice/React

[React] ์ถ”์ฒœ ๋ฒ„ํŠผ ๊ธฐ๋Šฅ ์˜ค๋ฅ˜ ์ˆ˜์ •ํ•˜๊ธฐ

by Connecting-the-dots 2022. 3. 22.
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ’ก ์‹ค์Šต ํฌ์ธํŠธ!

  • ์ด์ „์— ์ถ”์ฒœ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋ฒ„ํŠผ ์˜†์— ์ˆซ์ž๊ฐ€ ์นด์šดํŠธ๋˜์–ด ๋ณด์—ฌ์ง€๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์—ˆ๋‹ค.
  • ๊ทธ ๋•Œ๋Š” ๊ฐ•์‚ฌ๋‹˜์ด ์˜ˆ์ œ๋กœ ํ•˜๋‚˜์˜ ๊ฒŒ์‹œ๊ธ€์—๋งŒ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ์…จ๋Š”๋ฐ, ๊ทธ ๋•Œ ๋‹ค๋ฅธ ๊ฒŒ์‹œ๊ธ€์—๋„ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋ณด๋ ค ์‹œ๋„๋ฅผ ํ•˜๊ธฐ๋Š” ํ–ˆ์—ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ๊ณต๋ถ€๋Ÿ‰์ด ๋ถ€์กฑํ•ด์„œ์ธ์ง€ ๋‚ด๊ฐ€ ๋‹น์žฅ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์ฒซ๋ฒˆ์งธ ๊ฒŒ์‹œ๊ธ€์— ์‚ฌ์šฉํ–ˆ๋˜ ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ useState() ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ๋‹ค๋ฅธ ๊ฒŒ์‹œ๊ธ€์—๋„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ ์ง€๊ธˆ ๋‹น์žฅ์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์ง€๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฌด์ˆ˜ํžˆ ๋งŽ์€ useState() ๊ฐ€ ํ•„์š”ํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ํ™•์žฅ์„ฑ ๋“ฑ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ๋˜๋ฏ€๋กœ ๊ณต๋ถ€๋ฅผ ์ข€ ๋” ํ•œ ๋‹ค์Œ์— ์‹œ๋„๋ฅผ ํ•˜๋ ค๊ณ  ๋ณด๋ฅ˜ํ•ด๋‘” ์ƒํƒœ์˜€๋‹ค.
  • ๊ทธ๋Ÿฌ๊ณ ๋‚˜์„œ ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊นŒ์ง€ ๋ฐฐ์šด ํ›„์— ์ด์ œ๋Š” ๋ฐฐ์šด ๊ฒƒ๋“ค์„ ์ ์šฉํ•ด์„œ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„ ๋‹ค์‹œ ์‹œ๋„ํ•ด๋ณด์•˜๊ณ  ์ด๋ฒˆ์—๋Š” ์ •์ƒ์ ์œผ๋กœ ๋ˆ„๋ฅธ ๋ฒ„ํŠผ๋งŒ ์นด์šดํŠธ๋˜๋„๋ก ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๐Ÿ’œ ์ถ”์ฒœ ๋ฒ„ํŠผ ๊ธฐ๋Šฅ ์˜ค๋ฅ˜ ์ˆ˜์ • ์ „

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

function App() {

  let [title, setTitle] = useState([
      '[React] React ์„ค์น˜์™€ ๊ฐœ๋ฐœํ™˜๊ฒฝ ์…‹ํŒ…ํ•˜๊ธฐ', 
      '[React] JSX ๋ฅผ ์ด์šฉํ•ด HTML ํŽ˜์ด์ง€ ์ œ์ž‘ํ•ด๋ณด๊ธฐ', 
      '[React] React ์—์„œ state ๋ณ€๊ฒฝํ•ด๋ณด๊ธฐ'
  ]);

  let [thumbsUp, setThumbsUp] = useState(0);

  let [clickedNum, setClickedNum] = useState(0);

  return (
    <div className="App">
    
      {
        title.map(function(content, idx){
          return (
          <div className='list' key={idx}>
            <h3 onClick={()=>{setClickedNum(idx)}}>
                {content}
                <span className='thumbs-up' onClick={ ()=>{ setThumbsUp(thumbsUp + 1) } }>๐Ÿ‘</span>
                {thumbsUp} 
            </h3>
            <p>2022-03-18</p>
            <hr/>
          </div>            
          )
        })
      }

    </div>
  );
}
  • ๊ธฐ์กด์˜ ์ฝ”๋“œ๋Š” ์œ„์™€ ๊ฐ™์•˜๋‹ค.
  • thumbs-up ์ด๋ผ๋Š” className ์„ ๊ฐ€์ง„ ํƒœ๊ทธ์˜ onClick ์†์„ฑ์„ ๋ณด๋ฉด ๊ฐ ๊ฒŒ์‹œ๊ธ€๋“ค์˜ ์ถ”์ฒœ ๋ฒ„ํŠผ์„ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ„๋„์˜ ์ฝ”๋“œ๊ฐ€ ์—†๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— map() ํ•จ์ˆ˜๋กœ ๊ฒŒ์‹œ๊ธ€๋“ค์ด ๋ Œ๋”๋ง๋˜์–ด ๋ธŒ๋ผ์šฐ์ €์— ๋ณด์ด๋Š” ์ƒํƒœ์—์„œ ์–ด๋–ค ์ถ”์ฒœ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋„ ๋‹ค๋ฅธ ์ถ”์ฒœ ๋ฒ„ํŠผ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

๐Ÿ’œ ์ถ”์ฒœ ๋ฒ„ํŠผ ๊ธฐ๋Šฅ ์˜ค๋ฅ˜ ์ˆ˜์ • ์ค‘

// ์ „์ฒด ์ฝ”๋“œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ „์ฒด ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด์„œ ์ผ๋ถ€ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋Š” ์ œ์™ธํ–ˆ๋‹ค.

function App() {

  let [title, setTitle] = useState([
      '[React] React ์„ค์น˜์™€ ๊ฐœ๋ฐœํ™˜๊ฒฝ ์…‹ํŒ…ํ•˜๊ธฐ', 
      '[React] JSX ๋ฅผ ์ด์šฉํ•ด HTML ํŽ˜์ด์ง€ ์ œ์ž‘ํ•ด๋ณด๊ธฐ', 
      '[React] React ์—์„œ state ๋ณ€๊ฒฝํ•ด๋ณด๊ธฐ'
  ]);

  let [thumbsUp, setThumbsUp] = useState([0, 0, 0]);

  let [clickedNum, setClickedNum] = useState(0);

  function changeThumbsUp(idx) {
    let newThumbsUp = [...thumbsUp];
    newThumbsUp[idx] = thumbsUp[idx] + 1;
    setThumbsUp(newThumbsUp);
  }
  
  function addTitleAndThumbsUp(input) {
    let newTitle = [...title];
    newTitle.unshift(input);
    setThumbsUp([0, ...thumbsUp]);
    setTitle(newTitle);
  }

  return (
    <div className="App">
    
      {
        title.map(function(content, idx){
          return (
          <div className='list' key={idx}>
            <h3 onClick={()=>{setClickedNum(idx)}}>
                {content}
                <span className='thumbs-up' onClick={ ()=>{ changeThumbsUp(idx) } }>๐Ÿ‘</span>
                {thumbsUp[idx]} 
            </h3>
            <p>2022-03-18</p>
            <hr/>
          </div>            
          )
        })
      }

    </div>
  );
}

 

// ์ˆ˜์ • ์ „
let [thumbsUp, setThumbsUp] = useState(0);

// ์ˆ˜์ • ํ›„
let [thumbsUp, setThumbsUp] = useState([0, 0, 0]);
  • ๋งจ ์ฒ˜์Œ ๋– ์˜ฌ๋ฆฐ ๊ฒƒ์€ ๊ฒŒ์‹œ๊ธ€์˜ ๊ฐœ์ˆ˜์™€ ์ถ”์ฒœ ๋ฒ„ํŠผ์˜ ๊ฐœ์ˆ˜๋Š” ์–ด์ฐจํ”ผ ๋™์ผํ•˜๋ฏ€๋กœ, title ์ด๋ผ๋Š” state ์˜ ์ž๋ฃŒํ˜•๊ณผ ์š”์†Œ์˜ ๊ฐœ์ˆ˜(3๊ฐœ)์™€ thumbsUp ์ด๋ผ๋Š” state ์˜ ์ž๋ฃŒํ˜• ๋ฐ ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋งž์ถฐ์ฃผ๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.
  • ๋‚˜์˜ ๋ชฉ์ ์€ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ 1๋ฒˆ ์ธ๋ฑ์Šค์— ํ•ด๋‹นํ•˜๋Š” ์ถ”์ฒœ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ thumbsUp ์„ [0, 1, 0] ์œผ๋กœ ๋ฐ”๊พธ์–ด์ฃผ๊ณ , ์ด ์ƒํƒœ์—์„œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ 0๋ฒˆ ์ธ๋ฑ์Šค์— ํ•ด๋‹นํ•˜๋Š” ์ถ”์ฒœ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด [1, 1, 0] ์ด๋Ÿฐ ์‹์œผ๋กœ ๋˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.
  • ์—ฌ๊ธฐ๊นŒ์ง€ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ์ง€๊ธˆ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋Š” ๋ฐฉํ–ฅ์ด ์ด์ „์— '์ฒซ๋ฒˆ์งธ ๊ธ€์ œ๋ชฉ ๋ฐ”๊พธ๊ธฐ' ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์—ˆ๋˜ ๋ฐฉ์‹๊ณผ idx ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™์•˜๋‹ค.
function addTitleAndThumbsUp(input) {
    let newTitle = [...title];
    newTitle.unshift(input);
    setThumbsUp([0, ...thumbsUp]);
    setTitle(newTitle);
}
  • ๋‹จ, state ์ดˆ๊ธฐ๊ฐ’๋งŒ ์ˆ˜์ •์„ ํ•˜๋Š” ๊ฒฝ์šฐ, ๋‚˜์ค‘์— ๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก์„ ํ•˜๋ฉด ๋‹ค์‹œ ์ถ”์ฒœ ๋ฒ„ํŠผ ๊ธฐ๋Šฅ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • ๊ฒŒ์‹œ๊ธ€์€ ๋Š˜์–ด๋‚˜๋Š”๋ฐ ์ถ”์ฒœ ๋ฒ„ํŠผ ๊ธฐ๋Šฅ์— ๋‹ด๊ธด ๊ฐ’์€ 3๊ฐœ์—์„œ ๋Š˜์–ด๋‚˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋”ฐ๋ผ์„œ, ๊ฒŒ์‹œ๋ฌผ์ด ์ถ”๊ฐ€๋˜๋ฉด ๊ธฐ๋ณธ๊ฐ’์„ 0 ์œผ๋กœ ํ•˜์—ฌ setThumsUp() ์„ ํ†ตํ•ด ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ thumbsUp ์„ ์ˆ˜์ •ํ•ด์ฃผ์—ˆ๋‹ค.
  • ์ด ๋ฐฉ๋ฒ•์ด ์‹ซ๋‹ค๋ฉด, newTitle ์„ ๋งŒ๋“ค์–ด์„œ setTitle() ์—  ๋„ฃ์–ด์„œ title ์„ ์ˆ˜์ •ํ•ด์ฃผ๋“ฏ์ด thumbsUp ์„ ์ˆ˜์ •ํ•ด๋„ ๋œ๋‹ค.

 

  {
    title.map(function(content, idx){
      return (
      <div className='list' key={idx}>
        <h3 onClick={()=>{setClickedNum(idx)}}>
            {content}
            <span className='thumbs-up' onClick={ ()=>{ changeThumbsUp(idx) } }>๐Ÿ‘</span>
            {thumbsUp[idx]} 
        </h3>
        <p>2022-03-18</p>
        <hr/>
      </div>            
      )
    })
  }
  • ์ผ๋‹จ html ์ด ๋“ค์–ด๊ฐ€๋Š” ์ฝ”๋“œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์ž‘์„ฑํ–ˆ๋‹ค.
  • changeThumbsUp() ์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ฒŒ์‹œ๋ฌผ ๊ตฌ๋ณ„์˜ ํ•ต์‹ฌ์ธ idx ๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.
    (์ด๋•Œ๊นŒ์ง€๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ• ์ง€๋Š” ์ƒ๊ฐํ•˜์ง€๋Š” ์•Š์•˜๋‹ค.)
  • ๊ทธ๋ฆฌ๊ณ  ์ถ”์ฒœ ๋ฒ„ํŠผ ์˜† ์ˆซ์ž๋Š” thumbsUp ์ด๋ผ๋Š” state ์—์„œ ํ•ด๋‹นํ•˜๋Š” idx ์˜ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์™€์„œ ์นด์šดํŠธํ•œ ์ˆซ์ž๋กœ ๋ณด์—ฌ์ฃผ์–ด์•ผ ํ•˜๋ฏ€๋กœ {thumbsUp[idx]} ๋ผ๊ณ  ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ํ‹€์ด ๋Œ€๋žต ๋งŒ๋“ค์–ด์ง„ ํ›„ ๋ณธ๊ฒฉ์ ์œผ๋กœ changeThumbsUp() ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค.

 

  function changeThumbsUp(idx) {
    let newThumbsUp = [...thumbsUp];
    newThumbsUp[idx] = thumbsUp[idx] + 1;
    setThumbsUp(newThumbsUp);
  }
  • ์ผ๋‹จ idx ๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์„ ์˜ˆ์ •์ด๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์„ ๊ตณ์ด ๋ฐ”๊ฟ€ ํ•„์š” ์—†์„ ๊ฒƒ ๊ฐ™์•„ idx ๋กœ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.
  • ์ด์ „์— '์ฒซ๋ฒˆ์งธ ๊ธ€์ œ๋ชฉ ๋ฐ”๊พธ๊ธฐ' ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด๋ณผ ๋•Œ, array ์ž๋ฃŒํ˜•์€ ์–•์€ ๋ณต์‚ฌ๋ฅผ ํ•˜๋ฉด ์‚ฌ๋ณธ๊ณผ ๊ฐ’์ด ๊ณต์œ ๋˜๋ฏ€๋กœ spread ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ•ด์•ผํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ thumbsUp ๋ผ๋Š” state ์˜ ์ž๋ฃŒ๋ฅผ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ•˜์—ฌ newThumbsUp ์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  newThumbsUp[idx] ์— thumbsUp[idx] ๊ฐ’์— 1 ๋”ํ•œ ๊ฐ’์ด ์ €์žฅ๋˜๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค.
    (์ฆ‰, ๋งจ์ฒ˜์Œ์— idx ๊ฐ€ 1 ์ธ ์ถ”์ฒœ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ตœ์ข…์ ์œผ๋กœ ํ•จ์ˆ˜ ๋‚ด์—์„œ newThumbsUp ์€ [0, 1, 0] ์ด ๋œ๋‹ค.)
  • ๋งˆ๋ฌด๋ฆฌ๋กœ setThumbsUp(newThumbsUp) ์„ ํ•ด์ฃผ๋ฉด thumbsUp ์— ์ €์žฅ๋œ array ๊ฐ€ newThumbsUp ์— ์ €์žฅ๋œ array ๋กœ ๋ณ€๊ฒฝ๋˜์–ด ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
    (์ฆ‰, ์ด์ œ thumbsUp ์ด๋ผ๋Š” state ์—๋Š” [0, 0, 0] ์ด ์•„๋‹ˆ๋ผ [0, 1, 0] ์ด ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด๋‹ค.)
  • ์ด์ œ thumbsUp state ์˜ ๊ฐ ๊ฒŒ์‹œ๋ฌผ์˜ ์ธ๋ฑ์Šค์˜ ๊ฐ’์— +1 ์ด ๋˜๋ฏ€๋กœ ๊ฐ ์ถ”์ฒœ ๋ฒ„ํŠผ์€ ์„œ๋กœ์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. 

๐Ÿ’œ ์ถ”์ฒœ ๋ฒ„ํŠผ ๊ธฐ๋Šฅ ์˜ค๋ฅ˜ ์ˆ˜์ • ํ›„

  • ๋ชจ๋“  ์ˆ˜์ •์ด ๋๋‚˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์œ„์™€ ๊ฐ™์ด ์–ด๋–ค ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋„ ๋…๋ฆฝ์ ์œผ๋กœ ์ˆซ์ž๊ฐ€ ์นด์šดํŠธ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

728x90
๋ฐ˜์‘ํ˜•