묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실리콘밸리 빅테크 29개의 실습으로 배우는 시스템 디자인 설계
쿠폰 문의
고성능 실시간 분산 시스템 RabbitMQ + Kafka + Redis 실전 프로젝트쿠폰이 비활성화되었다고 나오는데 혹시 새로운 쿠폰 링크를 업데이트해주실 수 있나요?
-
미해결[자바스크립트부터 리액트까지] 포기없는 React로 가는 길 [Full vers.]
제가 신청한강좌들 무제한으로 변경즘부탁드릴게요
[자바스크립트부터 리액트까지] 포기없는 React로 가는 길 [Full vers.]122/ 122강(100%)2027. 01. 01. 23:59 만료모던 웹 인터렉티브 CSS3 부트캠프 [Full vers.]78/ 78강(100%)2027. 01. 01. 23:59 만료쌩초보, 비전공자를 위한 [HTML 스타터] 부트캠프 이3강좌가 수강기간이 제한이있어서 무제한으로 변경즘부탁드립니다.
-
미해결부트스트랩을 활용한 반응형 웹제작[기본 개념편] 부트캠프
수강기간을 무제한으로 변경부탁드립니다.
수강기간 무제한으로 변경즘 부탁드릴게요
-
미해결강화학습 입문에서 Deep Q-learning/Policy Gradient까지
16:07슬라이드에소 헷갈리는 부분이 있습니다
Policy Network(Q)와 일반적인 Q-learning 문제에서의 behaviour policy(b)가 각자 하는 역할이 비슷한거 같은데, 만약 틀리다면 추가적인 설명을 부탁드려도 될까요? 왜냐하면, '탐험'의 성격?을 각각의 net과 policy가 수행한다고 생각했습니다. 우선 network관점에서는 특정 행동 결정 규칙에 따라 weight를 형성하는데 이때 그리디 action에 대한 value를 추정(max함수)하는 target network에 비해선 '활용'보다는 '탐험'을 하고 있다고 생각합니다 -> 행동 규칙에 따라 transition을 입력으로 받아 weight를 업데이트 하기 때문. 이로 인해 일반적인 Q-learning에서의 b도 max를 출력하는 target policy, pi대신 e-그리디 정책으로 일정 확률 e로 모든 행동을 선택할 수 있는 기믹을 활용하여 '탐험'을 하기 때문에 위와 같은 생각을 하였습니다.
-
미해결스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
컨슈머 이벤트 중복 처리
안녕하세요! 자주 질문드리는데 정성껏 답변해주셔서 감사합니다! 동일한 이벤트가 중복 전송될 가능성이 있기 때문에 article-read 서비스에 이벤트 id를 통한 중복 처리 로직을 추가 하려고합니다.article-read 는 redis를 사용하고 있기 때문에 redis에 이벤트 id를 저장해 해결하려고했습니다. 예를 들어 article-read가 이벤트를 받았을때redis 에서 이벤트 id 확인동일한 이벤트 id가 저장돼 있으면 추가 처리 안하고 message ack redis 에서 이벤트 id 확인동일한 이벤트 저장된게 없으면 서비스 로직 수행서비스 로직 결과 redis 업데이트처리 완료한 이벤트 id redis 저장 이런식으로 진행하려 했으나 만약 어떠한 문제로 인해서비스 로직 결과 redis 업데이트 ( 성공 )처리 완료한 이벤트 id redis 저장 ( 실패 )하게되면 이벤트 처리는 성공했지만 처리된 이벤트 저장에는 실패해 추후에 중복 처리가 발생할 가능성이 생길 것 같습니다. 이러한 문제 해결을 위해서비스 로직 결과 redis 업데이트처리 완료한 이벤트 id redis 저장두 작업을 하나의 트랜잭션으로 묶어 처리하려고했지만 rdb 와 동작이 다르기 때문에 (롤백 기능 제공 안함 등) 적절한 방법인지 판단이 안서는 상태네요 혹시 article-read에 이벤트 중복 처리를 한다고 하면 어떻게 구현이 가능할지 여쭤보고싶습니다
-
미해결Next.js 완벽 마스터 (v15): 노션 기반 개발자 블로그 만들기 (with 커서AI)
퀴즈 질문 풀이 오류
저는 아무래도 정답이 C 같은데.. 질문에서 /docs도 포함되어야 한다고 했으므로, 옵셔널 캐치올만이 루트 경로(/docs)까지 모두 처리할 수 있는거 아닌가요? 다 학습하고 혼란이 오네요..
-
미해결백엔드 6주 실전 미션과 1:1 피드백으로 완성하는 합격 포트폴리오
4-9 낙관적 락, 비관적 락
해당 강의 수강 중 Facade 패턴에 대해 알게 되었습니다 그런데 테스트 코드에만 Facade가 적용되어 있고 Controller에는 바로 서비스 코드를 호출하게 되어 있는데요. 학습용 예시 코드여서 이런 것인지 다른 의도가 있는것인지 궁금합니다!
-
미해결대세는 쿠버네티스 (초급~중급편)
PVC실습 질문 (왜 hostPath 실습이 영향을 주는지)
안녕하세요. 강사님Volume-실습 강의 11:42에서"아까 hostPath실습에 만들어 놓은 path를 사용하기 떄문에 file.txt가 보인다" 위 말씀을 통해 아래와 같이 결론을 낼 수 있을까요?hostPath실습때 만든 Volume과PVC 실습에서 만든 PV는 워커노드1의 /node-v 경로를 공유한다 왜냐하면
-
미해결친절한 블렌더 - [LV.3] 캐릭터 애니메이션
카메라 뷰가 이상해졌어요 ㅜㅜㅜ
갑자기 카메라뷰가 원근이 엄청 먹는것 같아요 ㅜㅜㅜㅜㅜ카메라뷰가 왜 이상해졌는지 되돌리는방법이 뭔지가 궁금합니다 ㅜㅜㅜㅜㅜ강의 너무 잘 보고있습니다!그런데 혼자하다보니 자꾸 삑사리가 나서 질문하게 되네요좋은 강의 감사합니다!!!!
-
미해결베개 투자법: 자면서 돈 버는 AI 주식 자동 매매 머신
[베개투자법 :자면서 돈버는 AI주식 자동매매머신] 종목을 100개까지 추가 하고자 합니다.
안녕하세요. 강의 잘 들었습니다. 프로그램도 잘 작동합니다. 단지 종목수가 적어 종목을 100개까지 추가하고자 합니다. 어느 부분을 수정해야하는지 문의 드립니다.
-
미해결비개발자 4주만에 수익화 서비스 만들기: AI 바이브코딩 웹 + 앱 ALL IN ONE
구글 애드 센스 정책 위반을 해결하기 위해선 도데체..
아니 며칠이나 기다렸는데,웹에 특별히 더 넣을 기능도 없는데,어떻게 더 고품질로 만들죠...게시글도 15개이상 1000자이상 무조건 넣어야하나요~?ㅜ정확히 뭐가 어디가 부족하다라고 해주면 좋은데 특별한 고지도 없고..,이렇게 웹승인 받기가 힘들면...어떻게 만들으라구..ㅜㅠ혹시 방법있을까요 샘?커서는 두리뭉실한 얘기만 해줘서 또 며칠이나 기다려서 실패하면 어떡하나 고민입니다.그리고 커뮤니티 즉 회원가입,로그아웃 기능에 대해서 조금더 설명이나 관련 링크를 좀 주실수 있을까요?회원가입이나 뭐가 되야 결제시스템도 등록이 가능한데 그런게 없어서 계속 헤매고 있네요...
-
미해결
코딩 1:1 클래스 코드스케이프 모집
🌟 코딩을 탐험하는 CodeScape(코드스케이프) 🌟 안녕하세요 코드스케이프 스터디입니다! 2학기를 맞이해서 1학기에 이어 새학기 C언어, JAVA 4주 마스터 스터디와 응용 심화 스터디를 준비하고 있습니다! 중간고사 기간 전에 빠르게 기본기 점검, 마스터하고 싶은 분들 모집합니다! 자세한 커리큘럼은 노션 통해서 확인 해주세요~! 📖 <프로그램 및 커리큘럼 소개>https://polar-zydeco-01f.notion.site/CodeScape-17eab7600a9d805bb0a2e0b474d895a8?pvs=4 📝모집기간 및 대상 📍모집 기간 : 09.01 (월) ~ 09.21 (일)📍진행 기간 : 4~5주차 커리큘럼으로 준비중 (클래스마다 조금씩 상이할 수 있음.)📍모집대상 ✅ 서울권 대학생(휴학생도 환영)✅ 서울 거주자 전공자 & 비전공자 상관 없음!✅ 새학기 시작하고 C Langauge 혹은 Java 개념 4주안에 기본기 쌓고 싶은 분!✅ C Langauge 혹은 JAVA 주력언어로 희망하는 개발자 지망생! (심화반은 사이드 프로젝트 진행예정.)✅ 6주차 커리큘럼으로 준비중 (스터디마다 조금씩 상이할 수 있음.) ✉ <신청 및 문의>📤신청링크: https://forms.gle/Nwzj5mqPVDxHAvLr9📤문의링크: 김지석 010-2973-4106
-
미해결[4주 과정] <클로드 코드> 완독 챌린지 : 매일 1시간씩 4주 동안 클로드 코드 도서 완독하기!
토큰으로 구매해도 괜찮을까요?
토큰 구매 페이지가 먼저떠서,, 토큰으로 구매했는데, 가성비가 더 나쁠까요
-
미해결김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션
제대로 이해한게 맞나 궁금합니다
close() 메서드에서 synchronized와 if(closed){ return;} 조건문을 해준 이유가 해당 세션 종료시 close() 메서드 호출과 서버 종료시 SessionManager의 closeAll()을 통한 close() 메서드 호출이 동시에 되고 중복으로 호출 되는걸 막기 위해서 해준거라고 이해하면 될까요?
-
미해결
머리 식힐 겸 같이 산책 가실 분 구해요~
https://open.kakao.com/o/sIGTphyh
-
미해결독하게 시작하는 C 프로그래밍
필수실습문제 파일을 어떻게 찾으면 될까요?
수업제목/번호와 파일과 매칭이 잘 안되어 있어서 은근 찾기가 불편하네요. 물론 수업중에 선생님 화면 참고해서 찾기를 해요. 그런데 필수실수문제는 그방법이 안통하네요. [필수 실습 문제] 평균값 구하기 예를 들어 말씀해 주시면 감사하겠습니다
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
셀레니움 PDF자료는 받을 수 있나요
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의 내용중에 셀레니움 PDF자료를 보면서 하시던데, 받을 수 있는 곳이 있나요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-Q 질문있습니다
안녕하세요 큰돌님 문제를 풀다가 이해안되는 부분이 있어 질문드립니다.https://www.acmicpc.net/source/98984224Q1. 저는 dfs 부분에서 0일때 1일때 다르게 처리 했는데요 1만나면 방문처리, 벡터에 담고, 더이상 탐색을 안하는데 왜 쌤이 구현한 방식이랑 치즈개수에서 차이가 나는지 궁금합니다.주석처리한 부분이 쌤이 구현하신 코드입니다. Q2. 이런 동시 확산문제에서는 dfs(), bfs()에 좌표뿐만 아니라 동 시간대라는 정보를 주기 위해시간 정보도 같이 인자로 넣어서 풀어도 될까요? bfs(int y, int x, int t)
-
미해결Next + React Query로 SNS 서비스 만들기
팔로우 추천 목록이 빈 배열로 들어옵니다.
안녕하세요. 팔로우 추천 API는 팔로워 수가 많은 순으로 최대 3명을 가져오도록 되어 있는 것으로 알고 있습니다.현재 발생하는 현상으로는 회원가입한 유저가 없는 경우에 기존 유저에게 추천 목록이 빈 배열로 나타납니다.그런데 회원가입 후 로그인하면 추천 목록에 로그인한 본인 아이디가 뜨고, 로그아웃 후 기존 유저 A로 로그인하면 이전에 회원가입한 유저 아이디가 추천 목록에 나타납니다.기존 유저 A가 그 회원가입 한 유저를 팔로우한 상태에서, 다른 기존 유저 B로 로그인하면 A가 팔로우했던 아이디가 추천 목록에서 사라져 있습니다.팔로우나 언팔로우 기능을 사용할 때 데이터는 정상적으로 들어오는 것으로 확인되고, 팔로워가 있는 아이디가 추천 목록에 나타나야 하는데 빈 배열로 표시됩니다.어느 부분을 점검해야 문제를 정확히 파악할 수 있을지 감이 잡히지 않아 질문 남겨봅니다..!import { MouseEventHandler } from "react"; import { User } from "@/model/User"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { useSession } from "next-auth/react"; type Props = { user: User; }; export default function FollowRecommend({ user }: Props) { const queryClient = useQueryClient(); const { data: session } = useSession(); const followed = !!user.Followers?.find((v) => v.id === session?.user?.id); // 팔로우 const follow = useMutation({ // 호출 시마다 userId를 전달 mutationFn: (userId: string) => { return fetch( `${process.env.NEXT_PUBLIC_BASE_URL}/api/users/${userId}/follow`, { method: "POST", credentials: "include", }, ); }, onMutate: (userId: string) => { const data: User[] | undefined = queryClient.getQueryData([ "users", "followRecommends", ]); if (data) { // 내가 팔로우 하는 대상 // User 배열 중에 팔로우 버튼을 누른 대상의 userId를 찾아서 그 유저의 Followers 수정 const index = data.findIndex((users) => users.id === userId); const shallow = [...data]; shallow[index] = { ...shallow[index], Followers: [{ id: session?.user?.id as string }], _count: { ...shallow[index]._count, Followers: shallow[index]._count.Followers + 1, }, }; queryClient.setQueryData(["users", "followRecommends"], shallow); } }, onError: (error, userId: string) => { console.error("팔로우/언팔로우 에러:", error); console.log("실패한 userId:", userId); const data: User[] | undefined = queryClient.getQueryData([ "users", "followRecommends", ]); if (data) { const index = data.findIndex((users) => users.id === userId); const shallow = [...data]; shallow[index] = { ...shallow[index], // 내 아이디가 대상 유저의 팔로워 목록에서 빠져야함 Followers: shallow[index].Followers.filter( (f) => f.id !== (session?.user?.id as string), ), _count: { ...shallow[index]._count, Followers: shallow[index]._count.Followers - 1, }, }; queryClient.setQueryData(["users", "followRecommends"], shallow); } }, }); // 팔로우 끊기 const unfollow = useMutation({ mutationFn: (userId: string) => { return fetch( `${process.env.NEXT_PUBLIC_BASE_URL}/api/users/${userId}/follow`, { method: "DELETE", credentials: "include", }, ); }, onMutate: (userId: string) => { const data: User[] | undefined = queryClient.getQueryData([ "users", "followRecommends", ]); if (data) { const index = data.findIndex((users) => users.id === userId); const shallow = [...data]; shallow[index] = { ...shallow[index], Followers: shallow[index].Followers.filter( (f) => f.id !== (session?.user?.id as string), ), _count: { ...shallow[index]._count, Followers: shallow[index]._count.Followers - 1, }, }; queryClient.setQueryData(["users", "followRecommends"], shallow); } }, onError: (error, userId: string) => { const data: User[] | undefined = queryClient.getQueryData([ "users", "followRecommends", ]); if (data) { const index = data.findIndex((users) => users.id === userId); const shallow = [...data]; shallow[index] = { ...shallow[index], Followers: [{ id: session?.user?.id as string }], _count: { ...shallow[index]._count, Followers: shallow[index]._count.Followers + 1, }, }; queryClient.setQueryData(["users", "followRecommends"], shallow); } }, }); const onFollow: MouseEventHandler<HTMLButtonElement> = (e) => { e.stopPropagation(); e.preventDefault(); if (followed) { console.log("언팔로우"); unfollow.mutate(user.id); } else { console.log("팔로우"); follow.mutate(user.id); } };
-
해결됨남박사의 파이썬으로 실전 웹사이트 만들기
첨부파일 삭제
@blueprint.route("/edit/<idx>", methods=["GET", "POST"]) @login_required def board_edit(idx): board = mongo.db.board try: doc = board.find_one({"_id": ObjectId(idx)}) except Exception: doc = None if not doc: flash("해당 게시물이 존재하지 않습니다.") return redirect(url_for("board.lists")) if str(session.get("id") or "") != str(doc.get("writer_id") or ""): flash("글 수정 권한이 없습니다.") return redirect(url_for("board.lists")) if request.method == "GET": return render_template("edit.html", data=doc, title="글수정") # --- POST --- title = (request.form.get("title") or "").strip() contents = (request.form.get("contents") or "").strip() deleteold = "deleteoldfile" in request.form # ✅ 체크박스 감지 old_file = doc.get("attachfile") filename = old_file f = request.files.get("attachfile") if f and f.filename: base, ext = os.path.splitext(secure_filename(f.filename)) new_name = f"{base}_{int(time.time())}{ext.lower()}" save_dir = app.config["BOARD_ATTACH_FILE_PATH"] os.makedirs(save_dir, exist_ok=True) f.save(os.path.join(save_dir, new_name)) if old_file: board_delete_attach_file(old_file) filename = new_name elif deleteold: if old_file: board_delete_attach_file(old_file) filename = None update_set = {"title": title, "contents": contents} if deleteold and filename is None: board.update_one({"_id": doc["_id"]}, {"$set": update_set, "$unset": {"attachfile": ""}}) else: update_set["attachfile"] = filename board.update_one({"_id": doc["_id"]}, {"$set": update_set}) flash("수정되었습니다.") return redirect(url_for("board.board_view", idx=str(doc["_id"])))챗지피티의 도움을 받아 작성했습니다. 근데 삭제 기능만 안되는데 왜 안돼는지 모르겠습니다..