안녕하세요! 서강대학교 컴공과를 졸업하고 현재 대학원 진학을 준비 중인 학생입니다.
고등학교 때 우연히 풀스택 웹 개발과 파이썬을 활용한 자동 매매를 시작하면서 프로그래밍에 빠지게 되었습니다.
그 후 다양한 프로젝트와 프로그래밍 과외활동을 경험하며 실력과 노하우를 공유했습니다. 이러한 경험을 통해 프로그래밍을 처음 접하는 분들에게도 "이렇게 쉬울 수 있구나!"라는 느낌을 줄 수 있는 강의를 만들고자 노력하고 있습니다.
실용적인 예제와 친근한 설명으로 여러분의 학습을 돕고 싶습니다. 감사합니다.
Courses
Reviews
- 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
파일명 , 폴더명 대문자 소문자, 케이스 구별법이궁금해요
안녕하세요. 질문 주셔서 감사합니다. Q. 각 폴더에 따라 이름을 짓는 방법이 다른 것 같습니다. 폴더와 파일명 대문자/소문자 규칙이 궁금합니다.이번 프로젝트의 폴더와 파일 명명 규칙은 엄격한 규칙보다는 개인 취향이 반영된 부분이 있습니다.Utils 폴더폴더명은 항상 대문자(Utils)로 시작하고, 안의 파일은 첫 단어는 소문자, 뒤따르는 단어는 첫 글자만 대문자 형식으로 작성합니다.예시:adminLoginUtils.tsxcommunityDetailUtils.tsxcommunityUtils.tsxpredictUtils.tsx이렇게 하면 파일명이 길어져도, 어떤 기능과 역할을 하는 파일인지 직관적으로 알 수 있습니다.Components 폴더 및 하위 폴더폴더와 파일 이름 모두 단어와 상관없이 첫 글자를 대문자로 작성하는 경우가 있습니다.UI 컴포넌트임을 시각적으로 바로 구분할 수 있고, 프로젝트를 처음 보는 사람도 구조를 이해하기 쉽습니다.팀 내 통일성팀에서 파일명을 정할 때, 예를 들어 predict + utils라는 파일을 만들면누군가는 predictUtils라고 하고, 누군가는 PredictUtils라고 할 수 있습니다.이런 차이로 오해가 생길 수 있지만, 실제 기능이나 동작에는 전혀 영향을 주지 않습니다.따라서 질문자님께서 보시기에 보기 편하고 이해하기 쉬운 방식으로 선택하시면 됩니다.정리이번 프로젝트에서 파일명과 폴더명은 PascalCase 및 camelCase 방식을 적절히 혼합해서 사용했습니다.기능별로 구분되어 있어 유지보수나 확장이 쉽고, 다른 개발자가 봐도 직관적으로 이해할 수 있습니다.즉, 엄격한 컨벤션보다 실용성과 편의성을 우선시한 방식이라고 볼 수 있습니다.감사합니다!
- 0
- 1
- 23
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
- 19
Q&A
[강의 오류 리포트] React Router Outlet 사용 오류
안녕하세요, 소중한 오류 리포트 남겨주셔서 진심으로 감사드립니다.말씀해주신 React Router Outlet 관련 오류는 확인 후, 문제된 부분을 수정하였습니다. 강의 영상이 업로드 과정에서 임의로 분할되는 과정에서 코드 구조 일부가 누락되어 발생한 문제로 확인되었습니다. 이러한 실수로 인해 학습에 불편을 드린 점 진심으로 사과드립니다.현재 챕터 4의 코드 및 강의 내용을 다시 꼼꼼히 검수하였고, 1~3챕터 또한 검수를 진행하였으며, 이후 챕터들 또한 순차적으로 검수 및 수정 작업을 진행 중입니다. 질 낮은 강의로 실망을 드린 점 매우 죄송하게 생각하며, 더 나은 완성도로 보답드리겠습니다.귀중한 시간 내어 상세히 제보해주셔서 다시 한 번 감사드립니다. 꾸준히 개선하며 신뢰할 수 있는 강의로 만들어가겠습니다. 감사합니다.
- 0
- 1
- 20
Q&A
[강의 오류 제보] Navbar 컴포넌트 코드 오류 발견
안녕하세요, 소중한 오류 제보 정말 감사합니다. 말씀해주신 Navbar 컴포넌트의 logout 관련 부분을 확인해보니, 말씀하신 대로 함수명이 불일치하여 에러가 발생하는 문제가 있었습니다. 꼼꼼히 확인해주신 덕분에 원인을 빠르게 파악하고, 해당 섹션의 강의 자료와 코드를 모두 수정 및 반영했습니다.이처럼 세세하게 살펴보고 정확히 제보해주셔서 정말 감사드립니다. 덕분에 다른 학습자분들도 더 원활하게 학습하실 수 있을 것 같습니다. 앞으로도 자료와 강의 내용을 더욱 꼼꼼히 검수하겠습니다. 감사합니다!(사진)
- 0
- 2
- 16
Q&A
데모사이트 접속이 안됩니다.
안녕하세요. 문의 남겨주셔서 감사합니다.아마도 서버의 Docker가 잠시 중단되어 접속이 안되었던 것 같습니다.현재는 정상적으로 접속 가능합니다. 감사합니다!
- 0
- 1
- 23
Q&A
membership부분은 몇 강의에서 진행하신건가요?
안녕하세요, 질문 주셔서 감사합니다! 말씀하신 멤버십 기능은 섹션 17, Ch.16 (풀스택) – 멤버십 결제 기능 구현 (1부) 에서 진행됩니다.해당 강의에서는 포트원 사이트에서 제공하는 KG이니시스 API를 활용하여 결제 기능을 구현하는 과정을 다루고 있습니다. (사진) 감사합니다!
- 0
- 1
- 28
Q&A
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
- 52
Q&A
Github repository는 없나요?
안녕하세요. 질문 주셔서 감사합니다.챕터별 완성 코드는 시간상 Notion 외에는 Github에 별도로 업로드되어 있지 않습니다. 다만, 저희 팀에서 개발 후 업로드한 Talkandvote 프로젝트 코드는 제공 가능합니다. 해당 프로젝트는 강의 촬영 과정에서 일부 코드가 수정되거나 추가된 부분이 있을 수 있으니, Notion에 있는 코드와 비교하여 참고하시기 바랍니다.jmh4011/talkAndVoteReak감사합니다!
- 0
- 1
- 59
Q&A
백엔드 도커 실행 에러가 뜹니다 ㅠ
안녕하세요. 질문 주셔서 감사합니다!오류 메세지 마지막 부분에서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
- 71
Q&A
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
- 32