React | ๐Ÿ’ป ์›ํ‹ฐ๋“œ(WANTED) 2nd Team Project ํšŒ๊ณ  ๋ฐ ๋งˆ๋ฌด๋ฆฌ

๋ฏธ์—ฐยท2021๋…„ 10์›” 31์ผ
2

WANTED-clone

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

WANTED Clone Project

์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์ฑ„์šฉ ๊ณต๊ณ ๋ฅผ ํ™•์ธํ•˜๊ณ , ์ด๋ ฅ์„œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์›ํ•˜๋Š” ํšŒ์‚ฌ์— ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ดํŠธ.

  • Wanted ์‚ฌ์ดํŠธ์˜ ๊ธฐํš๊ณผ ๋””์ž์ธ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๊ธฐ๋Šฅ๊ณผ ๋ฐ์ดํ„ฐ๋Š” ์ง์ ‘ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ์ดˆ๊ธฐ ์„ธํŒ…๋ถ€ํ„ฐ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์˜€์œผ๋ฉฐ, ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ํ”„๋ก ํŠธ์™€ ๋ฐฑ์˜ ํ†ต์‹ ์œผ๋กœ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ๊ธฐ๊ฐ„ ๋ฐ ๊ฐœ๋ฐœ ์ธ์›

  • ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„: 2021. 10. 18. ~ 2021. 10. 29.
  • ๊ฐœ๋ฐœ ์ธ์›
    โœ”๏ธ Front-End 4๋ช… : ๋ฐ•๋ฏธ์—ฐ, ์„œ๋™ํ˜, ์ •๋ฏผ์ง€, ํ™์Šน๊ท 
    โœ”๏ธ Back-End 2๋ช… : ๊ตฌ๋ณธ์šฑ, ๊น€๋ฏผํ˜ธ

ํ”„๋กœ์ ํŠธ ๊ตฌํ˜„ ์˜์ƒ / Github

๐Ÿ“Ž ์œ ํŠœ๋ธŒ ์˜์ƒ ๋งํฌ
๐Ÿ“Ž Front-end Github
๐Ÿ“Ž Back-end Github

Technology

  • Frontend: JSX React(CRA), React Hook, Sass (Library: React-router-DOM)
  • Backend: Python, Django Web Framework, AWS, MySQL, JWT
  • Common: ๋ฒ„์ „๊ด€๋ฆฌ Git & GitHub, ์†Œํ†ต Slack, ์ผ์ •๊ด€๋ฆฌ Trello

Trello

  • ์ „์ฒด์ ์ธ ์ผ์ • ๊ด€๋ฆฌ์™€ ํŒ€์›๋“ค์˜ ์ž‘์—… ํ˜„ํ™ฉ ๊ณต์œ ๊ฐ€ ์ „๋ฐ˜์ ์œผ๋กœ ์ž˜๋œ ํŽธ์ด์—ˆ๋‹ค.
  • ๋ฐ์ผ๋ฆฌ ์Šคํฌ๋Ÿผ ๊ธฐ๋ก์ด ์žˆ์–ด ์˜ค๋Š˜ ํ•ด์•ผ ํ•  ์ผ์„ ๋‹ค์‹œ ์ƒ๊ธฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • ๋˜ํ•œ ์ •ํ•ด์ง„ ์‹œ๊ฐ„ ์•ฝ์†๋„ ์—†์—ˆ๋Š”๋ฐ, ํŒ€์› ๋ชจ๋‘๊ฐ€ ์—ด์ •์ ์ด์–ด์„œ ๋ชจ๋‘๋“ค ์ผ์ฐ ์˜ค๋Š” ํŽธ์ด์—ˆ๋‹ค. ํŒ€์›์˜ ๋ฐ˜์ด 9์‹œ ์ด์ „์— ์™€์„œ ๊ฐ™์ด ์ž‘์—…ํ–ˆ์—ˆ๋‹ค. ๋„ˆ๋ฌด ๋Œ€๋‹จํ•œ ์šฐ๋ฆฌ ํŒ€์›๋“ค! ์ด ๊ธฐํšŒ์— ์นญ์ฐฌํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘

Main Function

  • ๋ฉ”์ธ ํŽ˜์ด์ง€: ๋ฉ”์ธ ๋ ˆ์ด์•„์›ƒ, ๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ ์—ฌ๋ถ€์— ๋”ฐ๋ฅธ Nav ๋ ˆ์ด์•„์›ƒ ๋ณ€๊ฒฝ
  • ์†Œ์…œ ๋กœ๊ทธ์ธ: ์นด์นด์˜คAPI๋ฅผ ์ด์šฉํ•œ ์†Œ์…œ ๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ
  • ํšŒ์› ์ •๋ณด ์ž…๋ ฅ: ํšŒ์› ์ „๋ฌธ ๋ถ„์•ผ ์„ค์ • ๊ธฐ๋Šฅ, ์ง์žฅ ๋ฐ ์—ฐ๋ด‰์ •๋ณด ์ž…๋ ฅ ๊ธฐ๋Šฅ
  • ์ฑ„์šฉ ๊ณต๊ณ  ๋ฆฌ์ŠคํŠธ: ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์ฑ„์šฉ ๊ณต๊ณ  ํ™•์ธ, ์ตœ์‹ ์ˆœ/์ธ๊ธฐ์ˆœ/๋ณด์ƒ๊ธˆ์ˆœ ์ •๋ ฌ ๊ธฐ๋Šฅ, ํ•ด์‰ฌํƒœ๊ทธ๋ณ„ ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ
  • ์ง๊ตฐ๋ณ„ ์—ฐ๋ด‰ ๊ทธ๋ž˜ํ”„: ์ง๊ตฐ๋ณ„ ํ‰๊ท  ์—ฐ๋ด‰ ํ™•์ธ ๋ฐ ์—ฐ์ฐจ๋ณ„ ํ‰๊ท  ์—ฐ๋ด‰ ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์ธ ๊ฐ€๋Šฅ
  • ์ฑ„์šฉ ๊ณต๊ณ  ์ƒ์„ธ: ๊ณต๊ณ  ์ œ๋ชฉ/์นดํ…Œ๊ณ ๋ฆฌ/๊ณต๊ณ  ๋‚ด์šฉ ํ™•์ธ, ์ง€๋„(์นด์นด์˜ค API)๋ฅผ ํ†ตํ•œ ํšŒ์‚ฌ ์œ„์น˜ ํ™•์ธ, ๊ณต๊ณ  ๋ถ๋งˆํฌ ๊ธฐ๋Šฅ, ํ•ด๋‹น ๊ณต๊ณ ์— ์ด๋ ฅ์„œ ์ง€์›ํ•˜๊ธฐ ๊ธฐ๋Šฅ
  • ์ด๋ ฅ์„œ ์ž‘์„ฑ: ์ƒˆ ์ด๋ ฅ์„œ ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ ๊ธฐ๋Šฅ(์ž๊ธฐ์†Œ๊ฐœ, ๊ฒฝ๋ ฅ, ํ•™๋ ฅ, ์Šคํ‚ฌ), ๊ธฐ์กด ์ด๋ ฅ์„œ ์ˆ˜์ • ๊ธฐ๋Šฅ, ์ž‘์„ฑํ•œ ์ด๋ ฅ์„œ ๋ฆฌ์ŠคํŠธ ํ™•์ธ ๊ธฐ๋Šฅ
  • ๋งˆ์ดํŽ˜์ด์ง€: ํšŒ์› ์ •๋ณด ํ™•์ธ ๊ธฐ๋Šฅ, ์ฑ„์šฉ ๊ณต๊ณ  ์ง€์› ํ˜„ํ™ฉ ํ™•์ธ ๊ธฐ๋Šฅ, ๋ถ๋งˆํฌํ•œ ๊ณต๊ณ  ํ™•์ธ ๋ฐ ํ•ด๋‹น ๊ณต๊ณ  ์ƒ์„ธ ํŽ˜์ด์ง€ ์ด๋™ ๊ธฐ๋Šฅ

My Function : ์ฑ„์šฉ ๊ณต๊ณ  ๋ชฉ๋ก

  • ๊ทธ๋ž˜ํ”„์˜ ๋ฐ์ดํ„ฐ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ์ง์ ‘ ๊ตฌํ˜„ํ–ˆ์œผ๋ฉฐ, ๋ฐฑ์—”๋“œ์—์„œ ๋ฐ›์•„ ์˜จ ์—ฐ๋ด‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋ง‰๋Œ€์˜ height์œผ๋กœ ๊ฐ€๊ณตํ–ˆ๋‹ค.
  • ๋ฐ˜๋ณต๋˜๋Š” UI ์ค‘ ๊ณต๊ณ  ๋ชฉ๋ก ๋‹จ์œ„๋Š” ์ปดํฌ๋„ŒํŠธํ™”ํ•˜์—ฌ .map() ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์˜€์œผ๋ฉฐ, ํ•„ํ„ฐ modal ๋‹จ์œ„๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ–ˆ๋‹ค.

๊ธฐ์–ต์— ๋‚จ๋Š” ๋‚˜์˜ ์ฝ”๋“œ ๐Ÿ’Œ

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

๋‚ด ๋‡Œ์™€ ๋‚ด ์†์œผ๋กœ ๋‚ณ์€ ๋‚ด ์ฝ”๋“œ๋“ค..

1. Modal ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ


3๊ฐœ๊ฐ€ ๋ชจ๋‘ ๋˜‘๊ฐ™์€ modal์˜ ํ˜•ํƒœ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. [์ดˆ๊ธฐํ™”, ํƒœ๊ทธ, X]์˜ ํ—ค๋” ๋ถ€๋ถ„๊ณผ ๋์˜ ํ™•์ธ ๋ฒ„ํŠผ ๋ถ€๋ถ„. ๊ทธ๋Ÿฐ๋ฐ ๋ฐ”๋”” ๋ถ€๋ถ„์˜ ๋‚ด์šฉ๋งŒ ๋‹ค๋ฅด๋‹ค..?! ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด, ์–ด๋–ป๊ฒŒ ์žฌ์‚ฌ์šฉ์„ ํ•  ์ˆ˜ ์žˆ์„์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ–ˆ์—ˆ๋‹ค.

// FilterBtn.js - Modal Wrap
<div className={btnClick ? 'ModalPopupWrapON' : 'ModalPopupWrapOFF'}>
        <Header
          btnName={btnName}
          btnClick={btnClick}
          isClickFilterBtn={isClickFilterBtn}
        >
          <div className="ModalBody">
            {btnName === 'ํƒœ๊ทธ' && <BodyTags />}
            {btnName === '์ง€์—ญ' && <BodyLocation />}
            {btnName === '๊ฒฝ๋ ฅ' && <BodyCareer />}
          </div>
</Header>
</div>
  1. ํ•„ํ„ฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด btnClick state๊ฐ€ false์—์„œ true๋กœ ๋ฐ”๋€๋‹ค. <div className="ModalPopupWrapON">์€ modal ์ฐฝ ๊ทธ ์ž์ฒด์ด๋ฏ€๋กœ modal์ด ์ผœ์ง„๋‹ค.

  2. <Header> ์ปดํฌ๋„ŒํŠธ ์•ˆ์—๋Š” ๋ชจ๋‹ฌ์ฐฝ์˜ header ๋ถ€๋ถ„์˜ ๋ ˆ์ด์•„์›ƒ์ด ๋“ค์–ด๊ฐ„๋‹ค.

  3. ๋ชจ๋‹ฌ์ฐฝ๋งˆ๋‹ค ์•ˆ์— ๋“ค์–ด๊ฐ€๋Š” ๋‚ด์šฉ์€ ๋‹ค๋ฅด๋‹ค. ๊ทธ ๋‚ด์šฉ์€ ๋˜ ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ณ , ๋ฒ„ํŠผ ์ด๋ฆ„์„ ๊ธฐ์ค€์œผ๋กœ ์กฐ๊ฑด๋ถ€๋ Œ๋”๋ง์„ ๊ฑธ์–ด์ฃผ์—ˆ๋‹ค.

  4. ๋ฐ”๋”” ๋ถ€๋ถ„์„ ์ค‘๊ฐ„์— ๋‘๊ณ , ์—ด๊ณ  ๋‹ซ๋Š” <Header> ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ”๋”” ๋ถ€๋ถ„์„ ๊ฐ์‹ธ์ฃผ์—ˆ๋‹ค.

// Header.js
export default function Header({
  btnClick,
  btnName,
  isClickFilterBtn,
  children,
}) {
  return (
    <div className="ModalPopup" ref={modalRef}>
      <header className="modalHeader">
        <span className="modalReset">
          <i className="fas fa-redo" />
          &nbsp;์ดˆ๊ธฐํ™”
        </span>
        <h1 className="modalName">{btnName}</h1>
        <span className="modalClose" onClick={isClickFilterBtn}>
          X
        </span>
      </header>
      {children}
    </div>
  );
}
  1. Header.js๋Š” modal์ฐฝ์˜ ๋˜‘๊ฐ™์€ ํ—ค๋” ๋ถ€๋ถ„์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.
  2. ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€์˜ ๋‚ด์šฉ์€this.props.children๋กœ ์ฒ˜๋ฆฌํ•ด ์ค€๋‹ค.
  3. ์ฆ‰ this.props.children์— ๋“ค์–ด๊ฐˆ ๋ถ€๋ถ„์€, modal์—์„œ ๋‚ด์šฉ์„ ๋‹ฌ๋ฆฌํ•ด์ค„ ๋ถ€๋ถ„์ด๋‹ค.

2. ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•ด์„œ ๊ทธ๋ž˜ํ”„๋กœ ๋งŒ๋“ค๊ธฐ

โœ๏ธ ๊ณ ๋ฏผ์‚ฌํ•ญ

๋ฐฑ์—”๋“œ๋กœ๋ถ€ํ„ฐ ์—ฐ๋ด‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋™์•ˆ ์ •์ ์ธ ํ™”๋ฉด์ด ํฝ ์‹ฌ์‹ฌํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๋ž˜ํ”„๊ฐ€ ์˜ฌ๋ผ์˜ค๋Š” css ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ–ˆ๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋กœ๋”ฉ๋˜๋Š” ๋™์•ˆ ์—ฐ๋ด‰ ๋ฐ์ดํ„ฐ๋„ ๋ถˆ๋Ÿฌ์™€์ง€๋ฏ€๋กœ, ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค๊ณ  ๋Š๊ปด์ง€์ง€ ์•Š์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

๋ฆฌํŒฉํ† ๋ง ์ „ ์ฝ”๋“œ

useEffect(() => {
    let floatToInt = salarydata.split('.')[0];
    Number.parseInt(floatToInt);
    let result = (350 * floatToInt) / 70000000;

    setHeight(result);
  }, [salarydata]);
// ๋ฐฑ์—”๋“œ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์—ฐ๋ด‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„์˜ height์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •


  const valueToInt = salarydata => {
    let intValue = salarydata.split('.')[0];
    Number.parseInt(intValue);

    let result = Math.floor(intValue / 10000)
      .toString()
      .replace(/\B(?=(\d{3})+(?!\d))/g, ',');

    return result;
  };
// ๋ฐฑ์—”๋“œ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์—ฐ๋ด‰ ์ˆซ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ธฐ ์‰ฌ์šด ์ˆซ์ž๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •

useEffect()

  1. ์—ฐ์ฐจ๋ณ„(์‹ ์ž…, 1๋…„, 2๋…„ ...) ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฑ์—”๋“œ๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์™”๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋Š” 30000000.932823 ์ด๋Ÿฐ ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด๋กœ ๋˜์–ด ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„์˜ height์œผ๋กœ ํ‘œํ˜„์„ ํ•ด์•ผ ํ•œ๋‹ค.
  2. salaydata๋ฅผ props๋กœ ๋ฐ›์•„์˜จ๋‹ค.
  3. height ์ˆ˜์น˜๋กœ ์“ฐ์ผ state๋กœ heightValue์„ ์„ ์–ธํ•œ๋‹ค.
  4. useEffect์—์„œ salaydata์„ heightValue์˜ ์ˆ˜์น˜๋กœ ๊ฐ€๊ณตํ•œ๋‹ค.
  5. console.log(typeof salaydata)๋ฅผ ์ฐ์–ด๋ณด๋‹ˆ string ํ˜•์ด๊ธธ๋ž˜ split ๋ฉ”์„œ๋“œ๋ฅผ ์จ์„œ, ๋ฌธ์ž์—ด ํ˜•์ธ salarydata์—์„œ .๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ „์ž์™€ ํ›„์ž ๋ฐฐ์—ด๋กœ ๋‚˜๋ˆ  ์ฃผ์—ˆ๋‹ค.
  6. ๊ทธ ํ›„ ์ „์ž์˜ ๊ฐ’([0])๋งŒ ์„ ํƒํ–ˆ๋‹ค. 30000000.932823 -> [30000000], [932823] -> 30000000
  7. ์ „์ž๋งŒ ๋‚จ์€ 30000000 ๊ฐ’์„ parseInt ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์ˆ˜ํ˜•์œผ๋กœ ๋ณ€ํ˜•์‹œํ‚จ๋‹ค.
  8. ๊ทธ๋ž˜ํ”„์˜ ์ „์ฒด height ๊ฐ’์ธ 350 * ์—ฐ๋ด‰ ์ˆ˜์น˜ / ์ตœ๋Œ“๊ฐ’(์—ฐ๋ด‰ ๋งˆ์ง€๋…ธ์„ ) ์œผ๋กœ ๊ณ„์‚ฐํ•˜์—ฌ, setHeight์— ๊ทธ ๊ฒฐ๊ณผ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.
  9. ๋ง‰๋Œ€๊ทธ๋ž˜ํ”„์˜ height ๊ฐ’์€, ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด๋กœ ๊ทธ ๊ฒฐ๊ณผ๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค. ${heightValue}px

valueToInt()

  1. salarydata ๋กœ ๋ฐฑ์—”๋“œ ๋ฐ์ดํ„ฐ("56687500.0000000")๋ฅผ ๋ฐ›์•„์™”๋‹ค.
  2. salarydata๋ฅผ . ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆˆ ๋‹ค์Œ, [0] ์ธ๋ฑ์Šค๋งŒ์„ ์ž๋ฅธ๋‹ค. "56687500"
  3. salarydata๋Š” ์•„์ง ๋ฌธ์ž์—ด์ด๋ฏ€๋กœ, parseInt๋กœ ์ •์ˆ˜ํ™”ํ•œ๋‹ค.
  4. 10000 ๋‹จ์œ„๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด 1000์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ์ด๋ฅผ floor ๋ฉ”์„œ๋“œ๋กœ ๋ฐ˜์˜ฌ๋ฆผํ•œ๋‹ค.
  5. 5668๊นŒ์ง€๋Š” ๋งŒ๋“ค์—ˆ์œผ๋‚˜ ์ฝค๋งˆ๋ฅผ ์ฐ๊ธฐ ์œ„ํ•ด .toStiring() ๋ฉ”์„œ๋“œ์™€ ํ•จ๊ป˜ ์ •๊ทœ์‹์œผ๋กœ ํ‘œํ˜„

๋ฆฌํŒฉํ† ๋ง ํ›„ ์ฝ”๋“œ (๊น”-๋” ๐Ÿ‘)

const APIdataChangeToHeight = totalSalary => {
    const ALL_GRAPH_WRAP_HEIGHT = 350;
    const MAX_DATA_VALUE = 70000000;

    let heighValue =
      (ALL_GRAPH_WRAP_HEIGHT * parseInt(totalSalary, 10)) / MAX_DATA_VALUE;

    return heighValue;
  };

  const yearTenThousandWon = salarydata => {
    const THOUSAND_DIGIT = 10000;
    const salary = parseInt(salarydata, 10);
    const divisionForYearMoney = Math.floor(salary / THOUSAND_DIGIT);

    return divisionForYearMoney.toLocaleString();
  };
  1. ๋‚จ์ด ๋ด๋„ ์•Œ์•„๋ณด๊ธฐ ํž˜๋“  ์ˆซ์ž๋Š” ์ƒ์ˆ˜ ๋ณ€์ˆ˜๋กœ ํ‘œํ˜„ํ•˜๊ณ , ์˜๋ฏธ ์žˆ๋Š” ํ•จ์ˆ˜๋ช…์œผ๋กœ ๋ณ€๊ฒฝํ•ด ์ฃผ์—ˆ๋‹ค.
  2. salarydata๋ฅผ parseInt ๋ฉ”์„œ๋“œ๋ฅผ ์จ์„œ ์ •์ˆ˜ํ™”ํ•œ๋‹ค. ์ด๋•Œ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” 10์ง„์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. (์†Œ์ˆซ์  ๋’ค๋Š” ์•Œ์•„์„œ ์ œ๊ฑฐ๋œ๋‹ค)
  3. 10000 ๋‹จ์œ„๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด 1000์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ์ด๋ฅผ floor ๋ฉ”์„œ๋“œ๋กœ ๋ฐ˜์˜ฌ๋ฆผํ–ˆ๋‹ค.
  4. toLocaleString() ๋ฉ”์„œ๋“œ๋Š” ์ •๊ทœ์‹์ด ์—†์–ด๋„, ์ฝค๋งˆ๋ฅผ ์ž๋™์œผ๋กœ ์ฐ์–ด์ค€๋‹ค. ์ด๋ฅผ ๋ฆฌํ„ดํ•ด ์ฃผ๋ฉด ๋-!

โœ๏ธ ์•„์‰ฌ์šด ์  ํšŒ๊ณ 

  • ์• ์ •์ด ๋งŽ์•˜๋˜ ์ปดํฌ๋„ŒํŠธ์ธ ๋งŒํผ ์•„์‰ฌ์šด ์ ๋„ ์ฐจ๊ณ  ๋„˜์นœ๋‹ค. ๐Ÿ˜ข
  • ํ•„ํ„ฐ๋ง์— ๋”ฐ๋ผ ํŠน์ • ํ•„ํ„ฐ์— ํ•ด๋‹นํ•˜๋Š” ๊ทธ๋ž˜ํ”„๋งŒ ํ•˜์–€์ƒ‰ ๋ง‰๋Œ€๋กœ ๋ฐ”๋€Œ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ, ๋ฌผ๋ฆฌ์ ์ธ ์‹œ๊ฐ„ ๋•Œ๋ฌธ์— ํ•œ๊ณ„๊ฐ€ ์žˆ์—ˆ๋‹ค. ๋‚˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์š•์‹ฌ์Ÿ์ด๋‹ค..
  • ์ง๊ตฐ์— ๋”ฐ๋ฅธ ๊ทธ๋ž˜ํ”„ ๋ณ€ํ™”๋Š” "ํ•„ํ„ฐ๋ง" ๊ธฐ๋Šฅ์„ ์ด์šฉํ–ˆ๋”๋ผ๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํŽ˜์ด์ง€ ๋กœ๋”ฉ์ด ๋˜์—ˆ์„ ๊ฒƒ์ด๋‹ค. ํ—ˆ๋‚˜ ์ด์— ๋Œ€ํ•œ ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š์•˜๊ณ , CSS ๊ทธ๋ž˜ํ”„ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋ Œ๋”๊ฐ€ ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋  ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์ง€์ฒด๋˜์–ด location.href ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ๋ฐ–์— ์—†์—ˆ๋‹ค. ๋ฆฌ์•กํŠธ์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐœ๋…์ธ SPA ํŠน์„ฑ์„ ๋ฌด์‹œํ•˜๊ณ  ์ƒˆ๋กœ ๊ณ ์นจ -> ์ „์ฒด ํŒŒ์‹ฑ์ด ๋˜์–ด ๊ทธ๋ž˜ํ”„ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋กœ๋”ฉ์„ ์‹คํ–‰์‹œํ‚จ ์ ์ด ๋„ˆ๋ฌด๋‚˜๋„ ์•„์‰ฌ์› ๋‹ค. ๊ผญ ์†๋ณด๊ณ  ์‹ถ์€ ๋‚˜์˜ ์ฝ”๋“œ์ด๋‹ค.

๋งˆ์น˜๋ฉด์„œ ๐Ÿ™Œ

  • 1์ฐจ ํ”„๋กœ์ ํŠธ ๋•Œ๋ณด๋‹ค, 2์ฐจ ํ”„๋กœ์ ํŠธ ๋•Œ ๋” ์„ฑ์žฅํ–ˆ์Œ์„ ๋Š๋‚€๋‹ค. 1์ฐจ ํ”„๋กœ์ ํŠธ ๋•Œ๋Š” ๋ฐฐ์šด ๋‚ด์šฉ์„ ์ตํž ์ˆ˜ ์žˆ์—ˆ๋˜ ์‹œ๊ฐ„์ด๋ผ๋ฉด, 2์ฐจ ํ”„๋กœ์ ํŠธ ๋•Œ๋Š” ๊ธฐ์ดˆ๋ฅผ ํ† ๋Œ€๋กœ ๋” ๋งŽ์€ ๊ฐœ๋…๊ณผ ์‹ฌํ™”์ ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ธฐํšŒ๊ฐ€ ๋˜์—ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์™œ ํ˜‘์—…์ด ์ค‘์š”ํ•œ ๊ฒƒ์ธ์ง€ ๋‹ค์‹œ๊ธˆ ๊นจ๋‹ฌ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ•œ ์‚ฌ์ดํŠธ ์ „์ฒด๋ฅผ ๋‚˜ ํ˜ผ์ž ๋‹ค ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๊ตฌ์„ฑ์› ๊ฐ์ž๊ฐ€ ๋งก์€ ๋ฐ”๊ฐ€ ์žˆ๋‹ค. ๊ฐ์ž ๋งก์€ ํŽ˜์ด์ง€๊ฐ€ ๋‹ค๋ฅธ๋ฐ๋„ ์œ ๊ธฐ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ํ•˜๋‚˜์˜ ์™„์ „ํ•œ ์‚ฌ์ดํŠธ๊ฐ€ ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ด (์•ฝ๊ฐ„์˜ ๊ณผ์žฅ์„ ๋ณดํƒœ์„œ) ๋ฒ…์ฐจ์˜ฌ๋ž๋‹ค..! ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—ฐ๊ฒฐ์ด ๋˜๋ ค๋ฉด, ํŒ€์›๋“ค์˜ ์†Œํ†ต์ด ์šฐ์„ ์ด ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ๋„ ๋ฐฐ์› ๋‹ค. ๋‹ค์Œ์—๋„ ๊ธฐํšŒ๊ฐ€ ๋œ๋‹ค๋ฉด ์šฐ๋ฆฌ ํŒ€์›๋“ค์ด๋ž‘ ๋˜ ๊ฐ™์ด ๊ฐœ๋ฐœํ•˜๊ณ  ์‹ถ๋‹ค. ๋ชจ๋‘๋“ค ํ•จ๊ป˜ ์ผํ•˜๊ณ  ์‹ถ์€ ๊ฐœ๋ฐœ์ž์˜€๋‹ค.
  • ํ˜ผ์ž ์‚ฝ์งˆํ–ˆ๋˜ ์‹œ๊ฐ„์ด ์ฐธ ๊ธธ์—ˆ๋‹ค. ์ดํ•ด๋ฅผ ํ•˜๊ณ  ์‹ถ์€๋ฐ ์ดํ•ด๊ฐ€ ์•ˆ ๋˜๋Š” ๋Š๋‚Œ์ด ๋‹ต๋‹ตํ•ด์„œ ์ด๊ฒƒ์ €๊ฒƒ ์‹œ๋„ํ•ด ๋ณด๊ณ , ๋˜‘๊ฐ™์€ ์ฝ”๋“œ๋งŒ ๊ณ„์† ๋šซ์–ด์ ธ๋ผ ์ณ๋‹ค๋ณด์•˜๋˜ ์‹œ๊ฐ„๋„ ๋ฐฐ๋กœ ๋งŽ์•˜๋‹ค. ๊ตฌ๊ธ€๋งํ•ด์„œ ์ฐพ์€ ํžŒํŠธ๋ฅผ ๋‚ด ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค๊ธฐ๊นŒ์ง€์˜ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ ๋งŒํผ, ๋‚ด ์ฝ”๋“œ์— ์ž๋ถ€์‹ฌ์ด ์ƒ๊ธฐ๊ณ  ์• ์ •์ด ์ƒ๊ฒผ๋‹ค. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ ๋•๋ถ„์— ๋‚ด๊ฐ€ ์–ผ๋งˆ๋‚˜ ๊ฐœ๋ฐœ์„ ์‚ฌ๋ž‘ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ๊ฒŒ ๋  ์ˆ˜ ์žˆ์—ˆ๋‹ค. (๋‚˜ ๊ฐœ๋ฐœ ์‚ฌ๋ž‘ํ•˜๋„ค..?) ์—ญ์‹œ ์ด๋Ÿฐ ๋ง›์— ๊ฐœ๋ฐœํ•˜๋Š” ๊ฑด๊ฐ€ ์‹ถ๋‹ค! ํ›—๋‚ ์— ๋‚ด๊ฐ€ ๋” ์„ฑ์žฅํ•œ๋‹ค๋ฉด, ์–ด๋Š ์ •๋„ ์‚ฝ์งˆ๋„ ์ฆ๊ธธ ์ค„ ์•„๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ  ์‹ถ๋‹ค.
profile
FE Developer

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