묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결견고한 결제 시스템 구축
recovery 동시성 처리 관련 문의
recovery() 를 스케줄로 구현한 부분에 있어서 궁금증이 있습니다.설명에도 언급 되었듯이 k8s 환경과 같이 scale-out 형태로 서비스를 제공하면 동시성 이슈가 발생될 것으로 예상되는데요.단순하게 하나의 unknown order 만 생성해서 테스트로 갈음하기에는 검증이 부족하다고 느껴지는데, 동시성 검증은 어떻게 진행하셨을까요?
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
(질문)외부 저장소를 통한 환경변수 불러오기 비동기 질문
const getEnv = async ()=>{ const response = await axios.get(’/비밀키요청’) return response.data } 강의에서 위 코드를 통해 비밀키를 받아오는 예시를 작성해 주셨는데 ConfigModule.forRoot({isGlobal:true, load: [getEnv]})과정에서getEnv와 같은 비동기 함수를 등록한 경우 forRoot 내부적으로 await을 통해 메서드가 동작을 완료할때까지 기다리는지 궁금합니다.(비동기 함수를 등록해도 forRoot의 내부 동작으로 처리되는지?)
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
외래키를 사용하지 않아도 되는지 궁금합니다
이렇게 연관관계가 있는 키들은 외래키로 참조하고 있다는 표시를 하지 않아도 되는지 궁금합니다.
-
미해결[MD/마케터] 포토샵 파일 수정법과 썸네일/기획전 제작하기
인스타그램 사이즈
안녕하세요 인스타그램이 최근에 4대 3으로 바뀌었는데원래는 1080 1080 정사각형 사이즈였다면현재는 가로 810 세로 1080 사이즈로 작업하면 되나요?
-
미해결비전공자도 이해할 수 있는 쿠버네티스 입문/실전
파드오류
아직도 crashloopback off 가 뜹니다.어떤식으로 명령어를 써야될지 모르겠어요..
-
해결됨RAG를 활용한 LLM Application 개발 (feat. LangChain)
Usage Limit 관련해서 질문이 있습니다!
만약에 openai api를 사용해서 챗봇 서비스를 프로덕션 환경에서 배포해서 사용자들이 사용할 수 있도록 한 경우, 만약 많은 사용자로 인해 Usage Limit이 초과 되면 어떻게 해야할까요? Usage Tier 1 기준 gpt-4o-mini 모델의 한도:RPM(분당 요청): 500RPD(일당 요청): 10000TPM(분당 토큰): 200000gpt-4o-mini 모델을 사용한 챗봇을 배포했다고 가정했을 때 많은 사용자로 인해 요청 횟수를 넘어가게 되면 어떻게 해야할까요?사용자 별로 제한을 둬야하는 걸까요? 분당 몇 번, 하루에 몇 번 질문 가능 이런식으로..?
-
미해결
짐코딩 뷰 수업중에 상태저장유지 내용이 있나요?
커리큘럼에 봐도 딱히 모르겠어서 문의드립니다. 그부분 내용을 꼭 보고 싶은데 확실하지 않아서요ㅠㅠ로컬스토리지에 담고 그런거요!
-
미해결스프링 핵심 원리 - 기본편
assertj랑 junit이랑 뭔가 충돌하는 것 같습니다.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]assertThat을 부르려고 assertj의 AssertThat을 import static으로 해도 안 불러와집니다import할때 아예 import static org.assertj.core.api.Assertions.assertThat;import static org.junit.jupiter.api.Assertions.assertThrows; 이렇게 해봐도안되고,지금은 junit의 Assertions를 불러와서 assertThrows에 에러 표시가 안 나는데... 정리하면 assertThat이 되면 assertThrows가 안됩니다. 반대도 마찬가지이고 하나가 되면 하나가 안 불러와져요 gradle.build에서 의존성도 건드렸었는데 효과가 없네요
-
미해결설계독학맛비's 실전 Verilog HDL Season 2 (AMBA AXI4 완전정복)
KV260으로 실습하는 방법
안녕하세요 🙂신규 보드로 zybo z7-20을 사는 것은 비효율적입니다.비슷한 가격으로 스팩이 5~10배 이상 좋은 kv260을 구매할 수 있습니다. 다만 자료가 부족하여 보드를 구매할 때 망설이는 부분이 있다고 생각이 듭니다.하지만 zybo z7에는 없는 ultra 램과 4GB의 ddr4램 10만개 이상의 LUT과 20만개 이상의 FF, 1280개의 DSP는 석사 레벨 혹은 박사 레벨의 프로젝트도 무리 없이 수행 가능하다고 생각합니다.저도 verilog season1 수강을 할 때도 kv260으로 고생하면서 들은 기억이 납니다. verilog season 2 dma를 실제로 올리고, 작동까지 확인하는 것을 보고 나서, 이제는 다른 수강생들에게 저의 경험을 공유해도 될 것이라고 생각해서 이 글을 올립니다.저의 vivado 환경은 ubuntu 24.04 vivado 2024.1을 사용하고 있습니다. 윈도우 환경에서는 vitis 빌드가 되지 않는 치명적인 버그가 있어서 vivado를 사용하는 분들이면 마음 편하게 SSD를 하나 더 사셔서 듀얼 부팅 환경을 만드시는 것을 추천합니다. UART 연결하기KV260의 UART는 zybo z7-20과 다르게 36, 37번 pin과 연결되어 있습니다. IO의 기본 voltage가 1.8V로 되어있으므로 이 부분은 수정하지 않아도 될 것 같습니다. 이 화면 그대로 따라하면 될 것 같습니다. jtag bootkv260의 기본 boot setting은 qspi boot입니다. 제가 생각하는 kv260의 치명적인 단점은 external boot selector switch가 없는 것입니다. jtag boot를 위해서 다음의 문서를 참조했습니다.https://xilinx.github.io/kria-apps-docs/creating_applications/2022.1/build/html/docs/bootmodes.html이 환경에서 따로 boot_jtag.tcl파일을 만드신 다음xsct console에서 connecttargetsource .. boot_jtag.tcl파일 위치boot_jtag를 순서대로 입력하면 jtag boot로 변합니다. 이 두가지만 해결하시면 kv260으로도 충분히 수강 가능하다고 생각합니다. 또 kv260에는 100mhz clock이 정확히 안돠고 99000001 이런식으로 클록이 나오는데 이는 에러 코드에 나오는 클록을 그대로 복사 붙여넣기 하시면 해결이 됩니다.DDR3 메모리가 점차 단종 수순을 밟으면서 zybo z7-20도 단종될 것 같습니다. KV260을 사고 싶었는데 자료가 없어서 망설이시는 분을 위한 좋은 길잡이가 되었으면 좋겠습니다.
-
해결됨소프트웨어 업데이트 : Re-Programming 과정에 대한 이해
Application -> Bootloader jump
application에서 bootloader로 jump할 때, 혹시 이 부분은 MCU의 soft reset같은 기능을 의미할까요? 그래서 상위 제어기가 하위 제어기에게 reset해서 bootloader로 진입해. 이런 방식일까요?
-
해결됨소프트웨어 업데이트 : Re-Programming 과정에 대한 이해
Secondary Bootloader와 first bootloader
reprogramming 기능의 여부에 따라 secondary bootloader와 first bootloader가 나뉜 다면, MCU에는 first 아니면 secondary bootloader 중 하나를 보유하고 있는 것인가요? 아니면 bootloader의 state machine에 따라 각 기능 secondary bootloader의 역할인 reprogramming과 그 밖의 app jump용도의 first bootloader로 state machine 내의 기능적인 역할로서 존재하는건가요?
-
해결됨쿠버네티스 어나더 클래스-Sprint 1, 2 (#실무기초 #설치 #배포 #Jenkins #Helm #ArgoCD)
MAC 빠른 설치와 무게감 있는 설치 차이점
안녕하세요 강사님MAC 빠른설치의 4-1. 자료를 보고 설치한 후무게감 있게 설치하는 방법의 강의 자료를 보니 같은 내용으로 생각이 되어 질문드립니다.4-1을 보고 설치했다면 무게감 있는 설치가 되었다고 생각하면 될까요?
-
미해결[게임 프로그래머 도약반] DirectX11 입문
'C\ .... ......lib'은 올바른 win32에플리케이션이 아닙니다.
'C\.... ......lib'프로그램을 시작할 수 없습니다.'C\ .... ......lib'은 올바른 win32에플리케이션이 아닙니다. 뭐 때문에 그러는 건가요
-
미해결김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션
채팅 클라이언트 문의
안녕하세요. 채팅 클라이언트 실습전에 먼저 구현을 해보았는데요.클라이언트 메인에서 스레드를 스타트 하면 그 즉시 소켓이 닫히면서 프로그램이 종료되는 오류를 겪었습니다.이는 클라이언트 메인에서 sender 스레드를 join하면서 해결하긴 했는데요.영한님의 예제에서는 start() 만 하여도 프로그램이 종료되지 않는데, 왜 저의 코드는 종료될까.... try with resources 가 문제인가 싶다가도 그건 아닐거 같은 모호한 상황에 놓여서....제가 볼 땐 도무지 보이지 않아서, 코드 리뷰와 원인 파악을 부탁드리려고 질문을 남깁니다. MessageHandler.javapackage com.hoonjin.study.java.ionetwork.network.chat.client; import lombok.RequiredArgsConstructor; import java.io.DataInputStream; import java.io.IOException; import java.net.Socket; import static com.hoonjin.study.java.util.MyLogger.log; @RequiredArgsConstructor public class MessageHandler implements Runnable { private final Socket socket; @Override public void run() { try (DataInputStream dis = new DataInputStream(socket.getInputStream())) { while (true) { String msg = dis.readUTF(); log(msg); } } catch (IOException e) { e.printStackTrace(); } } } MessageSender.javapackage com.hoonjin.study.java.ionetwork.network.chat.client; import com.hoonjin.study.java.ionetwork.network.chat.Command; import lombok.RequiredArgsConstructor; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.util.Arrays; import java.util.Scanner; import static com.hoonjin.study.java.util.MyLogger.log; @RequiredArgsConstructor public class MessageSender implements Runnable { private static final String DELIMITER = "\\|"; private final Socket socket; private boolean joined = false; @Override public void run() { Scanner scanner = new Scanner(System.in); try (DataOutputStream dos = new DataOutputStream(socket.getOutputStream())) { while (true) { log("input message with cmd: "); String msg = scanner.nextLine(); if (msg.isEmpty()) { continue; } String[] split = msg.split(DELIMITER); String cmd = split[0]; if (Arrays.stream(Command.values()).noneMatch(c -> c.value().equals(cmd))) { log("wrong command"); continue; } if (cmd.equals(Command.EXIT.value())) { dos.writeUTF(msg); joined = false; break; } else if (cmd.equals(Command.JOIN.value())) { joined = true; } if (joined) { dos.writeUTF(msg); } } } catch (IOException e) { e.printStackTrace(); } } } ChatClient.javapackage com.hoonjin.study.java.ionetwork.network.chat.client; import java.io.IOException; import java.net.Socket; public class ChatClient { private static final String SERVER = "localhost"; private static final int PORT = 23456; public static void main(String[] args) throws IOException, InterruptedException { try (Socket socket = new Socket(SERVER, PORT)) { Thread messageHandler = new Thread(new MessageHandler(socket)); Thread messageSender = new Thread(new MessageSender(socket)); messageHandler.start(); messageSender.start(); messageSender.join(); // 이 부분이 없으면 시작하자마자 즉시 종료됨 } catch (IOException e) { e.printStackTrace(); } } } Command.javapackage com.hoonjin.study.java.ionetwork.network.chat; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public enum Command { JOIN("/join"), MESSAGE("/message"), CHANGE("/change"), USERS("/users"), EXIT("/exit") ; private final String value; public String value() { return value; } } 이상입니다.확인해주시면 감사하겠습니다.새해복 많이 받으세요!
-
해결됨김영한의 실전 자바 - 기본편
메서드 추출 시 매개변수
public static void volumeUp(MusicPlayerData data) { data.volume++; System.out.println("음악 플레이어 볼륨: " + data.volume); } 반복되는 기능을 이후에 재사용하기 위하여 메서드를 추출할 때매개변수에 (MusicPlayerData data)라고 적어주셨어요. 1) 이때 [MusicPlayerData]라는 것은 클래스(틀, 설계도, 붕어빵틀)인가요?이게 맞다면,, 그럼 이건 매개변수(파라미터)안에 클래스를 넣은것이라 볼 수 있나요??? 2) MusicPlayerData 클래스 안에 있는 int 변수[volume]이라는 것은 객체(붕어빵 틀에서 만들어진 붕어빵)라고 하는 것인가요? 용어 정리가 되지 않아 질문드립니다.답변 감사합니다..
-
해결됨독하게 시작하는 C 프로그래밍
fgets() 함수 사용관련
리눅스에서는 fgets() 함수를 쓴다고 하는데, 제 컴퓨터랑 강사님 컴퓨터는 Windows 환경인데 어떻게 fget()함수가 동작하나요?
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
중단점에 대한 질문 있습니다.
실습과장에서 중단점을 클릭 했고 디버그 했는데 중단점에서 멈추지 않고 텍스트 찍어준다면 어떤 문제가 있는 것 일까요. 구글링 해도 정확한 해답을 찾지 못해 이렇게 질문을 남기게 되었습니다.
-
미해결김영한의 실전 자바 - 중급 1편
정적 중첩 클래스 질문
외부 클래스안에 정적 중첩 클래스가 있고, 중첩 클래스 안에 정적 멤버와 인스턴스 멤버들이 있다고 가정할때, 다른클래스의 메인함수에서 외부클래스의 인스턴스를 생성하면, 이 때, 외부클래스의 대한 정보와, static멤버에 대한 정보가 메서드 영역에 저장되는데, 이때 정적 중첩 클래스도 static이라 같이 메서드영역에 정보가 저장되나요? 그리고 별개로 정적 중첩 클래스의 인스턴스를 생성해야만 중첩 클래스의 인스턴스를 생성해야만 중첩 클래스의 인스턴스 멤버들을 사용할 수 있는거죠??
-
미해결
리엑트 무한스크롤기능 ㅠㅠ 5일째 안되고있어요...
useQuery를 이용해서, apple검색api를 활용한 페이지를 만들고있는데요.apple검색api에는 'page, offset'이라는 옵션이 없어요ㅠㅠ그래서 slice해서 하고있는데ㅠㅠ분명 로그는 나오는데 observerTarget의 height값을 아무리 크게 100, 500px이렇게 해도 무한스크롤기능이 안돼는데ㅠㅠ...정말 5일째 이것만 붙잡고 끙끙앓고있어요 아무리 로그찍어도 왜 안되는질 모르겠어요ㅠ...도와주세요ㅠㅠ... List컴포넌트는import React, {useEffect, useState, useRef} from 'react' import Header from './inc/Header' import Star from './Star' import {useLocation} from 'react-router-dom' import { useQuery } from '@tanstack/react-query' import { fetchSearchWord } from '../api/searchApi' const List = () => { // 로딩상태 const [isLoading, setIsLoading] = useState(true); const location = useLocation() const dataFromState = location.state?.data // search컴포넌트에서 전달받은 데이터 // 만약state에 데이터가 없다면, 캐시에서 데이터를 가져오기 위해 useQuery사용 const {data: cacheData} = useQuery( { queryKey: ['resultSearchWord', location.state?.data?.searchQuery], // 캐시된 데이터를 위한 key(location.state.data객체의 속성 중 하나가 searchQuery임) queryFn: async() => { if(!dataFromState) { // state에 데이터가 없으면 캐시에서 데이터를 불러옴 const result = await fetchSearchWord(location.state?.data?.searchQuery) return result } return dataFromState }, enabled: !!location.state?.data // 데이터가 있을때만 쿼리실행 } ) const initialData = dataFromState || cacheData // state에서 데이터가 없으면 캐시된 데이터를 사용 // INF[s] const observerRef = useRef() const [displayData, setDisplayData] = useState([]) const [currentPage, setCurrentPage] = useState(1) useEffect(() => { console.log('currentPage:', currentPage); if (initialData) { const newData = initialData.slice(0, currentPage * 10); console.log('newData:', newData); setDisplayData(newData); // 새 데이터를 덮어쓰는 방식 } }, [initialData, currentPage]); // console.log(`displayData = ${JSON.stringify(displayData)}`); useEffect(() => { if (!initialData || initialData.length === 0) { console.log('observerRef.current is null'); return; } const observer = new IntersectionObserver( (entries) => { console.log('Observer entries:', entries); // 스크롤 이벤트가 발생하는지 확인 if (entries[0]?.isIntersecting) { console.log('Target is intersecting'); setCurrentPage((prev) => { const nextPage = prev + 1; console.log('nextPage:', nextPage); // nextPage 값을 확인 if (nextPage > Math.ceil(initialData.length / 10)) { console.log('모든 데이터가 로드되었습니다.'); return prev; // 모든 데이터가 로드되었을 때는 현재 페이지 유지 } return nextPage; // 새로운 페이지로 증가 }); } }, { threshold: 0, // 더 민감하게 설정 rootMargin: '100px', // 더 넓게 감지 } ); if (observerRef.current) { observer.observe(observerRef.current); } return () => observer.disconnect(); }, [initialData, observerRef]); // INF[e] useEffect(()=> { setIsLoading(true) // 검색 결과 로딩이 끝난 후 로딩 상태를 false로 변경 const timer = setTimeout(() => { setIsLoading(false) }, 500) // 임의의 딜레이(0.5초)를 추가해 로딩 표시 return () => clearTimeout(timer) // 컴포넌트 언마운트 시 타이머 정리 }, [initialData]) if(!initialData) { return <p>No data found. Please perform a search first.</p> } if(isLoading) { return <div id="container"> <div className="stick"></div> <div className="stick"></div> <div className="stick"></div> <div className="stick"></div> <div className="stick"></div> <div className="stick"></div> <h1 className="tit-Loadng">Loading...</h1> </div> } // console.log(`displayData = ${JSON.stringify(displayData)}`); // console.log('initialData:', initialData); return ( <> <Header></Header> <div className='box-wrap'> {displayData.length === 0 && <p>Loading more items...</p>} { displayData.map((item, idx) => { const sliceImg = item.screenshotUrls.slice(0,3) // 0번째부터 2번째까지(원본배열 안건드림) return <div className='box' key={idx}> <div className='top'> <div className='left'> <img src={item.artworkUrl60} alt={item.trackName}/> <div className='center'> <span className='title'>{item.trackName}</span> {/* <span className='subtext'>{item.shortDescription}</span> */} <span className='genre'>{item.primaryGenreName}</span> </div> </div> <div className='right'><button type='button'>받기</button></div> </div> <div className='middle'><Star item={item}></Star></div> <div className='bottom'> <ul className='imgbox'> { sliceImg.map((value, idx) => { return <li key={idx}><img src={value} alt=""/></li> }) } </ul> </div> </div> }) } <div ref={observerRef} className="observerTarget"></div> </div> </> ) } export default List scss는 @charset "utf-8"; .observerTarget { height: 1px; background-color: red; position: relative; } api기능은 let currentData = []; // 받은 데이터를 저장할 변수 let currentLimit = 10; // 요청할 데이터의 개수 export const fetchSearchWord = async (query, country = 'KR', entity = 'software', media = 'software', limit = currentLimit) => { const response = await axios.get(`https://itunes.apple.com/search`, { params: { term: query, country, entity, media, limit } }); // 받은 데이터를 현재 데이터에 추가 currentData = [...currentData, ...response.data.results]; return response.data.results; }
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
MyListEx 질문드립니다.
MyListEx 생성자에서 UserData를 매개변수로 받도록 설계한 이유에 대해 궁금합니다.MyNode라는 추상 자료형(ADT)을 정의해 두셨는데, 생성자에서 특정 구현체인 UserData를 직접 받는 방식이 추상화의 장점을 제한할 수 있다고 생각합니다.또한, onRemoveNode 메서드에서도 UserData 타입으로 변환하지 않고 MyNode에 정의된 메서드만으로도 충분히 기능 구현이 가능해 보이는데, 혹시 MyListEx는 UserData를 위한 전용 자료구조로 설계된 것인가요?그렇지 않다면, MyNode를 기반으로 유연성을 유지하도록 설계하는 것이 더 적합하지 않을까 하는 생각이 들어 질문드립니다.