๐โโ๏ธ MERN ์คํ ๋ฑ์ผ๋ก Dev.to ๋ณต์ ๋ณธ ๊ตฌ์ถ
Dev.to-clone
A Dev.to clone created with MERN stack and more (Essentially FB without stories feature)๐ฅณ
๋ชฉ์ฐจ
A Dev.to clone created with MERN stack and more (Essentially FB without stories feature)๐ฅณ
๊ณ ๋ฌดํ๋ค
First of all, I did not think of clonning another websites in my whole journey, Only to know what I'm capable of after learning the MERN stack 4 months ago.
๋ง์ ๊ฒ์์ ํ ํ ๋๋ dev.to ์น์ฌ์ดํธ๋ฅผ ๋ณต์ ํ ๋ช๋ช ์ฌ๋๋ค๋ก๋ถํฐ ์๊ฐ์ ์ป์์ต๋๋ค. ์ผ๋ถ๋ ํ๋ฐํธ์๋๋ง ๋ณต์ ํ๊ณ ์ผ๋ถ๋ ์๋ก ๋ค๋ฅธ ๊ธฐ์ ์คํ์ ์ฌ์ฉํ์ฌ ๋ณต์ ํ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ํด ๋ณต์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์์์์๋ ๋ถ๊ตฌํ๊ณ ๐ ๋ค๋ฅธ ํด๋ก ์๋ ์๋ ๋ง์ ๊ธฐ๋ฅ์ ๊ฐ์ง ์ ํํ ํด๋ก ๋ณต์ ๋ณธ์ ๋ง๋ค์ด์ผ ํ์ต๋๋ค. ์ต๊ณ ์ ๋ธ๋ก๊น , ๋ค์ค ํ์ด์ง ๋ฐ ๋์ ์ ์ธ ์น ์ฌ์ดํธ ์ค ํ๋๋ฅผ ๋ณต์ ํ ์ ์๋ ๊ธฐํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ด 4๊ฐ์ ์ ๋ ๊ฑธ๋ ธ์ผ๋ ์ ๋งํ์ง ๋ง๊ณ ๋ค์๊ณผ ๊ฐ์ด ํ์ธ์.
Doesn't matter how slowly you go as long as you do not stop.
๊ฒฝํ
It was really challenging in these different layouts especially on mobile, Also browser support wasn't that good so I couldn't use some stuff as in css the :has() pseudo class.
I Deep dived in Redux toolkit and RTK query, Learned lots of stuff like lazy quering and cache invalidation.
I practiced Json web tokens (aka JWT) in advance for issuing access & refresh tokens on login either from Google/Github OAuth or manual authentication and logging them out automatically after expiration.
Got familiar with Vercel/Render deployments, Faced so many problems in this journey, It was full of error handling, stress and panicking๐, There was alot going on in this phase.
Eventually, I was satisfied and pleased with the results!
Don't forget to share this as much as possible and let's get started folks๐.
์ฌ์ฉํ ๊ธฐ์
Frontend
- React
- Redux toolkit (Advanced RTK)
- Tailwind
- Styled components
- Framer motion
- React router
- Cloudinary (Image hosting)
Backend
- MongoDB
- Express
- Node.js
- OAuth (Google/Github)
- JWT
- Socket.io (Real-time)
- Cloudinary
- Mongoose
- Axios
ํน์ง
- Login / Signup
- View / Edit Profile
- Google / Github OAuth
- Ultimate mobile responsiveness
- Real-time Notifications Toasted
- CRUD Posts / Comments / Replies / Tags
- Follow / Unfollow Users
- Follow / Unfollow Tags
- Like / Unicorn / Bookmark Posts
- Like comments
- Advanced Search engine for posts, people and tags
- Filter for posts
- Reading List
- Dashboard
์คํฌ๋ฆฐ์ท
๋ก๊ทธ์ธ / ํ์๊ฐ์ / ์์ / ์ญ์
๊ตฌ๊ธ/๊นํ๋ธ OAuth
๊ฒ์๋ฌผ ์์ฑ/์ ๋ฐ์ดํธ/์์ /์ญ์
๋ฐ์ / ๋๊ธ / ํ๋ก์ฐ ์ค์๊ฐ ์๋ฆผ (ํ ์คํธ)
ํ๊ทธ / ์ฝ๊ธฐ๋ชฉ๋ก
๊ณ๊ธฐ๋ฐ
๊ฒ์ ์์ง
์ฐ๊ฒฐ
Client: https://marodevv-devto-clone.vercel.app
๋ก์ปฌ์์ ์ค์ ํ๋ ๋ฐฉ๋ฒ
ํด๋ก ๋ ํฌ
์ค์
client
์ ์ํด server
๋ฐ npm i
ํ์ ๋๋ ํ ๋ฆฌ์ ๋ชจ๋ ์ข
์์ฑ์ ์ค์นํฉ๋๋ค.$ cd server && npm i
$ cd client && npm i
๋ง๋ค๋ค
.env
๋ฐ client
ํ์ ๋๋ ํ ๋ฆฌserver
ํ์ผclient/.env
:BASE_URL=
GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID}
GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID}
GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET}
server/.env
:ACCESS_TOKEN_SECRET=
REFRESH_TOKEN_SECRET=
CLIENT_URL=
GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID}
GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID}
GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET}
DB_NAME=
DB_USER=
DB_PASSWORD=
CLOUDINARY_CLOUD_NAME=
CLOUDINARY_API_KEY=
CLOUDINARY_API_SECRET=
CLOUDINARY_DEFAULT_URL= // default image url
CLOUDINARY_DEFAULT_PUBLIC_ID= // default image public_id
npm run stack
๋ฅผ ์คํํฉ๋๋ค.๋์๊ฒ ๋ถํ์ ๋ค์ด
์ฌํ์
๊ณต์ ํ๋ค
๋๋ ๋ธ๋ก๊น ์ ์ฒ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ๋ง๋ ํ๋ค๊ณ ์๊ฐํ๋ ๋งํผ ์ด๊ฒ์ ๊ณต์ ํ๋๋ก ์์ฒญํ ๊ฒ์ ๋๋ค!
์ง์ํ๋ค
์ ์ฉ ๊ฑฐ๋
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐โโ๏ธ MERN ์คํ ๋ฑ์ผ๋ก Dev.to ๋ณต์ ๋ณธ ๊ตฌ์ถ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/marodevv/built-a-devto-replica-with-the-mern-stack-and-more-fbdํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค