묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
수강연장 문의
안녕하세요! 11/13일 만료인데요 혹시 11/29까지만 연장이 가능할지 문의 드립니다 jeonghui71@naver.com 연락 부탁 드려요!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
다대다 관계 1:N, N:1 로 풀기
1. 강의 내용과 관련된 질문인가요? (예/아니오)네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)네3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)네[질문 내용]왜 주문과 상품은 1:N, N:1로 풀고, 카테고리와 상품은 풀지 않은 건가요? 둘 다 다대다 관계인데 어떤 의미가 있나요?
-
해결됨대기업 근무하며 경험한 Redis를 야무지게 사용하는 방법 [실습]
질문있습니다
RedisConfig 클래스에서 @Bean을 이용해서 @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> redis = new RedisTemplate<>(); redis.setConnectionFactory(factory); redis.setKeySerializer(new StringRedisSerializer()); redis.setHashKeySerializer(new StringRedisSerializer()); redis.setHashValueSerializer(new StringRedisSerializer()); redis.setValueSerializer(new StringRedisSerializer()); return redis; }해당 코드를 통해 RedisTemplate를 빈으로 등록한걸 확인했는데요.근데 왜 RedisCommon 클래스 쪽에선 해당 Bean을 사용하지 않고 RedisTemplate<String,String> 을 사용하나요?Bean으로 등록한건 RedisTemplate<String,Object>인데 그럼 스프링에서는 만들어 놓은 RedisTemplate<String,Object>을 사용하지 않고 새로운 RedisTemplate<String,String>을 만들어서 주입하는 걸로 알고있습니다.저 Bean으로 등록해놓은 RedisTemplate<String,Object>의 직렬화 및 역직렬화에 사용될 객체를 집어넣어주는 코드는 Redis 전체 설정인가요?? 저렇게 하면 RedisTemplate<String,String>에도 적용이 되는건가요??- 강사님의 이론편을 안봐서 제가 이해가 잘 안가는 것 일 수도 있습니다 ㅠㅠ실제로 RedisConfig 클래스에서 정의한 RedisTemplate<String, Object>와 RedisString에서 정의한 RedisTemplate<String,String>의 해시코드를 비교해봤는데 서로 다른 값이 나왔습니다.@Service @RequiredArgsConstructor public class RedisString { private final RedisTemplate<String, String> template; private final RedisTemplate<String, Object> template2; // RedisTemplate@544e3679RedisConfig에서 스프링의 빈 초기화시 로그 // RedisTemplate@544e3679RedisString에서 찍은 template2 로그 // StringRedisTemplate@6d5bb599 RedisString에서 찍은 template 로그
-
해결됨[PL 0303] 데이터 시각화를 위한 파이썬 - 맷플롯립 마스터 클래스
커리큘럼 문의
Part.II- Chap9~11, Part.III, Part.IV 가 강의 커리귤럼 리스트에 없는데 계속 업데이트 되는건가요?
-
미해결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는 지웠습니다.)