์์ด๋ก๊ทธ ๋๋ ์๋ก๊ทธ๋ผ ์ฝ์ผ๋ฉฐ, Algorithm log ์ฆ ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋กํ๋ค๋ผ๋ ์๋ฏธ์ ๋๋ค.
2021๋ 9์๋ถํฐ 2022๋ 1์๊น์ง ์ฝ 4๊ฐ์๊ฐ, ๊ธฐํ๋ถํฐ ๋ฐฐํฌ๊น์ง ๊ฐ์ธ์ผ๋ก ์งํํ ํ๋ก์ ํธ์ ๋๋ค. ๋ค์ํ ์ฝ๋ ์ฑ์ ํ๋ซํผ์์ ์ ๊ณตํ๋ ๋ฌธ์ ์ ํ์ด๋ฅผ ๊ธฐ๋กํ๊ณ , ์ํ๋ ๋ฌธ์ ์ ํ์ด๋ฅผ ์ฐพ๋๋กํ๋ ์น ์๋น์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํ์ฌ ๊ธฐ๋ฅ ์ถ๊ฐ๋ ๋ฉ์ถ ์ํ์ด์ง๋ง ์ ์ง๋ณด์ ์์ ์ ์งํํ๊ณ ์์ต๋๋ค.
๊ฐ์ธ ๋ธ๋ก๊ทธ์ ํ์ด๋ฅผ ์์ฑํ๋ฉด์ ์๊ณ ๋ฆฌ์ฆ ๊ธ๊ณผ ๋ค๋ฅธ ์ ํ์ ๊ธฐ์ ๊ธ๋ค๊ณผ ์์ด๋ ๊ฒ์ ๋ํด ๋ถํธํจ์ด ์์์ต๋๋ค. ๋ธ๋ก๊ทธ๋ฅผ ํตํด ์์ ์ด ์ด๋ค ๊ฒ์๋ํด ๊ด์ฌ์์ดํ๋์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ด๋ ต๋ค๋ ์๊ฐ์์ ์ถ๋ฐํ์ฌ, ๋ฌธ์ ํ์ด๋ง์ ์์ฑํ ์ ์๋ ์๋น์ค๊ฐ ์์ผ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
์ดํ ๊ฐ์ธ ๊ณต๋ถ ๊ทธ๋ฆฌ๊ณ ์ฝ๋ฉ ํ ์คํธ ์ค๋น ๋ชฉ์ ์์ ํ์ต์ ํ๋ฉด์, ๋ณธ์ธ ๋ง์ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ธ ๋ธ๋ก๊ทธ์ ๊ธฐ๋กํ๋ ์ฌ๋๋ค์ด ๋ง๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค.
์ด์ ๊ฐ์ ์ฌ๋๋ค์ ํ๊ฒ์ผ๋กํ์ฌ ์๊ณ ๋ฆฌ์ฆ ํ์ด๋ง์ ์์ฑํ ์ ์๋ ํ๋ซํผ์ ์ญํ ์ ํ๋ฉด์๋, Programmers์ Baekjoon๊ณผ ๊ฐ์ ์จ๋ผ์ธ ์ฑ์ ํ๋ซํผ์ ๋ฑ๋ก๋ ๋ฌธ์ ์ ์๊ณ ๋ฆฌ์ฆ ํ์ด๋ค์ ํ ๋์ ๋ณผ ์ ์๋ ํ๋ซํผ์ด ์์ผ๋ฉด ์ฌ๋๋ค์ด ๋ ๋์ ํ๊ฒฝ์์ ํ์ตํ ์ ์์ ๊ฒ์ด๋ผ๋ ๊ธฐ๋๊ฐ ์์์ต๋๋ค.
๋ฐ๋ผ์ ์๊ณ ๋ฆฌ์ฆ ํ์ด๋ฅผ ์ฐพ๋ ์ฌ๋๋ค ๊ทธ๋ฆฌ๊ณ ์์ฑํ๋ ์ฌ๋๋ค ๋ชจ๋์๊ฒ ๋ ๋์ ํธ์์ฑ์ ์ ๊ณตํ๊ณ ์ํ๋ ๋ชฉํ๋ฅผ ๊ฐ๊ณ ์์ํ๊ฒ ๋์ต๋๋ค.
$ https://github.com/Hyeondoonge/Alog.git
- .env ํ์ผ์ client ํ๋ก์ ํธ ์ต์๋จ์ ์์ฑ ํ, ์๋ ์ฝ๋๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์
REACT_APP_ENV={development | production}
- .env ํ์ผ์ server ํ๋ก์ ํธ ์ต์๋จ์ ์์ฑ ํ, ์๋ ์ฝ๋๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์
PORT={app port}
MONGO_URI={mongodb server url}
USER_ID={mongodb user id}
USER_PASSWORD={mongodb user password}
ACCESS_SECRET_KEY={secret key for access token}
REFRESH_SECRET_KEY={secret key for refresh token}
KAKAO_API_CLIENT_KEY={kakao api client key}
KAKAO_API_REDIRECT_URI_DM={kakao login redirect url for development}
KAKAO_API_REDIRECT_URI_PM={kakao login redirect url for production}
- ํด๋ผ์ด์ธํธ ์คํ
$ cd client
$ npm install && npm start
- API ์๋ฒ ์คํ
$ cd server
$ npm install && npm install pm2 -g
$ pm2 start ecosystem.config.js
React(React-router-dom, Context API), styled-components, netlify
express, mongoDB, mongoose, JWT, PM2, AWS EC2, Github Actions
์๋น์ค์ ๋ฉ์ธ ํ์ด์ง๋ก, ์ฌ์ฉ์๋ค์ด ์์ฑํ ํ์ด๋ฅผ ๊ฒ์ํ๊ณ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ํํฐ๋ง์ ์ ์ฉํ์ฌ ํ์ด๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์์ต๋๋ค.

โฃ ์ธ๋ถ ๊ตฌํ ์ฌํญ
- Intersection Observer API๋ฅผ ์ด์ฉํด ๋ฌดํ์คํฌ๋กค ๊ตฌํ
- Debounce๋ฅผ ์ด์ฉํด ์ฐ์๋ ํค์๋ ์ ๋ ฅ์ ์ ํํ์ฌ ๊ฒ์ ๊ธฐ๋ฅ์ UX ๊ฐ์
- useGetPost(custom hook)์ ํตํด ํ์ด server state ๊ด๋ฆฌ ์ฝ๋ ์ฌ์ฌ์ฉ
- LocalStorage๋ฅผ ์ด์ฉํด ์ ํ๋ ํํฐ ์ ์ง
ํ์ด๋ฅผ ์์ฑํ๊ฑฐ๋ ์์ ํ ์ ์๋ ํ์ด์ง์ ๋๋ค.
Markdownํ์์ผ๋ก ๊ธ์ ์์ฑํ ์ ์์ผ๋ฉฐ, ํ๋ฆฌ๋ทฐ๋ฅผ ๋ณผ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.

โฃ ์ธ๋ถ ๊ตฌํ ์ฌํญ
- auto resizing๋๋ textarea ๊ตฌํ
- ํ์ด ์์ฑ/์์ ์ ์ํ ์ฌ์ฌ์ฉ Form ์ปดํฌ๋ํธ ๊ตฌํ
react-responsive
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํด ๋ฐ์ํ ๋ ์ด์์ ์ ์ฉ
์๋น์ค์ ๋ฑ๋ก๋ ํ์ด๋ฅผ ์กฐํํฉ๋๋ค.
ํ์ด๋ ์์ฑ์ ๋ณธ์ธ์ ํํด ์์ , ์ญ์ ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ๋ชจ๋ ์ธ์ฆ๋ ์ฌ์ฉ์๋ ์ข์์ ๊ธฐ๋ฅ์ ์ด์ฉํ ์ ์์ต๋๋ค.
ํน์ ์์ฑ์๊ฐ ์์ฑํ ํ์ด๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
SNS ๋ก๊ทธ์ธ(์นด์นด์ค ๋ก๊ทธ์ธ ์ง์)์ ํตํด ๊ฐ๋จํ๊ฒ ๊ฐ์ /์ธ์ฆํ ์ ์์ต๋๋ค.
ํ ์คํธ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํ์ฌ ์๋น์ค๋ฅผ ํธํ๊ฒ ๋๋ฌ๋ณผ ์๋ ์์ต๋๋ค.
โฃ ์ธ๋ถ ๊ตฌํ ์ฌํญ
- ํ์๊ฐ์ , ๋ก๊ทธ์ธ, ๋ก๊ทธ์์ ๊ตฌํ
- JWT์ cookie๋ฅผ ํ์ฉํด ์ธ์ฆ ๋ฐ์ดํฐ ๊ด๋ฆฌ
- Local storage๋ฅผ ์ด์ฉํด ๋ก๊ทธ์ธ ์ํ ์ ์ง
- ๋ฉ์ธ ํ์ด์ง ๊ฒ์, ํํฐ๋ง, ํ์คํ ๋ฆฌ ํ์ ๊ธฐ๋ฅ UX ๊ฐ์ (24/06/22)
- ๋ฉ์ธ ํ์ด์ง ์ ๊ทผ์ฑ ๊ฐ์ (24/06/07)
- ๋ฉ์ธ ํ์ด์ง JS -> TS ๋ง์ด๊ทธ๋ ์ด์ (24/06/05)
- ํ์ด ์ ๋ชฉ ์ ๋ ฅ ๋ฒ๊ทธ์ ๋ฐ๋ฅธ ๋ก์ง ์์ ํด๊ฒฐ (24/03/14)
- ํ์ด์ง Lazy ๋ก๋ฉ์ ํตํ ์ฑ๋ฅ ํฅ์ (23/11/01)
- CRA ๋ฒ์ ์ ์ ๋ฐ๋ฅธ Buffer ๋ชจ๋ ์ฌ์ฉ ์ค๋ฅ (23/08/31)
- ํ์ด ๋ฑ๋ก ํผ URL ์ ๋ ฅ ๋ฒ๊ทธ ํด๊ฒฐ (23/08/07)