묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결회사에서 바로 쓰는 업무자동화 AI 에이전트 (w. n8n, LangGraph)
Slack 연동 시 질문입니다!
Slack 부분이 재밌을 것 같아서 먼저 보면서 따라해보고 있습니다!근데 궁금한게 현재 Docker를 이용해서 local로 진행을 하고 있는데요!선생님처럼 어떻게 url 도메인이 있는걸까요???
-
미해결[최신] Vue 강의 끝판왕 : Nuxt 3 완벽 마스터
vscode 자동 저장 시 탭 사이즈 조절 안되고 있습니다..
.vscode 디렉토리까지 생성이 돼서 안에 settings.json 파일에 { "eslint.enable": true, "editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit" }, "editor.tabSize": 2, }이렇게 내용 들어가 있는데 저장을 해도 탭 사이즈 조절이 안됩니다.. 강의 내용에서처럼 no-console을 주석한 뒤 lint 돌렸을때 warning 경고가 뜨는 걸 봐서는 설정은 잘 먹고 있는거 같긴한데 뭘 봐야할까요
-
해결됨GPT로 자동 월급받는 방법, AI시대 돈버는 사람은 따로있다[AI수익화 1위 작가]
강의 영상속 자료 부탁드립니다.
안녕하세요? 강의 잘듣고 있습니다.오프라인 정모같은건 계획이 없으신가요?있으시면 참여하고 싶습니다. 그리고 저도 아래 강의자료 문의하신분 처럼 영상에 있는 자료 와 프롬프트엔지니어링(선물) 부탁드립니다.^^w3ksh@naver.com좋은 강의 만들어주셔서 감사합니다.
-
해결됨회로설계 입문자를 위한 디지털, 아날로그 설계와 실무 Project
single stage amp 시뮬레이션 질문드립니다
왜 SPICE output log가 안나오는지 잘 모르겠습니다.어느 부분에서 잘못 설정한걸까요?
-
해결됨React, Node.js, MongoDB로 만드는 나만의 회사 웹사이트: 완벽 가이드
ch4-6 관리자 계정 로그아웃 , 삭제 관련
7:27 시점에서, 터미널에서 선생님은,,eyJhbGcioiJOUzI1N,......주소명이 뜹니다만,,,저의 경우, 아래와 같이 몽고DB에 연결이 되었습니다만 뜹니다.... 이 경우 어떻게 해야할가요... [nodemon] starting node index.js[dotenv@17.2.1] injecting env (2) from .env -- tip: 🔐 prevent committing .env to code: https://dotenvx.com/precommitServer is runningMongoDB와 연결이 되었습니다.[nodemon] restarting due to changes...[nodemon] starting node index.js[nodemon] restarting due to changes...[nodemon] starting node index.js[dotenv@17.2.1] injecting env (2) from .env -- tip: ⚙ suppress all logs with { quiet: true }Server is runningMongoDB와 연결이 되었습니다. 아래는 routes폴더에 있는 user.jsconst express = require("express"); const router = express.Router(); const bcrypt = require("bcrypt"); const User = require("../models/User"); const axios = require("axios"); const jwt = require("jsonwebtoken"); router.post("/signup", async (req, res) => { try { const { username, password } = req.body; const existingUser = await User.findOne({ username }); if (existingUser) { return res.status(400).json({ message: "이미 존재하는 사용자입니다." }); } const hashedPassword = await bcrypt.hash(password, 10); const user = new User({ username, password: hashedPassword, }); await user.save(); res.status(201).json({ message: "회원가입이 완료되었습니다." }); } catch (error) { res.status(500).json({ message: "서버 오류가 발생했습니다." }); console.log(error); } }); router.post("/login", async (req, res) => { try { const { username, password } = req.body; const user = await User.findOne({ username }).select("+password"); if(!user) { return res.status("401").json({message: "사용자를 찾을 수 없습니다."}); } if(!user.isActive){ return res .status(401) .json({ message: "비활성화된 계정입니다. 관리자에게 문의 주세요."}); } if(user.isLoggedIn){ return res .status(401) .json({message: "이미 다른 기기에서 로그인되어 있습니다."}); } const isValidPassword = await bcrypt.compare(password, user.password); if(!isValidPassword){ user.failedLoginAttempts += 1; user.lastLoginAttempt = new Date(); if(user.failedLoginAttempts >= 5){ user.isActive = false; await user.save(); return res.status(401).json({ message: "비밀번호를 5회이상 틀려 계정이 비활성화되었습니다.", }); } await user.save(); return res.status(401).json({ message: "비밀번호가 일치하지 않습니다.", remainingAttempts: 5 - user.failedLoginAttempts, }); } user.failedLoginAttempts = 0; user.lastLoginAttempt = new Date(); user.isLoggedIn = true; try { const response = await axios.get("https://api.ipify.org?format=json"); const ipAddress = response.data.ip; user.ipAddress = ipAddress; } catch (ipError) { console.error("IP 주소를 가져오는 중 오류 발생:", ipError.message); } await user.save(); const token = jwt.sign( { userId: user._id, username: user.username }, process.env.JWT_SECRET, { expiresIn: "24h" } ); res.cookie("token", token, { httpOnly: true, secure: "production", sameSite: "strict", maxAge: 24 * 60 * 60 * 1000, }); const userWithoutPassword = user.toObject(); delete userWithoutPassword.password; res.json({ user: userWithoutPassword }); } catch (error) { console.error("서버 오류:", error.message); res.status(500).json({ message: "서버 오류가 발생했습니다." }); } }); router.post("/logout", async (req, res) => { try { const token = req.cookies.token; if (!token) { return res.status(400).json({ message: "이미 로그아웃된 상태입니다." }); } try { const decoded = jwt.verify(token, process.env.JWT_SECRET); const user = await User.findById(decoded.userId); if (user) { user.isLoggedIn = false; await user.save(); } } catch (error) { console.log("토큰 검증 오류: ", error.message); } res.clearCookie("token", { httpOnly: true, secure: "production", sameSite: "strict", }); res.json({ message: "로그아웃되었습니다." }); } catch (error) { console.log("로그아웃 오류: ", error.message); res.status(500).json({ message: "서버 오류가 발생했습니다." }); } }); router.delete("/delete/:userId", async (req, res) => { try { const user = await User.findByIdAndDelete(req.params.userId); if (!user) { return res.status(404).json({ message: "사용자를 찾을 수 없습니다." }); } res.json({ message: "사용자가 성공적으로 삭제되었습니다." }); } catch (error) { res.status(500).json({ message: "서버 오류가 발생했습니다." }); } }); module.exports = router; env.에 표기한 부분MONGO_URI=mongodb+srv://sungwon5623:cho121101!@sungwon.oirqw5d.mongodb.net/?retryWrites=true&w=majority&appName=Sungwon JWT_SECRET=c21b6ba5372fa2b8 models폴더에 있는 User.jsconst mongoose = require("mongoose"); const userSchema = new mongoose.Schema( { username: { type: String, required: true, trim: true, minlength: 2, maxlength: 30, }, password: { type: String, required: true, select: false, }, isLoggedIn: { type: Boolean, default: false, }, isActive: { type: Boolean, default: true, }, failedLoginAttempts: { type: Number, default: 0, }, lastLoginAttempt: { type: Date, }, ipAddress: { type: String, trim: true, }, createdAt: { type: Date, default: Date.now, }, }, { timestamps: true, } ); const User = mongoose.model("User", userSchema); module.exports = User;
-
해결됨실전 jOOQ! Type Safe SQL with Java
generate dao 를 통한 삽입 시 pk auto-increment 가 적용되지 않습니다
Kotlin, Groovy gradle, PostrgreSQL 기반으로 프로젝트 세팅이 되어 있습니다 @Repository class ActorRepository( private val dsl: DSLContext, configuration: Configuration ) { private val actorDao = ActorDao(configuration) companion object { private val ACTOR = JActor.ACTOR } fun save(actor: Actor): Unit = actorDao.insert(actor) }이러한 방식으로 Repository 가 구현되어 있을 때, @SpringBootTest class ActorRepositoryTest( private val actorRepository: ActorRepository, ): StringSpec({ "insert test" { val actor = Actor().apply { firstName = "John" lastName = "Doe" } println("Actor before insert: $actor") val insertedActor = actorRepository.save(actor) } }) { override fun extensions() = listOf(SpringExtension) } 위 쿼리가 실행됩니다제가 예상했던 insert into "actor" ("first_name", "last_name") values(?, ?) 과는 다르게 id 값이 0으로 고정되어 생성되더라구요generate dao 를 생성하는 방법이 잘못된 걸까요?
-
미해결김영한의 실전 데이터베이스 입문 - 모든 IT인을 위한 SQL 첫걸음(SQL부터 차근차근)
DataGrip 사용시
안녕하세요! 학교에서는 MYSQL Workbench 가 아니라 Datagrip 을 사용할거라고 말씀해주셨는데, 이 강의를 통해서 MYSQL Workbench 를 배워도 다시 또 Datagrip 을 배워야 하는건가요 ?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
한글 깨짐
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.콘솔창이 깨지는데 관리자 옵션으로 beta체크도 해보고 gradle.properties도 해보고 build.gradle에 넣어보라는거 전부 넣어보고 코드 명시로도 해봤는데 안됩니다. 어떻게 해야 할까요
-
미해결프로그래밍 시작하기 : 도전! 45가지 파이썬 기초 문법 실습 (Inflearn Original)
실행오류
똑같이 코드 작성했는데 왜 오류가 나는건지 모르겠어요 ㅠㅠ!
-
미해결[리뉴얼] 타입스크립트 올인원 : Part2. 실전 분석편
React19에서 useRef 타입 정의의 변화
안녕하세요 제로초님!질문은 아니고, 제가 강좌를 보다가 알게 된 사실을 전해드리고 싶은데 질문답변 게시판 외에 마땅치가 않아 이곳에 남깁니다.이미 알고 계실 수도 있지만, React 19에서는 useRef 타입 정의에 MutableRefObject 자체가 사라진 것 같아요! 혹시 강좌 리뉴얼하시거나 할 때 참고하시면 좋을 것 같습니다ㅎㅎ//v19 function useRef<T>(initialValue: T): RefObject<T>; function useRef<T>(initialValue: T | null): RefObject<T | null>; function useRef<T>(initialValue: T | undefined): RefObject<T | undefined>항상 감사합니다~
-
해결됨두고두고 써먹는 유니티 VR
ray 가 하나만 나가는데 문제가 뭘까요
controller tracking 설정까지 끝냈는데, 핑크색상으로 ray가 두개가 안나가고 하나만 나가는데 문제가 뭘까요?
-
해결됨데이터 분석 SQL Fundamentals
조인실습03 - join의 pk-fk join
안녕하세요 조인실습03 - 8:25에서 join 관련 질문입니다. [ 이해한 내용 ]- shippers의 shipper_id - orders의 ship_via컬럼명만 다를 뿐, shipper_id가 pk컬럼인데,orders에서 fk로 만들 때 ship_via로 만든 것이다.그래서 두 컬럼이 조인된다. [ 궁금한 사항 ]두 컬럼이 PK - FK 관계라는 판단 근거가 어떻게 되나요?Dbeaver에서 이를 쉽게 확인할 수 있나요?제가 수강한 진도까지는 이러한 내용이 나오지 않고ERD를 봐도 모르겠어서 질문드립니다.
-
미해결데이터 분석 SQL Fundamentals
조인실습03 - join의 pk-fk join
안녕하세요 조인실습03 - 8:25에서 join 관련 질문입니다. [ 이해한 내용 ]- shippers의 shipper_id - orders의 ship_via컬럼명만 다를 뿐, shipper_id가 pk컬럼인데,orders에서 fk로 만들 때 ship_via로 만든 것이다.그래서 두 컬럼이 조인된다. [ 궁금한 사항 ]두 컬럼이 PK - FK 관계라는 판단 근거가 어떻게 되나요?Dbeaver에서 이를 쉽게 확인할 수 있나요?제가 수강한 진도까지는 이러한 내용이 나오지 않고ERD를 봐도 모르겠어서 질문드립니다.
-
미해결쿠버네티스 어나더 클래스-Sprint 1, 2 (#실무기초 #설치 #배포 #Jenkins #Helm #ArgoCD)
K8s 대시보드의 신규 리소스 생성시 이슈
대시보드에서 복사해서 내용 넣었을 때해당과 같은 이슈가 발생하시는 분들 계시면..vi 로 yaml 하나 만들어서 붙여넣은 뒤에chmod +x ~.yamlk apply -f ~.yaml하니까 가능합니다.혹시 헷갈리시는 분들 참고!!!...
-
미해결김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션
55. 네트워크 프로그램5 - 자원정리2 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.섹션9 : 네트워크 - 프로그램255. 네트워크 프로그램5 - 자원 정리2 여기 SessionV5에서 try-with-resources를 적용하기 위해 try에 소캣 input, output 다 넣는데 제가 실수로 socket을 넣지 않고 다른 코드 다 작성후 코드를 실행했는데 마지막에 잘 정리된건지 확인하는 로그log("연결 종료 : " + socket + "isClosed : " + socket.isClosed());여기서 true로 나오는데 이건 윈도우라서 그런건가요? 부가 설명부분에 윈도우 os는 tcp연결 강제 종료하기때문에 EOFExcepoin이 아니라 SocketException : Connection reset 이런 예외가 발생한다고 설명이 되어있어서 소캣을 빼먹고 자원정리해도 그냥 정리된 상태로 표시되는건지 궁금합니다.
-
미해결LangGraph를 활용한 AI Agent 개발 (feat. MCP)
InvalidUpdateError: At key 'tax_deduction': Can receive only one value per step. Use an Annotated key to handle multiple values.
InvalidUpdateError: At key 'tax_deduction': Can receive only one value per step. Use an Annotated key to handle multiple values. For troubleshooting, visit: https://python.langchain.com/docs/troubleshooting/errors/INVALID_CONCURRENT_GRAPH_UPDATEOutput is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings... graph를 최종 실행하니 에러가 발생하네요여러 노드가 한가지 값을 바꾸려고 한다는 얘기 같은데 langgraph 0.6.3langgraph-checkpoint 2.1.1langgraph-prebuilt 0.6.3langgraph-sdk 0.2.0제 랭그래프에서 지원이 안되는걸까요 ?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
GetMapping -> newItem 에서 @modelAttribute 가 있는 이유가 있나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.@GetMapping("/items/new") public String newItem(@ModelAttribute ItemForm form){ return "item-form"; }이부분에서 @ModelAttribute 로 itemForm 을 받아오는데, 왜 ModelAttribute 가 있는지 모르겠습니다. html 에 보면 item-form 도 ModelAttribute 에서 받아온 값을 안쓰는 것 같은데 따로 사용하는 이유가 있을까요
-
미해결[2025] 비전공자도 한 번에 합격하는 SQLD 올인원
ORA-12541 오류
SQL 하루는 잘 이용했는데 다음날 이렇게 뜹니다... ㅠㅠ
-
미해결[리뉴얼] 맛집 지도앱 만들기 (React Native & NestJS)
[2-0] Stack Navigation 에러
강의 내용대로 설정하고 App에 <AuthNavigation />을 추가하니 아래와 같은 에러가 발생했습니다.아직 강의를 두 개밖에 듣지 않았는데, 이 에러 때문에 진도를 나가지 못하고 해결하느라 너무 많은 시간을 소모하고 있습니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
페이징 조건시 조회수 정렬 기능 질문
강사님 안녕하세요.게시판 조회시 페이징으로 처리할때 조회수를 오름차순, 내림차순 정렬하는 기능이 있다면 현재 강의 설계 기준으로 어떻게 구현할 수 있을까요? 제가 생각한 방법은 다음과 같습니다.사전 조건:view에서 조회수 데이터는 redis를 바라봄개수 백업 적용 / 단위는 10페이징 쿼리에서 RDB 백업 테이블의 조회수 기준으로 정렬코드 레벨에서 redis 데이터 기준으로 한번 더 정렬 문제는, 2번에서 한 페이지의 데이터만 정렬이 되기 대문에 페이지를 넘어갈때 정렬이 깨지는 현상이 발생합니다 ㅠ 데이터 전체를 메모리에 한번에 조회하지 않고 할 수 있는 방법이 있을까요?