묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
Remote Partitioning
킬구형 6장 작전3에 첫번째 예제 Manager 노드 실행 명령까지 전체 코드를 볼 방법이 있어?
-
미해결실습으로 배우는 선착순 이벤트 시스템
ApplyService와 Consumer서비스의 db공유?
안녕하세요 강의 잘 듣고 있습니다.ApplyService와 Consumer서비스의 db관련 질문을 하려 합니다.9:30분쯤부터 ApplyService와 컨슈머서비스를 분리해서 테스트를 진행하는데 AppliServiceTest를 보면 자신의 CouponRepository에서 count개수가 100개인지 체크하는것 같습니다. 저는 쿠폰생성 및 저장 로직을 전부 컨슈머서비스로 옮겨서 여기서 쿠폰테이블을 관리한다고 생각했는데 어떻게 ApplyService가 자신이 이전에 사용하던 CouponRepository에서 count 체크가 가능한건지 궁금합니다. 혹시 두 서비스가 하나의 db를 공유하는건가요?
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
Study 개설하는 로직에 대해서 궁금점이 있습니다.
현재보면 repository에 저장하고 나서 manager등을 set하게 되는데 이렇게 되면 쿼리수가 늘어나서 set을 먼저하고 repository에 저장을 해주는게 효율적이지 않을까요? 다른 특별한 이유때문에 순서를 save를 하고 set으로 결정하셨는지 궁금합니다.
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
킬구형 실무에서는 JPA ItemReader / ItemWriter를 더 선호해? 아니면 JDBC itemReader/ItemWriter를 더 선호해?
킬구형, 히사시 부리데쓰요야 JPA ItemReader와 ItemWriter를 배워보니 생각보다 복잡하고 여러 고려사항들이 많이 보이는 것 같아, 물론 JPA와 통합이 되서 좋지만 JPA를 쓰고 있어도 Jdbc ItemReader/ItemWriter가 훨씬 더 간단해보이고 별다른 추상화도 많이 없어서 성능도 괜찮아 보이는데, 실무에서는 어때? JPA ItemReader / ItemWriter를 더 많이 써 Jdbc ItemReader/ItemWriter를 더 많이써? PS: 킬구형 어떻게 이렇게 자세한 내용들을 알 수 있는거야? spring batch 공식 docs를 봐도 내용이 없던데 ㅋㅋㅋ 킬구형 없었으면 큰일 날뻔했자너~
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
혹시 뭐가 문제인지 알 수 있나요?
Execution failed for task ':org.zerock.mallapi.MallapiApplication.main()'.> Process 'command 'C:\Users\User\.jdks\temurin-21.0.9\bin\java.exe'' finished with non-zero exit value 1* Try:> Run with --stacktrace option to get the stack trace.> Run with --info or --debug option to get more log output.> Run with --scan to generate a Build Scan (powered by Develocity).> Get more help at https://help.gradle.org.
-
미해결실전! 스프링 데이터 JPA
MemberRepository 구현체
MemberRepository의 구현체는 프록시 객체라고 배웠습니다 그렇다면 해당 프록시 객체 안에서 SimpleJpaRepository와 MemberCustomRepositoryImpl 등을 필드로 갖고 있는 형태인가요?
-
미해결백엔드 개발자 성능 개선 초석 다지기
script Validate가 안됩니다.
계속해서 똑같은 오류만 나오고있습니다. 오류를 몇시간씩 찾아봤고, 테스트의 버전을 변경하고, 다 지우고 다운로드를 다시받고,jdk버전을 홈 기준 11로도 맞춰보고 다 해봤지만 계속해서 같은 오류가 나는데 어떻게 해결할 수 있을까요?
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
안녕하세요 혹시 프론트 코드 제공받을 수 있을까요?
안녕하세요 강의 잘 보고있습니다.다름이 아니라 프론트쪽 코드가 궁금해서 리액트 코드좀 받고싶은데 받을 수 있을까요?메일:ad0362320@naver.com 입니다. 항상 감사드립니다!!
-
미해결스프링부트를 이용한 웹 프로그래밍: 웹사이트 이렇게 만드는 거예요!
일정 삭제 시 예외 발생 질문과 이전 질문에 대한 추가질문드립니다.
// 컨트롤러 메서드 @DeleteMapping("/plan/{no}") public ResponseEntity<Map<String, Object>> removePlan(@PathVariable(value = "no") int no){ Map<String, Object> resultMap = plannerService.removePlan(no); return ResponseEntity.ok(resultMap); } // 서비스 메서드 @Transactional public Map<String, Object> removePlan(int no) { System.out.println("no :" + no); log.info("removePlan"); Map<String, Object> resultMap = new HashMap<>(); int result = plannerRepository.deleteByPlanNo(no); if(result > PLAN_DELETE_FAIL){ log.info("REMOVE PLAN SUCCESS"); }else{ log.info("REMOVE PLAN FAIL"); } resultMap.put("result", result); return resultMap; } // 레퍼지토리 메서드 int deleteByPlanNo(int planNo); // 삭제된 행의 개수 첫번째 질문위 코드처럼 작성을 하고 delete 버튼을 클릭하면2025-12-21 20:36:32 ERROR [[dispatcherServlet]] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.ClassCastException: class com.office.calendar.planner.jpa.PlannerEntity cannot be cast to class java.lang.Integer (com.office.calendar.planner.jpa.PlannerEntity is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @34790124; java.lang.Integer is in module java.base of loader 'bootstrap')] with root causejava.lang.ClassCastException: class com.office.calendar.planner.jpa.PlannerEntity cannot be cast to class java.lang.Integer (com.office.calendar.planner.jpa.PlannerEntity is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @34790124; java.lang.Integer is in module java.base of loader 'bootstrap') at jdk.proxy4/jdk.proxy4.$Proxy153.deleteByPlanNo(Unknown Source) ~[?:?] at com.office.calendar.planner.PlannerService.removePlan(PlannerService.java:124) ~[main/:?] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[?:?] at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360) ~[spring-aop-6.2.11.jar:6.2.11] at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.2.11.jar:6.2.11] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.2.11.jar:6.2.11] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380) ~[spring-tx-6.2.11.jar:6.2.11] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-6.2.11.jar:6.2.11] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.2.11.jar:6.2.11] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728) ~[spring-aop-6.2.11.jar:6.2.11] at com.office.calendar.planner.PlannerService$$SpringCGLIB$$0.removePlan(<generated>) ~[main/:?] at com.office.calendar.planner.PlannerController.removePlan(PlannerController.java:123) ~[main/:?] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[?:?] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258) ~[spring-web-6.2.11.jar:6.2.11] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191) ~[spring-web-6.2.11.jar:6.2.11] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.2.11.jar:6.2.11] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991) ~[spring-webmvc-6.2.11.jar:6.2.11] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896) ~[spring-webmvc-6.2.11.jar:6.2.11] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.2.11.jar:6.2.11] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.2.11.jar:6.2.11] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.2.11.jar:6.2.11] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.2.11.jar:6.2.11] at org.springframework.web.servlet.FrameworkServlet.doDelete(FrameworkServlet.java:936) ~[spring-webmvc-6.2.11.jar:6.2.11] at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:596) ~[tomcat-embed-core-10.1.46.jar:6.0] at...위 예외가 발생하면서 planner_fetch.js의 fetchRemovePlan 함수에서 catch 문에 걸리면서alert('일정 삭제 중 오류가 발생했습니다.'); 이 실행됩니다.서비스에서 deleteByPlanNo를 호출할 때 문제가 발생한 것 같은데찾아보니 레퍼지토리 메서드에 @Modifying을 붙여보라고 해서 해봤는데 해결은 안됐습니다.어떤 원인으로 위 같은 예외가 발생한거고, 어떻게 해결할 수 있는지 질문드립니다. 두번째 질문 이전 질문에서<script src="planner_fetch.js"></script><script src="planner.js"></script>위 코드는 브라우저에서 다음과 같이 처리됩니다.1. planner_fetch.js를 읽고 실행2. 그 다음 planner.js를 읽고 실행3. 이 두 파일은 각각 다른 파일이지만, 브라우저에서는 하나의 JavaScript 실행 공간에서 실행결과적으로 파일이 나뉘어 있어도 "같은 공간"에서 실행되기 때문에 서로의 전역 변수, 함수 등을 공유할 수 있습니다.하나 더 중요한 사실이 있는데요, 로딩 순서가 중요합니다.<script src="planner_fetch.js"></script><script src="planner.js"></script>위와 같은 순서라면, planner_fetch.js가 먼저 실행되고 planner.js에서 planner_fetch.js 안의 함수를 사용할 수 있습니다.하지만, 로딩 순서를 변경하면<script src="planner.js"></script><script src="planner_fetch.js"></script>다음과 같은 에러가 발생할 수 있습니다.fetchPlans(); // 에러 (아직 정의되지 않음)즉, 먼저 로드 된 파일의 함수만 사용할 수 있습니다.이렇게 답변을 주셨는데추가적으로 궁금한 점은planner.js가 나중에 로드 되어서 planner.js에 있는 함수나 변수를 planner_fetch.js에서 사용하면 정의 되지 않아서 사용을 못해야 할텐데 코드에서는 planner.js에 있는 showDetailPlanView 함수라든지 current_year같은 변수를 사용하고 있는데 에러가 발생하지 않습니다. 이 부분 질문드립니다.
-
해결됨멀티 모듈 아키텍처로 구현하는 은행 서버 핵심 기능 [ Kotlin & Spring ]
비동기 전송을 위한 Thread 관리 에서 Executor 설명 오류
안녕하세요! 유익한 강의 감사합니다.Executor 설명 중 한 가지를 정정드리고 싶습니다.강의에서 설명해주신 내용은 maxPoolSize까지 바로 스레드가 생성되는 것으로 이해될 수 있는데,실제 동작은 먼저 corePoolSize만큼 스레드를 생성하고,그 이후 요청은 큐에 쌓이며,큐가 가득 찼을 때 maxPoolSize까지 확장되는 구조입니다.물론 강의 흐름상 의도적으로 설명을 단순화하신 것일 수도 있습니다만,혼동될 수 있는 부분이라 참고용으로 댓글 남깁니다!
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
챕터: React-Router 설정
React-Router 설정 강의다름이 아니고요강의 내용을 보면생성위치가 PS: C\r2025\front\ch2 폴더 (당연히 ch2 겠지만요...^^)로 되어있는데요 ch1 프로젝트에서 계속 진행하면 안되나요?아니면 ch2 로 다시 만들어서 진행해야 할까요?그리고 ch2 만들때 특이 사항이 없는지..갑자기.. frontend/ch2 폴더에서 진행을 하셔서요... (ch2 프로젝트 하나 생성해서 따라하면 땡이지만...ㅋㅋㅋ) 살짝 궁금해서 질문 드립니다.
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
CouponService 의존성 의문
CouponService쪽에선 다른 Service와 다르게 Implement Layer를 의존안하고, DataAccess Layer의 Repository 계층에 의존하고 있던데, 왜 그런걸까요?
-
해결됨Spring Boot와 React로 배우는 초간단 REST API 게시판 만들기
7.React UI구현하기 에서 css파일을 어디서 다운받나요?
강의를 수강하면서 실습하고 있는데요.7.React UI구현하기 강의 중 css파일을 복사해서 붙여넣기 하시는데 깃자료에서 css파일 다운로드 하는 위치를 못찾겠어요. 위치를 알려주시면 감사하겠습니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?
이번 강의에서 영한님이 기본적으로 트랜잭션을 시작할 때 커넥션을 가져온다고 말씀해 주셨습니다. 주문 api 관련 내용에서는 바로 리포지토리를 참조하여 @Transactional 없이 사용했는데요그럼 이런 경우는 커넥션을 어느 타이밍에 가져오나요?
-
미해결Next.js with Spring Boot
이미지 변환
안녕하세요이미지 가져올때 주소창에 http://localhost:8080/29c13610-d02f-41b2-b12d-b1a65ebbec7a_img3.webp이렇게 하면 잘뜨는데 images폴더안에도 파일명 webp로 잘들어와있고요 근데 db에서 받아오면fileName에 test1.webp로 29c13610-d02f-41b2-b12d-b1a65ebbec7a_img3.webp 이렇게 변환이 안됐는데 뭐가 문제인가요?
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
상품 목록 조회 고도화 질문
상품 목록 조회가 복잡해질 때의 상황을 생각해보고 있는데요. 감이 오지 않는 부분들이 몇가지 있어 질문드립니다. 상품 목록 조회 시 옵션 개념이 있다면 재고는 어떻게 처리해야 할까요? 재고는 상품옵션들의 조합이 가지고 있는 것이 이상적일 것 같은데, 상품 목록 조회던, 상세 조회던 품절 여부와 최대 구매가능 수량을 나타내기 위해서는 재고 정보도 필요해보입니다. 따라서 Product 필드에 해당 상품의 전체재고수량(모든 조합의 실재고 합)을 필드로 가지고 있는게 맞나? 라는 생각이 들고... 필드로 가지고 있다면 상품 조회 시 조합을 전부 조회하고 매번 합해 주어야 하나? 그럼 Product 테이블 컬럼단에 미리 합한 값을 넣어두어야 하나? 여러 생각이 듭니다. 다음으로는 프로모션(타임세일) 적용가, 쿠폰적용가 등으로 보여줘야 한다면 이게 실질적으로 Product 도메인 객체의 가격을 변경해도 되는 건가? 라는 생각도 했습니다.프로모션(타임세일) 적용가, 쿠폰적용가 등으로 보여줘야 한다면 쿠폰적용가, 타임세일 적용가 등이 처음에는 보여주기만을 위한 정보이지 않을까 생각했는데, 실제 주문할 때 반영될 금액이기도 하고, 타임세일 같은 경우는 대부분 모두에게 적용되어 보이는 형태이기에... 뷰의 목적이 아니라 개념적으로 봐도 되는걸까? 라는 생각이 듭니다.조금 고도화 하여 생각해보니 감이 잡히지 않는 부분들이 너무 많네요,,, 실무에서는 주로 어떤 구조를 추구하는지 제미니님은 어떻게 생각하시는지 궁금합니다. 긴 글 읽어주셔셔 감사드려요!
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
병렬 중첩
형 병렬 중첩 시키는 예제 코드있잖아.Worker Step Multithreading Implementation@Bean public Step managerStep(Step workerStep) { return new StepBuilder("managerStep", jobRepository) .partitioner("workerStep", dailyTimeRangePartitioner) .step(workerStep) .taskExecutor(partitionTaskExecutor()) .gridSize(4) .build(); } @Bean public Step workerStep(SynchronizedItemReader<TestLog> redisLogReader, ItemProcessor<TestLog, TestLog> logProcessor, MongoItemWriter<TestLog> mongoLogWriter) { return new StepBuilder("workerStep", jobRepository) .<TestLog, TestLog>chunk(500, transactionManager) .reader(redisLogReader) .processor(logProcessor) .writer(mongoLogWriter) .taskExecutor(workerTaskExecutor()) .build(); } @Bean @StepScope public SynchronizedItemReader<TestLog> redisLogReader(@Value("#{stepExecutionContext['startDateTime']}") LocalDateTime startDateTime) { log.info("{} read {}", Thread.currentThread().getName(), startDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHH"))); RedisItemReader<String, TestLog> itemReader = new RedisItemReaderBuilder<String, TestLog>() .redisTemplate(redisTemplate()) .scanOptions(ScanOptions.scanOptions() .match("logs:" + startDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHH")) + ":*") .count(10000) .build()) .build(); return new SynchronizedItemReader<>(itemReader); }@Bean public TaskExecutor workerTaskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); executor.setMaxPoolSize(5); executor.setWaitForTasksToCompleteOnShutdown(true); executor.setAwaitTerminationSeconds(10); executor.setThreadNamePrefix("Worker-Thread-"); executor.setAllowCoreThreadTimeOut(true); executor.setKeepAliveSeconds(30); return executor; }이렇게 했는데2025-12-17T13:34:07.885+09:00 ERROR 1568 --- [ main] o.s.batch.core.step.AbstractStep : Encountered an error executing step workerStep in job testLogJob java.lang.NullPointerException: Cannot invoke "org.springframework.data.redis.core.Cursor.hasNext()" because "this.cursor" is null at org.springframework.batch.item.redis.RedisItemReader.read(RedisItemReader.java:62) ~[spring-batch-infrastructure-5.2.4.jar:5.2.4] 이런 오류가 나.그리고 ItemReader쪽에log.info("{} read {}", Thread.currentThread().getName(), startDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHH")));로그를 찍었는데Worker-Thread-5 read 2025121712Worker-Thread-1 read 2025121706Worker-Thread-2 read 2025121700Worker-Thread-3 read 2025121718이런식으로 찍히고 있어.하나의 파티션을 여러 스레드가 읽어야 하는데 workerTaskExecutor가 서로 다른 파티션을 읽고 있어.내가 뭐 놓친게 있는걸까?
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
article_like_count api test
동시성 이슈가 안터질 수도 있나요?
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
이벤트 페이로드 객체의 생성 방식이 팩토리 메서드 패턴이 아닌 빌더 패턴인 이유가 궁금합니다!.
안녕하세요, 강사님덕분에 많은 인사이트를 얻으며 성장중인 수강생입니다ㅎㅎ 다름이 아니라 이벤트 페이로드 타입의 생성 방식이 팩토리 메서드 패턴이 아닌 빌더 패턴인 이유가 궁금합니다! 빌더 패턴의 장점은 생성자 오버로딩이 많을 때, 간편하게 사용할 수 있다는 장점이 있지만 필수인 필드에 null 이 들어갈 수 있다는 단점이 있다고 생각합니다.그래서, 저는 빌더 패턴을 해당 객체의 필드 중 null 이 들어갈 수 있는 필드가 많을 때 사용하는 걸 선호하다 보니, 이벤트 페이로드 타입을 생성 할 때 일부 필드에 null 이 들어가는 걸까? 란 궁금증으로 질문이 생기게 되었습니다.빌더 패턴에 대한 강사님의 의견이 궁금하며 이벤트에 기존에 사용하신 팩토리 메서드 대신 빌더 패턴을 사용하신 계기가 궁금합니다!감사합니다 :)
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
실행이 안되네요
Execution failed for task ':compileKotlin'.> Error while evaluating property 'filteredArgumentsMap' of task ':compileKotlin' > Could not resolve all files for configuration ':compileClasspath'. > Could not find org.jetbrains.kotlin:stdlib-jdk8:1.6.21. Required by: project :Possible solution: - Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html 위와 같은 에러가 뜨는데아래 잘 바꿨거든요? plugins { id 'org.springframework.boot' version '2.7.6' id 'io.spring.dependency-management' version '1.0.12.RELEASE' id 'java' id 'org.jetbrains.kotlin.jvm' version '1.6.21' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.jetbrains.kotlin:stdlib-jdk8' runtimeOnly 'com.h2database:h2' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } compileKotlin{ kotlinOptions{ jvmTarget="11" } } compileTestKotlin{ kotlinOptions{ jvmTarget="11" } }왜안될까요