묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨두고두고 써먹는 유니티 VR
mob 스크립트 작성 시 오류
안녕하세요~mob 스크립트 작성 시, 콘솔에 에러가 이렇게 뜨는데 무엇이 문제일까요? Assets\Tutorial\Scripts\Mob\Mob.cs(6,14): error CS0101: The namespace '<global namespace>' already contains a definition for 'Mob' Assets\Tutorial\Scripts\Mob\Mob.cs(15,18): error CS0111: Type 'Mob' already defines a member called 'Start' with the same parameter types
-
해결됨시작하는 PM/PO들에게 알려주고 싶은, 프로덕트의 모든 것
면접에서 PM은 뭘하는 사람인지 질문
안녕하세요.인프런가서 민우님의 세미나도 듣고, 인강과 스터디도 참여하고 있는 PM지망생입니다. 좋은 강의 항상 감사합니다. 강의를 통해, 데이터, 고객, 인더스트리, 비즈니스 전문성을 가지고 valuable, usable, feasible, viable한 제품을 만드는 역할이 고차원의 Product Manager의 역할이라는 점은 파악했습니다. 그런데, 가끔 면접에서 신입으로서, PM/PO/기획자가 무엇? 혹은 어떤 역할을 해야하는가? 혹은 본질은 무엇인가? 등의 질문을 받습니다. 그때마다 제품 성과 전반을 책임지는 사람이라고 답변을 하긴 했는데, 제 경험으로 보았을 때, 면접관들에게 크게 와닿지 않아 보이더라고요. 민우님이 생각하실 때, 이 질문에 대한 적절한 답변이 있었을까요? 궁금합니다.
-
미해결Airflow 마스터 클래스
python 개발환경 구성관련
안녕하세요.python 인터프리터 설치하는 화면에서3.7.16 버전은 인스톨러가 없어서 3.7.9를 받으셨는데, 그 이후로 3.7.16으로 맞추려면 어떻게 해야 하는지 궁금합니다
-
미해결초보자를 위한 ChatGPT API 활용법 - API 기본 문법부터 12가지 프로그램 제작 배포까지
가상환경 종료
가상환경을 종료하려고 Deactivate 명령어를 입력하면 다음과 같은 문구가 뜨면서 종료가 되지 않습니다.deativate : 'deativate' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로그램 이름으로 인식되지 않습니다. 이름이 정확한지 확인하고 경로가 포함된 경우 경로가 올바른지 검증한 다음 다시 시도하십시오.위치 줄:1 문자:1+ deativate+ ~~~~~~~~~ + CategoryInfo : ObjectNotFound: (deativate:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
-
해결됨두고두고 써먹는 유니티 VR
Spawner 스크립트
해당 스크립트 제작 후, 컴포넌트에 추가했는데, 밑에 파라미터들이 활성화되지 않아 연결할 수 있는 창이 안보여요 ㅠㅠ 무엇이 문제일까요?? Prefab, Play On Start 등등이요..
-
미해결쿠버네티스 어나더 클래스-Sprint 1, 2 (#실무기초 #설치 #배포 #Jenkins #Helm #ArgoCD)
containerd 버전확인방법
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo이부분을 추가하고 나서 설치버전을 확인할수있는데이해가 안되는게 지금 github 가이드 보면 1.6 LTS 와 1.7LTS 가 보이는데 그래서 1.7을 설치하고자 하는데 dnf list containerd.io --showduplicates | sort -r 명령어로 실행해보면 최신버전이 1.6 까지밖에 안보입니다.저는 1.7버전 이상을 사용하고 싶고 패키지 설치명령어는<major>.<minor>.<patch> 만 있는게 아니라 containerd.io-1.6.21-3.1.el8 이렇게 el8까지 보이는데 containerd 릴리즈 사이트에서는 패치까지만 보이고 그 이후는 볼수가 없습니다. 이부분이 알고싶습니다.
-
미해결비전공자/입문자를 위한 Data Science(DS)와 AI 학습 & 취업 가이드
일부 교육 동영상 재생이 안됩니다
일부 교육 동영상 재생이 안됩니다.강의 커리큘럼으로 넘어가는데 동영상은 이전 교육 동영상입니다. 일부 강의 항목만 동영상 재생이 되는 것 같습니다.
-
해결됨[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
mmdetection과 opencv 사용 차이.
지금까지 진행한 inference에서 질문이 생겨 글 남깁니다!현재까지 실습에서는 inference와 결과물 시각화 과정에서 mmdetection 자체 함수를 사용하는 것과 opencv를 사용해 직접 inference 함수를 작성해 사용하는 방법 두 가지 다 사용중인데, 둘의 장단점이 무엇인지 궁금합니다!지금까지는 opencv 이용 직접 제작 함수가 좀더 유연하고 결과물을 저장하는데 용이하다는 느낌을 받기는 했으나 명확한 차이를 모르겠어 질문 남깁니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
타임리프 Live Reload 기능
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 설명해주신것 같은데 찾기가 힘들어서요.. 서버 재시작 없이 타임리프 뷰 수정한것 바로 웹 브라우저에 반영하는 방법 알려주심 감사하겠습니다..
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
작업형1 모의문제3의 문제 7번 3:30초지점 질문드립니다.
학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!질문과 관련된 영상 위치를 알려주면 더 빠르게 답변할 수 있어요먼저 유사한 질문이 있었는지 검색해보세요작업형1 모의문제3의 문제 7번 3:30초지점(문제) index "2001" 데이터(행)의 평균보다 큰 값의 수와 index 2003 데이터(행)의 평균보다 작은 값의 수를 더하시오.문제를 보면 하단에 2001이 아닌 2003이 들어가야 하지 않나요? 검토 및 설명을 바랍니다.
-
해결됨실전! FastAPI 입문
FastAPI 폴더 구조에 대해 질문이 있습니다.
안녕하세요. FastAPI 프로젝트의 폴더 구조에 대해서 궁금한 점이 생겨서 질문 드립니다.처음에는 라우터에 모든 로직을 넣어서 라우터와 Repository만 분리해서 개발을 하다가, 3 레이어드 아키텍처로 분리를 좀 해볼까 생각이 들었습니다.controller, service, repository 이렇게 나누어 보려고 하는데요. 예를들어 user, board와 같은 도메인이 있다고 하면, 각 폴더를 도메인별로 나누어서 구조를 잡는게 좋을까요? 아니면, controller 폴더 안에 user_controller.py, board_controller.py 등의 파일들이 모여있는게 좋을까요? 선생님께서는 실무에서 어떻게 폴더 구조를 가져가시는지도 궁금합니다.감사합니다.
-
미해결실전! Querydsl
코드 다운로드 혹시 어디서 하나요? pdf 자료만 보여서요..
코드 다운로드 혹시 어디서 하나요? pdf 자료만 보여서요..
-
해결됨웹 개발자와 정보보안 입문자가 꼭 알아야 할 웹 해킹 & 시큐어 코딩
실습6-1] CSRF공격을 통한 게시글 무단작성에서 오류가 발생합니다.
<form action="http://172.30.1.22/insecure_website/action.php" method="POST" enctype="multipart/form-data"><input type="hidden" name="title" value="해커가 무단으로 작성!"><input type="hidden" name="password" value="test"><input type="hidden" name="content" value="해커닷"><input type="hidden" name="mode" value="write"><input type="submit"></form>이내용으로 게시글을 작성하면다음과 같이 나옵니다.actio.php에서 뭘 수정해야 할까요?
-
해결됨[말 한마디로 뚝딱!] AI와 함께 나만의 수익화 웹사이트를 만드는 법
화면이 끊겨서 어지러워요
마우스 스크롤이 뚝뚝 끊기며 움직여서 다음번 강의때는 부드럽게 움직이면 좋겠어요... 다음번 강의도 끊기면 보다가 환불할것같네요 중간중간 설명이 생략되어서, 변수가 발생했을때 초보자들에게는 답답하게 느껴질수있을것같아요. 개발자분들에게는 당연하게 느껴질만한 부분들이겠지만,"ai로 코드 한줄 없이"가 강의의 지향점이니까 조금 더 쉽게느껴지도록 설명들을 해주시면 더욱 좋을것같아요강의 주제와 커리큘럼은 너무 좋습니다!
-
미해결
송금 테스트 코드 작성중인데 비동기 처리 시 Transactional이 적용이 안되서 지갑이 null로 발생하는 문제
@Test void 동시에_같은_계좌에_송금이_발생한다() throws InterruptedException { // Given: 초기 충전 User sender = createUser("sender@example.com", "passwordA123!", "sen", "S1234", "010-1111-2222", 30, Sex.MALE); User receiver = createUser("receiver@example.com", "passwordA123!", "rec", "R5678", "010-3333-4444", 25, Sex.FEMALE); Wallet senderWallet = createWalletForUser(sender); Wallet receiverWallet = createWalletForUser(receiver); WalletChargeRequest chargeRequest = new WalletChargeRequest( sender.getUserId(), CHARGE_AMOUNT.multiply(BigDecimal.valueOf(100)), CURRENCY, CURRENCY, LocalDateTime.now() ); walletService.charge(chargeRequest); walletBalanceRepository.flush(); walletRepository.flush(); int concurrentUsers = 100; ExecutorService executorService = Executors.newFixedThreadPool(100); CountDownLatch countDownLatch = new CountDownLatch(concurrentUsers); CompletableFuture<?>[] futures = new CompletableFuture[concurrentUsers]; for (int i = 0; i < concurrentUsers; i++) { futures[i] = CompletableFuture.runAsync(() -> { try { WalletTransferRequest transferRequest = new WalletTransferRequest( sender.getUserId(), receiver.getUserId(), TRANSFER_AMOUNT, CURRENCY, CURRENCY, LocalDateTime.now() ); walletService.asyncTransfer(transferRequest); } finally { countDownLatch.countDown(); } }, executorService); } // 모든 송금 요청이 완료될 때까지 기다림 CompletableFuture.allOf(futures).join(); countDownLatch.await(); executorService.shutdown(); // Then: 잔액 검증 WalletBalance senderBalance = balanceService.findBalance(senderWallet.getWalletId(), CURRENCY); WalletBalance receiverBalance = balanceService.findBalance(receiverWallet.getWalletId(), CURRENCY); System.out.println("receiverBalance = " + receiverBalance.getBalance()); System.out.println("senderBalance = " + senderBalance.getBalance()); assertThat(senderBalance.getBalance()).isEqualByComparingTo( CHARGE_AMOUNT.multiply(BigDecimal.valueOf(concurrentUsers)).subtract(TRANSFER_AMOUNT.multiply(BigDecimal.valueOf(concurrentUsers))) ); assertThat(receiverBalance.getBalance()).isEqualByComparingTo( TRANSFER_AMOUNT.multiply(BigDecimal.valueOf(concurrentUsers)) ); } /** // * 💡 송금 도중 출금 실패 테스트 // */ @Test void 송금_도중_발생한_출금은_실패한다() throws InterruptedException { User sender = createUser("sender@example.com", "passwordA123!", "sen", "S1234", "010-1111-2222", 30, Sex.MALE); User receiver = createUser("receiver@example.com", "passwordA123!", "rec", "R5678", "010-3333-4444", 25, Sex.FEMALE); Wallet senderWallet = createWalletForUser(sender); Wallet receiverWallet = createWalletForUser(receiver); walletRepository.flush(); WalletChargeRequest chargeRequest = new WalletChargeRequest( sender.getUserId(), CHARGE_AMOUNT, CURRENCY, CURRENCY, LocalDateTime.now() ); walletService.charge(chargeRequest); AtomicReference<BigDecimal> withdrawAmount = new AtomicReference<>(BigDecimal.ZERO); AtomicBoolean isWithdrawFirst = new AtomicBoolean(false); AtomicBoolean isTransferFirst = new AtomicBoolean(false); int concurrentTasks = 2; ExecutorService executorService = Executors.newFixedThreadPool(concurrentTasks); CountDownLatch countDownLatch = new CountDownLatch(concurrentTasks); CompletableFuture<?>[] futures = new CompletableFuture[concurrentTasks]; // 출금 실행 (비동기) futures[0] = CompletableFuture.runAsync(() -> { try { System.out.println("[출금 시작] - Thread: " + Thread.currentThread().getName()); WalletChargeRequest withdrawRequest = new WalletChargeRequest( sender.getUserId(), CHARGE_AMOUNT, CURRENCY, CURRENCY, LocalDateTime.now() ); withdrawAmount.set(walletService.asyncWithdrawal(withdrawRequest)); if(!isTransferFirst.get())isWithdrawFirst.set(true); } catch (Exception e) { System.err.println("[출금 중 예외 발생]: " + e.getMessage()); } finally { countDownLatch.countDown(); } }, executorService); // 송금 실행 (비동기) futures[1] = CompletableFuture.runAsync(() -> { try { System.out.println("[송금 시작] - Thread: " + Thread.currentThread().getName()); WalletTransferRequest transferRequest = new WalletTransferRequest( sender.getUserId(), receiver.getUserId(), TRANSFER_AMOUNT, CURRENCY, CURRENCY, LocalDateTime.now() ); walletService.asyncTransfer(transferRequest); if(!isWithdrawFirst.get())isTransferFirst.set(true); } catch (Exception e) { System.err.println("[송금 중 예외 발생]: " + e.getMessage()); } finally { countDownLatch.countDown(); } }, executorService); // 모든 작업이 완료될 때까지 대기 CompletableFuture.allOf(futures).join(); countDownLatch.await(); executorService.shutdown(); // 잔액 확인 WalletBalance balanceA = balanceService.findBalance(senderWallet.getWalletId(), CURRENCY); WalletBalance balanceB = balanceService.findBalance(receiverWallet.getWalletId(), CURRENCY); System.out.println("[최종 Sender 잔액] = " + balanceA.getBalance()); System.out.println("[최종 Receiver 잔액] = " + balanceB.getBalance()); System.out.println("[출금된 금액] = " + withdrawAmount.get()); System.out.println("[출금이 먼저 실행되었는가?] " + isWithdrawFirst.get()); System.out.println("[송금이 먼저 실행되었는가?] " + isTransferFirst.get()); // 테스트 검증 if (isWithdrawFirst.get()) { // 출금이 먼저 실행되었으면 송금이 실패해야 함 assertThat(withdrawAmount.get()).isEqualByComparingTo(CHARGE_AMOUNT); // 출금 성공 assertThat(balanceA.getBalance()).isEqualByComparingTo(BigDecimal.ZERO); // 잔액 없음 (출금 완료) } else if (isTransferFirst.get()) { // 송금이 먼저 실행되었으면 출금이 실패해야 함 assertThat(balanceA.getBalance()).isEqualByComparingTo(TRANSFER_AMOUNT); // 송금 성공 assertThat(withdrawAmount.get()).isEqualTo(BigDecimal.ZERO); // 출금 실패 } else { throw new IllegalStateException("출금과 송금이 모두 실행되지 않음"); } } } Service 코드: public class WalletService { private final WalletRepository walletRepository; private final UserRepository userRepository; private final WalletBalanceService balanceService; @Async // ✅ 비동기 실행 @Transactional(propagation = Propagation.REQUIRES_NEW) // ✅ 새 트랜잭션 적용 public void asyncTransfer(WalletTransferRequest request) { transfer(request); } @Async // ✅ 비동기 실행 @Transactional(propagation = Propagation.REQUIRES_NEW) // ✅ 새 트랜잭션 적용 public BigDecimal asyncWithdrawal(WalletChargeRequest request) { return withdrawal(request); } @Transactional public void charge(WalletChargeRequest request) { if (!request.toCurrency().equals(request.fromCurrency())) { //환전 } Wallet wallet = walletRepository.findByUserId(request.userId()); if (!balanceService.checkBalance(wallet.getWalletId(), request.toCurrency())) { Wallet findWallet = walletRepository.findById(wallet.getWalletId()) .orElseThrow(ErrorCode.WALLET_NOT_FOUND::commonException); balanceService.createBalance(findWallet, request.toCurrency()); } WalletBalance balance = balanceService.findBalance(wallet.getWalletId(), request.toCurrency()); balanceService.chargeBalance(balance, request.chargeAmount()); } @Transactional public BigDecimal withdrawal(WalletChargeRequest request) { if (!request.toCurrency().equals(request.fromCurrency())) { //환전 } Wallet wallet = walletRepository.findByUserId(request.userId()); WalletBalance balance = balanceService.findBalance(wallet.getWalletId(), request.toCurrency()); balanceService.withdrawBalance(balance, request.chargeAmount()); return balance.getBalance(); } // @Transactional(propagation = Propagation.REQUIRES_NEW) @Transactional public void transfer(WalletTransferRequest request) { Wallet fromWallet = walletRepository.findByUserId(request.senderId()); Wallet toWallet = walletRepository.findByUserId(request.receiverId()); if (fromWallet == null) { throw new IllegalStateException("보내는 지갑이 존재하지 않습니다: " + request.senderId()); } if (toWallet == null) { throw new IllegalStateException("받는 지갑이 존재하지 않습니다: " + request.receiverId()); } WalletBalance fromBalance =balanceService.findBalance(fromWallet.getWalletId(), request.fromCurrency()); WalletBalance toBalance = balanceService.findBalance(toWallet.getWalletId(), request.toCurrency()); BigDecimal transferAmount = request.transferAmount(); if (transferAmount.compareTo(fromBalance.getBalance()) > 0) { throw ErrorCode.BALANCE_NOT_AVAILABLE.commonException(); } balanceService.transferBalance(fromBalance, toBalance, transferAmount); } } ErrorCode: java.lang.IllegalStateException: 보내는 지갑이 존재하지 않습니다: 4 java.util.concurrent.CompletionException: java.lang.IllegalStateException: 보내는 지갑이 존재하지 않습니다: 4어떻게 해결할 수 있을까요?ㅜㅜ
-
미해결핵심만 골라 배우는 Vue.js
vscode extension에서 volar검색하면 Vue Language Features(Volar)가 검색이 안되는데요
제목의 질문 내용과 동일 합니다.
-
미해결김영한의 실전 자바 - 중급 2편
hashCode() 오타? 질문
강의 자료 보면, 전부 다 해시코드 만들 때, Object.hashCode()를 사용한다고 되어있는데, 막상 equals()와 hashCode() 오버라이딩된 것을 보면, Objects인데, 둘은 서로 다른 것 아닌가요? 오타 아닌가요?
-
해결됨[UI3 업데이트] 피그마 배리어블을 활용한 디자인 시스템 구축하기
타이포그래피 scope관련 문의드립니다.
안녕하세요! 혹시 타이포그래피에서 scope을 지정할 때 비슷해보이는 속성들이 목록에 있어 헷갈려서요. string scope의 font family, font weight or style, text content와 상단의 typography 항목들, 그리고 number scope에 있는 text content의 차이가 무엇일까요~?
-
해결됨한 입 크기로 잘라먹는 Next.js(v15)
next 에러 로그 관련 질문
현재 RecoBooks 함수 정의가 위와 같고, 3초마다 캐시를 업데이트하는 속성이 설정되어 있습니다.그런데 저는 강사님처럼 error 노출이 되지 않고 캐시되어 있는 동일한 랜덤 도서 목록이 계속 나오고 있습니다. 아래는 npm run dev로 실행했을 때 나온 로그입니다. 여기서 하나 더 궁금한게 있는데현재 전체 도서 목록을 불러오는 fetch 함수는 요청한 결과를 무조건 캐싱하는 속성이 설정되어 있습니다.그런데 제 로그를 보면 http://localhost:12345/book 이 api가 두 번 호출되고 있습니다. request memoization이 호출이 안되는 거 같은데 데이터 캐시가 우위적으로 호출되는 건가요??
-
미해결AWS Certified Solutions Architect - Associate 자격증 준비하기
수강기한 연장
안녕하세요. 강사님수강기한 신청 연장이 가능하다면 수강기한 연장을 부탁드리고 싶습니다.감사합니다.