์นดํ ๊ณ ๋ฆฌ๋ณ ์ฑ์ฉ ๊ณต๊ณ ๋ฅผ ํ์ธํ๊ณ , ์ด๋ ฅ์๋ฅผ ์์ฑํ์ฌ ์ํ๋ ํ์ฌ์ ์ง์ํ ์ ์๋ ์ฌ์ดํธ.
๐ ์ ํ๋ธ ์์ ๋งํฌ
๐ Front-end Github
๐ Back-end Github
JSX
React(CRA)
, React Hook
, Sass
(Library: React-router-DOM
)Python
, Django Web Framework
, AWS
, MySQL
, JWT
Git & GitHub
, ์ํต Slack
, ์ผ์ ๊ด๋ฆฌ Trello
- ๊ทธ๋ํ์ ๋ฐ์ดํฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด ์ง์ ๊ตฌํํ์ผ๋ฉฐ, ๋ฐฑ์๋์์ ๋ฐ์ ์จ ์ฐ๋ด ๋ฐ์ดํฐ๋ฅผ ๋ง๋์
height
์ผ๋ก ๊ฐ๊ณตํ๋ค.- ๋ฐ๋ณต๋๋ UI ์ค ๊ณต๊ณ ๋ชฉ๋ก ๋จ์๋ ์ปดํฌ๋ํธํํ์ฌ
.map()
๋ฉ์๋๋ฅผ ํ์ฉํ์์ผ๋ฉฐ, ํํฐ modal ๋จ์๋ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉํ๋ค.
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>
ํํฐ ๋ฒํผ์ ๋๋ฅด๋ฉด btnClick state
๊ฐ false
์์ true
๋ก ๋ฐ๋๋ค. <div className="ModalPopupWrapON">
์ modal ์ฐฝ ๊ทธ ์์ฒด์ด๋ฏ๋ก modal์ด ์ผ์ง๋ค.
<Header>
์ปดํฌ๋ํธ ์์๋ ๋ชจ๋ฌ์ฐฝ์ header ๋ถ๋ถ์ ๋ ์ด์์์ด ๋ค์ด๊ฐ๋ค.
๋ชจ๋ฌ์ฐฝ๋ง๋ค ์์ ๋ค์ด๊ฐ๋ ๋ด์ฉ์ ๋ค๋ฅด๋ค. ๊ทธ ๋ด์ฉ์ ๋ ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌ๋ฅผ ํด์ฃผ๊ณ , ๋ฒํผ ์ด๋ฆ์ ๊ธฐ์ค์ผ๋ก ์กฐ๊ฑด๋ถ๋ ๋๋ง์ ๊ฑธ์ด์ฃผ์๋ค.
๋ฐ๋ ๋ถ๋ถ์ ์ค๊ฐ์ ๋๊ณ , ์ด๊ณ ๋ซ๋ <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" />
์ด๊ธฐํ
</span>
<h1 className="modalName">{btnName}</h1>
<span className="modalClose" onClick={isClickFilterBtn}>
X
</span>
</header>
{children}
</div>
);
}
this.props.children
๋ก ์ฒ๋ฆฌํด ์ค๋ค.this.props.children
์ ๋ค์ด๊ฐ ๋ถ๋ถ์, modal์์ ๋ด์ฉ์ ๋ฌ๋ฆฌํด์ค ๋ถ๋ถ์ด๋ค.๋ฐฑ์๋๋ก๋ถํฐ ์ฐ๋ด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๋์ ์ ์ ์ธ ํ๋ฉด์ด ํฝ ์ฌ์ฌํ๋ค. ๊ทธ๋์ ๊ทธ๋ํ๊ฐ ์ฌ๋ผ์ค๋ 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()
props
๋ก ๋ฐ์์จ๋ค.state
๋ก heightValue์ ์ ์ธํ๋ค.useEffect
์์ salaydata์ heightValue์ ์์น๋ก ๊ฐ๊ณตํ๋ค.console.log(typeof salaydata)
๋ฅผ ์ฐ์ด๋ณด๋ string ํ์ด๊ธธ๋ split ๋ฉ์๋๋ฅผ ์จ์, ๋ฌธ์์ด ํ์ธ salarydata์์ .๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ์์ ํ์ ๋ฐฐ์ด๋ก ๋๋ ์ฃผ์๋ค.30000000.932823 -> [30000000], [932823] -> 30000000
30000000
๊ฐ์ parseInt ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ์ผ๋ก ๋ณํ์ํจ๋ค.${heightValue}px
valueToInt()
"56687500"
parseInt
๋ก ์ ์ํํ๋ค.floor
๋ฉ์๋๋ก ๋ฐ์ฌ๋ฆผํ๋ค..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();
};
- ๋จ์ด ๋ด๋ ์์๋ณด๊ธฐ ํ๋ ์ซ์๋ ์์ ๋ณ์๋ก ํํํ๊ณ , ์๋ฏธ ์๋ ํจ์๋ช ์ผ๋ก ๋ณ๊ฒฝํด ์ฃผ์๋ค.
- salarydata๋ฅผ
parseInt
๋ฉ์๋๋ฅผ ์จ์ ์ ์ํํ๋ค. ์ด๋ ๋ ๋ฒ์งธ ์ธ์๋ 10์ง์๋ฅผ ๋ํ๋ธ๋ค. (์์ซ์ ๋ค๋ ์์์ ์ ๊ฑฐ๋๋ค)- 10000 ๋จ์๋ก ํํํ๊ธฐ ์ํด 1000์ผ๋ก ๋๋๊ณ , ์ด๋ฅผ
floor
๋ฉ์๋๋ก ๋ฐ์ฌ๋ฆผํ๋ค.toLocaleString()
๋ฉ์๋๋ ์ ๊ท์์ด ์์ด๋, ์ฝค๋ง๋ฅผ ์๋์ผ๋ก ์ฐ์ด์ค๋ค. ์ด๋ฅผ ๋ฆฌํดํด ์ฃผ๋ฉด ๋-!
location.href
๋ฉ์๋๋ฅผ ์ด์ฉํ ์ ๋ฐ์ ์์๋ค. ๋ฆฌ์กํธ์ ๊ฐ์ฅ ์ค์ํ ๊ฐ๋
์ธ SPA ํน์ฑ์ ๋ฌด์ํ๊ณ ์๋ก ๊ณ ์นจ -> ์ ์ฒด ํ์ฑ์ด ๋์ด ๊ทธ๋ํ ์ ๋๋ฉ์ด์
๋ก๋ฉ์ ์คํ์ํจ ์ ์ด ๋๋ฌด๋๋ ์์ฌ์ ๋ค. ๊ผญ ์๋ณด๊ณ ์ถ์ ๋์ ์ฝ๋์ด๋ค.