묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨웹 개발자와 정보보안 입문자가 꼭 알아야 할 웹 해킹 & 시큐어 코딩
실습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); } }
-
해결됨책 3권을 영상으로 만든 Unity 게임 개발
Knight구매시 오류
using UnityEngine; using UnityEngine.UI; public class ItemPurchase : MonoBehaviour { [SerializeField] UnitObject[] unitObjects; [SerializeField] int ItemNumber; [SerializeField] int ItemPrice; [SerializeField] GameObject BlackPanel; [SerializeField] GameObject PurchasePanel; [SerializeField] GameObject AlarmPanel; [SerializeField] Text AlarmText; [SerializeField] Text UnitName; [SerializeField] Image UnitImg; int CurrentCoin = 0; [HideInInspector] public static ItemPurchase Instance; void Awake() { Instance = this; Debug.Log("1. Saved ItemNumber" + PlayerPrefs.GetInt("ItemNumber")); } void Start() { PlayerPrefs.SetInt("Coin", 10000000); PlayerPrefs.Save(); Debug.Log("2. Saved ItemNumber" + PlayerPrefs.GetInt("ItemNumber")); CurrentCoin = PlayerPrefs.GetInt("Coin"); } public void SelectItem() { PlayerPrefs.SetInt("ItemNumber", ItemNumber); PlayerPrefs.Save(); BlackPanel.SetActive(true); PurchasePanel.SetActive(true); UnitName.text = unitObjects[ItemNumber-1].UnitName; UnitImg.sprite = unitObjects[ItemNumber-1].UnitImg; Debug.Log("3. Saved ItemNumber" + PlayerPrefs.GetInt("ItemNumber")); Debug.Log("4. Selected Item Number : " + ItemNumber); } public void PurchaseItemBtn() { if(CurrentCoin < ItemPrice) { AlarmPanel.SetActive(true); AlarmText.text = "코인이 부족합니다."; return; } AlarmPanel.SetActive(true); AlarmText.text = "구매를 완료했습니다."; Debug.Log("5. Saved ItemNumber" + PlayerPrefs.GetInt("ItemNumber")); Debug.Log("6. Selected Unit" + (ItemNumber+3)); Debug.Log("7. Selected Price : " + ItemPrice); PlayerPrefs.SetInt("Unit"+(ItemNumber + 3), 1); PlayerPrefs.SetInt("Coin", CurrentCoin - ItemPrice); PlayerPrefs.Save(); } public void PurchasePanelOffBtn() { BlackPanel.SetActive(false); PurchasePanel.SetActive(false); PlayerPrefs.DeleteKey("ItemNumber"); } } using UnityEngine; using UnityEngine.UI; public class PurchaseBtn : MonoBehaviour { [SerializeField] Button purchase_btn; void Start() { purchase_btn.onClick.AddListener(OnClickBtn); } private void OnClickBtn() { ItemPurchase.Instance.PurchaseItemBtn(); } } 강의 따라했는데, 나이트 구매시 인스턴스 this가 super defender로 잡혀서 구매가 되는데 어떻게 해야하나요? 싱글턴 패턴에서 수퍼 디펜더가 처음에 잡혀서 나이트가 static 인스턴스에의해 못 잡고있는 것 같기도한데... 어디서부터 봐야할지 모르겠어요ㅠ
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-K 어떤 반례가 있는지 모르겠습니다
http://boj.kr/33d85a5593ae445392cb5242ad169a89
-
미해결웹소켓/STOMP 채팅서비스(spring, vue, redis)
return type ?에 대해서
@PostMapping("/doLogin") public ResponseEntity<?> doLogin(@RequestBody MemberLoginRequestDto memberLoginRequestDto) { //email, password 검증 Member member = memberService.login(memberLoginRequestDto); //일치할 경우 access token 발행 String jwtToken = jwtTokenProvider.createToken(member.getEmail(), member.getRole().toString()); Map<String, Object> loginInfo = new HashMap<>(); loginInfo.put("id", member.getId()); loginInfo.put("token", jwtToken); return new ResponseEntity<>(loginInfo, HttpStatus.OK); } 어찌보면 자바 질문일수도 있는데요. 수업 내용 듣다가 궁금해서요! 여기 메서드 보시면 return type이 ? 사용하였는데요. ?는 어떤 타입이 와도 통과 되는 거라고 알고 있는데요. 명시적으로 특정타입으로 표현을 해도 될거 같은데 그냥 교육상 ?로 하신건가요? 실제 실무에서도 ?를 자주 사용할까요?? 코딩하다가 궁금해서 여쭤봅니다 ㅋㅋ
-
해결됨[코드캠프] 부트캠프에서 만든 '완벽한' 프론트엔드 코스
한 달이 좀 넘게 지났는데, 아직 강의 영상은 안올라오는건가요?
보니까 해당 강의 영상이 내려간게 1월 14일 같은데... 아직까지 소식이 없는건가요...?
-
미해결김영한의 실전 자바 - 중급 1편
catch 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]예외가 터지면서 객체가 생성이 됐지만 참조값 대입을 안했는데 어떻게 catch (NetworkClientExceptionV2 e)에서 참조값을 가지고 있는 건가요?