์๋ ํ์ธ์! ์๊ฐ๋ํ๊ต ์ปด๊ณต๊ณผ๋ฅผ ์กธ์ ํ๊ณ ํ์ฌ ๋ํ์ ์งํ์ ์ค๋น ์ค์ธ ํ์์ ๋๋ค.
๊ณ ๋ฑํ๊ต ๋ ์ฐ์ฐํ ํ์คํ ์น ๊ฐ๋ฐ๊ณผ ํ์ด์ฌ์ ํ์ฉํ ์๋ ๋งค๋งค๋ฅผ ์์ํ๋ฉด์ ํ๋ก๊ทธ๋๋ฐ์ ๋น ์ง๊ฒ ๋์์ต๋๋ค.
๊ทธ ํ ๋ค์ํ ํ๋ก์ ํธ์ ํ๋ก๊ทธ๋๋ฐ ๊ณผ์ธํ๋์ ๊ฒฝํํ๋ฉฐ ์ค๋ ฅ๊ณผ ๋ ธํ์ฐ๋ฅผ ๊ณต์ ํ์ต๋๋ค. ์ด๋ฌํ ๊ฒฝํ์ ํตํด ํ๋ก๊ทธ๋๋ฐ์ ์ฒ์ ์ ํ๋ ๋ถ๋ค์๊ฒ๋ "์ด๋ ๊ฒ ์ฌ์ธ ์ ์๊ตฌ๋!"๋ผ๋ ๋๋์ ์ค ์ ์๋ ๊ฐ์๋ฅผ ๋ง๋ค๊ณ ์ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.
์ค์ฉ์ ์ธ ์์ ์ ์น๊ทผํ ์ค๋ช ์ผ๋ก ์ฌ๋ฌ๋ถ์ ํ์ต์ ๋๊ณ ์ถ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
Courses
Reviews
- Voting Community Platform with React & FastAPI: Monetization through Payment Systems!
farmerkyh2857
ยท
Voting Community Platform with React & FastAPI: Monetization through Payment Systems!Voting Community Platform with React & FastAPI: Monetization through Payment Systems!- Building Your Own Company Website with React, Node.js, MongoDB: Complete Guide
- Building Your Own Company Website with React, Node.js, MongoDB: Complete Guide
- Building Your Own Company Website with React, Node.js, MongoDB: Complete Guide
Posts
Q&A
์ผ๋ ํธ๋ก ํจํค์ง ๋ฐ ๋ฐฐํฌ ๊ด๋ จ ์ง๋ฌธ
์๋ ํ์ธ์! ์ข์ ์ง๋ฌธ ๊ฐ์ฌํฉ๋๋ค๋ง์ํ์ ๋๋ก React ํ๋ก์ ํธ๋ฅผ ์ ์ ํ์ผ๋ก ๋น๋ ํ loadFile๋ฅผ ํตํด ์จ๋ผ์ธ์ด ์๋ ์คํ๋ผ์ธ์์๋ ElectronJS GUI ์ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ง, Electron์์ loadURL()๊ณผ loadFile() ๋ชจ๋ React ์ฑ์ ๋ถ๋ฌ์ค๋ ๋ฐ ์ฌ์ฉํ ์ ์์ง๋ง, ๋ ๋ฐฉ์์ ์ฉ๋์ ํน์ง์ด ์กฐ๊ธ ๋ค๋ฆ ๋๋ค.loadURL() ๋ฐฉ์loadURL()์ ๊ฐ๋ฐ ์๋ฒ๋ ๋ฐฐํฌ๋ ์น ์ฃผ์๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ ๋๋ค.์๋ฅผ ๋ค์ด, ๊ฐ๋ฐ ์ค์๋ http://localhost:3000์ผ๋ก,๋ฐฐํฌ ํ์๋ Firebase, Vercel, Netlify ๋ฑ์ ๋ฐฐํฌ๋ React ์ฌ์ดํธ ์ฃผ์๋ฅผ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค.์ด ๋ฐฉ์์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ Electron ์ฑ์ ๋ค์ ํจํค์งํ์ง ์์๋ ๋๋ค๋ ์ ์ ๋๋ค.React ์ชฝ ์ฝ๋๋ง ์์ ํ๊ณ ๋ค์ ๋ฐฐํฌํ๋ฉด, Electron ์ฑ์ ๊ทธ๋๋ก ๋๊ณ ๋ ์ต์ ๋ฒ์ ์ ์น UI๋ฅผ ์๋์ผ๋ก ๋ฐ์ํ ์ ์์ต๋๋ค.loadFile() ๋ฐฉ์๋ฐ๋ฉด loadFile()์ npm run build๋ก ๋ง๋ค์ด์ง ์ ์ ํ์ผ(index.html)์ ์ง์ ๋ก๋ํ๋ ๋ฐฉ์์ ๋๋ค.์ด ๋ฐฉ๋ฒ์ ์์ ํ ์คํ๋ผ์ธ ํ๊ฒฝ์์๋ ๋์ ๊ฐ๋ฅํ๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.ํ์ง๋ง React ์ฝ๋๋ฅผ ์์ ํ ๋๋ง๋ค ๋ค์ ๋น๋ํ๊ณ ,๊ทธ ๊ฒฐ๊ณผ๋ฌผ์ Electron ์์ ๋ค์ ๋ฃ์ด ์ฑ์ ์ฌํจํค์งํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์์ต๋๋ค. ๊ฐ์์์ ์ ๊ฐ loadURL() ๋ฐฉ์์ผ๋ก Firebase์ ๋ฐฐํฌ๋ React ์ฑ์ ๋ถ๋ฌ์จ ์ด์ ๋,Electron์ด ํ ๋ฒ ๋ฐฐํฌ๋ ์ดํ์๋ React ์น์ฌ์ดํธ๋ง ๋ฐ๋ก ์์ ํ๊ณ ์ฌ๋ฐฐํฌํ ์ ์๊ฒ ํ๊ธฐ ์ํด์์ ๋๋ค.loadFile()์ ์ฌ์ฉํ๋ฉด ์ ์ ํ์ผ์ด Electron ๋ด๋ถ์ ํฌํจ๋๊ธฐ ๋๋ฌธ์, UI๋ฅผ ์กฐ๊ธ๋ง ์์ ํด๋ ์ฑ ์ ์ฒด๋ฅผ ๋ค์ ๋น๋ํ๊ณ ํจํค์งํด์ผ ํฉ๋๋ค.ํ์ง๋ง loadURL()๋ก Firebase์ ๋ฐฐํฌ๋ ์ฃผ์๋ฅผ ๋ถ๋ฌ์ค๋ฉด, Electron ์ฑ์ ๊ทธ๋๋ก ๋๊ณ React๋ง ์์ ํด๋ ๋ฐ๋ก ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์๋๊ธฐ ๋๋ฌธ์ ์ด์๊ณผ ์ ์ง๋ณด์ ์ธก๋ฉด์์ ํจ์ฌ ํจ์จ์ ์ ๋๋ค.์ ๋ฆฌํ์๋ฉด, Electron ์ฑ ๋ฐฐํฌ ํ์๋ React UI๋ฅผ ์์ ๋กญ๊ฒ ์ ๋ฐ์ดํธํ ์ ์๋๋ก ํ๊ธฐ ์ํดloadURL() + Firebase ๋ฐฐํฌ ๋ฐฉ์์ ๊ฐ์์์ ์ฌ์ฉํ์ต๋๋ค. ํ ๋ฒ ์ง์ React ํ๋ก์ ํธ๋ฅผ npm run build๋ก ์ ์ ํ์ผ๋ก ๋น๋ํ ๋ค,loadFile()์ ํตํด ํ์ด๋จธ ์ฑ์ ์คํ๋ผ์ธ ํ๊ฒฝ์์๋ ์คํํด๋ณด์๋ ๊ฒ๋ ์ถ์ฒ๋๋ฆฝ๋๋ค! ๋ง์ํ์ ์ฃผ์์ฌํญ๋ค ์ธ์๋ loadFile() ๋ฐฉ์์๋ ํฌ๊ฒ ๋ฌธ์ ๋ ์์ต๋๋ค. ์งํ ํ์๋ฉด์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ๋ค๋ฅธ ์ด๋ ค์์ด ์์ผ์ค ๊ฒฝ์ฐ ์ธ์ ๋ ์ง ๋ฌธ์ ๋ฐ๋๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
- 0
- 2
- 29
Q&A
๊ด๋ฆฌ์ ์๋ ๋ก๊ทธ์์ ๋ฌธ์๋๋ฆฝ๋๋ค.
์๋ ํ์ธ์. ๋ฆ๊ฒ ๋ต๋ณ์ ๋ฌ์๋๋ ค์ ์ฃ์กํฉ๋๋ค. Q. ๋ก๊ทธ์ธ ์ isLoggedIn์ด true๋ก ๋ฐ๋๊ณ , ํ ํฐ ๋ง๋ฃ(24์๊ฐ) ํ ๋ค์ ๊ด๋ฆฌ์ ํ์ด์ง์ ์ ์ํ๋ฉด ์๋์ผ๋ก isLoggedIn์ด false๋ก ๋ฐ๋๊ฒ ํ๊ณ ์ถ์ต๋๋ค. ํ์ง๋ง ํ์ฌ ๊ทธ๋ ๊ฒ ๋์ง ์์ต๋๋ค. ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์์๊น์?A. ์ฑํฐ 6-6๊น์ง ์งํ๋ ์ฝ๋์์๋ JWT ํ ํฐ ๋ง๋ฃ๋ ํด๋ผ์ด์ธํธ ์ธก ์ธ์ฆ๋ง ๋ฌดํจํํ ๋ฟ,MongoDB์ ์ ์ฅ๋ isLoggedIn ํ๋๋ ์๋์ผ๋ก ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.๋ก๊ทธ์ธ ์ isLoggedIn = true ๋ก ์ค์ ๋จ JWT๋ expiresIn: "24h" ์ค์ ์ผ๋ก ์ธํด 24์๊ฐ ํ ์๋ ๋ง๋ฃ๋จ๊ทธ๋ฌ๋ ๋ฐฑ์๋๋ DB์๋ โํ ํฐ ๋ง๋ฃ๋จโ์ด๋ผ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์isLoggedIn ํ๋๋ฅผ false๋ก ๋๋๋ฆด ์ฝ๋๊ฐ ์คํ๋์ง ์์ ๊ฒฐ๊ตญ DB๋ ์ฌ์ ํ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ์ค(true)์ธ ์ํ๋ก ๋จ๊ฒ ๋ฉ๋๋ค. ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋ชจ๋ ๊ด๋ฆฌ์ ํ์ด์ง ์ ๊ทผ ์ ์ ํ ํฐ์ ๊ฒ์ฆํ๋ ๋ฏธ๋ค์จ์ด๋ฅผ ์ถ๊ฐํ๊ณ ,ํ ํฐ์ด ๋ง๋ฃ๋ ๊ฒฝ์ฐ ํด๋น ์ฌ์ฉ์์ isLoggedIn์ ์๋์ผ๋ก false๋ก ์ ๋ฐ์ดํธํฉ๋๋ค.๋ฐฑ์๋ ํด๋์ middleware/verifyToken.js ๋ฅผ ์์ฑํ๊ณ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.// middleware/verifyToken.js const jwt = require("jsonwebtoken"); const User = require("../models/User"); const verifyToken = async (req, res, next) => { const token = req.cookies.token; if (!token) { return res.status(401).json({ message: "ํ ํฐ์ด ์์ต๋๋ค." }); } try { const decoded = jwt.verify(token, process.env.JWT_SECRET); req.user = decoded; next(); } catch (error) { if (error.name === "TokenExpiredError") { // ๋ง๋ฃ๋ ํ ํฐ์์ ์ฌ์ฉ์ ์ ๋ณด ์ถ์ถ const decoded = jwt.decode(token); if (decoded?.userId) { await User.findByIdAndUpdate(decoded.userId, { isLoggedIn: false }); } } return res.status(401).json({ message: "ํ ํฐ์ด ๋ง๋ฃ๋์์ต๋๋ค. ๋ค์ ๋ก๊ทธ์ธํด์ฃผ์ธ์." }); } }; module.exports = verifyToken;๋ง๋ค์ด์ง ๋ฏธ๋ค์จ์ด๋ฅผ ์ค์ ๋ก ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์์ ๋๋ค.const verifyToken = require("../middleware/verifyToken"); router.get("/admin/dashboard", verifyToken, async (req, res) => { res.json({ message: "๊ด๋ฆฌ์ ํ์ด์ง ์ ์ ์ฑ๊ณต" }); });์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ฉด ์๋ฒ๋ JWT ํ ํฐ์ ๋ฐ๊ธํ๊ณ isLoggedIn์ true๋ก ์ค์ ํฉ๋๋ค.์ฌ์ฉ์๋ ์ด ํ ํฐ์ ๊ฐ์ง๊ณ ๊ด๋ฆฌ์ ํ์ด์ง ๋ฑ์ ์ ๊ทผํ ๋๋ง๋ค ์์ฒญ ํค๋ ๋๋ ์ฟ ํค์ ํฌํจ์์ผ ์๋ฒ๋ก ์ ์กํฉ๋๋ค.๋ฏธ๋ค์จ์ด๊ฐ ๋งค ์์ฒญ๋ง๋ค ํ ํฐ์ ๊ฒ์ฆํฉ๋๋ค.ํ ํฐ์ด ์ ํจํ๋ฉด ์์ฒญ์ ์ ์์ ์ผ๋ก ํต๊ณผ์ํต๋๋ค.ํ ํฐ์ด ๋ง๋ฃ๋์๋ค๋ฉด (TokenExpiredError),ํด๋น ํ ํฐ์์ userId๋ฅผ ์ถ์ถํ๊ณ DB์์ ํด๋น ์ฌ์ฉ์์ isLoggedIn์ false๋ก ์๋ ์ ๋ฐ์ดํธํฉ๋๋ค.์ดํ ์๋ฒ๋ 401 Unauthorized ์๋ต์ ๋ณด๋ด์ด โ์ธ์ ์ด ๋ง๋ฃ๋จโ์ ์๋ฆฝ๋๋ค.ํด๋ผ์ด์ธํธ๋ ์ด ์๋ต์ ๋ฐ์ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธํ๊ฑฐ๋ ๋ค์ ๋ก๊ทธ์ธํ๋๋ก ์ฒ๋ฆฌํฉ๋๋ค.์ถ๊ฐ ์ง๋ฌธ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง ๋ฌธ์ ๋ถํ๋๋ฆฝ๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
- 0
- 1
- 29
Q&A
verify_token ํจ์์ ๋ค์ด๋ฐ์ ๋ํ ์ง๋ฌธ์ ๋๋ค
์๋ ํ์ธ์! ์ธ์ฌํ ํผ๋๋ฐฑ ์ ๋ง ๊ฐ์ฌํฉ๋๋ค.๋ง์ํด์ฃผ์ ๋ถ๋ถ์ด ์ ํํฉ๋๋ค. ์๋๋ verify_token ํจ์๊ฐ ํ ํฐ์ ์ ํจ์ฑ ๊ฒ์ฆ๋ง ์ํํ๊ณ Boolean ๊ฐ์ ๋ฐํํ๋๋ก ๊ตฌํ๋์ด ์์๋๋ฐ, ์ดํ ๋ฆฌํฉํ ๋ง ๊ณผ์ ์์ ๊ฒ์ฆ๊ณผ ๋์์ user id๋ฅผ ๋ฐํํ๋ ํํ๋ก๋ณ๊ฒฝ๋๋ฉด์ ํจ์๋ช ๋ ํจ๊ป ์์ ํ์ด์ผ ํ์ต๋๋ค. ํ์ง๋ง ๋น์ ๋ค์ด๋ฐ์ ๊ทธ๋๋ก ๋๋ ๋ฐ๋์ ํผ๋์ ๋๋ฆฌ๊ฒ ๋์์ต๋๋ค.get_uid_from_token์ด๋ extract_user_id์ฒ๋ผ ์ค์ ๋ฐํ ๊ฐ์ ๋ช ํํ ๋๋ฌ๋ด๋ ๋ค์ด๋ฐ์ด ํจ์ฌ ์ง๊ด์ ์ด๋ผ๋ ์ ์ ๊น์ด ๊ณต๊ฐํฉ๋๋ค. ํ์ค์ ์ผ๋ก๋ ๊ฐ์ ์ ์ฒด๋ฅผ ์์ ํ๊ธฐ๋ ์ด๋ ค์ด ์ํฉ์ด์ง๋ง, ๋ง์ํด์ฃผ์ ์๊ฒฌ์ ๋งค์ฐ ํฉ๋นํ๊ณ ์ค๋ฌด์ ์ผ๋ก๋ ์ค์ํ ์ง์ ์ ๋๋ค.์ข์ ํผ๋๋ฐฑ ์ฃผ์ ์ ์ง์ฌ์ผ๋ก ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ด๋ฐ ์ธ์ฌํ ๊ด์ ์ด ๊ฐ์ ํ์ง์ ๊ฐ์ ํ๋ ๋ฐ ํฐ ๋์์ด ๋ฉ๋๋ค.
- 0
- 2
- 32
Q&A
6-2 ๊ฐ์ ๋ ธ์ ์ฝ๋ ์คํ์ธ๊ฑฐ์ฃ ? 2
์๋ ํ์ธ์, ์์คํ ์๊ฒฌ ๋จ๊ฒจ์ฃผ์ ์ ์ง์ฌ์ผ๋ก ๊ฐ์ฌํฉ๋๋ค.๋ง์ํด์ฃผ์ SingleTopic/Chart/ChartCanvas.jsx (39๋ฒ ๋ผ์ธ)์ stroke={colors[i].bg} ๋ฌธ์ ๋ฅผ ํ์ธํ์๊ณ , ๊ฐ์์๋ฃ์์ ์์ ํ์์ต๋๋ค.๊ท์คํ ํผ๋๋ฐฑ ๋๋ถ์ ๋ ๋์ ๊ฐ์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.์๊ฐ ๋ด์ด ์๋ ค์ฃผ์ ์ ์ง์ฌ์ผ๋ก ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
- 0
- 3
- 36
Q&A
ํ์ผ๋ช , ํด๋๋ช ๋๋ฌธ์ ์๋ฌธ์, ์ผ์ด์ค ๊ตฌ๋ณ๋ฒ์ด๊ถ๊ธํด์
์๋ ํ์ธ์. ์ง๋ฌธ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. Q. ๊ฐ ํด๋์ ๋ฐ๋ผ ์ด๋ฆ์ ์ง๋ ๋ฐฉ๋ฒ์ด ๋ค๋ฅธ ๊ฒ ๊ฐ์ต๋๋ค. ํด๋์ ํ์ผ๋ช ๋๋ฌธ์/์๋ฌธ์ ๊ท์น์ด ๊ถ๊ธํฉ๋๋ค.์ด๋ฒ ํ๋ก์ ํธ์ ํด๋์ ํ์ผ ๋ช ๋ช ๊ท์น์ ์๊ฒฉํ ๊ท์น๋ณด๋ค๋ ๊ฐ์ธ ์ทจํฅ์ด ๋ฐ์๋ ๋ถ๋ถ์ด ์์ต๋๋ค.Utils ํด๋ํด๋๋ช ์ ํญ์ ๋๋ฌธ์(Utils)๋ก ์์ํ๊ณ , ์์ ํ์ผ์ ์ฒซ ๋จ์ด๋ ์๋ฌธ์, ๋ค๋ฐ๋ฅด๋ ๋จ์ด๋ ์ฒซ ๊ธ์๋ง ๋๋ฌธ์ ํ์์ผ๋ก ์์ฑํฉ๋๋ค.์์:adminLoginUtils.tsxcommunityDetailUtils.tsxcommunityUtils.tsxpredictUtils.tsx์ด๋ ๊ฒ ํ๋ฉด ํ์ผ๋ช ์ด ๊ธธ์ด์ ธ๋, ์ด๋ค ๊ธฐ๋ฅ๊ณผ ์ญํ ์ ํ๋ ํ์ผ์ธ์ง ์ง๊ด์ ์ผ๋ก ์ ์ ์์ต๋๋ค.Components ํด๋ ๋ฐ ํ์ ํด๋ํด๋์ ํ์ผ ์ด๋ฆ ๋ชจ๋ ๋จ์ด์ ์๊ด์์ด ์ฒซ ๊ธ์๋ฅผ ๋๋ฌธ์๋ก ์์ฑํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.UI ์ปดํฌ๋ํธ์์ ์๊ฐ์ ์ผ๋ก ๋ฐ๋ก ๊ตฌ๋ถํ ์ ์๊ณ , ํ๋ก์ ํธ๋ฅผ ์ฒ์ ๋ณด๋ ์ฌ๋๋ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค.ํ ๋ด ํต์ผ์ฑํ์์ ํ์ผ๋ช ์ ์ ํ ๋, ์๋ฅผ ๋ค์ด predict + utils๋ผ๋ ํ์ผ์ ๋ง๋ค๋ฉด๋๊ตฐ๊ฐ๋ predictUtils๋ผ๊ณ ํ๊ณ , ๋๊ตฐ๊ฐ๋ PredictUtils๋ผ๊ณ ํ ์ ์์ต๋๋ค.์ด๋ฐ ์ฐจ์ด๋ก ์คํด๊ฐ ์๊ธธ ์ ์์ง๋ง, ์ค์ ๊ธฐ๋ฅ์ด๋ ๋์์๋ ์ ํ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.๋ฐ๋ผ์ ์ง๋ฌธ์๋๊ป์ ๋ณด์๊ธฐ์ ๋ณด๊ธฐ ํธํ๊ณ ์ดํดํ๊ธฐ ์ฌ์ด ๋ฐฉ์์ผ๋ก ์ ํํ์๋ฉด ๋ฉ๋๋ค.์ ๋ฆฌ์ด๋ฒ ํ๋ก์ ํธ์์ ํ์ผ๋ช ๊ณผ ํด๋๋ช ์ PascalCase ๋ฐ camelCase ๋ฐฉ์์ ์ ์ ํ ํผํฉํด์ ์ฌ์ฉํ์ต๋๋ค.๊ธฐ๋ฅ๋ณ๋ก ๊ตฌ๋ถ๋์ด ์์ด ์ ์ง๋ณด์๋ ํ์ฅ์ด ์ฝ๊ณ , ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ๋ด๋ ์ง๊ด์ ์ผ๋ก ์ดํดํ ์ ์์ต๋๋ค.์ฆ, ์๊ฒฉํ ์ปจ๋ฒค์ ๋ณด๋ค ์ค์ฉ์ฑ๊ณผ ํธ์์ฑ์ ์ฐ์ ์ํ ๋ฐฉ์์ด๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.๊ฐ์ฌํฉ๋๋ค!
- 0
- 1
- 35
Q&A
๊ฐ์ ์๋ฃ๊ณ ์์ต๋๋ค. next js์์ src ํด๋ ๋ฐ์ ํด๋๋ค ์ด๋ฆ ์ ์ํ ๋ ์ฒซ๊ธ์๋ฅผ ๋๋ฌธ์๋กํ๋ ์ด์ ๊ฐ์๋์?
์๋ ํ์ธ์. ์ง๋ฌธ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. Q1. Next.js์์ src ๋ฐ ํ์ ํด๋๋ช ์ ๋๋ฌธ์๋ก ์ฐ๋ ์ด์ A. ์ข์ ์ง๋ฌธ์ ๋๋ค. ์๋ฅผ ๋ค์ด src ํด๋ ์์์ ์ปดํฌ๋ํธ๋ฅผ ๊ด๋ฆฌํ ๋, components ๋์ Components๋ก ์ฐ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.์ด๊ฑด ์ปจ๋ฒค์ (์ฝ๋ ์คํ์ผ)์ ์ฐจ์ด์ผ ๋ฟ, ๊ธฐ๋ฅ์ด๋ ์ฑ๋ฅ์๋ ์ ํ ์ํฅ์ด ์์ต๋๋ค.์๋ฌธ์(components)โ ์ผ๋ฐ์ ์ผ๋ก ํด๋๋ช ์ ์๋ฌธ์๋ก ์์ํ๋ ๊ฒ ํ์ค์ ์ด๋ฉฐ, Next.js ๊ณต์ ๋ฌธ์์์๋ ์ด ๋ฐฉ์์ ๋ฐ๋ฆ ๋๋ค.๋๋ฌธ์(Components)โ ํด๋๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๋ด๊ณ ์์์ ์๊ฐ์ ์ผ๋ก ๊ฐ์กฐํ๊ธฐ ์ํ ์ ํ์ ๋๋ค.์๋ฅผ ๋ค์ด Components, Pages, Hooks, Utils์ฒ๋ผ ์ญํ ๋ณ ํด๋๋ฅผ ๋ช ํํ ๊ตฌ๋ถํ๋ ค๋ ์๋์ ๋๋ค.์ฆ, ์ด๋ ์ชฝ์ด๋ ์ฑ๋ฅ์ด๋ ๋์์ ์ฐจ์ด๋ ์์ผ๋ฉฐ,๊ฐ์ธ ์ทจํฅ์ด๋ ํ์ ์คํ์ผ ๊ฐ์ด๋์ ๋ง์ถฐ ํต์ผ๋ง ํด์ฃผ์๋ฉด ๋ฉ๋๋คQ2. Next.js ์ค์ต ์ ์ฌ์ฉํ ํด๋ ๊ตฌ์กฐ๋ ์ด๋ค ๊ตฌ์กฐ์ด๋ฉฐ, ์์ฉํ๋ ๊ตฌ์กฐ์ธ๊ฐ์?A. ์ด๋ฒ ํ๋ก์ ํธ์์๋ Next.js์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก, ์ฝ๋๋ฅผ ์ญํ ๋ณ๋ก ๊ตฌ๋ถํ์ฌ ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋ณด์ด๊ธฐ ์ํ ํด๋ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ต๋๋ค.์๋๋ ํ์ฌ ์ฌ์ฉ ์ค์ธ ํด๋ ๊ตฌ์กฐ์ ๋๋ค.src/ โโโ app/ โโโ Components/ โโโ Hooks/ โโโ Utils/ โโโ Styles/ โโโ Types/ โโโ Constants/ โโโ lib/Next.js๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋ ๊ตฌ์กฐ๋ฅผ ์๊ฒฉํ๊ฒ ์ ํํ์ง ์๊ธฐ ๋๋ฌธ์, ์ด์ฒ๋ผ ๊ธฐ๋ฅ๋ณ๋ก ๊ตฌ๋ถ๋ ๊ตฌ์กฐ๋ ์ค๋ฌด๋ ํ ํ๋ก์ ํธ์์ ์์ฃผ ์ฌ์ฉ๋๋ ํํ์ ๋๋ค. ๊ฐ ์ญํ ์ด ๋ช ํํ๊ฒ ๋๋์ด์ ธ ์์ด ์ ์ง๋ณด์๋ ํ์ฅ์ด ์ฉ์ดํ๋ฉฐ, ๋ค๋ฅธ ๊ฐ๋ฐ์์ ํ์ ํ ๋๋ ํจ์จ์ ์ ๋๋ค.๋ํ, Next.js๋ก ์์ฉํ๋ ํ๋ก์ ํธ๋ ๊นํ๋ธ์์ ์ฐพ๊ธฐ ์ด๋ ค์ด ํธ์ด์ง๋ง, ๊ทธ ์ค ๋ํ์ ์ธ ์๋ก Appwrite๋ฅผ ๋ค ์ ์์ต๋๋ค. Appwrite๋ Next.js ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ๋ ์คํ์์ค ๋ฐฑ์๋ ํ๋ซํผ์ผ๋ก,ํ์ฌ GitHub์์ 53K๊ฐ ์ด์์ ๋ณ(โญ) ์ ๋ฐ์ ๋๊ท๋ชจ ์์ฉ ํ๋ก์ ํธ์ ๋๋ค.Appwrite์ ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ์ดํด๋ณด๋ฉด, ์ด๋ฒ์ ์ฌ์ฉํ ๊ตฌ์กฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ธฐ๋ฅ๋ณ๋ก ํด๋๋ฅผ ๋๋์ด ๊ด๋ฆฌํ๋ ์ค๋ฌด ์ค์ฌ์ ๋ฐฉ์์ ์ฑํํ๊ณ ์์ต๋๋ค.๊นํ๋ธ ์ฃผ์: https://github.com/appwrite/Q3. Next.js๋ Electron์ผ๋ก ํฌํ ํ ์ ์๋์?๋ค, ๊ฐ๋ฅํฉ๋๋ค. Electron์ ํ๋ ์์ํฌ์ ํฌ๊ฒ ๊ตฌ์ ๋ฐ์ง ์๊ณ ์น ๊ธฐ์ ๋ก ๋ง๋ ์ฑ์ ๋ฐ์คํฌํฑ์ผ๋ก ํฌํ ํ ์ ์์ต๋๋ค. ๋น์ ํ์๋ฉด, Electron์ ์ก์์ ๊ฐ๊ณ , ํ๋ก ํธ์๋ ํ๋ ์์ํฌ(React, Next.js, Vue ๋ฑ)๋ ๊ทธ ์์ ๋ฃ๋ ์ฌ์ง๊ณผ ๊ฐ์ต๋๋ค.์ฆ, ์ด๋ค ์ฌ์ง์ ๋ฃ๋ ์ก์๋ง ์์ผ๋ฉด ์ ์๊ฐ ๊ฐ๋ฅํ ๊ฒ์ฒ๋ผ, Next.js๋ React๋ , ์ฌ์ง์ด ๋ค๋ฅธ ์น ๊ธฐ์ ๋ก ๋ง๋ ์ฑ๋ Electron ์์์ ์คํํ ์ ์์ต๋๋ค. ์ง๋ฌธ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ฆ๊ฑฐ์ด ์ถ์ ์ฐํด ์ ๋ณด๋ด์๊ณ , ๋จ์ ๋ช ์ ๋ ํธ์ํ๊ฒ ๋ง๋ฌด๋ฆฌํ์๊ธธ ๋ฐ๋๋๋ค.
- 0
- 2
- 39
Q&A
[๊ฐ์ ์ค๋ฅ ๋ฆฌํฌํธ] React Router Outlet ์ฌ์ฉ ์ค๋ฅ
์๋ ํ์ธ์, ์์คํ ์ค๋ฅ ๋ฆฌํฌํธ ๋จ๊ฒจ์ฃผ์ ์ ์ง์ฌ์ผ๋ก ๊ฐ์ฌ๋๋ฆฝ๋๋ค.๋ง์ํด์ฃผ์ React Router Outlet ๊ด๋ จ ์ค๋ฅ๋ ํ์ธ ํ, ๋ฌธ์ ๋ ๋ถ๋ถ์ ์์ ํ์์ต๋๋ค. ๊ฐ์ ์์์ด ์ ๋ก๋ ๊ณผ์ ์์ ์์๋ก ๋ถํ ๋๋ ๊ณผ์ ์์ ์ฝ๋ ๊ตฌ์กฐ ์ผ๋ถ๊ฐ ๋๋ฝ๋์ด ๋ฐ์ํ ๋ฌธ์ ๋ก ํ์ธ๋์์ต๋๋ค. ์ด๋ฌํ ์ค์๋ก ์ธํด ํ์ต์ ๋ถํธ์ ๋๋ฆฐ ์ ์ง์ฌ์ผ๋ก ์ฌ๊ณผ๋๋ฆฝ๋๋ค.ํ์ฌ ์ฑํฐ 4์ ์ฝ๋ ๋ฐ ๊ฐ์ ๋ด์ฉ์ ๋ค์ ๊ผผ๊ผผํ ๊ฒ์ํ์๊ณ , 1~3์ฑํฐ ๋ํ ๊ฒ์๋ฅผ ์งํํ์์ผ๋ฉฐ, ์ดํ ์ฑํฐ๋ค ๋ํ ์์ฐจ์ ์ผ๋ก ๊ฒ์ ๋ฐ ์์ ์์ ์ ์งํ ์ค์ ๋๋ค. ์ง ๋ฎ์ ๊ฐ์๋ก ์ค๋ง์ ๋๋ฆฐ ์ ๋งค์ฐ ์ฃ์กํ๊ฒ ์๊ฐํ๋ฉฐ, ๋ ๋์ ์์ฑ๋๋ก ๋ณด๋ต๋๋ฆฌ๊ฒ ์ต๋๋ค.๊ท์คํ ์๊ฐ ๋ด์ด ์์ธํ ์ ๋ณดํด์ฃผ์ ์ ๋ค์ ํ ๋ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊พธ์คํ ๊ฐ์ ํ๋ฉฐ ์ ๋ขฐํ ์ ์๋ ๊ฐ์๋ก ๋ง๋ค์ด๊ฐ๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
- 0
- 1
- 40
Q&A
[๊ฐ์ ์ค๋ฅ ์ ๋ณด] Navbar ์ปดํฌ๋ํธ ์ฝ๋ ์ค๋ฅ ๋ฐ๊ฒฌ
์๋ ํ์ธ์, ์์คํ ์ค๋ฅ ์ ๋ณด ์ ๋ง ๊ฐ์ฌํฉ๋๋ค. ๋ง์ํด์ฃผ์ Navbar ์ปดํฌ๋ํธ์ logout ๊ด๋ จ ๋ถ๋ถ์ ํ์ธํด๋ณด๋, ๋ง์ํ์ ๋๋ก ํจ์๋ช ์ด ๋ถ์ผ์นํ์ฌ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ๊ผผ๊ผผํ ํ์ธํด์ฃผ์ ๋๋ถ์ ์์ธ์ ๋น ๋ฅด๊ฒ ํ์ ํ๊ณ , ํด๋น ์น์ ์ ๊ฐ์ ์๋ฃ์ ์ฝ๋๋ฅผ ๋ชจ๋ ์์ ๋ฐ ๋ฐ์ํ์ต๋๋ค.์ด์ฒ๋ผ ์ธ์ธํ๊ฒ ์ดํด๋ณด๊ณ ์ ํํ ์ ๋ณดํด์ฃผ์ ์ ์ ๋ง ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋๋ถ์ ๋ค๋ฅธ ํ์ต์๋ถ๋ค๋ ๋ ์ํํ๊ฒ ํ์ตํ์ค ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์์ผ๋ก๋ ์๋ฃ์ ๊ฐ์ ๋ด์ฉ์ ๋์ฑ ๊ผผ๊ผผํ ๊ฒ์ํ๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค!(์ฌ์ง)
- 0
- 2
- 40
Q&A
๋ฐ๋ชจ์ฌ์ดํธ ์ ์์ด ์๋ฉ๋๋ค.
์๋ ํ์ธ์. ๋ฌธ์ ๋จ๊ฒจ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.์๋ง๋ ์๋ฒ์ Docker๊ฐ ์ ์ ์ค๋จ๋์ด ์ ์์ด ์๋์๋ ๊ฒ ๊ฐ์ต๋๋ค.ํ์ฌ๋ ์ ์์ ์ผ๋ก ์ ์ ๊ฐ๋ฅํฉ๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
- 0
- 1
- 30
Q&A
membership๋ถ๋ถ์ ๋ช ๊ฐ์์์ ์งํํ์ ๊ฑด๊ฐ์?
์๋ ํ์ธ์, ์ง๋ฌธ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ๋ง์ํ์ ๋ฉค๋ฒ์ญ ๊ธฐ๋ฅ์ ์น์ 17, Ch.16 (ํ์คํ) โ ๋ฉค๋ฒ์ญ ๊ฒฐ์ ๊ธฐ๋ฅ ๊ตฌํ (1๋ถ) ์์ ์งํ๋ฉ๋๋ค.ํด๋น ๊ฐ์์์๋ ํฌํธ์ ์ฌ์ดํธ์์ ์ ๊ณตํ๋ KG์ด๋์์ค API๋ฅผ ํ์ฉํ์ฌ ๊ฒฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ณผ์ ์ ๋ค๋ฃจ๊ณ ์์ต๋๋ค. (์ฌ์ง) ๊ฐ์ฌํฉ๋๋ค!
- 0
- 1
- 32





