묻고 답해요
167만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
H2데이터베이스 파일 생성
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]H2 데이터베이스 파일 생성방법 강의자료에서는 저장된 설정이 server가 아닌 embedded로 되어있는데 어떤것을 따라야할까요?
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
[예제][3장][작전2] windows 에서 마지막 예제
... @Slf4j @Configuration @RequiredArgsConstructor public class LogProcessingJobConfig { private final JobRepository jobRepository; private final PlatformTransactionManager transactionManager; private final String BASE_PATH = "C:\\Users\\user\\Desktop\\batch\\section3\\flatfileitemwriter"; @Bean public Job logProcessingJob( Step createDirectoryStep, Step logCollectionStep, Step logProcessingStep ) { return new JobBuilder("logProcessingJob", jobRepository) .start(createDirectoryStep) .next(logCollectionStep) .next(logProcessingStep) .build(); } @Bean public Step createDirectoryStep(SystemCommandTasklet mkdirTasklet) { return new StepBuilder("createDirectoryStep", jobRepository) .tasklet(mkdirTasklet, transactionManager) .build(); } @Bean @StepScope public SystemCommandTasklet mkdirTasklet( @Value("#{jobParameters['date']}") String date ) { SystemCommandTasklet tasklet = new SystemCommandTasklet(); tasklet.setWorkingDirectory(BASE_PATH); String collectedLogsPath = "collected_ecommerce_logs\\" + date; String processedLogsPath = "processed_logs\\" + date; try { tasklet.setCommand("cmd.exe", "/c", "mkdir", collectedLogsPath, processedLogsPath); tasklet.setTimeout(3000); } catch (Exception e) { log.error("mkdirTasklet error: ", e); } return tasklet; } @Bean public Step logCollectionStep(SystemCommandTasklet scpTasklet) { return new StepBuilder("logCollectionStep", jobRepository) .tasklet(scpTasklet, transactionManager) .build(); } @Bean @StepScope public SystemCommandTasklet scpTasklet( @Value("#{jobParameters['date']}") String date ) { SystemCommandTasklet tasklet = new SystemCommandTasklet(); tasklet.setWorkingDirectory(BASE_PATH); String processedLogsPath = "collected_ecommerce_logs\\" + date; StringJoiner commandBuilder = new StringJoiner(" & "); for (String host : List.of("localhost")) { // Windows 환경에서 해당 코드를 적용하려면 ssh 관련 설정들을 찾아야 해서 주석 처리 // String command = String.format("scp %s:~/ecommerce_logs/%s.log %s\\%s.log", host, date, processedLogsPath, host); String sourcePath = BASE_PATH + "\\ecommerce_logs\\" + date + ".log"; String command = String.format("copy %s %s\\%s.log", sourcePath, processedLogsPath, host); commandBuilder.add(command); } tasklet.setCommand("cmd.exe", "/c", commandBuilder.toString()); tasklet.setTimeout(10000); return tasklet; } @Bean public Step logProcessingStep( MultiResourceItemReader<LogEntry> multiResourceItemReader, LogEntryProcessor logEntryProcessor, FlatFileItemWriter<ProcessedLogEntry> processedLogEntryJsonWriter ) { return new StepBuilder("logProcessingStep", jobRepository) .<LogEntry, ProcessedLogEntry>chunk(10, transactionManager) .reader(multiResourceItemReader) .processor(logEntryProcessor) .writer(processedLogEntryJsonWriter) .build(); } @Bean @StepScope public MultiResourceItemReader multiResourceItemReader( @Value("#{jobParameters['date']}") String date ) { MultiResourceItemReader<LogEntry> resourceItemReader = new MultiResourceItemReader<>(); resourceItemReader.setName("multiResourceItemReader"); resourceItemReader.setResources(getResources(date)); resourceItemReader.setDelegate(logFileReader()); return resourceItemReader; } private Resource[] getResources(String date) { try { String formattedBasePath = BASE_PATH.replace("\\", "/"); String location = "file:///" + formattedBasePath + "/collected_ecommerce_logs/" + date + "/*.log"; PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); return resolver.getResources(location); } catch (IOException e) { throw new RuntimeException("Failed to resolve log files", e); } } @Bean public FlatFileItemReader<LogEntry> logFileReader() { return new FlatFileItemReaderBuilder<LogEntry>() .name("logFileReader") .delimited() .delimiter(",") .names("dateTime", "level", "message") .targetType(LogEntry.class) .build(); } @Bean public LogEntryProcessor logEntryProcessor() { return new LogEntryProcessor(); } @Bean @StepScope public FlatFileItemWriter<ProcessedLogEntry> processedLogEntryFlatFileItemWriter( @Value("#{jobParameters['date']}") String date ) { String outputPath = Paths.get(BASE_PATH, "processed_logs", date, "processed_logs.jsonl").toString(); ObjectMapper objectMapper = new ObjectMapper(); JavaTimeModule javaTimeModule = new JavaTimeModule(); javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"))); objectMapper.registerModule(javaTimeModule); return new FlatFileItemWriterBuilder<ProcessedLogEntry>() .name("processedLogEntryJsonWriter") .resource(new FileSystemResource(outputPath)) .lineAggregator(item -> { try { return objectMapper.writeValueAsString(item); } catch (JsonProcessingException e) { throw new RuntimeException("Error Converting item to JSON", e); } }) .build(); } @Data public static class LogEntry { private String dateTime; private String level; private String message; } @Data public static class ProcessedLogEntry { private LocalDateTime dateTime; private LogLevel level; private String message; private String errorCode; } public enum LogLevel { INFO, WARN, ERROR, DEBUG, UNKNOWN; public static LogLevel fromString(String level) { if (level == null || level.trim().isEmpty()) { return UNKNOWN; } try { return valueOf(level.toUpperCase()); } catch (IllegalArgumentException e) { return UNKNOWN; } } } public static class LogEntryProcessor implements ItemProcessor<LogEntry, ProcessedLogEntry> { private static final DateTimeFormatter ISO_FORMATTER = DateTimeFormatter.ISO_DATE_TIME; private static final Pattern ERROR_CODE_PATTERN = Pattern.compile("ERROR_CODE\\[(\\w+)]"); @Override public ProcessedLogEntry process(LogEntry item) throws Exception { ProcessedLogEntry processedLogEntry = new ProcessedLogEntry(); processedLogEntry.setDateTime(parseDateTime(item.getDateTime())); processedLogEntry.setLevel(parseLevel(item.getLevel())); processedLogEntry.setMessage(item.getMessage()); processedLogEntry.setErrorCode(extractErrorCode(item.getMessage())); return processedLogEntry; } private LocalDateTime parseDateTime(String dateTime) { return LocalDateTime.parse(dateTime, ISO_FORMATTER); } private LogLevel parseLevel(String level) { return LogLevel.fromString(level); } private String extractErrorCode(String message) { if (message == null) { return null; } Matcher matcher = ERROR_CODE_PATTERN.matcher(message); if (matcher.find()) { return matcher.group(1); } // ERROR 문자열이 포함되어 있지만 패턴이 일치하지 않는 경우 if (message.contains("ERROR")) { return "UNKNOWN_ERROR"; } return null; } } } 윈도우즈에서는 scp 명령어 관련해서 windows 서비스에서 open-ssh-server 실행현재 사용하고 있는 사용자(windows 사용자) 가 관리자 권한을 보유 할 경우 programdata/sshd_config 파일 수정 필요기타 파일 권한 정리 필요로 인하여 scp 프로그램을 windows 환경의 intellij idea 에서 id, 비번치게끔 ide 콘솔에서 지원하지 않는거 같아. 그래서 제미니가 추천해준대로 실습 환경에서 scp 접속 단을 copy 로 그냥 퉁치는 것으로 바꿔놨어. 나처럼 windows 환경인 사람들이 있으면 혹시나 참고했으면 좋겠네. ObjectMapper, JavaTimeModule 같은 경우는 org.springframework.boot:spring-boot-starter-json 의존성 추가 필요
-
해결됨센서데이터를 수집하는 내가 만드는 ESP32 IoT 기기 - 초보자·아두이노 사용자
직접 만들어 봐야 내 지식이 된다
안녕하세요, 그린탐입니다. 이미 여러 수강생분들이 완강하신것으로 보입니다.그러나 강의를 끝까지 다 들었다고 내 지식이 되는 것은 아닙니다.반드시 직접 만들어보고 동작하는 것까지 직접 경험해 보셔야 내 지식과 경험이 되고, 그제서야 내가 아는 것이 됩니다.그래서 수강생 여러분들은 강의 내용을 그대로 따라서 직접 제작해 보시고, 주문 제작 후 보드구동까지 해보시기 바랍니다.처음 제작할 때 가장 어려운 부분은 "내가 만든 보드가 정말로 동작할까?"입니다. 그래서 처음 시작은 항상 이미 남이 만든 것을 따라하기 입니다. 맨처음 만들때는 강의 동영상과 자료를 통해서 얻은 KiCad 프로젝트 파일을 이용해서 그대로 따라서 제작해 보시기를 권합니다. 그런 후, 그 다음 버전을 제작할 때 각자의 필요에 의해서 추가하면 됩니다.또한 제작 시 가장 자주 부딪히는 문제는 부품 수급 문제입니다. 자주 사용되는 부품들, 저항이나 캐패시터는 제조사가 다량 보유하고 있으므로, 교체할 필요가 낮으나, 가장 잘 자주 재고가 떨어지는 것들은 스위치, LED, 커넥터 류 들입니다. 이 때에는 같은 기능을 하는 다른 부품을 검색해서 사용하면 됩니다.이때 KiCad에 새로운 부품을 라이브러리에 추가하는 방법을 강의에서 설명했으니 그대로 따라하시면 됩니다. 제작하시다가 어려운 점이나 잘 모르는 사항이 있으시면 본 게시판 혹은 디스코드, 아니면 개인적인 이메일로라도 문의 주시면, 가능한 빨리 답변드리겠습니다.제작 후 동작까지 성공하신 분이 있으시면 여기나 디스코드에 후기를 올려주시면 감사하겠습니다.
-
해결됨코드 한 줄 안 쓰고 주식 자동 분석 시스템 만들기 feat. Claude CLI
노션 학습자료 문의
해외 주식에 이어 국내주식도 듣고 있는데요!노션 파일이 열리지 않아서해외 주식에서 파일 이메일로 보내 주신것처럼 국내주식도 이메일로 받을 수 있을까요?
-
미해결Vue3 완벽 마스터: 기초부터 실전까지 - "실전편"
unplugin-vue-components 질문드립니다.
현재는 vite.config.js, components.d.ts 설정을 따로 하지 않아도 어느정도 자동으로 되는거 같긴한데요. components.d.ts에 등록을 안해도 잘 동작하네요.main.js에서만 globalComponents만 잘 임포트 해주면 컴포넌트도 전부 정상적으로 인식이 되네요.(영상처럼 빨간색이 아닌 초록색) 질문1.unplugin-vue-components 이거를 현재 시점에서 사용할 필요가 있는지 궁금합니다.현 시점 실무에서 많이 쓸까요? 차라리 갠적인 생각으론 eslint만 잘 걸어놓고, 컴포넌트 내 import가 필요한걸 그 시점에 직접 넣는게 안전할거 같긴한데요.2.확장자가 .ts인데 혹시 typeScript를 사용할땐 components.d.ts가 필요한 설정인가요?요렇게 설정하니깐 파일내 인터페이스가 자동으로 생성은 되네요.Vue3도 가만히 보면 은근 방대한 양이네요. 강의 완주까지 얼마 안남은거 같네요. 좋은 강의 감사합니다.
-
미해결2026 코딩테스트 올인원 [JAVA]
DFS/BFS
학습 관련 질문을 남겨주세요. 구체적으로 적을수록 좋아요!마크다운과 단축키를 활용하면 글을 더 편하게 작성할 수 있어요.커뮤니티 질문 & 답변에 비슷한 내용이 있었는지 먼저 검색해보세요.편하게 질문주세요:) 직접 답변 드리도록 하겠습니다~안녕하세요. 제가 DFS/BFS부분이 많이 약해서 ㅠㅠ 질문입니다.lockers = [[1, 2], [3], [], [0]] 이런 이중행렬인데 인접리스트로 코드 변환 안하고 생각해도 괜찮다는 의미 인거죠…? 감사합니다.
-
미해결[LottieFiles 공식] After Effects로 만드는 Lottie 애니메이션 (수료증 발급)
음성 파일 두개가 들리네요
음성이 겹쳐서 들립니다
-
미해결한 입 크기로 잘라먹는 React.js 실전 프로젝트 - SNS 편
6.8 zustand 세션 질문입니다.
session.tsimport type { Session } from "@supabase/supabase-js"; import { create } from "zustand"; import { combine, devtools } from "zustand/middleware"; type State = { isLoaded: boolean; session: Session | null; }; const initialState = { isLoaded: false, session: null, } as State; const useSessionStore = create( devtools( combine(initialState, (set) => ({ actions: { setSession: (session: Session | null) => { set({ session, isLoaded: true }); }, }, })), { name: "sessionStore", }, ), ); export const useSession = () => { const session = useSessionStore((store) => store.session); return session; }; export const useIsSessionLoaded = () => { const isSessionLoaded = useSessionStore((store) => store.isLoaded); return isSessionLoaded; }; export const useSetSession = () => { const setSession = useSessionStore((store) => store.actions.setSession); return setSession; }; App.tsximport { Button } from "@/components/ui/button"; import RootRoute from "./root-route"; import supabase from "@/lib/supabase"; import { useEffect } from "react"; import { useSetSession } from "@/store/session"; export default function App() { const setSession = useSetSession(); useEffect(() => { //console.log("111"); supabase.auth.onAuthStateChange((event, session) => { setSession(session); }); }, []); return <RootRoute />; } 코드는 강의와 동일하게 잘따라간 것 같은데개발자 도구 에서 session이랑 isLoaded가 안보입니다.새로고침을 해도, 탭을 껏다 켜도, 리액트를 껏다 켜도,제미나이한테 물어봐도 이게 해결이 안됩니다..... +추가App.tsximport { Button } from "@/components/ui/button"; import RootRoute from "./root-route"; import supabase from "@/lib/supabase"; import { useEffect } from "react"; import { useIsSessionLoaded, useSession, useSetSession } from "@/store/session"; export default function App() { const setSession = useSetSession(); const session = useSession(); const isLoaded = useIsSessionLoaded(); useEffect(() => { //console.log("111"); supabase.auth.onAuthStateChange((event, session) => { setSession(session); }); }, []); useEffect(() => { console.log("현재 세션 상태:", { session, isLoaded }); }, [session, isLoaded]); // 값이 바뀔 때마다 실행됨 return <RootRoute />; } 이렇게 하고 새로고침하면 콘솔에는 찍히긴 합니다 단순한 리덕스 툴킷 버그인지콘솔에 찍히니까 넘어가도 상관없는지 모르겠습니다.
-
미해결[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
fetchBoardsOfMine, fetchBoardsCountOfMine 에러 문의드립니다
프로젝트 진행 중 fetchBoardsOfMine과 fetchBoardsCountOfMine 요청 시 회원정보 인증에 실패했다는 응답이 옵니다.같은 accessToken을 입력했을 때 fetchUserLoggedIn 요청 시에는 정상적인 응답이 오는데 위의 두 요청에선 실패응답이 오는 상황입니다.혹시 fetchBoardsOfMine과 fetchBoardsCountOfMine에서 추가적인 인증이나 요청값이 필요한 건가요?추가적으로 학습자료 노션에 있는 REST-API 주소(http://practice.codebootcamp.co.kr/api-docs)는 접속이 안되고 있습니다.
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
셀레니움 환경설정 오류
from selenium import webdriver driver = webdriver.Chrome()위 코드는 정상 실행이 되나 driver = webdriver.Edge()위 엣지 사용을 위한 코드는 실행되지 않고 아래와 같은 에러가 발생합니다어떤게 문제일까요
-
미해결디지털포렌식 입문자를 위한 디지털포렌식 전문가 2급 실기 시험대비 강의(Encase/Autopsy)
특강 관련 문의
안녕하세요.이번주 2026. 4. 11. 특강관련해서 문의 남깁니다.특강 시간때, 특강을 들을 수가 없어, 혹시 추후 알려주실 URL로 특강 시간이후에도 특강을 볼 수 있는지,아니면 강의에 따로 올려주실 계획인지 궁금합니다.항상 좋은 강의 감사합니다.
-
미해결클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
CLAUDE.md 200줄 이하 기준
클로드는 매 대화(요청/응답)마다 CLAUDE.md 를 읽나요? 루트 CLAUDE.md는 항상 읽고, 하위 CLAUDE.md는 해당 폴더에 접근할 때만 읽잖아요. 그러면 /rulesCLAUDE.md는 항상 읽나요? 아니면 조건부로 읽나요?200줄 이하 규칙은 어떤 CLAUDE.md가 준수해야 하나요? 루트 CALUDE.md만 준수?개별 CLUADE.md 각각 준수?모든 CLUADE.md를 합쳐서 준수?
-
미해결전동킥보드로 배우는 임베디드 실전 프로젝트
벅컨버터 출력전압
벅컨버터의 출력전압을 12V로 만드는 이유가 무엇인가요?
-
미해결클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
커서 킬때마다 오류
커서에서 터미널을 킬때 마다 아래와같이 느낌표가 뜨면서 아래와 같은 확장을 원합니다. 계속 재시동을 하고 있는데 킬때마다 이러는데 원인은 무엇인지 혹시 해결방법이 있나요?
-
해결됨수익형 AI Agent n8n 전문가 강의, 블로그·쇼츠 자동화
17강 json구문 오류
안녕하세요. 알 수 없는 에러가 나서 질문드립니다.강사님이 추천해주신 z-image-turbo를 사용하여 n8n에서 http request를 만들고 있었는데요, 작동이 안되고 계속 에러가 납니다. json구문이 잘못된것 같은 에러메시지인데. 분명 틀린 곳이 없는데 왜이럴까요?스샷에는 다 보이지 않아 상세 구문도 아래넣습니다.{ "input": { "width": 1344, "height": 768, "prompt": "{{ $json.image_prompt }}", "go_fast": false, "output_format": "png", "guidance_scale": 0, "output_quality": 80, "num_inference_steps": 8 } } 도와주세요! 박사님!ㅜㅜ
-
미해결React Three fiber(R3F)로 배우는 인터렉티브 3D 웹 개발
ai 도구 질문
혹시 glb 파일을 이미지 파일만 보고 만들어주는 ai 툴 같은게 있을까요..?
-
미해결클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
한국어 설정 방법 문의
settings.json 파일에 language에 설정 만으로 셋팅이 된다고 하는데요.에러가 발생합니다.왜그런 건지 문의드립니다.
-
미해결오라클 SQL 데이터베이스
ORA-01017 오류 때문에 진도가 못나가고있습니다.!
도커데스크탑 화면 왼쪽 목록에서 컨테이너 선택 -> 실행중인 컨테이너 클릭 -> exec 탭 클릭 -> # 프롬프트가 보이면 bash 입력 후 엔터 -> sqlplus 입력 후 엔터 -> 아이디와 비번으로 로그인 후 성공했는데 여기서만 sql작성을 해야하나요 여전히 oracle sql developer에서는 로그인이 안됩니다 도커에서만 계속 사용해야한다면 환불 문의도 좀...ㅎㅎ
-
미해결클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
추가 질문드립니다!
안녕하세요.빠른 답변 감사합니다. Shift+Enter 오류 관련하여 답변 확인하고 몇 가지 더 궁금한 사항이 생겨 질문드립니다!iterm2를 삭제해도 git, node, Homebrew 등 개발 도구들은 전혀 영향 없다고 확인했습니다. Q1. 맥 OS 터미널에서 권한 설정, 개발 도구 설치를 하면 이게 자동으로 iterm2에도 반영이 되는 것인지 궁금합니다! 예를 들면 맥 OS 터미널에서 클로드 코드에 대한 세부 설정을 바꾸면 iterm에도 반영이 되는 것인지, iterm2 외에 다른 터미널 프로그램(고스티 같은)을 설치해도 마찬가지로 별도 설정없이 적용되는지 궁금합니다! 그리고 커서에서 변경한 설정이나 권한 설정이 터미널이나 아이텀에도 적용되는지, 그 반대의 경우도 적용이 되는지도 궁금합니다. 즉, 터미널은 어떤 프로그램을 쓰든 하나라고 생각해도 되나요? Q2. Cursor는 VS Code 기반이라 /terminal-setup을 실행해도 Shift+Enter 대신 Option+Enter로 동작하는 경우가 있다고 확인했습니다! 그럼에도 불구하고... 저는 맥 내장 터미널과 커서 안에서 알트 엔터 줄바꿈이 너무 불편해서 시프트 엔터로 변경하고 싶은데 이것은 방법이 없을까요? 클로드 코드로 옵션 엔터 대신 시프트 엔터로 바꿔달라고 몇번 요청하고(그 사이 여러 파일들을 읽고 분석했는데도) 동작하지 않아.. 혹 방법이 있는지 궁금합니다!
-
미해결[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
수강기간 연장 문의드립니다.
안녕하세요!작년 개인 일정으로 인해 응시하지 못했던 실기 시험을, 이번 6월에 공부하여 응시하고자 합니다. 현재 수강 중인 강의의 종료일이 2026년 5월 13일까지이나,혹시 2026년 제1회 실기 시험일(26-06-20)까지라도 기간 연장이 가능할지 여쭤보고 싶습니다.만약 가능하다면, 남은 기간 열심히 수강하여 꼭 합격의 결실을 맺도록 하겠습니다.감사합니다.이메일 : tomatobad@naver.com