๐Ÿงพ ํ”„๋ฆฌ์œŒ๋ฆฐ ๊ณผ์ œํ…Œ์ŠคํŠธ

Netlify Status

โš™ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ

  • node.js
  • npm

โœจ ์‹คํ–‰

  1. github์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ํด๋ก  ํ•œ๋‹ค.
$ git clone https://github.com/sangbooom/AssignmentTest
  1. ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— ๋“ค์–ด๊ฐ„๋‹ค.
$ cd AssignmentTest
  1. ์˜์กด์„ฑ ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•œ๋‹ค.
$ npm install
  1. ์‹คํ–‰ํ•œ๋‹ค.
$ npm run start

๐Ÿ“š ์‚ฌ์šฉ ๊ธฐ์ˆ  ์Šคํƒ

  • react (typescript, ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ)
  • emotion.js
  • redux
  • axios

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๋™์ž‘ ํ๋ฆ„ ์ˆœ์„œ

์ฒ˜์Œ์— store์—์„œ initialState๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.index.tsx
๊ทธ ํ›„์— ProblemLayout๊ณผ SimilarLayout์„ ๋ Œ๋”๋งํ•œ๋‹ค. App.tsx
์ž‘์„ฑํ•œ API ์š”์ฒญ์„ ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š”๋‹ค.ProblemLayout/index.tsx, SimilarLayout/index.tsx
๊ฐ๊ฐ Layout์—์„œ axios๋กœ ๋ฐ›์•„์˜จ json ๋ฐ์ดํ„ฐ๋ฅผ dispatch๋ฅผ ํ†ตํ•ด store์— ๊ฐฑ์‹ ํ•œ๋‹ค.
๊ฐฑ์‹  ๋˜๋ฉด useSelector๋กœ store์˜ ๊ฐ’๋“ค์„ ์ง€์ผœ๋ณด๊ณ  ์žˆ๋˜ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ฆฌ๋ Œ๋”๋ง ๋˜๊ณ  ๊ฐ’์ด ๊ฐฑ์‹ ๋œ๋‹ค.
Layout๋“ค์ด ๋‹ค์‹œ ๊ฐฑ์‹ ๋˜๊ณ  list - listItem ์ˆœ์œผ๋กœ ๋ Œ๋”๋ง์ด ๋œ๋‹ค.

๊ธฐ๋Šฅ ๊ตฌํ˜„

์œ ์‚ฌ๋ฌธํ•ญ ๋ฒ„ํŠผ active

์œ ์‚ฌ๋ฌธํ•ญ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ onClickSimilarCardButton์ด ์‹คํ–‰๋œ๋‹ค.

const onClickSimilarCardButton = useCallback(() => {
  dispatch(changeValue({ key: "isButtonClicked", value: true }));
  dispatch(changeValue({ key: "activeIndex", value: targetIndex }));
}, [dispatch, targetIndex]);

targetIndex๋Š” List์ปดํฌ๋„ŒํŠธ์—์„œ map์œผ๋กœ ๋ฐ›์•„์˜จ index๊ฐ’์„ index-1๋กœ ์ดˆ๊ธฐํ™”ํ–ˆ๊ณ , ๋‚ด๊ฐ€ ๋ˆ„๋ฅธ ๋ฒ„ํŠผ์˜ index๋ฅผ ์ €์žฅํ•œ ๋ณ€์ˆ˜์ด๋‹ค.
dispatch๋ฅผ ํ†ตํ•ด isButtonClicked๋ฅผ true๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ , SimilarLayout์˜ useSelector๊ฐ€ ๊ฐ์ง€๋ฅผ ํ•˜๊ณ  ๋ฐ”๋€ ๊ฐ’์œผ๋กœ ๋ฆฌ๋ Œ๋”๋ง์„ ํ•œ๋‹ค.
activeIndex๋Š” ํ˜„์žฌ active ๋˜์–ด์žˆ๋Š” index๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์‚ญ์ œ

์‚ญ์ œ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ onClickDeleteButton์ด ์‹คํ–‰๋œ๋‹ค.

const onClickDeleteButton = useCallback(() => {
  dispatch(deleteProblem(targetIndex));
  if (activeIndex === targetIndex) {
    dispatch(changeValue({ key: "isButtonClicked", value: false }));
    dispatch(changeValue({ key: "activeIndex", value: -1 }));
  } else if (activeIndex > targetIndex) {
    dispatch(changeValue({ key: "activeIndex", value: activeIndex - 1 }));
  }
}, [dispatch, activeIndex, targetIndex]);

์‚ญ์ œ๋ฅผ ๋ˆ„๋ฅธ index๋ฅผ dispatch๋กœ ๋„˜๊ธฐ๊ณ  reducer์—์„œ targetIndex์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.
๋งŒ์•ฝ, activeIndex(ํ˜„์žฌ active ๋˜์–ด์žˆ๋Š” index)์™€ targetIndex(ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ๋ฒ„ํŠผ์˜ index)๊ฐ€ ๊ฐ™๋‹ค๋ฉด activeIndex๋ฅผ ์ดˆ๊ธฐํ™” ์‹œํ‚ค๊ณ  ์œ ์‚ฌ๋ฌธํ•ญ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ์ง€ ์•Š์œผ๋ฉด ๋œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  activeIndex๊ฐ€ targetIndex๋ณด๋‹ค ํฌ๋‹ค๋ฉด ์‚ญ์ œ๋ฅผ ํ–ˆ์„ ๋•Œ index๊ฐ€ ํ•œ์นธ์”ฉ ๋‚ด๋ ค์˜ค๊ธฐ ๋•Œ๋ฌธ์— activeIndex์— -1์„ ํ•ด์ฃผ์—ˆ๋‹ค.

์ถ”๊ฐ€

์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ onClickAddButton์ด ์‹คํ–‰๋œ๋‹ค.

const onClickAddButton = useCallback(() => {
  dispatch(addProblem(targetIndex));
}, [dispatch, targetIndex]);

ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ๋ฒ„ํŠผ์˜ index๋ฅผ dispatch๋ฅผ ํ†ตํ•ด store์˜ reducer์— ๋„˜๊ฒจ์ฃผ๊ณ  ์•„๋ž˜ ๋ฐฉ์‹์„ ์‹คํ–‰์‹œ์ผœ ๋ฐ”๊ฟ”์ค€๋‹ค.

// reducer
switch (action.type) {
  ...
  case ADD_PROBLEM:
    draft.problemData.splice(
      draft.activeIndex + 1,
      0,
      draft.similarData[action.data]
    );
    // ํ•™์Šต์ง€ ๋ฆฌ์ŠคํŠธ์— ํ˜„์žฌ active ๋˜์–ด์žˆ๋Š” index + 1์— ์œ ์‚ฌ๋ฌธ์ œ ๋ฆฌ์ŠคํŠธ[์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ index]๋ฅผ ์ถ”๊ฐ€
    draft.similarData.splice(action.data, 1);
    // ์œ ์‚ฌ๋ฌธ์ œ ๋ฆฌ์ŠคํŠธ[์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ index] ์‚ญ์ œ
    break;
  ...
}

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ProblemLayout/index.tsx ์™€ SimilarLayout/index.tsx์—์„œ ๊ฐ๊ฐ problemData์™€ similarData ๊ฐ’์ด ๋ณ€๊ฒฝ ๋œ ๊ฒƒ์„ ๊ฐ์ง€ํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง ํ•œ๋‹ค.

๊ต์ฒด

๊ต์ฒด ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ onClickSwapButton์ด ์‹คํ–‰๋œ๋‹ค.

const onClickSwapButton = useCallback(() => {
  dispatch(swapSimilar(targetIndex));
}, [dispatch, targetIndex]);

ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ๋ฒ„ํŠผ์˜ index๋ฅผ dispatch๋ฅผ ํ†ตํ•ด store์˜ reducer์— ๋„˜๊ฒจ์ฃผ๊ณ  ์•„๋ž˜ ๋ฐฉ์‹์„ ์‹คํ–‰์‹œ์ผœ ๋ฐ”๊ฟ”์ค€๋‹ค.

๊ต์ฒด ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ ๋ฌธ์ œ๋ฅผ ํ•™์Šต์ง€ ๋ฆฌ์ŠคํŠธ์˜ active๋œ ๋ฌธ์ œ ์•„๋ž˜์— ์ถ”๊ฐ€ํ•œ๋‹ค.
๊ต์ฒด ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ ๋ฌธ์ œ๋ฅผ ์œ ์‚ฌ๋ฌธ์ œ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ญ์ œํ•œ๋‹ค.
ํ•™์Šต์ง€ ๋ฆฌ์ŠคํŠธ์—์„œ active ์ƒํƒœ ๋ฌธ์ œ๋ฅผ ์œ ์‚ฌ๋ฌธ์ œ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ญ์ œํ•œ index์— ์ถ”๊ฐ€ํ•œ๋‹ค.
ํ•™์Šต์ง€ ๋ฆฌ์ŠคํŠธ์—์„œ active ์ƒํƒœ ๋ฌธ์ œ๋ฅผ ํ•™์Šต์ง€ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ญ์ œํ•œ๋‹ค.
๋งˆ์น˜ ๊ต์ฒด๊ฐ€ ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋„๋ก ์—ฐ์‚ฐ์„ ํ–ˆ๋‹ค.

// reducer
switch (action.type) {
  ...
  case SWAP_SIMILAR:
    draft.problemData.splice(
      draft.activeIndex + 1,
      0,
      draft.similarData[action.data]
    );
    // ๊ต์ฒด ๋ˆ„๋ฅธ ๋ฌธ์ œ๋ฅผ ํ•™์Šต์ง€์˜ active๋ฌธ์ œ์˜ ์•„๋ž˜์— ์ถ”๊ฐ€
    draft.similarData.splice(action.data, 1);
    // ๊ต์ฒด ๋ˆ„๋ฅธ ๋ฌธ์ œ๋ฅผ similarData์—์„œ ์‚ญ์ œ
    draft.similarData.splice(
      action.data,
      0,
      draft.problemData[draft.activeIndex]
    );
    // ํ•™์Šต์ง€์˜ active๋ฌธ์ œ๋ฅผ similarData์—์„œ ์‚ญ์ œํ•œ index์— ์ถ”๊ฐ€
    draft.problemData.splice(draft.activeIndex, 1);
    // ํ•™์Šต์ง€์˜ active๋ฌธ์ œ๋ฅผ problemData์—์„œ ์‚ญ์ œ
    break;
  ...
}

immer๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๋ณ€์„ฑ์„ ์ง€์ผœ์ฃผ์ง€ ์•Š์•˜๋‹ค.

๐Ÿ’ญ๋‚˜ ํ˜ผ์ž ๊ณ ๋ฏผํ•œ ๋ฆฌํŒฉํ† ๋ง ์ด์Šˆ

๋ฐ˜์‘ํ˜•

480px 576px 768px ์ผ ๋–„๋„ ๋ฐ˜์‘ํ˜•์„ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋‚˜ ๋งŽ์€ ๊ณ ๋ฏผ์„ ํ–ˆ๋‹ค. ์‚ฌ์‹ค ํŽ˜์ด์ง€ ์ž์ฒด๊ฐ€ ์Šค๋งˆํŠธํฐ์œผ๋กœ ๋ณด์ง€ ์•Š๋Š” ํŽ˜์ด์ง€์ธ ๊ฒƒ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ๋งŒ ์ฒ˜๋ฆฌํ•ด์ฃผ์—ˆ๋‹ค.

์ด๋ฏธ์ง€๋Š” ๋น„์œจ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ž‘์•„์ง€๋ฉด ๋„ˆ๋ฌด ์•ˆ ๋ณด์—ฌ์„œ ๋”ฐ๋กœ css ์†์„ฑ์„ ์ฃผ์ง€ ์•Š์•˜๋‹ค.

๋น„๋™๊ธฐ ํ†ต์‹ 

json์„ ๋กœ์ปฌ์—์„œ AJAX๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๋Š”๋ฐ Layout ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ›์•„์˜ค๋Š” ๊ฒŒ ๊ฑฐ์Šฌ๋ ธ๋‹ค.
์ปดํฌ๋„ŒํŠธ๋Š” view์— ๊ด€ํ•œ ๊ฒƒ์„ ๊ฐ€์ ธ์˜ค๊ณ  ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๋Š” ์—ญํ• ๋งŒ ํ•˜๊ณ  ์‚ฌ์ด๋“œ์ดํŽ™ํŠธ๊ฐ€ ์žˆ๋Š” ๋น„๋™๊ธฐ ํ†ต์‹ ์€ redux-saga๊ฐ€ ๋‹ด๋‹นํ•˜๋„๋ก ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ๋ฅผ ํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค.
์‚ฌ์‹ค json์„ ํ†ตํ•ด ๋”๋ฏธ๋ฐ์ดํ„ฐ๋กœ ๊ฐ„๋‹จํžˆ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด๋ผ์„œ ๋”ฑํžˆ ๋น„๋™๊ธฐ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ด์œ ๊ฐ€ ์—†์–ด ๋ณด์—ฌ ์ ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค.
๊ตณ์ด ์žˆ๋‹ค๋ฉด ์š”์ฒญ๊ณผ ์‘๋‹ต์‚ฌ์ด์— ๋กœ๋”ฉํ™”๋ฉด์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค?
์ž‘์€ ํ”„๋กœ์ ํŠธ์—์„œ redux-saga ์“ฐ๊ธฐ์— ์„ฑ๋Šฅ์ƒ์˜ ์ด์ ๋ณด๋‹ค ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์ด ๋–จ์–ด์ง€๋Š” ๊ฒƒ์ด ๋” ํฐ ๊ฒƒ ๊ฐ™์•„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๊ฐ Layout ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์•˜๋‹ค.


SWR์„ ๋„์ž…ํ•˜๋ฉด ์„ฑ๋Šฅ์ƒ์˜ ์ด์ ์ด ์žˆ์„๊นŒ? ์ „ํ˜€ ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค.


๊ฒฝ๋กœ๋ฅผ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด Config ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ ค ํ–ˆ์ง€๋งŒ ํฐ ์ด์Šˆ๊ฐ€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์•„ ์ ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค.

CSS

css ์†์„ฑ ๊ธฐ์ˆ  ์ˆœ์„œ๋Š” NHN ์ฝ”๋”ฉ์ปจ๋ฒค์…˜์„ ๋”ฐ๋ž๋‹ค. image

์ถœ์ฐจ : https://nuli.navercorp.com/data/convention/NHN_Coding_Conventions_for_Markup_Languages.pdf

css ๋ฐฉ๋ฒ•๋ก  ์ค‘ ํ•˜๋‚˜์ธ BEM ๋ฐฉ์‹์„ ์„ ํ˜ธํ•˜๋Š”๋ฐ styled-component์— ์ ์šฉํ•˜๋ ค๋ฉด ์Šค๋„ค์ดํฌ ์ผ€์ด์Šค์™€ ํŒŒ์Šค์นผ ์ผ€์ด์Šค๋ฅผ ํ˜ผํ•ฉํ•ด์„œ ์จ์•ผํ–ˆ๋‹ค.
๊ทธ๋Ÿฌ๊ธฐ์—” ๊ฐ€๋…์„ฑ์ด ์•ˆ ์ข‹๊ณ  ์œ ์ง€๋ณด์ˆ˜ ํ•˜๊ธฐ ์•ˆ ์ข‹๊ณ  eslint์—์„œ ์—๋Ÿฌ๋ฅผ ๋ƒˆ๊ธฐ์— ๊ทธ๋ƒฅ ํŒŒ์Šค์นผ ์ผ€์ด์Šค๋กœ styled-component๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

์ตœ์ ํ™”

๋งŒ์•ฝ ํ•™์Šต์ง€, ๊ต์ฒด/์ถ”๊ฐ€ ํ•  ๋ฌธ์ œ๊ฐ€ ๋ฐฑ ๋ฌธ์ œ๊ฐ€ ๋„˜๋Š”๋‹ค๋ฉด?? lazy-loading ์ด๋‚˜ react-virtualized๋กœ ์ตœ์ ํ™” ํ•ด์ฃผ๋Š” ๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. ์ด๋ฏธ์ง€๋Š” ์šฉ๋Ÿ‰์„ ๋งŽ์ด ์ฐจ์ง€ํ•˜๊ณ  ์„ฑ๋Šฅ์ด ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์‚ฌ์šฉ์ž ํ™”๋ฉด์— ๋ณด์ด๋Š” ์ด๋ฏธ์ง€๋งŒ ์š”์ฒญํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์Šคํฌ๋กค์„ ๋‚ด๋ ค์„œ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๊ฐ€ ๋ณด์—ฌ์•ผ ํ•  ๋•Œ ์ด๋ฏธ์ง€๋ฅผ ์š”์ฒญํ•ด์„œ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์„ ์ค„์ด๋ฉด ์„ฑ๋Šฅ์ด ์ตœ์ ํ™”๋  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค.

๋ถˆํ•„์š”ํ•œ ํƒœ๊ทธ๋‚˜ ์Šคํƒ€์ผ์ด ์—†์–ด์•ผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ css๋ฅผ ๊ทธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋‹จ์ถ• ๋  ๊ฒƒ์ด๊ณ  ์ด๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”๋กœ ์ด์–ด์งˆ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋‚˜์˜ css์— ์žˆ์–ด์„œ๋Š” ์•„์ง ๋ฌผ์Œํ‘œ๊ฐ€ ๋งŽ๋‹ค. ์ƒํ™ฉ์— ์ ์ ˆํ•œ ์†์„ฑ์ธ์ง€.. ์‹œ๋งจํ‹ฑ ํƒœ๊ทธ์— ์ต์ˆ™ํ•˜์ง€ ์•Š์•„์„œ ์ž˜ ์ผ๋Š”์ง€ ํ™•์‹ ์ด ์•ˆ ์„ ๋‹ค. ๋ฉด์ ‘์„ ๋ณด๊ฒŒ ๋œ๋‹ค๋ฉด ์—ฌ์ญค๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

React.memo()๋ฅผ ์ด์šฉํ•œ ์ตœ์ ํ™”? ์‚ฌ์‹ค ํฐ ์ด์ ์ด ์—†์–ด๋ณด์—ฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค. memo๋Š” ์–•์€ ๋น„๊ต๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ƒ๊ธธ ๋•Œ ๋ฆฌ๋ Œ๋”๋ง์„ ํ•˜๋Š” ๊ฒƒ์ด๊ณ  ์–•์€ ๋น„๊ต์‹œ์— ๋ฆฌ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ผ๋ฐ˜์ ์ธ ์ปดํฌ๋„ŒํŠธ ์‹คํ–‰๋ณด๋‹ค ๋น„์šฉ์ด ๋” ๋น„์Œ€ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.