묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결STM32 CAN 통신
준비물 도움 요청
장비를 살 때 전선같은 경우는 별도의 키트들이 있을까요? 완전 초보라 다소 헷갈리는데 세트가 있다면 안내부탁드리며전선이나 전원 연결 방법 등의 정보도 한 번 다시 알려주시길 바랍니다.. 감사합니다.(장비 구입 중)
-
해결됨Ruby on Rails 공식 가이드 따라잡기
강의 감사합니다.
타입스크립트 환경에서 eslint와 prettier를 사용했었는데요. rails는 혹시 어떤걸 쓰면 되나요? 찾아보니 prettier를 쓰기도 하고 robocop이란걸 쓰기도 하는거 같은데 혹시 vscode에선 어떤 익스텐션을 쓰는게 제일 베스트인지 알 수 있을까요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
WebUtil 관련
WebUtil이 지원하지 않는거 같은데 맞을까요?(WebUtils만 보이네요)
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
todolist 새로고침 했을때 추가했던 데이터들 초기화 되지 않게는 어떻게 하나요??
삭제하기 강의 까지 들었는데따로 데이터를 삭제하지 않았어도 새로고침을 하면 기본 mockData들만 다시 화면에 나타납니다. 새로 고침을 해도 이전 데이터들이 그대로 나오게 하려면 어떻게 해야 하나요?
-
미해결Vue3 완벽 마스터: 기초부터 실전까지 - "실전편"
endOfLine git checkout 할때마다 매번 입력안하는 방법 있을까요?
안녕하세요~윈도우 사용자 입니다.아래 질문 답변 주시면 감사하겠습니다. delete cr error 에러때문에 git checkout 할때마다 매번.eslintrc.cjs 파일에endOfLine auto 를 입력해야하는데,git checkout 시 매번 입력하지 않는 방법이 있을까요?시도해본 방법 1.gitignore 에 .eslintrc.cjs 파일을 추가 -> 실패 시도해본 방법 2 에디터 설정 -실패
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
http://localhost:8080/index.html HTTP ERROR 405 에러..
main/webapp/index.html 경로에 붙여넣기를 했는데 나오지 405 에러가 나옵니다..ㅠ혹시나 해서 메모장 넣기, 인터넷 사용 기록 삭제 모두 해봐도 비슷합니다.. 다른 글보니 ssd 얘기가 있던데 인텔리제이는 C:D 드라이브에 spring.gradle 파일이 있으면 안되는건가요..?
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
nx,ny를 조건문에서 거르는 대신 반복문의 시작을 1부터 n-1까지 하면 되지 않나요?
nx,ny를 조건문에서 거르는 대신 반복문의 시작을 1부터 n-1까지 하면 되지 않나요?강사님처럼 조건문에서 거르신 이유가 궁금합니다.
-
미해결제대로 파는 Git & GitHub - by 얄코(Yalco)
커밋 내용 실수 수정
섹션 4 충돌해결하기에서 main 브랜치에서 Tigers의 manager를 Kenneth로 변경Leopards의 coach를 Nicholas로 변경Panthers의 coach를 Shirley로 변경커밋 메시지: Edit Tigers, Leopards, Panthers을 했어야했는데 main 브랜치에서 전부 manager의 이름으로 변경해버려서 이후 conflict-2에서 충돌이 일어나지 않는 상황이 발생했습니다..이 커밋 내용만 수정하는 방법이 있을 까요?
-
미해결Microservice 설계(with EventStorming,DDD)
다른 BC 또는 마이크로서비스 담당 정보를 어떻게 이용하나요?
컨텍스트 매핑 강의를 듣는 중입니다.대여를 처리하려면 도서 정보, 회원 정보도 필요합니다.다른 BC 또는 마이크로서비스가 관리하는 정보를 어떻게 이용하나요?- 대여할 도서(도서 정보 필요)- 대여할 사용자(회원 정보 필요)
-
해결됨Flutter 앱 개발 실전
CartItem 추가시
extension ImmutableHelper<T> on Iterable<T> { List<T> toImmutable() => List.unmodifiable(this); }이걸 이용해서 전에 있던 코드를 응용해서 List<CartItem> get selectedCartItemList { return state.where((cartItem) => cartItem.isSelected).toImmutable(); }이렇게 이용해도 괜찮을까요 ???
-
미해결
CartItem 시에 불변성을 보장하기 위한 함수
// immutable_helper.dart extension ImmutableHelper<T> on Iterable<T> { List<T> toImmutable() => List.unmodifiable(this); }이걸 만들어서 cart item 추가, 수정, 삭제 시에 써도 괜찮을까요 ????
-
미해결스프링 배치
Batch 성능 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.이 강의를 들으면서 프로젝트에 Batch를 도입하려고합니다.Jenkins에서 파라미터로 Spring Batch에 pageNo이라는 인자에 주입하고 Tasklet 인터페이스를 implements한 커스텀 tasklet에서 공공데이터 포털 api를 호출하여 데이터를 가져오고 이를 db에 적재를 하려고 합니다. Job을 1번 실행하면 Step도 1번 실행하는 방식인데 1번 배치 사이클이 끝나면 pageNo을 1 증가해서 다시 배치를 돌리는 방식입니다. 그래서 아래와 같이 2가지 구현을 생각했습니다. Job은 1번 호출하지만 Step을 반복 실행 VS Job을 반복 호출=======================================전자 방식-장점: 메타 테이블에 JobExecution 등 db에 삽입 및 조회가 많이 일어나지 않는다.-단점: 특정 pageNo이 오류가 날 시 몇번째 pageNo에서 오류가 났는 지 확인을 해야하는데 이를 StepExecutionContext에서 디코딩 후 자바 역직렬화를 해야한다.(DB에서 조회만으로 확인하기 힘듦)=======================================후자 방식-장점: DB에서 조회만으로 pageNo이 몇번째에서 오류가 발생했는 지 쉽게 확인 할 수 있다.-단점: DB에 접근이 많다.=======================================제가 직접 느낀바로는 위와 같습니다. 저도 아직 공부한지 얼마 안되어서 잘 모르기에 Chat GPT에게 물어봤습니다. 아래와 같이 Job을 반복 호출하는건 성능상 좋지 않다고 합니다. GPT의 답변이 정답이 아닐 수 있기에 확인도 받고싶고 만약 Step을 반복적으로 호출하는게 더 낫다면 API용 Spring 서버에서 관리자가 로그인하면 이를 StepExecutionContext에서 가져와서 역직렬화 후 브라우저에 보여주는게 더 나은가싶습니다. 선생님께 자문을 구하고싶습니다.
-
해결됨초보자를 위한 BigQuery(SQL) 입문
강의 자료를 블로그 작성에 활용해도 될까요?
안녕하세요 카일스쿨님!PM 강의부터 빅쿼리 SQL까지 너무 좋은 강의 덕분에 잘 공부하고 있습니다. 해당 내용을 블로그에 정리하고 싶은데요. 장표를 활용해도 될지 궁금합니다. 상업적인 광고는 달려 있지 않으며, 정리 용도로 제 생각을 덧붙여 정리 예정입니다. 저작권 관련 예민한 부분이라 미리 여쭤보며, 혹 불가능 하더라도 충분히 이해되는 부분입니다. 감사합니다!!
-
해결됨350개의 개인 앱을 만들어 월급의 7배 수익을 달성한 방법
다작이 가능한 아이디어와 그렇지 않은 아이디어란?
안녕하세요 그 좋은 아이디어인지 여러가지 기준을 가지고 판단할 수 있다고 가르쳐주셔서 감사합니다. 그 중에 확장(다작)이 가능한 아이디어인지?를 고민해본다고 하셨는데 어떤 게 확장이 가능한거고 어떤게 확장이 어려운 아이디어인지요?
-
해결됨350개의 개인 앱을 만들어 월급의 7배 수익을 달성한 방법
쿠팡 open api에 관해서
안녕하세요 쿠팡 open api가 규정만 빼면 좋다는 말씀에 저도 관심이 많이 생기는데 상품이 앱내 타겟과 일치하는 경우에 활용하면 좋다는 말씀이 잘 이해가 안돼서 질문드립니다. 상품이 내려가거나 가격이 변동된 경우에 싱크가 안 맞는 문제는 아무리 상품과 앱이 일치해도 동일하게 문제일 것 같다고 생각이 들어서 헷갈리는 것 같습니다. 예를 들어서 제가 개발한 앱이 낚시 커뮤니티 앱이기 때문에 키워드를 "낚싯대"로 한담에 뿌려주면 된다고 쳐도 서치 횟수 제한을 피하려고 캐싱 혹은 DB화 하는 순간 싱크 안맞는 문제는 발생할 것 같은데 그리고 같은 맥락에서 다작을 하더라도 앱마다 거기에 맞는 상품을 서치해서 보여주면 되는데 앱이 많은 거랑 써치하면 싱크가 안 맞는거랑 무슨 상관인지도 잘 모르겠어서 질문드립니다. 감사합니다!
-
미해결
gpt를 한 10번 돌려도 안고쳐져 져서 문의남깁니다선생님 ㅠㅠ
import React, { useState, useEffect } from "react"; import axios from "axios"; import { motion } from "framer-motion"; import { FiPhone, FiMail, FiMapPin } from "react-icons/fi"; import Swal from "sweetalert2"; import contactData from "../../Locale/contact.json"; // ✅ JSON 불러오기 const fadeInVariants = { hidden: { opacity: 0, y: 30 }, visible: (i) => ({ opacity: 1, y: 0, transition: { duration: 0.6, delay: i * 0.2 }, }), }; const buttonVariants = { hover: { scale: 1.05, transition: { duration: 0.3 } }, tap: { scale: 0.95 }, }; const Contact = () => { const [language, setLanguage] = useState( localStorage.getItem("language") || "ko" ); const [localizedData, setLocalizedData] = useState(contactData[language]); const [forceRender, setForceRender] = useState(0); // ✅ 리렌더링 트리거를 위한 상태 추가 // ✅ `localStorage` 변경 감지 및 `forceRender` 상태 업데이트 useEffect(() => { const handleLanguageChange = () => { const newLanguage = localStorage.getItem("language") || "ko"; setLanguage(newLanguage); setLocalizedData(contactData[newLanguage]); setForceRender((prev) => prev + 1); // ✅ 리렌더링 강제 실행 }; window.addEventListener("storage", handleLanguageChange); return () => { window.removeEventListener("storage", handleLanguageChange); }; }, []); const getLocalizedText = (key) => { const keys = key.split("."); return keys.reduce((obj, k) => obj?.[k], localizedData) || key; }; const [formData, setFormData] = useState({ name: "", email: "", phone: "", message: "", status: "in progress", }); const handleChange = (e) => { setFormData({ ...formData, [e.target.name]: e.target.value, }); }; const handleSubmit = async (e) => { e.preventDefault(); try { const response = await axios.post( "http://localhost:3000/api/contact", formData ); if (response.status === 201) { Swal.fire({ icon: "success", title: getLocalizedText("contact.alerts.success"), confirmButtonColor: "#3085d6", confirmButtonText: "확인", }); setFormData({ name: "", email: "", phone: "", message: "", status: "in progress", }); } } catch (error) { Swal.fire({ icon: "error", title: getLocalizedText("contact.alerts.error"), confirmButtonColor: "#d33", confirmButtonText: "확인", }); } }; return ( <motion.div key={language} className="min-h-screen bg-white py-32" initial="hidden" animate="visible" > <motion.div className="container mx-auto px-4 max-w-6xl" variants={fadeInVariants} custom={0} > <motion.div className="text-center mb-16" variants={fadeInVariants} custom={1} > <h1 className="text-4xl lg:text-5xl font-bold text-gray-800 mb-6"> {getLocalizedText("contact.title")} </h1> <p className="text-xl text-gray-600 max-w-3xl mx-auto"> {getLocalizedText("contact.subtitle")} </p> </motion.div> <motion.div className="grid lg:grid-cols-2 gap-12 items-start" variants={fadeInVariants} custom={2} > <motion.div className="bg-white rounded-2xl shadow-xl p-8" variants={fadeInVariants} custom={3} > <form onSubmit={handleSubmit}> <div className="space-y-6"> {["name", "email", "phone"].map((field, index) => ( <motion.div key={index} variants={fadeInVariants} custom={index + 4} > <label className="block text-gray-700 font-medium mb-2"> {getLocalizedText(`contact.form.${field}`)} </label> <input type={field === "email" ? "email" : "text"} name={field} className="w-full p-4 py-3 rounded-lg border border-gray-300 focus:border-blue-500 focus:ring-2 focus:ring-blue-200 transition-all duration-300" placeholder={getLocalizedText( `contact.form.placeholders.${field}` )} required value={formData[field]} onChange={handleChange} /> </motion.div> ))} <motion.div variants={fadeInVariants} custom={6}> <label className="block text-gray-700 font-medium mb-2"> {getLocalizedText("contact.form.message")} </label> <textarea name="message" className="w-full p-4 py-3 rounded-lg border border-gray-300 focus:border-blue-500 focus:ring-2 focus:ring-blue-200 transition-all duration-300 h-40" placeholder={getLocalizedText( "contact.form.placeholders.message" )} required value={formData.message} onChange={handleChange} /> </motion.div> <motion.button className="w-full bg-blue-600 text-white py-4 rounded-lg font-medium hover:bg-blue-700 transition-colors duration-300" variants={buttonVariants} whileHover="hover" whileTap="tap" > {getLocalizedText("contact.form.submit")} </motion.button> </div> </form> </motion.div> {/* 연락처 정보 */} <motion.div className="space-y-8" variants={fadeInVariants} custom={7} > <motion.div className="bg-white rounded-2xl shadow-lg p-8" variants={fadeInVariants} custom={8} > <h3 className="text-2xl font-bold text-gray-800 mb-6"> {getLocalizedText("contact.contact_info.title")} </h3> <div className="space-y-6"> {["phone", "email", "address"].map((key, index) => ( <motion.div key={index} className="flex items-center gap-4 p-4 border rounded-lg shadow-md hover:shadow-lg transition-all duration-300" variants={fadeInVariants} custom={index + 9} > {key === "phone" && ( <FiPhone className="text-blue-600 text-3xl" /> )} {key === "email" && ( <FiMail className="text-blue-600 text-3xl" /> )} {key === "address" && ( <FiMapPin className="text-blue-600 text-3xl" /> )} <div> <h4 className="text-lg font-semibold text-gray-800"> {getLocalizedText(`contact.contact_info.${key}.title`)} </h4> <p className="text-gray-600"> {getLocalizedText(`contact.contact_info.${key}.info`)} </p> <p className="text-sm text-gray-500"> {getLocalizedText(`contact.contact_info.${key}.desc`)} </p> </div> </motion.div> ))} </div> </motion.div> <motion.div className="bg-white rounded-2xl shadow-lg overflow-hidden" variants={fadeInVariants} custom={10} > <iframe src=" width="100%" height="400" loading="lazy" className="w-full h-[400px] md:h-[600px] lg:h-[600px]" ></iframe> </motion.div> </motion.div> </motion.div> </motion.div> </motion.div> ); }; export default Contact;gpt를 한 10번 돌려도 안고쳐져 져서 문의남깁니다선생님 ㅠㅠ다른 페이지는 모두 변경완료 했습니다. 하지만 문의하기 페이지만 계속 새로고침 해야만 언어가 변경이 되네요.왜그런지 자세히 알려주시면 감사하겠습니다..(지도 src는 지웠습니다.)
-
미해결한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
5.2강의에서 header태그 에러
const Header = () => { return { <header> <h1>header</h1> </header> }; }; 위의 코드 작성시속성 할당이 필요합니다.선언 또는 문이 필요합니다.식이 필요합니다.선언 또는 문이 필요합니다.이 4가지 에러가 표시됩니다.
-
미해결Airflow 마스터 클래스
Email operator로 메일 전송하기 오류 내용에 대한 도움 부탁드립니다.
안녕하세요. 선생님.Email operator 메일 전송 dag 수행 시 아래 오류 발생합니다.시간 되실 때 내용에 대해 도움 부탁드립니다.*** /opt/airflow/logs/dag_id=dags_email_operator/run_id=manual__2025-02-19T05:59:40.395069+00:00/task_id=send_email_task/attempt=1.log ▲▲▲ Log group end [2025-02-19, 14:59:44 KST] {local_task_job_runner.py:123} ▼ Pre task execution logs [2025-02-19, 14:59:44 KST] {taskinstance.py:2613} INFO - Dependencies all met for dep_context=non-requeueable deps ti=<TaskInstance: dags_email_operator.send_email_task manual__2025-02-19T05:59:40.395069+00:00 [queued]> [2025-02-19, 14:59:44 KST] {taskinstance.py:2613} INFO - Dependencies all met for dep_context=requeueable deps ti=<TaskInstance: dags_email_operator.send_email_task manual__2025-02-19T05:59:40.395069+00:00 [queued]> [2025-02-19, 14:59:44 KST] {taskinstance.py:2866} INFO - Starting attempt 1 of 1 [2025-02-19, 14:59:44 KST] {taskinstance.py:2889} INFO - Executing <Task(EmailOperator): send_email_task> on 2025-02-19 05:59:40.395069+00:00 [2025-02-19, 14:59:44 KST] {warnings.py:112} WARNING - /home/**/.local/lib/python3.12/site-packages/***/task/task_runner/standard_task_runner.py:70: DeprecationWarning: This process (pid=117) is multi-threaded, use of fork() may lead to deadlocks in the child. pid = os.fork() [2025-02-19, 14:59:44 KST] {standard_task_runner.py:72} INFO - Started process 118 to run task [2025-02-19, 14:59:44 KST] {standard_task_runner.py:104} INFO - Running: ['***', 'tasks', 'run', 'dags_email_operator', 'send_email_task', 'manual__2025-02-19T05:59:40.395069+00:00', '--job-id', '121', '--raw', '--subdir', 'DAGS_FOLDER/dags_email_operator.py', '--cfg-path', '/tmp/tmp4a9ijz8k'] [2025-02-19, 14:59:44 KST] {standard_task_runner.py:105} INFO - Job 121: Subtask send_email_task [2025-02-19, 14:59:44 KST] {task_command.py:467} INFO - Running <TaskInstance: dags_email_operator.send_email_task manual__2025-02-19T05:59:40.395069+00:00 [running]> on host 4742acded404 [2025-02-19, 14:59:44 KST] {taskinstance.py:3132} INFO - Exporting env vars: AIRFLOW_CTX_DAG_OWNER='***' AIRFLOW_CTX_DAG_ID='dags_email_operator' AIRFLOW_CTX_TASK_ID='send_email_task' AIRFLOW_CTX_EXECUTION_DATE='2025-02-19T05:59:40.395069+00:00' AIRFLOW_CTX_TRY_NUMBER='1' AIRFLOW_CTX_DAG_RUN_ID='manual__2025-02-19T05:59:40.395069+00:00' [2025-02-19, 14:59:44 KST] {logging_mixin.py:190} INFO - Task instance is in running state [2025-02-19, 14:59:44 KST] {logging_mixin.py:190} INFO - Previous state of the Task instance: queued [2025-02-19, 14:59:44 KST] {logging_mixin.py:190} INFO - Current task name:send_email_task state:running start_date:2025-02-19 05:59:44.157879+00:00 [2025-02-19, 14:59:44 KST] {logging_mixin.py:190} INFO - Dag name:dags_email_operator and current dag run status:running [2025-02-19, 14:59:44 KST] {taskinstance.py:731} ▲▲▲ Log group end
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
화살과 몬스터 버그와 관련한 질문입니다
몬스터, 화살 이동 전부 독립적인 갱신 주기를 갖게 한 이후로 버그가 생긴 것 같습니다. 화살을 쏘는 동안에는 캐릭터가 안 움직여요.원인은 화살이 50ms 단위로 일감을 예약하고 몬스터는 200ms로 일감을 예약하다 보니까 화살이 날아가는 중에는 화살의 Update만 호출될 수밖에 없더라고요. 최소 힙으로 예약 일감을 처리하니까요.이를 쉽게 해결하는 건 몬스터랑 화살 둘 중에 하나를 TickRoom의 room.Update()에 넣어놓는 것인데 이건 임시방편 같고요. 헤딩해봐야 하겠지만 각 화살, 몬스터에 각각 잡큐를 두는 방식밖에 없는 것 같은데, 이런 식의 해결이 일반적인 방법에 가까울까요? 각 오브젝트마다 잡큐를 두는 것이? 실무에서 더 복잡하고 많은 오브젝트들이 처리돼야 할 때 해당 Zone에 하나만 잡큐를 두는 건 굉장히 비효율적인 것 같습니다.뭐 어떻게든 돌아가면 되긴 하지만 정답은 없어도 오답이란 건 있으니까요. 지금처럼 GameRoom에 잡큐를 두었을 때는 투사체랑 다른 오브젝트들을 순차적으로 처리하는 건 무조건 문제가 생길 것 같고, room.Update()에 빼놓으면 갱신 주기를 조절하기 어려우니, 각각 잡큐를 두는 게 이상적인 것 같아서요.
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
1-9 마지막 테이블 피벗 해보기
안녕하세요 카일님강의 마지막에 주신 연습문제 해보았습니다. PIVOT에 어떤 연산자를 사용할 것인가?MAX로 할 경우 -> 별도의 연산된 결과값이 있는 base`가 필요할 것 같음. 이 경우 강의 중 작성된 cnt를 참조하여 작성할 수 있을 것 같으나 3중 쿼리라는게 마음에 걸림.SUM으로 할 경우 -> 강의 중 작성한 base 만으로 충분할 것 같음. 2중 쿼리로 충분해보임.따라서 B안으로 작성해보았습니다.WITH base AS ( SELECT event_date, event_timestamp, event_name, user_id, user_pseudo_id, platform, -- event_param, MAX(IF(event_param.key = 'firebase_screen',event_param.value.string_value, NULL)) AS firebase_screen, -- MAX(IF(event_param.key = 'food_id',event_param.value.int_value, NULL)) AS food_id, MAX(IF(event_param.key = 'session_id',event_param.value.string_value, NULL)) AS session_id, FROM advanced.app_logs CROSS JOIN UNNEST(event_params) AS event_param WHERE -- event_date = '2022-08-01' -> 적은 데이터로 쿼리를 작성하기 위해 입력한 임시 조건 event_date BETWEEN '2022-08-01' AND '2022-08-18' GROUP BY ALL -- LIMIT 100 -> 기초 구문 작성 완료 시 삭제 필요! ), filter_event_and_concat_event_and_screen AS ( -- name, screen concatate (필요한 이벤트만 WHERE 조건 걸어 사용) SELECT * EXCEPT(event_name,firebase_screen, event_timestamp), CONCAT(event_name, '-', firebase_screen) AS event_name_with_screen, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime FROM base WHERE event_name IN('screen_view', 'click_payment') ) # PIVOT 연습문제 SELECT event_date, SUM(IF(event_name_with_screen = 'screen_view-welcome',1,0)) AS `screen_view-welcome`, SUM(IF(event_name_with_screen = 'screen_view-home',1,0)) AS `screen_view-home`, SUM(IF(event_name_with_screen = 'screen_view-food_category',1,0)) AS `screen_view-food_category`, SUM(IF(event_name_with_screen = 'screen_view-restaurant',1,0)) AS `screen_view-restaurant`, SUM(IF(event_name_with_screen = 'screen_view-cart',1,0)) AS `screen_view-cart`, SUM(IF(event_name_with_screen = 'click_payment=cart',1,0)) AS `click_payment-cart`, FROM filter_event_and_concat_event_and_screen GROUP BY ALL ORDER BY event_date ASC