https://github.com/junh0328/ts-slack-clone
๐ป ํ์
์คํฌ๋ฆฝํธ, ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ ์ฌ๋ ํด๋ก ์ฝ๋ฉ
https://github.com/junh0328/ts-slack-clone
react socket-io swr typescript
Last synced: 2 months ago
JSON representation
๐ป ํ์ ์คํฌ๋ฆฝํธ, ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ ์ฌ๋ ํด๋ก ์ฝ๋ฉ
- Host: GitHub
- URL: https://github.com/junh0328/ts-slack-clone
- Owner: junh0328
- Created: 2021-03-20T07:58:41.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2021-03-31T05:35:44.000Z (about 5 years ago)
- Last Synced: 2025-03-22T03:27:06.172Z (over 1 year ago)
- Topics: react, socket-io, swr, typescript
- Language: TypeScript
- Homepage:
- Size: 2.11 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 12
-
Metadata Files:
- Readme: README2.md
Awesome Lists containing this project
README
# ๋ผ์ด๋ธ๊ฐ์ข ํต์ฌ ๋ด์ฉ ์ ๋ฆฌํด์ ์ฌ๊ธฐ(README.md)์ ์ฌ๋ ค๋์์ต๋๋ค~ ๋ค์๋ณด๊ธฐํ๋ฉด์ ๊ฐ์ด ์ฝ๊ณ ๋ณต์ตํ์๋ฉด ๋ฉ๋๋ค!
# ๋ฐฑ๊ทธ๋ผ์ด๋ ์ธํ
0. node 14๋ฒ์ (12๋ 15๋ ๊ด์ฐฎ์)๊ณผ MySQL์ ๋ฏธ๋ฆฌ ์ค์นํ๊ธฐ
1. cd back (๋ฉํฐ์บ ํผ์ค ๊ฐ์ข ์๊ฐ์๋ผ๋ฉด cd multicampus-back)
2. npm i
3. .env ์์ฑํ๊ธฐ(COOKIET_SECRET๊ณผ MYSQL_PASSWORD ๋น๋ฐ๋ฒํธ ์ค์ )
4. config/config.json ์ค์ (MYSQL ์ ์ ์ค์ )
5. npx sequelize db:create(์คํค๋ง ์์ฑ)
6. npm run devํ๋ค๊ฐ ctrl + c๋ก ๋๊ธฐ(ํ
์ด๋ธ ์์ฑ)
7. npx sequelize db:seed:all(๊ธฐ์ด ๋ฐ์ดํฐ ๋ฃ๊ธฐ)
8. npm run dev
9. localhost:3095์์ ์๋ฒ ๋์๊ฐ๋ ์ค
10. ๋ฐฑ์๋ ๊ฐ๋ฐ์๊ฐ API.md์ typings/db.ts๋ฅผ ๋จ๊ฒจ๋ ์ํฉ
# ๊ฐ์ข ์์
## 1์ผ์ฐจ
1. package.json
- npm init์ผ๋ก ์์ฑ
- npm i react react-dom
- npm i typescript @types/react @types/react-dom
- ์ค์น ํ package-lock.json๊ณผ node_modules ํด๋๊ฐ ์์ฑ๋จ
2. .eslintrc
- eslint ์ค์ ํ์ผ
- ์ฝ๋ ์ ๊ฒ ๋๊ตฌ, ์ง์ ์ค์ ํ๋ฉด ํ์๊ฐ ์๊ฒฌ ์ถฉ๋์ด ์์ผ๋ prettier์ ์์
- npm i -D eslint
3. .prettierrc
- prettier ์ค์ ํ์ผ
- ์ ์ฅํ๋ฉด ์์์ ์ฝ๋๋ฅผ ์์ ํด์ค(์๋ํฐ ์ค์ ํ์)
- npm i -D prettier eslint-plugin-prettier eslint-config-prettier
4. tsconfig.json
- ํ์
์คํฌ๋ฆฝํธ ์ค์
- ์ธ์ด ๋ฌธ๋ฒ๊ณผ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฒฐ๊ณผ๋ฌผ์ด ์ด๋ป๊ฒ ๋์์ผํ๋์ง ์ค์ ํ๋ ํ์ผ
- lib์ ES2020, DOM(๋ธ๋ผ์ฐ์ ), module์ esnext์ฒ๋ผ ์ต์ ์ค์ ์ด์ง๋ง target์ es5๋ก IE ๋ธ๋ผ์ฐ์ ์์๋ ๋์๊ฐ ์ ์๊ฒ ๋ณํ
- strict: true๋ฅผ ์ผ๋์์ผ ํ์
์ฒดํน์ ํด์ค์ ์๋ฏธ๊ฐ ์์.
5. webpack.config.ts
- ์นํฉ ์ค์
- ts, css, json, ์ต์ ๋ฌธ๋ฒ js ํ์ผ๋ค์ ํ๋๋ก ํฉ์ณ์ค.
- npm i -D webpack @types/webpack @types/node
- entry์์ ํ์ผ์ ์ ํํ๋ฉด module์ ์ ํด์ง rules๋๋ก js๋ก ๋ณํํ์ฌ ํ๋์ ํ์ผ๋ก ํฉ์ณ์ค(output). plugins๋ ํฉ์น๋ ์ค ๋ถ๊ฐ์ ์ธ ํจ๊ณผ๋ฅผ ์ค
- ts๋ babel-loader๋ก, css๋ style-loader์ css-loader๋ฅผ ํตํด js๋ก ๋ณํ
- babel์์๋ @babel/preset-env(์ต์ ๋ฌธ๋ฒ ๋ณํ) @babel/preset-react(๋ฆฌ์กํธ jsx ๋ณํ), @babel/preset-typescript(ํ์
์คํฌ๋ฆฝํธ ๋ณํ)
- npm i -D css-loader style-loader @babel/core babel-loader @babel/preset-env @babel/preset-react @babel/preset-typescript
- publicPath๊ฐ /dist/๊ณ [name].js์์ [name]์ด entry์ ์ ํ๋๋ก app์ผ๋ก ๋ฐ๋์ด /dist/app.js๊ฐ ๊ฒฐ๊ณผ๋ฌผ์ด ๋จ.
6. index.html ์์ฑ
- ์์ด์ฝ, ํฐํธ, ํ๋น์ฝ๊ฐ์ ๊ฒ์ ์ฌ๋์์ ๊ทธ๋๋ก ์ฌ์ฉ
- client.tsx์ ๊ฐ๋จํ tsx ์์ฑ
- #app ํ๊ทธ์ ๋ฆฌ์กํธ๊ฐ ๋ ๋๋ง๋จ.
- ./dist/app.js๋ก ์นํฉ์ด ๋ง๋ค์ด๋ธ jsํ์ผ ๋ถ๋ฌ์ด
7. tsconfig-for-webpack-config.json
- webpackํ ๋ webpack.config.ts๋ฅผ ์ธ์ ๋ชปํ๋ ๋ฌธ์
- npm i cross-env
- package.json์ scripts์ build๋ฅผ cross-env TS_NODE_PROJECT=\"tsconfig-for-webpack-config.json\" webpack
- npm run build
- index.html ์คํํด๋ณด๊ธฐ
8. ์นํฉ ๋ฐ๋ธ ์๋ฒ ์ค์น
- ๊ฐ๋ฐ์ฉ ์๋ฒ์ธ devServer ์ต์
์ถ๊ฐ(port๋ 3090, publicPath๋ /dist/๋ก)
- webpack serveํ ๋ webpack.config.ts๋ฅผ ์ธ์ ๋ชปํ๋ ๋ฌธ์
- npm i -D ts-node webpack-dev-server @types/webpack-dev-server webpack-cli
- package.json์ scripts์ dev๋ฅผ cross-env TS_NODE_PROJECT=\"tsconfig-for-webpack-config.json\" webpack serve --env development
- npm run devํ๋ฉด localhost:3090์์ ์๋ฒ ์คํ๋จ.
9. hot reloading ์ค์
- npm i -D @pmmmwh/react-refresh-webpack-plugin react-refresh
- webpack์ babel-loader ์์ ์ค์ (env) ๋ฐ plugin์ผ๋ก ์ถ๊ฐ
10. fork-ts-checker-webpack-plugin
- webpack์ ts์ฒดํฌ ํ eslint์ฒดํฌ ํ ๋น๋ ์์
- ts๋ eslint๋ ๋์์ ์ฒดํฌํ๋ฉด ๋ ํจ์จ์
- ์ด ํ๋ฌ๊ทธ์ธ์ด ๋์์ ์งํํ๊ฒ ํด์ค.
11. ํด๋ ๊ตฌ์กฐ ์ธํ
- ํ์ด์ง๋ค์ pages
- ํ์ด์ง๊ฐ ๊ณตํต๋๋ ํ์ layouts
- ๊ฐ๋ณ ์ปดํฌ๋ํธ๋ components
- ์ปค์คํ
ํ
์ hooks, ๊ธฐํ ํจ์๋ utils
- ๊ฐ ์ปดํฌ๋ํธ๋ ์ปดํฌ๋ํธ ํด๋ ์๋ index.tsx(JSX)์ styles.tsx(์คํ์ผ๋ง)
12. ts์ webpack์์ alias ์ง์
- npm i -D tsconfig-paths
- tsconfig์์ baseUrl์ paths ์ค์
- webpack์์๋ resolve์์ alias ์ค์
- ../layouts/App๊ฐ์ ๊ฒ์ @layouts/App์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅ
13. emotion ์ธํ
- styled components์ ๋น์ทํ์ง๋ง ์ค์ ์ด ๊ฐ๋จํจ.
- npm i @emotion/react @emotion/styled
- npm i -D @emotion/babel-plugin (์นํฉ์ babel ์ค์ ์ถ๊ฐ)
- ์คํ์ผ๋ ์ปดํฌ๋ํธ๋ก ๋ง๋ค ๋ ๋ณ์๋ฅผ ๋ง์ด ๋ง๋๋ ์
์ด๋ฏ๋ก & ๊ฐ์ ์ ํ์ ์ ๊ทน ํ์ฉํด์ผ ๋ณ์ ์ด๋ฆ์ง๊ธฐ๋ฅผ ์ต์ํํ ์ ์์.
14. @layouts/App ์์ฑ
- ๋ฆฌ์กํธ ๋ผ์ฐํฐ ์ ์ฉํ๊ธฐ
- npm i react-router react-router-dom
- npm i -D @types/react-router @types/react-router-dom
- client.tsx์์ App์ BrowserRouter๋ก ๊ฐ์ธ๊ธฐ
- @layouts/App์ Switch, Redirect, Route ๋ฃ๊ธฐ
15. @loadable/component
- ๋ผ์ฐํฐ๋ฅผ ์ฝ๋์คํ๋ฆฌํ
ํด์ค
- ํ์๊ฐ์
ํ์ด์ง์ ์ ๊ทผํ ์ฌ๋์ ํ์๊ฐ์
ํ์ด์ง์ ํ์ํ JS๋ง ๋ฐ์
- 3์ด ๋ฃฐ ๊ธฐ์ตํ์!
- npm i @loadable/component @types/loadable\_\_component
16. @pages/SignUp ์์ฑ
## 2์ผ์ฐจ
17. ํ์๊ฐ์
axios๋ก ์งํ
- npm i axios
- CORS ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด์ devServer์ proxy ์ธํ
- CORS๋ ๋ธ๋ผ์ฐ์ ์์ ๋ค๋ฅธ ๋๋ฉ์ธ์ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ผ ๋ ๋ฐ์
- ๊ฐ์ ๋๋ฉ์ธ์ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ด๊ฑฐ๋, ์๋ฒ๋ผ๋ฆฌ ์์ฒญ์ ๋ณด๋ผ ๋๋ ๋ฐ์ํ์ง ์์
- ๋ฐ๋ผ์ ๊ฐ์ ๋๋ฉ์ธ์ธ proxy์๋ฒ๋ฅผ ๋์ CORS๋ฅผ ํผํด๊ฐ ์ ์์.
18. useInput ์ปค์คํ
ํ
๋ง๋ค๊ธฐ
- ์ปค์คํ
ํ
์ผ๋ก ํ
๋ค๊ฐ์ ์ค๋ณต๋ ๊ฒ์ ์ ๊ฑฐํ ์ ์์
- ํ
๋ด๋ถ์ ํ
์ ์์ฑํ ์ ์๋ ์ ์ผํ ์ผ์ด์ค
- useCallback์ return ์์ ๋ค์ด์๋ ํจ์์ ๊ผญ ์ ์ฉํด์ฃผ์
- useMemo๋ return ์์ ๋ค์ด์๋ ๊ฐ์ ์ ์ฉํ์
19. @pages/LogIn ์์ฑ ๋ฐ SWR
- ๋ก๊ทธ์ธ ํ ์ฌ๋์ด ํ์๊ฐ์
/๋ก๊ทธ์ธ ํ์ด์ง์ ์ ๊ทผํ๋ค๋ฉด?
- GET ์์ฒญ์ SWR๋ก ํ๋ ๊ฒ๋ ๊ด์ฐฎ์
- npm i swr
- SWR์ fetcher(axios๋ฅผ ์ฌ์ฉ)๋ฅผ ๋ฌ์์ค.
- ๋ก๊ทธ์ธํ์์ ์ฆ๋ช
ํ๊ธฐ ์ํด withCredentials: true ์์ผ๋ฉด ์ ๋จ.
20. @layouts/Workspace ์์ฑ
- ๋์ ๋๋ ๊ตฌ์ญ ๋จ์๋ก ์คํ์ผ๋์ปดํฌ๋ํธ๋ก ๋ง๋ค์ด๋ .
- ๊ตฌ์ญ ๋ด๋ถ์ ํ๊ทธ๋ค์ ์คํ์ผ๋์ปดํฌ๋ํธ๋ก ๋ง๋ค๋ฉด ๋ณ์๋ช
์ง์ด์ผ ํ๋ css์ ํ์๋ก ์ ํ
21. ๊ทธ๋ผ๋ฐํ
- npm i gravatar @types/gravatar
- Github๊ฐ์ ์์ด์ฝ์ ๋ง๋ค ์ ์์
22. typescript ์ ์
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณ์, ๋งค๊ฐ๋ณ์, ๋ฆฌํด๊ฐ์ ํ์
์ ๋ถ์ฌ์ฃผ๋ฉด ๋จ.
- ๋จ์ด ํ์ดํํด๋ ๊ฒ ๋ถ์ํ๋ ๊ฒ ์ด๋ ค์
- Go to Type Definition
- ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์์๋ ๋ค๋ฅธ ์ฌ๋์ด ๋ง๋ ts ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ @types๋ก ์์ํ๋ ๊ฒ๋ค
23. @components/DMList ์์ฑ
- ํ์ฌ ์ฑ๋ ์ฐธ์ฌ์ ๋ชฉ๋ก ๊ฐ์ ธ์ค๊ธฐ
24. @pages/DirectMessage ์์ฑ
- Header์ ChatList, ChatBox๋ก ๊ตฌ์ฑ
25. @components/ChatBox ๋จผ์ ์์ฑ
- react-mentions ํ์ฉ
- DM์์๋ ๋ฉ์
๊ธฐ๋ฅ์ด ์์ง๋ง Channel์์๋ ์์ ๊ฒ
26. DM ๋ณด๋ด๋ณด๊ธฐ
- optimistic UI
- ๋จผ์ ํ๋ก ํธ์์ ํ์ํ๊ณ , ์๋ฒ๋ก๋ ๊ทธ ๋ค์์ ์์ฒญ๋ณด๋
- ์์ฒญ ์คํจํ๋ ์๊ฐ ํ๋ก ํธ์์ ์ ๊ฑฐํ๊ณ ์๋ฌ ๋ฉ์์ง ๋์
- ๋ณด๋ผ ๋ ์๋ฌ๊ฐ๋ ๊ฒ์ ์๋ฒ์ชฝ์์ socket ์ฐ๊ฒฐ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ธฐ ๋๋ฌธ
27. DM ๋ก๋ฉ์ useSWRInfinite ์ฌ์ฉ
- ๊ฒฐ๊ณผ๋ฌผ์ด 2์ฐจ์ ๋ฐฐ์ด ๊ผด๋ก ๋์ด.
- ์ฒซ ๋ฒ์งธ ์ธ์๊ฐ ์ฃผ์ ๋ฌธ์์ด์ด ์๋ ์ฃผ์๋ฅผ ๋ฆฌํดํ๋ ํจ์
- ์ด ํจ์์ ๋งค๊ฐ๋ณ์๋ก ํ์ด์ง๊ฐ ๋ค์ด์์ด์ ํ์ฌ ๋ช ํ์ด์ง์ธ์ง ์ ์ ์์.
## 3์ผ์ฐจ
28. Workspace์ ์์ผ ์ฐ๊ฒฐํ๊ธฐ
- socket.emit์ด ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก, socket.on์ด ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก
29. DMList์ onlineList, dm ์ด๋ฒคํธ ์ฐ๊ฒฐ
30. @components/ChatList ์์ฑ ๋ฐ @components/Chat ๊ตฌํ
- npm i react-custom-scrollbars @types/react-custom-scrollbars
31. makeSection ๊ตฌํ
- npm i dayjs
- dayjs๋ moment๋ฅผ ๋์ฒดํจ
32. ํ๋กํ์ผ๋ง ํ๋ฉด์ Chat์ memo ์ ์ฉํ๊ธฐ
33. ์ธํผ๋ํธ ์คํฌ๋กค๋ง ๊ตฌํ
34. @components/ChannelList ์์ฑ
35. @pages/ChannelMessage ์์ฑ
36. Channel Chat ๋ณด๋ด๋ณด๊ธฐ
37. ๋น๋ ์ค์
38. ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ธ JS์ html์ ์๋ฒ๊ฐ๋ฐ์์๊ฒ ์ ๋ฌํ๊ธฐ