묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
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 자격증 준비하기
수강기한 연장
안녕하세요. 강사님수강기한 신청 연장이 가능하다면 수강기한 연장을 부탁드리고 싶습니다.감사합니다.
-
미해결[웹 개발 풀스택 코스] 넷플릭스와 당근마켓 분석을 통해서 배우는 데이터베이스 기초
SQL 설치시 관련 옵션이 없습니다
중간 과정에서 문제 생긴건지 아니면 설치 옵션이 바뀐것지 모르겠지만 PDF 파일에 나온 Windows 환경에서 설치하는 과정에서DeveloperDefault 옵션이 보이지 않습니다.그래서 일단 Full 옵션을 선택해서 다운로드 했는데 상관없을까요?( 아래는 PDF 이미지 입니다. 저는 맨 윗줄 옵션이 아예 누락되서 나오네요. )
-
미해결[PL 0302] 데이터 연산을 위한 파이썬 - 넘파이 마스터 클래스
broadcasting 관련 강의 듣다가 어떤 부분에서 실수가 발생해 오류를 발생시키는지 궁금합니다.
오류가 발생하는 예시를 들어주실 수 있을까요? 어떤 부분을 주의해야하는지 더 도움이 될 것 같습니다. 🙂
-
미해결모두를 위한 대규모 언어 모델 LLM(Large Language Model) Part 1 - Llama 2 Fine-Tuning 해보기
Llama vision 이미지 해상도
안녕하세요, 지금 한번 llama3.2 vision을 다른 이미지와 테스트를 해보고 있는데, vision이 인식하기 위한 최소 이미지 사이즈나 해상도가 있나요? https://ollama.com/blog/llama3.2-vision이 링크를 통해서 제 로컬에서 실험해보고 있는데, added image는 되는데, 그 이후 답변을 안해 줘서, 혹시 다른 이미지로도 테스트 가능하신지 궁금합니다!
-
미해결비전공자도 이해할 수 있는 DB 설계 입문/실전
개발자 및 DB 설계 관련 질문
안녕하세요. 덕분에 DB에 대해 알아가고 있는 입문자입니다.강의와 상관없는 질문일 수도 있지만 궁금해서 여쭤봅니다.개발자 및 DB 설계할 때 엑셀을 많이 다루나요?아니면 강의 자료를 쉽게 설명하기 위해 엑셀을 하시는건가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
th:field="*{open}"질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]랜더링전<input type="checkbox" th:field="*{open}" class="form-check-input"/>랜더링후<input type="checkbox" class="form-check-input" id="open" name="open" value="*{open}"/> th:field를 사용하여 강의에서 배운대로 위와 같은 랜더링 결과를 기대했으나실제 랜더링된 페이지 코드를 보니 아래와 같이 id="open"이 아닌 id="open1"이 적용되었습니다.<div>판매 여부</div> <div> <div class="form-check"> <input type="checkbox" class="form-check-input" id="open1" name="open" value="true"/> <input type="hidden" name="_open" value="on"/> <label for="open" class="form-check-label">판매 오픈</label> </div> </div>그럼 label의 for과 input의 id를 맞추기 위해서 저런 경우 th:field를 사용한다고 해도 id를 작성해야 하나요??아니면 다른 방법이 있을까요? 긴 글 읽어주셔서 감사합니다.
-
해결됨프론트엔드 개발자를 위한, 실전 웹 성능 최적화(feat. React) - Part. 1
성능 탭에서 소요시간이 안보입니다
강사님 Perfomance 화면과 다르게저는 Timing 화면을 볼 수 없습니다.왜 그럴까요...?
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
equals() 사용 시 시간 복잡도 관련 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 강사님 좋은 강의 항상 감사드립니다.해당 문제에서 시간 복잡도 관련 질문이 있습니다!map의 equals() 는 내부적으로 O(n)의 복잡도를 가진 메소드로 알고 있습니다! 내부 구현 코드도 entrySet을 통해서 반복문으로 찾는 과정이 있는 것 같은데요!그렇다면 for문 안에 equals()를 사용할 경우 O(n^2)이 되는 것이 아닌지 질문 드리고 싶습니다! equals가 평균적으로 n 까지 가지 않기 때문에 제외 되는 것일까요?추가적으로 equals() 를 사용하지 않고 풀이를 해봤습니다! 채점을 했을 땐 통과를 하였는데.. 혹시 이 방법에 예외가 있을까요? import java.util.HashMap; import java.util.Scanner; public class Main { private static void solution(String s, String t) { int idx1 = 0; int answer = 0; int cnt = 0; HashMap<Character, Integer> targetMap = new HashMap<>(); for (char c : t.toCharArray()) { targetMap.put(c, targetMap.getOrDefault(c, 0) + 1); } for (int i = 0; i < s.length(); i++) { char key = s.charAt(i); if (targetMap.containsKey(key)) { int value = targetMap.get(key); if (value == 0) { cnt--; } targetMap.put(key, --value); if (value == 0) { cnt++; } } if (i >= t.length()) { char backKey = s.charAt(idx1++); if (targetMap.containsKey(backKey)) { int value = targetMap.get(backKey); if (value == 0) { cnt--; } targetMap.put(backKey, ++value); if (value == 0) { cnt++; } } } if (cnt == targetMap.size()) { answer++; } } System.out.println(answer); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.next(); String t = sc.next(); solution(s, t); } }