묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결(2026 최신!) 일주일만에 합격하는 정보처리기사 실기
9강 35분경 질문있습니다
표에서는 토탈값이 계속 계산되지만 이는 계산과정에 있어 필요할까봐 넣어주신 예시사항일뿐인거고 코드상으로는I가 15가 되어서 for문이 종료되었을때의 기준 sumQ와 R 을 더하여Total값이 50이 되는과정 한번만 있는게 맞는걸까요? 토탈이 계속 증가할 이유를 찾지 못하겠어서 질문드립니다
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
코딩 살구 클럽 가입 요청드립니다.
이메일은 lshlsh3690@gmail.com 입니다.
-
미해결[6주 과정] 『혼자 공부하는 바이브 코딩 with 클로드 코드』 완독 챌린지 2기
python을 upgrade 와 claude doctor 에러가 나타납니다
• 챌린지 활동 관련 문의: event@hanbit.co.kr• 학습 관련 질문: https://github.com/taehojo/vibecoding/issues⠀깃허브에 질문을 남기실 땐, 아래 3가지를 함께 알려주세요.1. 해당 부분의 챕터와 페이지 번호2. 발생한 오류 메시지 텍스트3. 문제가 된 코드나 오류 화면 캡처
-
해결됨2026년! 백엔드 개발자를 위한 Redis 실전 가이드: 기초부터 실무 패턴까지
인기 게시판 목록(Sorted set)
안녕하세요. 인기 게시판 목록 기능을 Redis의 Sorted Set을 활용해 좋아요 순으로 정렬하는 방식으로 구현하다 고민이 생겨 질문하게 되었습니다.먼저 잦은 데이터 변경을 고려해서 Sorted Set의 member에는 게시판 ID만 저장하고, score에는 좋아요 수를 저장하도록 했습니다.하지만 목록을 생성하기 위해서는 제목, 생성일 같은 부가 정보가 필요한데 이 데이터를 얻는 효율적인 방식에 대해 고민이 생겨 질문을 드리게 되었습니다. AI에게 도움을 받아 2가지 방법을 생각해보았는데 현실성이 있는지 판단 부탁 드립니다.Redis + RDB 조합Redis ZSet에서 상위 10개의 ID 목록을 먼저 조회합니다.해당 ID 목록을 가지고 RDB에 WHERE id IN (...) 쿼리를 날려 상세 데이터를 가져옵니다.데이터베이스의 IN 쿼리는 순서를 보장하지 않기 때문에 애플리케이션에서 Redis가 준 ID 순서대로 리스트를 다시 재정렬하여 반환합니다.제가 생각하기에는 인기 게시판 목록을 조회할 때마다 RDB의 ORDER BY 부하를 줄이려다 오히려 애플리케이션 단에서 정렬과 DB 조회가 일어나다 보니 얻는 것보다는 잃는 게 많은 구조가 아닌지 고민이 됩니다.Redis Sorted Set + Hash 조합정렬 기준(ID, 좋아요 수)은 기존대로 Sorted Set에 관리합니다.게시판의 상세 부가 정보는 Redis의 Hash 자료구조에 따로 캐싱합니다.목록 조회 시 Sorted Set에서 ID를 뽑은 후 DB를 거치지 않고 Hash에서 상세 데이터를 조회합니다.이 방식은 DB에 부하를 줄일 수 있지만 데이터가 자주 변하게 된다면 레디스에서 데이터를 자주 변경해야 되어 메모리에 큰 부하를 줄 수 있을 것 같아 고민이 되는 것 같습니다.
-
미해결한 입 크기로 잘라먹는 React.js 실전 프로젝트 - SNS 편
"포스트 생성에 실패했습니다" 실패 문구와 함께 에러가 발생합니다ㅠㅠ
안녕하세요 정환님! 정환님의 강의를 들으면서 코드를 따라 작성해보다가 포스트와 이미지를 최종적으로 업로드 하는 과정에서 아래의 캡쳐 사진과 같이 포스트 생성에 실패했다는 에러 메시지가 뜨게됩니다. 네트워크 탭에 보면, 포스트 부분은 잘 전달이 되는거같은데 이미지 생성에 관한 결과가 보이지 않는 것으로 보아 이미지 생성 관련 코드에서 문제가 생긴것같은데 무슨 문제일까요??..ㅠ 아래는 해당 코드들입니다. 이미지 생성 관련 코드를 가져왔는데 혹여나 다른 부분의 코드가 필요하면 추가 업로드 드리겠습니다. api/post.tsimport type { PostEntity } from './../types'; import supabase from '@/lib/supabase'; export async function createPost(content: string) { const { data, error } = await supabase .from('post') .insert({ content }) .select() .single() if (error) throw error return data } export async function createPostWithImages({ content, images, userId }: { content: string images: File[] userId: string }) { // 1. 새로운 포스트 생성 (맨 위에서 생성한 포스트 비동기 함수 가져오기) const post = await createPost(content) if (images.length === 0) return post // 2. 이미지 업로드 try { const imageUrls = await Promise.all( images.map((image) => { const fileExtension = image.name.split(".").pop() || "webp" const fileName = `${Date.now()}-${crypto.randomUUID()}.${fileExtension}` const filePath = `${userId}/${post.id}/${fileName}` return uploadImage({ file: image, filePath }) }) ) // 3. 포스트 테이블 업데이트 const updatedPost = await updatePost({ id: post.id, image_urls: imageUrls }) return updatedPost } catch(error) { await deletePost(post.id) throw error } } export async function updatePost(post: Partial<PostEntity> & { id: number }) { const { data, error } = await supabase .from("post") .update(post) .eq("id", post.id) .select() .single() if (error) throw error return data } export async function deletePost(id: number) { const { data, error } = await supabase .from("post") .delete() .eq("id", id) .select() .single() if (error) throw error return data } hooks/mutations/post/use-create-post.tsimport type { UseMutationCallback } from './../../../types'; import { createPost, createPostWithImages } from '@/api/post'; import { useMutation } from '@tanstack/react-query'; export function useCreatePost(callbacks?:UseMutationCallback) { return useMutation({ mutationFn: createPostWithImages, onSuccess: () => { if(callbacks?.onSuccess) callbacks.onSuccess() }, onError: (error) => { if (callbacks?.onError) callbacks.onError(error) } }) } components/modal/post-editor-modal.tsximport { Button } from '@/components/ui/button' import { Dialog, DialogContent, DialogTitle } from '@/components/ui/dialog' import { useCreatePost } from '@/hooks/mutations/post/use-create-post' import { usePostEditorModal } from '@/store/post-editor-modal' import { useSession } from '@/store/session' import { ImageIcon, XIcon } from 'lucide-react' import { useRef, useState, useEffect, ChangeEvent } from 'react' import { toast } from "sonner" import { Carousel, CarouselContent, CarouselItem } from '../ui/carousel' type Image = { file: File, previewUrl: string } export default function PostEditorModal() { const session = useSession() const { isOpen, close } = usePostEditorModal() const { mutate: createPost, isPending: isCreatePostPending } = useCreatePost({ onSuccess: () => { close() }, onError: (error) => { toast.error("포스트 생성에 실패했습니다", { position: "top-center" }) } }) const [content, setContent] = useState("") const [images, setImages] = useState<Image[]>([]) const textareaRef = useRef<HTMLTextAreaElement>(null) const fileInputRef = useRef<HTMLInputElement>(null) const handleCloseModal = () => { close() } const handleCreatePostClick = () => { if (content.trim() === "") return createPost({ content, images: images.map((image) => image.file), userId: session!.user.id }) } const handleSelectImages = (e:ChangeEvent<HTMLInputElement>) => { if (e.target.files) { const files = Array.from(e.target.files) files.forEach((file) => { setImages((prev) => [ ...prev, { file, previewUrl: URL.createObjectURL(file) }, ]) }) } e.target.value = "" } const handleDeleteImage = (image:Image) => { setImages((prevImages) => prevImages.filter((item) => item.previewUrl !== image.previewUrl)) } useEffect(() => { if (textareaRef.current) { textareaRef.current.style.height = "auto" textareaRef.current.style.height = textareaRef.current.scrollHeight + "px" } }, [content]) useEffect(() => { if (!isOpen) return textareaRef.current?.focus() setContent("") setImages([]) }, [isOpen]) return ( <Dialog open={isOpen} onOpenChange={handleCloseModal}> <DialogContent className="max-h-[90vh]"> <DialogTitle>포스트 작성</DialogTitle> <textarea disabled={isCreatePostPending} ref={textareaRef} value={content} onChange={(e) => setContent(e.target.value)} className="max-h-125 min-h-25 focus:outline-none" placeholder="무슨 일이 있었나요?" /> <input onChange={handleSelectImages} ref={fileInputRef} type="file" accept="image/*" multiple className="hidden" /> {images.length > 0 && <Carousel> <CarouselContent> {images.map((image) => <CarouselItem className="basis-2/5" key={image.previewUrl}> <div className="relative"> <img src={image.previewUrl} className="h-full w-full rounded-sm object-cover" /> <div onClick={() => handleDeleteImage(image)} className="absolute top-0 right-0 m-1 cursor-pointer rounded-full bg-black/30 p-1" > <XIcon className="h-4 w-4 text-white"/> </div> </div> </CarouselItem>)} </CarouselContent> </Carousel>} <Button onClick={() => { fileInputRef.current?.click() }} variant={"outline"} className="cursor=pointer" > <ImageIcon/> 이미지 추가</Button> <Button disabled={isCreatePostPending} onClick={handleCreatePostClick} className="cursor=pointer"> 저장 </Button> </DialogContent> </Dialog> ) }
-
미해결(2026 최신!) 일주일만에 합격하는 정보처리기사 실기
11강 3:20
문자열 쓸때 %를 2번 써야 출력시 %가 나온다고 하셨는데 /같은 경우는 한번만 써도 되는건가요? 혹시 %처럼 꼭 두번 써야 되는 문자가 더 있는지 궁금합니다
-
미해결대세는 쿠버네티스 (초급~중급편)
설치 문제 없는건가요?
안녕하세요 선생님kubectl get pod -A 와kubectl get nodes 쳐서 이미지와 같이 모두 러닝 상태와마스터 노드 1 및 워커 노드 2가 Ready 상태로 뜨면 설치 과정은 무사히 넘어간건가요? 그럼 다음에 다시 접속하려고 할때는 그냥 버추얼 머신으로 실행만 시키면 되는걸까요? 감사합니다
-
미해결(2026 최신!) 일주일만에 합격하는 정보처리기사 실기
10강 11:42
ptintf("\n");에서 \n이 있길래 출력값은 개행 되어 나오는 줄 알았는데요왜 출력값이 아래와 같지 않은지 모르겠습니다, 그리고 아래와 같은 결과가 나오려면 코드가 어떻게 쓰여져야 하는지도 궁금합니다12345
-
미해결대세는 쿠버네티스 (초급~중급편)
xshell 접속오류
안녕하세요 선생님 xshell 접속하는 과정중에workernode1 이랑 2 는 잘 접속이되는데 마스터노드에서만 여기서 반응이 없는데 왜 그런걸까요?감사합니다
-
미해결즐거운 블렌더 - 아이소메트릭 하우스
s,y로 책등 둥글리기가 안됩니다ㅠㅠ
17:05 책등 부분만 선택해서 s-y 눌러서 다시 동그랗게 해주는 부분에서, 앞의 모델링을 모두 똑같이 했는데 저는 이렇게 책표지와 종이가 분리되면서 동그래져요 어떤부분에서 문제가 있었던걸까요?혹시나 모델링에서 실수한게 있을까봐 처음부터 스크립트 보면서 다시 몇번이나 따라해봤는데 결과가 똑같아요..ㅠ- 막힌 부분의 시간(예를들면 3:24)과 안 되는 부분의 현상을 자세히 적어주세요.- 사진을 첨부해주시면 상황에 대한 이해가 빠르기 때문에 되도록 같이 올려주세요.- 사진은 다른 상황도 보이도록 스크린샷으로 찍어주시면 더 좋습니다.
-
미해결타입스크립트로 배우는 Next.js 16+ 완전 정복 : 기초부터 최신 아키텍처까지
쿠키 생성 관련
카카오 로그인 후 이메일을 입력하고 몽고DB에 이메일과 refresh token이 저장된 것 까지 확인은 했는데 쿠키가 생성되지 않고 있네요. 강사님 네이버메일로 소스코드링크를 보냈습니다.
-
미해결성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
클로저의 형태로 만들다
되게 간단한 질문인데요, 클로저 파트를 듣다보면 "함수를 클로저 형태로 만들었다.."라는 말씀을 종종 하시는데이걸 콜백함수를 받는 함수라고 보면 되겠죠...?함수자체는 콜백을 받는 함수로 만들고, 실행하는 구문쪽에서 클로저의 형태로 실행했다 =>로 이해해도 되려나요?.?
-
해결됨쉽게 배우는 데이터 모델링 : 기본부터 실전 테이블 설계까지 (DASP/DAP)
관계도출부분 질문입니다.
학습 관련 질문을 남겨주세요. 구체적으로 적을수록 좋아요!실습중에 궁금한점이 있으시면 erdcloud 링크를 첨부해주세요!데이터 모델링 설명중에 나오는 '용어'들은 강의나 책마다 조금씩 다를 수 있습니다.https://drive.google.com/file/d/1ImDk6PSaolScBZnvEw_Y_Y8Kzxh7wvZd/view?usp=sharing질문 내용안녕하세요, 강사님.DAP 시험을 준비하며 강의를 수강하고 있는 수강생입니다. 관계 도출 부분에서 막히는 지점이 있어 질문드립니다.'물류운송시스템' 문제의 화물운송스케줄 엔터티 관련 질문입니다. 화물운송과 운송수단스케줄이 M:M 관계라고 판단하여, 식별자를 운송번호 + 운송스케줄번호 + 운송순번으로 도출했습니다. 그런데 답안에서는 운송출발순번과 도착운송순번 두 개의 속성이 식별자에 포함되어 있었습니다.하나의 화물이 특정 스케줄 내에서 출발 경유지와 도착 경유지를 함께 가져야 한다는 점 때문에 순번이 두 개로 나뉜 것인지 궁금합니다. 이런 경우를 어떤 기준으로 판단해서 식별자를 도출해야 하는지 설명 부탁드립니다.감사합니다.
-
미해결[Unity6] Claude Code CLI로 게임 개발부터 출시까지
프로덕션 부분 사용 불가
강의 순서대로 따라오면서 구글 스토어 출시 강의인데, 해당 화면에서 진입이 안되는데, 버튼 눌렀을때 프로덕션, 12명 이상의 테스터가 비공개 테스트 참여를 선택, 12명 이상의 테스터를 대상으로 14일 이상 비공개 테스트 진행이 있습니다. 해당 부분이 필수인가요 ?
-
미해결클로드를 활용한 AI 업무 자동화 완전 정복
강의중 '스타터킷'을 링크로 보내줬다고 하는데, 어디서 받는건가요?
클로드코드 실습 강의 2분 40초정도에 '스타터킷'을 링크로 보내줬다고 하는데, 어디서 받을 수 있는건가요?
-
미해결Three.js로 시작하는 3D 인터랙티브 웹
rotation.x 방향
큐브의 고개를 들게 만드려면 -20을 해야하는 것 아닌가 싶어 질문드립니다! 마찬가지로 왼쪽을 보게 돌리려면 y도 -인 것 같아요
-
미해결[Rookiss] 클로드 코드 개발을 위한 CS 입문 (인터랙티브 교재)
디스코드 초대를수락할 수 없음이라고 떠요
선생님 디스코드 안들어가져요 ㅠㅠ
-
해결됨실리콘밸리 엔지니어와 함께하는 Docker
docker 마지막 실습(app(flask) + mysql) 연동 과정
#compose.yml 파일 부분 수정depends_on: -dbcompose를 실행하는 과정에서 db가 app보다 먼저 실행되긴 하지만 db 커넥션이 준비되기전에 app이 실행되어 오류가 발생합니다. depends_on: db: condition: service_healthydb의 healthcheck 결과를 실제로 체크해서, healthycheck가 끝날때까지 기다렸다가 app이 실행되기에 오류를 해결할 수 있었습니다.수강생분들 참고하시면 좋을꺼 같습니다.좋은 강의 감사드립니다. 화이팅입니다.!!
-
해결됨QGIS 입문자 올인원 스타터팩 (이론/실습형)
대상좌표계 누락
2강_23번 11분쯤 강의를 듣고 있는데강의에서는 5174 대상 좌표계를 선택했는데제 QGIS 프로그램은 3개 밖에 나오지 않습니다.버전이 다른건가요?
-
미해결프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)
pcskjs@naver.com
강의 자료 제목의 메일 주소로 송부 부탁드립니다.