게시글
질문&답변
membership부분은 몇 강의에서 진행하신건가요?
안녕하세요, 질문 주셔서 감사합니다! 말씀하신 멤버십 기능은 섹션 17, Ch.16 (풀스택) – 멤버십 결제 기능 구현 (1부) 에서 진행됩니다.해당 강의에서는 포트원 사이트에서 제공하는 KG이니시스 API를 활용하여 결제 기능을 구현하는 과정을 다루고 있습니다. (사진) 감사합니다!
- 0
- 1
- 16
질문&답변
ipify.org api 호출 시 클라이언트 ip주소를 반환하는지?
안녕하세요. 질문 주셔서 감사합니다!말씀하신 대로 백엔드 기준으로 const response = await axios.get("https://api.ipify.org?format=json");axios.get("https://api.ipify.org?format=json")를 쓰면 실제 클라이언트의 IP가 아니라 백엔드 서버의 공인 IP가 반환됩니다.제가 착각했습니다. 죄송합니다.클라이언트 IP를 얻으려면 req.ip을 쓰거나, 배포 환경에 따라 프록시 헤더를 신뢰하도록 설정하고 다음처럼 가져와야 합니다.const ip = req.headers["x-forwarded-for"] || req.socket.remoteAddress || req.ip;따라서 포스트 상세 조회 시 조회수 체크 로직은 아래처럼 수정하시면 됩니다 router.get("/:id", async (req, res) => { try { const post = await Post.findById(req.params.id); if (!post) { return res.status(404).json({ message: "게시글을 찾을 수 없습니다." }); } const ip = req.headers["x-forwarded-for"] || req.socket.remoteAddress || req.ip; const userAgent = req.headers["user-agent"]; const oneDayAgo = new Date(Date.now() - 24 * 60 * 60 * 1000); const hasRecentView = post.viewLogs.some( (log) => log.ip === ip && log.userAgent === userAgent && new Date(log.timestamp) > oneDayAgo ); if (!hasRecentView) { post.views += 1; post.viewLogs.push({ ip, userAgent, timestamp: new Date(), }); await post.save(); } res.json(post); } catch (error) { res.status(500).json({ message: "서버 오류가 발생했습니다." }); } }); 정리하면, ipify.org는 서버 IP만 찍히기 때문에 의미가 없고, req.ip 또는 위 코드처럼 x-forwarded-for까지 확인하는 방식으로 바꾸는 게 맞습니다.혼란 드려 죄송합니다.
- 0
- 2
- 38
질문&답변
Github repository는 없나요?
안녕하세요. 질문 주셔서 감사합니다.챕터별 완성 코드는 시간상 Notion 외에는 Github에 별도로 업로드되어 있지 않습니다. 다만, 저희 팀에서 개발 후 업로드한 Talkandvote 프로젝트 코드는 제공 가능합니다. 해당 프로젝트는 강의 촬영 과정에서 일부 코드가 수정되거나 추가된 부분이 있을 수 있으니, Notion에 있는 코드와 비교하여 참고하시기 바랍니다.jmh4011/talkAndVoteReak감사합니다!
- 0
- 1
- 45
질문&답변
백엔드 도커 실행 에러가 뜹니다 ㅠ
안녕하세요. 질문 주셔서 감사합니다!오류 메세지 마지막 부분에서ModuleNotFoundError: No module named 'sqlalchemy' 라는 문구가 있습니다. 말 그대로 Docker 컨테이너 내부에 sqlalchemy 패키지가 설치되어 있지 않아서 FastAPI가 실행되지 못하는 상황입니다.해결방법TalkAndVote Notion 사이트Notion 챕터 7-1 FastAPI 초기 설정 토글을 여시면 필요한 코드를 확인하실 수 있습니다.cd .\backend\ .\venv\Scripts\activate pip install alembic sqlalchemy pymysql asyncmy cryptography passlib pip freeze > requirements.txt alembic init alembicPython 가상환경을 생성 후 필요한 패키지를 설치한 후에 해당 패키지 목록들을 requirements.txt로 추출하는 초기 설정 명령어입니다.Docker 컨테이너를 설치할 시에는, 이 requirements.txt 파일을 빌드 과정에서 컨테이너 내부로 복사하고, pip install -r requirements.txt 명령어로 모든 패키지를 설치해야 합니다. 이렇게 하면 로컬 환경과 컨테이너 환경이 동일한 패키지 구성을 가지게 되어, ModuleNotFoundError와 같은 패키지 누락 문제를 예방할 수 있습니다.따라서, 챕터 7-1 노션 코드를 천천히 다시 따라 해 보시되, 문제가 지속적으로 발생할 경우 Dockerfile 및 프로젝트 소스코드를 깃허브에 업로드 후 공유해 주시면 좀 더 수월하게 문제를 해결할 수 있을 것 같습니다. 감사합니다!
- 0
- 2
- 61
질문&답변
ch5-1 관리자 페이지 IP블랙리스트 기능구현 관련
안녕하세요. 질문 주셔서 감사합니다. 해당 오류는 MODULE_NOT_FOUND로 이전에 문의글과 비슷한 에러입니다. MODULE_NOT_FOUND 오류 - 인프런 | 커뮤니티 질문&답변구체적으로 어떤 모듈이 없는지 또는 인식하지 못했는지 확인하기 위해서 일단 챕터 5-1 IP블랙리스트 index.js 코드를 살펴보자면require("dotenv").config(); const express = require("express"); const mongoose = require("mongoose"); const cookieParser = require("cookie-parser"); const cors = require("cors"); const userRoutes = require("./routes/user");다음 패키지들이 사용됩니다:dotenvexpressmongoosecookie-parsercors또한, ./routes/user 경로에서 라우트 파일을 불러오고 있습니다.챕터 4-4와 비교해서 새로 추가된 패키지는 cors 패키지입니다. 해당 패키지가 실제로 설치되어 있는지 package.json 및 node_modules 폴더에서 확인 부탁드립니다. 그 후, 다음 사항을 확인해 주세요:패키지 설치 여부 확인backend 디렉토리에서 아래 명령어를 실행하여 필요한 패키지를 설치해 주세요npm install dotenv express mongoose cookie-parser cors라우트 경로 확인routes 폴더가 backend 디렉토리 내부에 위치해 있고,그 안에 user.js 파일이 존재하는지 확인해 주세요.경로 작성 확인require("./routes/user")가 정확한 상대 경로인지 확인해 주세요.파일 위치가 다를 경우, 경로를 조정해야 할 수 있습니다.감사합니다.
- 0
- 2
- 30
질문&답변
ch4-6 관리자 계정 로그아웃 , 삭제 관련
안녕하세요. 질문 주셔서 감사합니다!먼저, 코드에 MongoDB 연결 주소가 노출되어 있습니다. 보안을 위해 해당 정보는 즉시 삭제해주세요!말씀하신 ey~~~로 시작하는 문자열은 jsonwebtoken에서 발급된 인코딩 값입니다.답변에 앞서, 먼저 jsonwebtoken에 대해 간단히 설명드리면, 크게 두 가지 기능으로 나눌 수 있습니다.인코딩(발급): 내가 원하는 정보(예: 사용자 ID, 이름 등)를 토큰에 담아 하나의 긴 문자열로 변환디코딩(검증): 그 긴 문자열을 다시 풀어서 원래 담았던 정보로 복원사용자 ID, 이름뿐만 아니라 모든 문자열 데이터는 인코딩할 수 있습니다. 다만 중요한 점은, 토큰 발급 시 저희가 설정한 JWT_SECRET 값을 사용해 서명한다는 것입니다. 그렇기에 실제 운영 중에 JWT_SECRET 값이 유출이 되면 공격자가 언제든지 암호화된 문자열을 디코딩이 가능하기 떄문에 각별한 주의가 필요합니다.로그인 엔드포인트를 작성하셨다면, userId와 username을 인코딩하여 토큰 값을 발급받았던 과정을 기억하실 겁니다. 강의 영상 6분 34초에 jsonwebtoken 및 JWT_SECRET 값을 통해 인코딩 된 토큰 값을 출력하는 코드가 있습니다.const token = jwt.sign( { userId: user._id, username: user.username }, process.env.JWT_SECRET, { expiresIn: "24h" } ); console.log(token)해당 코드를 참고하시면서 개발을 진행하시면 됩니다. 감사합니다!
- 0
- 2
- 45
질문&답변
ch4-5 관리자 계정 로그인, JWT토큰 관련
안녕하세요. 질문 주셔서 감사합니다!챕터 4-5에서는 관리자 회원가입 이후 로그인 엔드포인트를 개발했습니다. 로그인 과정에서 MongoDB로 부터 반환된 user 정보를 확인하기 위해, 영상 4분 15초 쯤에 console.log(user)를 사용하여 유저 정보를 출력했습니다. 해당 부분이 누락되지 않았는지 확인해 주시기 바랍니다.router.post("/login", async (req, res) => { try { const { username, password } = req.body; const user = await User.findOne({ username }); console.log(user); // 이 코드가 누락되지 않았는지 확인 부탁드립니다! } catch (error) { console.log("서버 오류: ", error.message); res.status(500).json({ message: "서버 오류가 발생했습니다." }); } });또한 이후 login 엔드포인트에는 사용자를 찾을 수 없음, 비활성화 계정 처리 등 다양한 기능이 추가될 예정입니다. 코드 작성 중 에러가 발생하면 이후 하단의 코드들은 실행되지 않으므로, console.log(user)의 위치를 적절히 조정하여 에러 발생 지점을 파악하고 디버깅을 진행해 보시기 바랍니다. 이렇게 하면 챕터 4를 보다 수월하게 마무리하실 수 있습니다. 참고 부탁드립니다. 감사합니다.
- 0
- 2
- 36
질문&답변
ch4-4관리자 계정생성하기 문제 발생
안녕하세요. 질문 주셔서 감사합니다!챕터 4-4에서는 관리자 계정을 생성하는 과정에서 비밀번호를 bcrypt 패키지를 이용해 암호화했습니다. 저희가 직접 암호화 로직을 구현하기보다는, 이미 다른 개발자가 개발하여 패키지 형태로 제공하는 bcrypt를 활용했습니다.### routes/user.js signup 함수 중 일부 const hashedPassword = await bcrypt.hash(password, 10);현재 질문자님께 발생한 오류는 bcrypt 패키지가 설치되어 있지 않거나, 설치되어 있어도 Node.js에서 해당 패키지를 인식하지 못할 때 발생하는 문제입니다.해결 방법: bcrypt 패키지 재설치# backend 폴더로 이동해서 설치를 진행해야 합니다. cd backend # bcrypt 패키지 삭제 명령어 npm uninstall bcrypt # bcrypt 패키지 설치 명령어 npm install bcrypt# backend/package.json 코드 중 일부 "dependencies": { "axios": "^1.7.9", "bcrypt": "^5.1.1", 이 방법으로도 문제가 해결되지 않는다면, 현재 사용 중인 Node.js 버전, 운영체제 환경, 그리고 발생하는 오류 메시지 전체를 함께 알려주세요. 확인 후 보다 구체적인 해결 방법을 안내해 드리겠습니다. 감사합니다!
- 0
- 2
- 45
질문&답변
6-2 강의 노션 코드 오타인거죠?
안녕하세요. 질문 남겨주셔서 감사합니다! 그리고 꼼꼼하게 코드를 확인해주시고 좋은 피드백 주셔서 정말 고맙습니다.말씀해주신 대로 해당 부분은 명백한 오타가 맞습니다. 개발이 끝난 직후 바로 강의 촬영을 준비하다 보니 오타에 대한 검수가 미흡했던 것 같습니다. 이로 인해 학습에 혼란을 드린 점 죄송합니다.찾아주신 것처럼 SingleTopic/index.jsx에서는 voteOptions로 전달하는데, Chart/index.jsx에서 voteOpitons로 잘못 작성되었습니다. 덕분에 문제를 인지하고 Notion에 공유된 코드는 바로 voteOptions로 수정해두었습니다.앞으로는 이런 실수가 없도록 더욱 꼼꼼히 살피겠습니다. 다시 한번 감사드립니다!
- 0
- 1
- 34
질문&답변
섹션2 퀴즈 정답 이상함..( Docker 핵심구성요소가 아닌 것)
안녕하세요, 질문 주셔서 감사합니다!저희 TalkAndVote 강의에서 제공되는 퀴즈는 제가 직접 제작한 것이 아니라, 인프런 측에서 AI를 활용해 자동 생성한 콘텐츠입니다.(사진)해당 퀴즈를 직접 풀어본 결과, 정답과 해설이 일치하지 않는 부분이 있는 것을 확인했습니다. 이와 관련해 인프런 측에 별도로 문의를 드려 조치하도록 하겠습니다.문제를 꼼꼼히 확인해주시고 알려주셔서 진심으로 감사드립니다!
- 0
- 1
- 40