๐ ๊ณตํต์ฌํญ
Git
์ ์ฌ์ฉํ ํ ํ์ ๊ณผ์ squash, rebase
๋ฅผ ์ ์ฉํ์ฌ commit ๋ด์ญ ๊ด๋ฆฌTrello
๋ฅผ ํ์ฉํ ์คํฌ๋ผ ๋ฐฉ์ ์๋ ํ๋ก์ ํธ ์งํ
๐ Front-end
React.js
๋ฅผ ์ด์ฉํ ํด๋กCRA(create-react-app)
๋ฅผ ์ฌ์ฉํ ์ด๊ธฐ ์ธํstyled-components
ํ์ฉRedux
๋ฅผ ์ด์ฉํ ์ ์ญ ์ํ ๊ด๋ฆฌHooks
๋ฅผ ์ด์ฉํ ์ปดํฌ๋ํธ ์ํ ๊ด๋ฆฌlocalStorage
์token
์ ์ด์ฉํ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํreact-router, query string, path
๋ก ๋์ ๋ผ์ฐํ ๊ตฌํ- Code refactoring
๐ Back-end
Django
๋ฅผ ์ฌ์ฉํ ์ด๊ธฐ ์ธํAquery
๋ฅผ ์ด์ฉํ ๋ชจ๋ธ๋งBcrypt
๋ฅผ ์ด์ฉํ ๋น๋ฐ๋ฒํธ ์ํธํ๋ก ํ์๊ฐ์ ๊ธฐ๋ฅ ๊ตฌํPyJWT
Mysql
- Code refactoring
๐ ํ๋ก์ ํธ ๊ธฐ๊ฐ
- 2020.10.05 ~ 2020.10.16
๐ธ ์ฌ์ฉ ๊ธฐ์
Front-end
React
JavaScript
styled-components
Redux, react-redux
Git
Back-end
AqueryTool
Python
Django
MySQL
PyJWT / Bcrypt
Git
๐ ๊ตฌํ ๊ธฐ๋ฅ
ย ย ๋ฉ์ธ ํ์ด์ง - PM ์ฅ์ฃผํฌ

- slick ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ ์ฌ๋ผ์ด๋ ๊ตฌํ
- js๋ฅผ ์ด์ฉํ ์ฌ๋ผ์ด๋ ๊ตฌํ
- map ํจ์๋ฅผ ์ด์ฉํ ์์ดํ ์ ๋ ฌ
- ์นดํ ๊ณ ๋ฆฌ ํด๋ฆญ์ ์์ดํ ๋ฆฌ์คํธ ํ์ด์ง๋ก ์ด๋
ย ย ํ์๊ฐ์
, ๋ก๊ทธ์ธ ํ์ด์ง, ๋ฉ๋ด - ์ค์ํ, ๊น์ฑ์ง



- ์์ด๋, ์ด๋ฆ
- at least one character
- ๋น๋ฐ๋ฒํธ
- 8-20์๋ฆฌ ๋๋ฌธ์, ์ซ์ ํฌํจ
- ๋น๋ฐ๋ฒํธ ์ฌํ์ธ
- ๋น๋ฏผ๋ฒํธ์ ๋์ผ
- ์๋ ์์ผ
- ์ฐ๋ - 4์๋ฆฌ ์ซ์
- ์ - 1-12์ ์ ํ
- ์ผ - 1-31์ผ๊น์ง ์ซ์
- ์ฑ๋ณ
- ๋จ์ฑ/์ฌ์ฑ/์ ํ์ํจ ์ค ํ 1
- ๋ณธ์ธํ์ธ ์ด๋ฉ์ผ (์ ํ)
- ์ ํ์ด๊ธฐ ๋๋ฌธ์ ๋น์นธ ์ ๋ ฅ ๊ฐ๋ฅ
- ํด๋์ ํ
- โ-โ ์์ด 11์๋ฆฌ ์ ๋ ฅ
- token์ ํ์ฉํ ๋ก๊ทธ์ธ
ย ย ์ํ ๋ฆฌ์คํธ ํ์ด์ง - ์ต์์, ์ด๋๊ธธ

- mapํจ์๋ฅผ ์ด์ฉํ ์์ดํ ์ ๋ ฌ
- ํํฐ์ ๋ฐ๋ฅธ ์์ดํ ์ ๋ ฌ ๊ธฐ๋ฅ ๊ตฌํ (์๋ฒ ์ฐ๊ฒฐ ์ ์๋ mock data๋ฅผ sortํจ์๋ก ๋ถ๋ฅํ๊ณ , ์๋ฒ ์ฐ๊ฒฐ ํ์๋ queryString ์ด์ฉํ fetch ํจ์๋ฅผ ์ด์ฉํ์๋ค.)
- ๋ฆฌ์คํธ๋ทฐ,์ด๋ฏธ์ง๋ทฐ,ํฐ์ด๋ฏธ์ง๋ทฐ,๊ฐค๋ฌ๋ฆฌ๋ทฐ 4๊ฐ์ง์ ๋ทฐ์คํ์ผ ์ ํ
- ์ํ ๋ฆฌ์คํธ ์ถ๋ ฅ๊ฐ์ ์ ํ์ ๋ฐ๋ฅธ ํ์ด์ง๋ค์ด์
- ์ฐํ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ
- ์ํ ํด๋ฆญ ์ ํด๋น ์ํ ํ์ด์ง๋ก ์ด๋
- ํ ๊ธ ๋ฒํผ ๊ตฌํ
ย ย ์ํ ์์ธ์ ๋ณด ํ์ด์ง - ์ ์ํ, ์ด๋๊ธธ, ๊น์ฑ์ง

- Price ๋ฐ์ดํฐ๋ก ์ ๋ฆฝ๊ธ, ์ต์ ์ ํ ์ ์ดํฉ ๊ณ์ฐ
- ๋ฐ์ดํฐ ์ฐจํธ ๊ตฌํ
- ์คํฌ๋กค์ ๋ฐ๋ฅธ sticky nav๊ตฌํ
- ์คํฌ๋กค์ ๋ฐ๋ฅธ sticky nav ์์ ๋ณํ ๋ฐ ํด๋ฆญ ์ ํน์ ์คํฌ๋กค ์ด๋ ๊ธฐ๋ฅ ๊ตฌํ
- ์ต์ ์ ํ ๊ธฐ๋ฅ ๋ฐ ์๋ ์ถ๊ฐ์ ๋ฐ๋ฅธ ๊ฐ๊ฒฉ ๊ณ์ฐ ๊ธฐ๋ฅ ๊ตฌํ
- sticky nav์ ๊ฐ๊ฒฉ ๋ฐ ์ต์ ์๋ ์ฐ๋
- ๋ง์ฐ์ค hover์ ์ ํ ์์ธ ์ด๋ฏธ์ง ๋ณํ
- ๋ฐ์ดํฐ ํต์ ์ผ๋ก ๋ณด์ฌ์ฃผ๋ ์ํ์ ๋ณด ํ ์ด๋ธ
- ํฌํ ๋ฆฌ๋ทฐ ๊ฐ๋ต๋ณด๊ธฐ 4๊ฐ์ฉ ๋ณด์ฌ์ฃผ๊ธฐ
- ๋ฆฌ๋ทฐ ๋ชจ๋ฌ์ฐฝ
- ๋ณ์ ํ๊ฐ ๋ฐ ๋ฆฌ๋ทฐ ์์ฑ ๊ธฐ๋ฅ
โ ๊ธฐ์ตํ๊ณ ์ถ์ ์ฝ๋
1class InformationTab extends Component {23 ...45 render() {6 retrun (7 ...8 <ul className="chart">9 {SHIP_DATA.map((data, index) => {10 const { id, option, count } = data;11 let ratio = parseInt((count / getTotalCount()) * 100);12 return (13 <li key={id}>14 <span className="option">{option}</span>15 <div className="line">16 <div17 className={18 getMaxInCount() === index19 ? 'activeLine max'20 : 'activeLine'21 }22 style={{ width: `${ratio}%` }}23 />24 <div className="backgroundLine"></div>25 </div>26 <span27 className={28 getMaxInCount() === index ? 'count max' : 'count'29 }30 >{`${count}๊ฑด (${count ? ratio : 0}%)`}</span>31 </li>32 );33 })}34 </ul>35 ...36 )37 }38}3940function getTotalCount() {41 let counts = [];4243 for (let data of SHIP_DATA) {44 counts.push(data.count);45 }4647 return counts.reduce((accumulator, count) => accumulator + count, 0);48}4950function getMaxInCount() {51 let max = 0;52 const counts = [];5354 for (let data of SHIP_DATA) {55 counts.push(data.count);56 }5758 max = Math.max(...counts);59 return counts.indexOf(max);60}

Reduce
๋ฉ์๋๋ฅผ ํ์ฉํ ํฉ๊ณ ๊ณ์ฐ- ๋ฐ์ดํฐ ์๊ฐํ (chart)
๐ ๋ณด๊ณ ๋ฐฐ์ฐ๊ณ ๋๋ ์
ํ์ํฌ
์์ฝ๋๋ฅผ ์ฒ์ ๋ค์ด์์ ๊ฐ๋ฐ์์๊ฒ ๊ฐ์ฅ ์ค์ํ ๊ฒ ์ค ํ๋๋ ์ปค๋ฎค๋ํฐ ์์์์ ์ํต ๋ฅ๋ ฅ์ด๋ผ ๋ฐฐ์ ๋ค. ์ฌ์ค ๊ทธ ์ด์ผ๊ธฐ๋ฅผ ์ฒ์ ๋ค์์ ๋๋ ์๋ก ํ์ฌ ์ํ์ ํ์ํ ํ๋์ ๋๋ชฉ์ ์ด์ผ๊ธฐํ๋ ๊ฒ์ด๋ผ ์๊ฐํ์๋๋ฐ ์ด๋ฒ ํ ํ๋ก์ ํธ์ ์งํํ๋ฉด์ ์ ๊ฐ๋ฐ์์๊ฒ ์ปค๋ฎค๋ํฐ๊ฐ ์ค์ํ ๊ฒ์ธ์ง, ํ์ํฌ๋ ๋ฌด์์ด๊ณ ๊ทธ ํ์ํฌ๊ฐ ๊ฒฐ๊ณผ์ ์ด๋ค ์ํฅ์ ๋ผ์น๊ฒ ๋๋์ง ๊ฐ์ด ๊น์ด ๋๋ ์ ์์๋ค.
์๊ตฌ๊ฐ ๋๋ค๋ ๊ฒ
์๊ตฌ๊ฐ ๋ญ์ฌ? ์๊ตฌ๋ ๋ง์ด์ฌ
๊ฐ์ด ๋ฐฅ๋จน๋ ์
๊ตฌ๋
์ด์ฌ~
์
๊ตฌ๋
ํ๋ ๋ ์
๋ท ๋ค์ฏ ์ฌ์ฏ ๋๊น์ง ์ผ๊ณฑ
ํผ์์ด๊ฒ ๋ค๊ณ ๋๊ฐ์ ๋ฐฅ๋จน๋๊ฑด ๋ญ์ฌ?
๊ทธ๊ฑด ์๊ตฌ๊ฐ์๋๊ณ ํธ๋ก์์ด์ฌ~ ๊ทธ๋ ์๊ทธ๋?
[์ํ ๋น์ดํ ๊ฑฐ๋ฆฌ ไธญ]
ํ์ด ์ ํด์ง๊ณ ์๋ฆฌ๋ฅผ ๋ฐฐ์ ๋ฐ๊ณ ๋์๋ถํฐ ์ด๋ฏธ ๋ด๊ฒ๋ ํฐ ๋ณํ๊ฐ ์๊ฒผ๋ค. ์ฌ์ค ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ์งํํ๊ธฐ ์ด์ ์๋ ์์ฝ๋์์ ๋ฒ๋ฆ์ฒ๋ผ ๋ฐฅ์ ๊ฑฐ๋ฅด๊ธฐ ์ผ์ค์๋ ๋์๋๋ฐ ๊ทธ๋ฐ ๋ด๊ฒ ๋งค ๋ผ๋๋ฅผ ํจ๊ปํ๋ ์๊ตฌ๊ฐ ์๊ฒผ๋ค๋ ๊ฒ์ด๋ค. ์ญ์ ํ๊ตญ์ธ์ ๋ฐฅ์ผ๋ก ํตํ๋ค๊ณ ํ๋๊ฐ, ๋ด๊ฐ ๋ฐฅ์ ๋จน๋๋ค๋ ์ด์ ํ๋๋ง์ผ๋ก๋ ์์์ง๋ ํ์๋ค์ ๋ฐ์๊ฐ์ฑ(?) ์์์ ์ด๋ฏธ ๋๋ ํ ์๊ตฌ์ ์ผ์์ด ๋์ด ์์๋ค.
์์์น ๋ชปํ ๋๊ด
๊ทธ๋ ๊ฒ ํ๋ก์ ํธ๊ฐ ์์๋๊ณ ์ฐ๋ฆฌ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ณ์๋ค์ ๋ง๋ ์ฒซ๋ ์ ๋๋ถ๋ถ์ ๊ธฐํ ํ์์ ํ ์ ํ๊ฒ ๋์๋ค. ๋์ ์๋ฌด๊ฐ ๋ถ๋ช ํด์ง ์ฒซ๋ ์ ๋์๋ฝ์ ๋ด๊ฐ ๋งก์ ์์ธํ์ด์ง๋ฅผ ๋ค์ ํ๋ํ๋ ๋ค์ฌ๋ค๋ณด๋ ์ ์ด๋ ๊ฒ ํ ์คํธ๋ ๋ง๊ณ ์คํ์ผ๋ค์ ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ฒ์ธ์ง ์์ด์ ๋ฅ์ํ์ง ์์ ๋๋ ๊ทธ ๋ง์ ํด๋์ค ์ด๋ฆ์ ์ด๋ป๊ฒ ์ง์ด์ผ ํ ๊น ์ข์ ํ๋ฉฐ๊ณ ๋ฏผํ๋ฉฐ ์ฒซ๋ ์ ๋ง๋ฌด๋ฆฌํ๊ฒ ๋์๋ค.
ํ์ง๋ง ์ค์ง ์์ ๊ฒ ๊ฐ๋ ์ ๋ ๋์น์ฑ์ง ๋ชปํ ์ฌ์ด ์ฐพ์์ ๋๋ฅผ ์ ๋ค๊ฒ ํ ๊ฒ์ฒ๋ผ ํด๊ฒฐ์ฑ ์ ๋ค์ ๋ ์ ํ ์์์น ๋ชปํ ๋ฐฉ๋ฒ์ผ๋ก ๋ด๊ฒ ์ฐพ์์๋ค. ๋ค์ ๋ ์๋ฒฝ 6์, ๋์ ๋ ๋ณด๋ ์ฌ๋ ๋ฉ์์ง ํ ํต์ด ์์์๋๋ฐ

์ ์ฑ์ค๋ ํ๋ํ๋ ํด๋์ค ์ด๋ฆ์ ๊ณ ๋ฏผํด ์ฃผ๊ณ ํธ์งํด ์ฃผ์ ์ํ ๋์ ๋ฉ์์ง์๋ค. ์ ๋ง ์ด ์ฌ์ง ํ์ผ๊ณผ ์์ ๋ฉ์์ง๋ฅผ ๋ณด๋ ์๊ฐ์ ๊ฐ์ ์ ํ์ ์์ ์ ์์ ๊ฒ ๊ฐ๋ค. ์๋, ์๊ณ ์ถ์ง ์๋ค.
์ฌ๋ฌ ๊ฐ์ง ๊ฐ์ ์ด ํ๊บผ๋ฒ์ ํฐ์ ธ ๋์๋๋ฐ ์ฐ์ ๋๋ฌด๋๋ฌด ๊ฐ์ฌํ ๋ง์์ด ์์ฐ๊ณ ๋ด๊ฐ ๋๋ฌด ํฐ๋ฅผ ๋ด์ด ๋ค๋ฅธ ํ์๋ค์ ๋ถํธํ๊ฒ ํ๋ ๊ฒ์ ์๋์์๊น ํ๋ ํํ ์์ธ ๋ฐ์ฑ, ๋๋ ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋๊ฒ ๋ค๋ ๋ค์ง, ์ด๋ค ๊ณต๋์ฒด์ ์ผ์์ด ๋๋ค๋ ๊ฒ์ ๋ํ ๊ฐ์ฌํจ ๋ฑ ๋ชจ๋ ๊ฒ์ด ํ๊บผ๋ฒ์ ๋ชฐ๋ ค์์๋ค.
์ง๋ฆฟํจ
๋ค๋ฅธ ์๊ฐ ์์ด ๋ฐ๋ก ์์ฝ๋๋ก ์์ ์์ ์ ์์ํ๋ค. ์ ๋ง ์ด์ฌํ ํ๊ณ ์ถ์๊ณ ๊ทธ ๋ง์์ด ์ ํด์ง ๊ฒ์ธ์ง ๋ชจ๋ ๊ฒ์ด ๋งํ์์ด ์งํ๋์๋ค. ๊ทธ๋ฌ๋ค ์๊ฐ์ด ์๊ธฐ๋ฉด ๋ด๊ฐ ๋์์ ๋ฐ์๋ ๊ฒ์ฒ๋ผ ๋ ๋ํ ๋ค๋ฅธ ์ด์ ๋์์ด ๋ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ค๋๊ธฐ๋ ํ์๋๋ฐ ์ด์ด ์ข๊ฒ๋ ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋๋ ์๊ฐ๋ค์ ๊ฒฝํํ๊ธฐ๋ ํ๋ค. ๋ค๋ฅธ ๊ฐ๋ฐ์์ ํจ๊ป ๊ณ ๋ฏผํ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ ๋์ ์ง๋ฆฟํจ์ ๊ทธ ๋ฌด์๊ณผ๋ ๋ฐ๊ฟ ์ ์๋ ์์คํ ๊ธฐ์ต์ด ๋๊ณ ๋์ ์๋๋ ฅ์ด ๋์ด์ฃผ๋ ๊ฒ ๊ฐ๋ค.
์ปค๋ฎค๋ํฐ
๋ค์ ์ฒ์์ผ๋ก ๋์๊ฐ ์์ฝ๋๋ฅผ ์ฒ์ ๋ค์ด์์ ๊ฐ๋ฐ์์๊ฒ ๊ฐ์ฅ ์ค์ํ ๊ฒ ์ค ํ๋๋ ์ปค๋ฎค๋ํฐ๋ผ ๋ฐฐ์ ์๋ค๊ณ ํ๋ค. ์ด์ ๋ ์ ๊ฐ๋ฐ์์๊ฒ ์ปค๋ฎค๋ํฐ๊ฐ ์ค์ํ ๊ฒ์ธ์ง, ํ์ํฌ๋ ๋ฌด์์ด๊ณ ๊ทธ ํ์ํฌ๊ฐ ๊ฒฐ๊ณผ์ ์ด๋ค ์ํฅ์ ๋ผ์น๊ฒ ๋๋์ง ๋๊ตฌ๋ณด๋ค ๊ฐ์ด ๊น์ด ๋๋ ์ ์๊ฒ ๋์๋ค.
์ด ๊ธ์ ๋์ผ๋ก ๊ทธ๊ฒ๋ค์ด ๊ฐ๋ฅํ๊ฒ ํด์ค ์ฐ๋ฆฌ ํ์๋๋ค, ๋๊ธฐ๋๋ค, ๋ฉํ ๋๋ค์๊ฒ ์ ๋ง ๊ฐ์ฌํ๋ค๋ ๋ง์ ์ ํ๊ณ ์ถ๋ค.๐โโ๏ธ
+ ํ์๋ค์๊ฒ
์ ๊ฐ ํ๋ก์ ํธ ๊ธฐ๊ฐ ๋์ ๊ท์ฐฎ๊ฒ๋ ๋ง์ด ํ๊ณ ๋ฐฅํฌ์ (ใ ใ ใ )๊น์ง ๋ถ๋ ธ๋๋ฐ ์ธ์ ๋ ๋ฐ๋ปํ๊ฒ ์์ผ๋ฉด์ ๋ฐฐ๋ คํด ์ฃผ์๊ณ ์์ํด ์ฃผ์ ์ ์ ๋ง ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋๋ถ์ ์ ๋ ๋ง์ ๊ฒ๋ค์ ๋ณด๊ณ ๋ฐฐ์ฐ๊ณ ๋๋ ์ ์์์ต๋๋ค. ๋ชจ๋ ๋ชจ๋ ๊ณ ์ํ์ จ์ต๋๋ค!