묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
@Bean으로 AuthenticationProvider를 등록 시 http.authenticationProvider 함수를 이용해서 추가해줘야되나요?
AuthenticationProvider 객체를 추가하는 방법 중에 @Bean 어노테이션을 이욯하여 컨테이너에 등록하는 경우에 AuthentcationManager 객체를 가져와서 .authenticationProvider( customAuthenticationProvider() ); 이렇게 또 메서드를 호출시키도록 로직이 구현되어있는데 bean으로 올라간 customAuthenticationProvider 객체를 주입받아서 객체를 넣어주면 안되나요? @Beanpublic AuthenticationProvider customAuthenticationProvider() { return new CunstomAuthenticationProvider();} 위 메서드가 두번 호출되는거 아닌가 싶어서요
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
테스트 실행 시 에러 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의 10분00초에서 클래스레벨에서 테스트, save와 findByName을 각각 테스트 하는 것을 보여주셨는데 저는 클래스를 테스트 할 때는 둘다 정상적으로 완료가 되는데, 이상하게 하나씩 테스트를 하면 아래의 에러가 납니다 Exception in thread "main" java.lang.NoSuchMethodError: 'java.lang.String org.junit.platform.engine.discovery.MethodSelector.getMethodParameterTypes()' at com.intellij.junit5.JUnit5TestRunnerUtil.loadMethodByReflection(JUnit5TestRunnerUtil.java:127) at com.intellij.junit5.JUnit5TestRunnerUtil.buildRequest(JUnit5TestRunnerUtil.java:102) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:43) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
DB 레이어 잘 다루는 법
안녕하세요. DB 레이어를 다루는 것에 대해 몇가지 질문이 있습니다.프로젝트 버전 1.1 포인트 적립 트랜잭션리뷰 작성ReviewService.addReview)에서 포인트 적립PointHandler.earn )이 한 트랜잭션에서 이루어져야 될 것 같다고 생각했는데 분리되어 있습니다. 이렇게 처리해도 충분한지 여쭤보고 싶습니다.CancelService, PaymentService 에서는 같은 트랜잭션에 있음 낙관적 락 예외 처리PointBalanceEntity 에는 동시성 처리를 위해 @Version(낙관적 락)을 두었다고 해주셨습니다.현재는 낙관적 락 예외가 발생하면 500 에러가 발생할 것으로 보이는데, 저는 평소 최대한 이 낙관적 락 예외를 잡아서 적절히 다른 예외로 변환하여 던지도록 했었습니다.낙관적 락 예외에 대해서 500에러가 발생하도록 처리하는 것으로 충분할지 고민됩니다. Repository, JpaRepository 분리 현재 프로젝트는 서비스 -> 컴포넌트(Finder, Handler, ...) -> JpaRepository 형태로 계층 관계가 있는 것 같습니다.그런데 재미니님의 유튜브를 보면 서비스 -> 컴포넌트(Finder, Handler, ...) -> Repository(개념 객체를 다루는?) -> JpaRepository 형태의 계층을 이루고 있는 것으로 보입니다.첫번째 계층구조를 보면 종종 서비스에서 단순히 컴포넌트를 한번 호출하는 정도인 경우가 많은 것 같습니다. 두번째 계층구조를 사용한다면 서비스에서 단순히 컴포넌트를 한번 호출하고, 그 컴포넌트에서도 단순히 Repository를 한번 호출하는 정도인 경우도 많이 생길 것 같습니다.이러한 이유로 저는 첫번째 계층구조 정도로 충분한가? 라고도 생각했는데 두번째 계층구조를 선택하시게 되는 이유가 궁금합니다. 두번째 계층구조 관련해서 여러 영상들이 있겠지만 우선 저는 아래 영상 참고했습니다.https://www.youtube.com/watch?v=b5xWS8MYl0Q Repository 가 분리된 경우에서의 검증, 업데이트 로직데이터를 검증, 업데이트할 때 어떤 재미니님과 같은 프로젝트 구조를 가져간다면 어떤 식으로 코드가 나오게 될 지 궁금합니다.검증, 업데이트라 하면 제가 생각한 예시 상황은 리뷰가 7주일이 지나면 업데이트 할 수 없다는 요건이 있다고 가정해보겠습니다.제가 생각한 것은 아래와 같습니다.public class ReviewService { private final ReviewFinder reviewFinder; private final ReviewProcessor reviewProcessor; public void update(ReviewUpdate reviewUpdate) { var review reviewFinder.get(reviewUpdate.id()); if (review.canUpdate()) { throw new CoreException(); } var updatedReview = review.update(reviewUpdate); reviewProcessor.update(updatedReview); } }이전에 프로젝트 구조에 대해서 고민이 많이 되었을 때 재미니님의 유튜브를 보면서 프로젝트 구조를 잡는데 도움이 많이 되었습니다.그런데 제가 그 의도나 스타일을 완전히 이해하지는 못하고 있는 것 같아서 재미니님의 스타일들을 한번 배워보고 싶습니다.유튜브에서부터 정말 도움 많이 받고있습니다. 좋은 강의 감사합니다!!
-
해결됨4주 완성! 10x AI 네이티브 개발자 챌린지
Window 환경에서의 Hooks 적용 에러문제
안녕하세요 현재 PreToolUse, PostToolUse 사용 시 제대로 적용이 안되는 문제가 발생하여 질문드립니다.node -v : v22.16.0claude --version : 2.0.61 (Claude Code)Window 운영체제로 진행중입니다. 강의와 교재에 나온대로'디스패처(Dispatcher)' 훅 패턴 적용 시settings.json과 dispatcher.js를 적용하고 .env와 src/db/migrations/001_create_users.sql 까지 모두 만든 상황에서테스트를 진행하면막혀야 하는데 적용되지 않고 그대로 읽어주는거나 수정을 합니다.Claude에게 물어보면등의 답변을 해주는데..환경설정의 문제인지 Window 와 Mac 운영체제의 차이인지 잘 모르겠습니다.(* 심화과정(디스패쳐 훅 패턴) 전부터 이상이 있었습니다.) 또한 강의를 보면 [DEBUG] MCP server "ide": Calling MCP tool: cloaseAllDiffTabs [DEBUG] MCP server "ide": Tool 'closeAllDiffTabs' completed successfully in 32ms 이러한 것이 나오는데 저는 똑같이 cladue --debug로 들어가도 그러한게 안찍히네요.. ㅜㅜclaude 버전문제인지 다른 세팅하는것이 있는지 궁금합니다.
-
해결됨카카오 면접관(개발자)이 알려주는 MSA 관점에서의 분산 트랜잭션 패턴
Orchestration 패턴시 트랜잭션 분리
안녕하세요 강의 열심히 보고 분산트랜잭션에 대해 배워가고 있습니다. 우선 좋은 강의 만들어주셔서 감사합니다. 강의를 보다가 OrchestrationService 소스 코드 설명해주시는 부분에서 궁금증이 생겨 질문드렸습니다. 현재 하나의 트랜잭션 내에서 출금처리에 대한 로컬 트랜잭션 처리 + 입금 서비스 REST 호출 + 입금 서비스 응답이후 SAGA 상태 업데이트 까지 처리하고 있는 것으로 보입니다. 이 경우에 입금 서비스에서 응답이 지연된다면 출금계좌에 대한 락은 지연시간만큼 대기를 하게 되고 트래픽이 몰리는 상황에서는 처리 성능이 떨어질것 같다고 판단했습니다. 그래서 제 생각에는 입금 서비스 호출 이전, 입급 서비스 호출 후 응답값에 대한 saga 업데이트, 출금 서비스 보상 처리 이렇게 3개의 로직을 각각 별개의 트랜잭션으로 선언해야 하지 않나 싶은데, 강사님의 의견이 궁금합니다!
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
SkipPolicy는 여러번 불릴 수 있는가?
skip policy 에 대한 질문Firebase message를 writer 쪽에서 사용하고,override fun shouldSkip(throwable: Throwable, skipCount: Long): Boolean { if (throwable !is BatchUnregisteredException) return true if (throwable.errorCode == FCM_UNREGISTERED_TOKEN || throwable.errorCode == FCM_MULTIPLE_TOKEN_ERROR) { throwable.tokens.forEach { fcmToken -> checkUnregisterToken(fcmToken) } } return true }skipPolicy에서 위와 같이 unregister token들을 제거해주려고 했어. 그리고, 테스트코드에서 제거 로직이 한번만 불렸는지 체크했는데, 총 3번이 불렸다고 테스트가 실패하더라구(실제 데이터는 1개라는 가정하에)GPT는 여러번 불릴 수 있다고, SkipListener 에서 onSkipWrite 에서 unregister 된 토큰을 제거하라고 하는데1. 실제로 skipPolicy는 여러번 불리는게 맞는지1-1. Skip 여부 체크1-2 Skip 처리 중에서도 체크1-3 Chunk 완료 처리 시에도 확인 이라는데 맞아 ,,?2. 보통 이러한 토큰 제거 작업이 있다면 어디서 수행하는게 맞는지 알려줘 ~
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
팩터리 메소드와 response 객체 사용 이유가 궁금합니다!
안녕하세요 게시판 강의 보면서 정말 잘 배우고 있습니다!! 국비학원 프로젝트 하던 때를 생각해보면서 듣고 있는데, 그때는 엔티티에 생성자를 만들어서 서비스에서 그냥 썼는데 본 강의에서 팩토리 메소드 형태를 사용하는 이유가 궁금했습니다!! (기술적으로 더 진보한 형태인지요) 그리고 객체마다 response를 만들어서 commentResponse, ArticleLikeResponse 같은걸 만들어 api 반환에 사용하는데, entity랑 필드도 다르지 않은데 굳이 이렇게 일일이 response 객체를 각각 만들어서 코드를 짜야하는지 궁금합니다!!
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
형 실무에서 배치 시스템은 어떤 식으로 HA를 구성해??
형! 퇴근도 못하고 일하다가 이제야 형 강의보면서 주말을 맞이하고 있어! 스프링 배치를 써서 분 단위, 하루 단위 KPI를 산출하는 배치 프로그램을 만드려고 하는데, 실무에서는 어떻게 HA를 구성하는 지 궁금해졌어. 가령, k8s에서 같은 배치를 돌리는 pod가 여러 개이면 배치가 동시에 돌 것 같고, pod가 한 개이면 하나의 배치 시스템이라서 위험할 것 같은데, 어떤 식으로 실무에서 하는 지 궁금해!
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
엔티티 연관관계 사용
안녕하세요, 강의 너무 잘보고있습니다!코드를 살펴보니 궁금한 부분이 있는데 현재 작성된 코드에서는 엔티티 간 연관관계를 맺지 않고 풀어내고계시더라고요!재미니님은 실무에서도 연관관계를 사용하지 않으시는 건지 아니면 고민 포인트(?)를 던져주신건지 궁금합니다!예를들어 Order와 OrderItem 관련해서, OrderService의 서비스 레이어인 create 메서드에서 OrderItemRepository를 사용해 saveAll을 호출하는 방식을 사용하시더라고요!저는 Order가 없으면 OrderItem은 존재하지 않아야한다고 생각해서, OrderItem의 생성을 서비스 레이어가 아닌 Order 엔티티안에서 생성하도록 강제하는 건 어떨까 생각했습니다.방법으로는OrderItem.create() 같은 생성 메서드를 protected로 막는다.OrderItemRepository를 아예 생성하지 않는다.더티 체킹을 이용하여 Order 필드에 있는 List<OrderItem> 컬렉션에 요소 추가로 OrderItem을 save한다.팀 컨벤션을 정한다.정도가 있을 것 같은데... 그렇다면 재미니님은 실무에서도 연관관계를 맺지 않는 방식을 선호하시는 건가요?사실 서비스 레이어에서 직접 호출을 통한 저장이라고 해도 문제는 없겠지만 사용하시는 방식이 궁금합니다! 그리고 추가적으로 주문 시 상품 재고를 차감시키는 메서드를 OrderHandler(OrderManager) 에 private으로 위치시키는 것과 ProductHandler(ProductManager)에 위치시키고 주입받아 사용하는 것중 어떤게 더 나은 방식일까요?private void decreaseProductStock(List<NewOrderItem> newOrderItems, Map<Long, Product> productMap) { for (NewOrderItem newOrderItem : newOrderItems) { Product product = productMap.get(newOrderItem.productId()); if (product.isStockLessThan(newOrderItem.quantity())) throw new ApiException(PRODUCT_QUANTITY_OVER); product.decreaseStock(newOrderItem.quantity()); } }고민이 되는 부분은 예를들어 위와 같은 메서드를 OrderHandler에 두자니 조금 헤비해지는 것 같고, ProductHandler에 두자니 신규 주문 시에만 사용될 것같은데.. ProductHandler에 두는게 맞는지 고민입니다..! 의견이나 힌트 주시면 좀 더 고민해보도록 하겠습니다!
-
해결됨카카오 면접관(개발자)이 알려주는 MSA 관점에서의 분산 트랜잭션 패턴
common 모듈의 필요성과 다른 방법에 대한 문의
안녕하세요! 궁금증이 생겨 문의 드립니다.common 공통 모듈은 서비스간 통신 데이터 구조를 표준화해서 통일성 있게 사용하기 위해서 사용한다고 이해하였습니다. 현재, 멀티모듈로 작성된 프로젝트라서 common 모듈을 작성된 것 같은데, 각각 독립적인 repository 로 운영된다면 이를 극복하기 위해 Nexus 같은 repository 에 관리하여 공통 dto 를 관리하는 방법은 어떤지 문의 드립니다. 적다 보니, 분산 환경에 대한 질문은 아니라서 죄송합니다...
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
엔티티 상태를 조회하는 시점
안녕하십니까 좋은 강의 잘듣고 있습니다.강의를 들으면서 예제 코드도 같이 파악해보고 있는데요repository 조회시 조회한 결과에서 활성 상태를 체크할때 2가지 방법으로 구현이 되어있는 것 같습니다.repository에서 쿼리 메서드로 값 전달 findByXXAndStatus()일단 findByXX로 조회하고 filter에서 isActive 체크 2가지 경우다 결과 자체는 Active인 엔티티를 조회하겠지만, 두 경우를 언제 사용하는 것이 좋은지가 구분이 있을까요?? 일단 저라면 목록을 조회하는 경우라면 1번 방법으로 조회하면 조금이나마 성능 이점이 있을 것 같고, 단일 데이터 조회시에는 1번이나 2번이나 상관은 없을꺼 같다는 생각입니다! https://youtu.be/o5byT9Ha5Tg?si=C1zj8oP8-wSB6g7Y최근에 우테코에서도 softDelete 관련 처리를 엔티티 설정을 통해 하기도 하던데, 제미니님의 의견이 궁금하여 질문드립니다! 감사합니다! ps. 아직 제가 강의를 쿠폰 부분까지 들어서 뒤에서 이에 대한 설명이 나오는지는 확인을 못했어요!
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
섹션3. 상품 상세. 코드느끼기 12:47 질문.
ProductFinder -> ProductUsecase or ProductUsecase<ProductSection>정의한 곳에 Product 서비스 와 ProductSection 서비스를 갖고 안에서 작업을 해보는건 어떻게 생각하실까요?ProductProductSecion 으로 명명하기에는 애매한 부분이 있어, Usecase라는 단어를 써서중간에 두 서비스만 사용하는 컴포넌트를 하나 두는 것은 어떻게 생각하실까요?혹은 Delegator 를 써서, 이 두 서비스를 의존해서 처리해야 하는 프로세스를 위임해버리는 타입을 하나 만드는겁니다.어떻게 생각하실까요?
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 캐시 전략
RateLimitTest시 저는 2초로 해야 정상으로 나오는데
1초로하면 현재 성공, 실패 각각 200, 0으로 나오고 2초로 해야 100개 씩 성공하는데 정상인가요?
-
미해결실전! 스프링 데이터 JPA
@PrePersist, @PreUpdate 호출 시점 질문드립니다.
@PrePersist가 있는 메서드는 영속성 컨텍스트에 엔티티를 저장할때 즉, save()나 persist() 호출 시점에 호출되는것인가요? 아니면 flush()이후에 INSERT쿼리가 실행되기 직전에 호출되는것인가요?@PreUpdate가 있는 메서드는 엔티티의 변경 감지가 일어나고 트랜잭션 커밋 또는 em.flush()시점에 UPDATE쿼리가 실행되는데, 이 UPDATE쿼리가 실행되기 직전에 호출되는것이 맞을까요?
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
xxx서비스와 xxx핸들러 의 구분 기준
안녕하세요!궁금한점이 생겼는데요.로직을 수행하는 객체중 어떤것은 xxx서비스 어떤것은 xxx핸들러또는매니저(컴포넌트) 등의 객체로 나눠지는데요. 이에 대한 기준이 있을까요?컨트롤러가 호출하는 객체를 xxx서비스, 서비스가 호출하는 객체를 xxx핸들러또는매니저(컴포넌트)라고 보면 될까요? 그렇다면 컴포넌트는 특정 개념에서의 로직들이 응집되어있는 객체 라고 보면 될까요?
-
해결됨카카오 면접관(개발자)이 알려주는 MSA 관점에서의 분산 트랜잭션 패턴
주식거래와 같은 실시간 보장이 필요한 상황에서 SAGA 패턴 도입에 대한 문의
안녕하세요!과거에, MSA 학습용으로 모의 주식 투자 서비스(?)를 만들어본 사람입니다. 당시에, 주식 매수의 기능을, 2개의 service 로 운영했었고, 이때 각 요청의 순서는 이벤트 기반으로 처리하였습니다.client -> stock service -> kafka-> payment service(이벤트 구독)이때, 특정 문제에 대한 트랜잭션 보장을, 보장 로직을 통해 구현하였었습니다.이때, kafka pub/sub 이벤트를 동기적으로 처리되었는지 확인하도록 구성해놓았었습니다. 주식 거래와 같은 일관성이 매우 중요한 서비스에서 어떤 방향성이 더 올바른(?) 방향이라고 생각하고, 어떤 생각을 가지고 계신지 궁금합니다. 현재 생각으로는, 2pc 를 채택하는게 더 올바른 선택이었다고 생각이 듭니다.
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
메타데이터 관리
킬구형메타데이터쪽 update를 읽다가 이해가 안가는게 있는데 형이update() 메서드는 매 트랜잭션의 커밋 직전에 호출된다. 단, 처리 도중 예외가 발생하여 트랜잭션이 롤백되는 경우에는 호출되지 않는다. 이는 실패한 처리 내용이 실행 정보에 반영되는 것을 방지한다.라고 했는데 그러면 문제가 생겨서 update를 호출하지 않고 롤백이 됬다고 하면 open입장에서는 실패했는지 안했는지도 모르는거아니야? 실패를 해도 마지막으로 저장된 곳부터 다시 시작하니까 실패를 아예 저장을 안한다는거야?재시작할때 메타테이블에서 execution값을 받아와서 괜찮은건가?
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
백)TODO관련
강의중에는 private long tno; private String title; private String content; private boolean complete; private LocalDate dueDate;위와같은 설정인데, 왜 갑자기 private long tno; private String title; private String writer; private boolean complete; private LocalDate dueDate;로 바뀌는 건가요?이것에 대한 설명은 어디에 있는거죠?몇강 몇분대에 있는지에 대해서 알려주시면 감사하겠습니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의 자료는 어디서 다운 받을 수 있나요?
안녕하세요.강의가 업데이트 되면서 다시 한번 강의 듣고 있네요 감사합니다.업데이트 된 강의자료(PDF, PPT)파일을 다운 받고 싶은데 어디서 다운 받아야 하나요?답변 부탁드립니다.감사합니다.수고하세요.
-
해결됨제미니의 개발실무 - 커머스 백엔드 기본편
상품 전체보기가 없습니다. 카테고리는 필수로 선택해야 합니다.
전체보기가 없는 상품들 목록이라면카테고리 프로덕트로 설계하는 방향은 어떻게 생각하시는지요?상품의 전체보기가 없습니다.A-Z까지 모든상품들은 카테고리로로 분류되어있고(=모든 상품들은 카테고리라는 꼬리표를 가집니다)좌측 메뉴탭에서도 카테고리별로 구분이 되어있습니다.해당 상품들을 모두 카테고리별로 선택의 상세보기에 해당상품들이 나열되도록 되어있습니다.이러한 생각은 어떤지 한번 의견 듣고싶어요.