묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
인텔리제이 gradle 질문드립니다..
복습하려고 다시 프로젝트 처음부터 진행중인데, 이렇게 콘솔에 찍히면서 프로그램이 중단되어버립니다..구글에 찾아봐도 정보가 없고 gradle을 refresh하면,Could not create parent directory for lock file 이런식으로 나옵니다...그래서 https://memodayoungee.tistory.com/m/55이대로 진행해봐도 안되고 인텔리제이 캐시도 삭제해봤는데도 해결이안되서.. 너무 답답해서 질문드립니다..
-
해결됨두고두고 써먹는 유니티 VR
xr 인터렉티브 툴키트를 수강하고 있습니다
강의에서 진행하는 유니티 버전 2021 2..13f 을사용하고 있습니다 강의 프로젝트셋팅때 버전은 같은데 설치하고 나서 하이어라키 메뉴 에서 xr 메뉴 xr oring (action based)라는 내용이 없습니다 받은 툴키에 셋업샘플에 컨트롤러도 내용이 강좌보다 많은 컨틀롤러가 있습니다 우선있는 컨트롤러는 디콜트 였습니다 하이어라키 메뉴 에서 xr 메뉴 xr oring (action based) 가 없어요 우선 시뮬레이터로 작업하려고 합니다
-
미해결
강의 내용과 좀다른게 있어서
안녕하세요 유니티 xr인터렉트 툴키트과정을 듣고 있습니다 같은버전 2021 .216 사용하는데'하이어라키 에서 xr 에 oringin(action-based)라는 항목이 없읍니다 다같은버젼인데 인터렉트툴키트도 같은 버젼으로 설치했는데 항목이 강의 보다 항목이 많이 생기네요
-
해결됨Flutter 앱 개발 기초
shared_preferences 패키지 설치하고나면 새로운 파일이 안생겨요
shared_preferences 패키지 설치하고나면 generated_plugin_registrant.dart 파일이 생긴다고하셨는데 패키지 버전이 올라가면서 이제 안생기는건가요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
클라이언트 강제 종료 시 플레이어 삭제 기능
안녕하세요 루키스님part4 강의로 만들어진 서버와part5에서 만들어진 클라이언트를조금 수정해가며 추가 기능을 만들던 중문제가 생겼는데 해결이 잘 안되어서 질문드립니다.우선 추가하려는 기능은 강의에서 배운 Q를 눌러서 종료하는 기능 외에플레이어(3명)들이 접속해있는 상태에서 언리얼 편집창을 닫아버렸을 때3명 모두 접속이 끊어지며 플레이어들을 서버에서 제거해주는 기능을 추가하려고 합니다..이 때, 발생하는 문제는player가 3명이고 objectId가 각각 1번부터 3번까지 있다고 했을 때,어쩔 땐 player들 모두 제거되고,어쩔 땐 player(2번), player(1번), player(1번)처럼objectId가 1번인 플레이어를 제거하는 처리가 중복 호출되며2번과 1번에 대한 삭제만 이루어지고,3번에 대한 삭제가 이루어지지 않는 문제가 발생합니다.아래는 작성한 코드입니다.먼저 GameSession::OnDisconnected()의 맨 마지막 줄에 GRoom->DoAsync()로Room::HandleLeavePlayer를 호출해주는 코드를 추가했고,이 때 들어오는 player들의 objectId들을 확인해봤을 때1, 2, 3 모두 중복 없이 들어오는 것을 확인했습니다.void GameSession::OnDisconnected() { if (player.load() == nullptr) { return; } cout << "objectId: " << player.load().get()->objectInfo->object_id() << endl; RoomRef room = player.load()->room.load().lock(); if (room == nullptr) { return; } GRoom->DoAsync(&Room::HandleLeavePlayer, player.load()); }다음은 Room::LeaveRoom()에서 위에서 말한 상황일 때파라미터로 들어오는 object가 중복으로 들어오는 걸 확인했습니다.if(!success) { return success; }는이미 삭제된 object를 중복으로 RemoveObject(objectId)를 할 경우 false를 돌려주는데밑에서 패킷 보내는 작업을 넘겨버리기 위해 추가했습니다.그리고 코드 거의 마지막 부분에GSessionManager.Remove(session)로세션을 제거하는 코드를 추가했습니다.bool Room::LeaveRoom(ObjectRef object) { if (object == nullptr) { return false; } const uint64 objectId = object->objectInfo->object_id(); bool success = RemoveObject(objectId); if (!success) { return success; } // 퇴장할 플레이어에게 퇴장 패킷 전송 if (object->IsPlayer()) { PlayerRef player = static_pointer_cast<Player>(object); Protocol::S_LEAVE_GAME leavePkt; SendBufferRef sendBuffer = ClientPacketHandler::MakeSendBuffer(leavePkt); if (GameSessionRef session = player->session.lock()) { session->Send(sendBuffer); } } // 남아있는 플레이어들에게 퇴장 플레이어의 디스폰 패킷 전송 { Protocol::S_DESPAWN despawnPkt; despawnPkt.add_object_ids(objectId); SendBufferRef sendBuffer = ClientPacketHandler::MakeSendBuffer(despawnPkt); Broadcast(sendBuffer, objectId); // 퇴장 플레이어는 이미 room에서 빠져나간 상태라 Broadcast 불가 if (object->IsPlayer()) { PlayerRef player = static_pointer_cast<Player>(object); if (GameSessionRef session = player->session.lock()) { session->Send(sendBuffer); GSessionManager.Remove(session); } } } return success; } GameSession 소멸자virtual ~GameSession() override { cout << "~GameSession" << endl; player.store(shared_ptr<Player>()); }Player 소멸자Player::~Player() { cout << "~Player" << endl; session.reset(); }다음은 첫번째 실행 화면입니다.(실행 화면에 출력되는 줄이 뒤죽박죽이라 서로 다른 색으로 구별 해봤습니다..ㅠ)연두색으로 묶은 범위는 언리얼 에디터를 1번 실행했다가 닫았을 때의 단위로 묶었습니다.빨간색으로 밑줄 그어진 objectId: 숫자로 출력되는 부분은GameSession::OnDisconnected()에서 출력하고 있고,노란색으로 밑줄 그어진 Remove Objedct숫자로 출력되는 부분은Room::RemoveObject()에서 objectId를 출력하고 있습니다.첫번째 실행 화면에서는 처음 실행하고 바로 해당 문제가 발생했습니다.objectId: 3, objectId: 2, objectId: 1 순으로 중복 없이 잘 들어왔는데Remove Object3, Remove Object1, Remove Object1 처럼 출력되었고,2번 플레이어에 대한 제거가 되지 않았습니다.때문에 두번째, 세번째 실행에서는 접속한 3명의 플레이어가 모두 잘 제거됨에도처음에 제거되지 않은 플레이어 하나가 남아서언리얼 에디터 실행 화면에 보이는 플레이어가 총 4명이었습니다.다음은 두번째 출력 화면입니다.두번째 실행 화면에서는 5번째가 되어서야 해당 문제가 발생했습니다.그 전까지는 문제 없이 3명의 플레이어 모두 잘 제거되었습니다.마찬가지로 objectId: 13, objectId: 14, objectId: 15로 들어왔고Remove Object13, Remove Object15, Remove Object15로 실행되면서13, 15번의 플레이어만 제거되고 14번 플레이어는 제거되지 않았습니다.실제로 문제가 발생할 경우의 호출 스택을 따라가 봤을 때 OnDisconnected()에서GRoom->DoAsync(&Room::HandleLeavePlayer, player.load())로삭제 작업 예약 거는 것 까지는 플레이어가 중복 없이 잘 들어가는데예약했던 Room::HandleLeavePlayer()가 호출되고파라미터로 들어오는 플레이어의 objectId를 확인해보면이미 삭제된 플레이어가 한번 더 들어오는 경우가 생기네요.혹시 어떤 부분 때문일까요??
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
pyqt5와 pyside가 충돌
pyqt5와 pyside가 충돌을 해서 .exe 파일이 만들어지지 않아서 pyqt5를 uninstall 했는데도 exe 파일이 만들어지지 않네요. 이럴 때 파이썬을 다시 삭제하고 설치하는 방법밖에 없나요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
선생님...대체 뭐떄문에 틀린지 모르겠어요..
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 선생님....선생님 해설보기전에 스스로 풀어보고 내려는데 자꾸 12%에서 틀립니다.백준에서 반례도 열심히 넣어봤는데.... 전부 다 제대로 동작합니다 ㅠㅠ제 코드는 아래와 같습니다.IsPossible이라는 함수에서 이게 애초에 팰린드롬이 가능한지 아닌지 검사합니다.main에서는 팰린드롬이라면count배열에 알파벳 갯수를 기록해두고char 벡터에 NULL값 하나를 넣어서 생성해둡니다.받은 문자열의 길이가 홀수라면, 가운데 글자를 미리 삽입해둡니다.짝수라면 NULL양옆으로 알파벳순서대로 삽입합니다.모든 과정을 마친 후 NULL을 삭제합니다.출력합니다.선생님...부탁드립니다..정말 오래고민했어요 ㅠㅠㅠ선생님의 정답을 보기전에 꼭 해결해보고 싶어서, 이렇게 질문드립니다//#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <vector> #include <algorithm> #include <string> #include <cmath> #include <map> using namespace std; bool IsPossible(string s) { int count[26] = { 0 }; int len = s.length(); for (char c : s) { count[c-'A']++; } if (len % 2 == 0) { for (int i : count) if (i % 2 == 1) return false; } else { for (int i = 0; i < 26; ++i) if (count[i]%2 == 1) count[i]--; for (int i : count) if (i % 2 == 1) return false; } return true; } void PrintV(vector<char> c) { for (char i : c) { cout << i; } } int main() { string s; cin >> s; if (IsPossible(s)) { int count[26] = { 0 }; int len = s.length(); for (char c : s) count[c - 'A']++; vector<char> v(1); if (len % 2 == 1) { for (int i = 0; i < 26; ++i) if (count[i]%2 == 1) { count[i]--; v[0] = (char)(i+'A'); break; } } for (int i = 0; i < 26; ++i) { while (count[i] != 0) { if (v.size() % 2 == 1) { v.insert(v.begin() + v.size() / 2, i + 'A'); } else { v.insert(v.begin() + v.size() / 2 + 1, i + 'A'); } count[i]--; } } if(len%2 == 0) v.erase(v.begin() + (v.size() / 2)); PrintV(v); } else cout << "I'm Sorry Hansoo" << "\n"; }
-
미해결실전! Django 활용
urls.py 파일에 작성한 코드 분리 여부
안녕하세요. 정말 강의 재밌게 잘 듣고 있습니다.들으면서 궁금한 부분이 있어 질문드립니다./orders API를 예시로 들었을 때, urls.py 파일에 모든 코드가 작성되는데, 쿼리나 비즈니스 로직을 따로 분리하는 방식은 파이썬 프레임워크에서는 잘 사용하지 않는 방법인가요? 일반적으로 스프링에서는 service와 respository 클래스로 해당 코드를 분리하는 편이어서 이 차이점이 궁금합니다.
-
미해결백엔드 애플리케이션 성능 개선하기 - 기초편
비동기 분리에 대해서 질문드립니다.
안녕하세요? 강의쭉 잘 듣고 있습니다.강의에서 말씀해주시고자 하는 부분은 [IO대기시간이 있는 작업을 비동기로 돌려서 클라이언트쪽에 우선응답을 빠르게 주고, 나머지는 따로 알아서 처리하는 것]으로 이해했습니다. 말씀해주신 방법은 충분히 사용할 수 있는 방법이라고 생각합니다. 그런데 조금 논외로, 이렇게 분리하는 방식이 좋은 방향성인가?에 대해서 궁금증이 생기고 사실 이 부분에 대해 최근 현업에서도 꽤 고민하고 있어서 질문을 드립니다. 아무래도 쪼렙 주니어개발자다보니.. 이런 부분에서 부족함과 의문이 많이 있네요 ㅠㅠ 제 생각에, 단축 url을 만드는 api가 200을 내려준다고하면 저장까지 올바르게 완료됨을 전제해야한다고 생각합니다. 이렇게 생각하는 이유는, 단축 url을 저장하는 것까지가 일종의 핵심적인 로직에 포함되지 않나? 하는 생각입니다. 예를 들어 로그를 찍거나, 혹은 비즈니스로직이여도 그렇게 중요하지 않은 부분이라면 마음편하게 완료를 보장하지 않는 async로 돌려도 될것 같습니다.하지만 url저장처럼 핵심적인 로직에 관한 부분에 대해서는 200을 내려줄 거면 저장도 올바르게 보장되어야 하지 않나? 하는 생각이 듭니다. 다르게 말하면, 내려준 단축 url이 정상적으로 동작하지 않는데 200을 내려줘도 되나? 에 대한 궁금증입니다.(물론 핵심적인 로직에 대한 판단은 개개인마다 또 상황마다 다를 수 있지만요) 결론적으로 여쭤보고 싶은 부분은 아래와 같습니다1) 비동기로 나누는 부분의 기준이 강사님에게 있으실 것 같은데, 보통 어떤 기준으로 나누시나요?2) 추가로, 핸들링을 어떤식으로 하시는지도 궁금합니다. 예를 들면 위와 같이 저장하는 로직을 비동기로 뺏을 때, 실패한다면 보통 어떤식으로 핸들링을 하시나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
orderList 페이지 div크기 차이
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.html코드는 같은데 입력창의 배치가 form-inline으로 안 나오는 이유가 있나요?<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head th:replace="fragments/header :: header"/> <body> <div class="container"> <div th:replace="fragments/bodyHeader :: bodyHeader"/> <div> <div> <form th:object="${orderSearch}" class="form-inline"> <div class="form-group mb-2"> <input type="text" th:field="*{memberName}" class="formcontrol" placeholder="회원명"/> </div> <div class="form-group mx-sm-1 mb-2"> <select th:field="*{orderStatus}" class="form-control"> <option value="">주문상태</option> <option th:each= "status : ${T(jpabook.jpashop.domain.OrderStatus).values()}" th:value="${status}" th:text="${status}">option </option> </select> </div> <button type="submit" class="btn btn-primary mb-2">검색</button> </form> </div> <table class="table table-striped"> <thead> <tr> <th>#</th> <th>회원명</th> <th>대표상품 이름</th> <th>대표상품 주문가격</th> <th>대표상품 주문수량</th> <th>상태</th> <th>일시</th> <th></th> </tr> </thead> <tbody> <tr th:each="item : ${orders}"> <td th:text="${item.id}"></td> <td th:text="${item.member.name}"></td> <td th:text="${item.orderItems[0].item.name}"></td> <td th:text="${item.orderItems[0].orderPrice}"></td> <td th:text="${item.orderItems[0].count}"></td> <td th:text="${item.status}"></td> <td th:text="${item.orderDate}"></td> <td> <a th:if="${item.status.name() == 'ORDER'}" href="#" th:href="'javascript:cancel('+${item.id}+')'" class="btn btn-danger">CANCEL</a> </td> </tr> </tbody> </table> </div> <div th:replace="fragments/footer :: footer"/> </div> <!-- /container --> </body> <script> function cancel(id) { var form = document.createElement("form"); form.setAttribute("method", "post"); form.setAttribute("action", "/orders/" + id + "/cancel"); document.body.appendChild(form); form.submit(); } </script> </html>
-
해결됨RAG를 활용한 LLM Application 개발 (feat. LangChain)
문서의 수에 따른 답변 정확성
안녕하세요 강사님 질문이 있는데,문서 20개 정도를 Pinecone에 등록한다고 할 때 인덱스 하나에 모두 등록하시나요?? 인덱스 하나에서 답변을 찾는게 정확성이 좀 떨어지는거 같은 느낌이들어서요~!많은 문서에서 보다 정확한 답변을 얻으려면 좋은 방법이 있을까요??
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
list형태를 불러올 수 없다고 합니다.
영상과 동일하게 적었는데 list 형태를 불러올 수 없다고 나오는 건 왜일까요??ㅠㅠ
-
해결됨실전! 스프링 데이터 JPA
스프링 데이터 Jpa 공통 인터페이스 기능 getOne(ID)
강의 자료 3. 공통 인터페이스 기능 마지막 주요 메서드 부분 getOne(ID): 엔티티를 프록시로 조회한다. 내부에서 EntityManager.getReference() 호출여기에 적힌 getOne이 스프링 데이터 JPA 2.5 부터 getById로 변경 되었고 스프링 데이터 JPA 2.6 getReferenceById로 변경되어 3.0 부터 getById도 deprecated 되었다고 들었는데 강의 자료에는 변경되어 있지 않는 것 같습니다.
-
해결됨비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
도커 컴포즈
현재 개인 프로젝트에 EC2에 도커 컴포즈로 프론트, 백엔드, db까지 실행되도록 아키텍처를 구성 했습니다.그런데 말씀하신 것처럼 RDS, elastiCache 를 분리시켜서 아키텍처를 구성 해야 할 필요성이 있을까요?
-
미해결스프링 핵심 원리 - 기본편
@Component 달때 rateDiscountPolicy에는 안다는이유
1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) ㅇ[질문 내용]@Component 어노테이션사용하여 자동 빈등록을할때 8:30에서 설명하듯이 rateDiscountPolicy에는 @Component는 달고fixDiscountPolicy 클래스에는 안다는 이유가 궁금합니다.빈을 등록할때 fix와 rate중 사용할려는 정책은 rat이기때문에 중복해서 빈으로 등록하지않는거라고 생각하면될까요? 추후 fix로도 쓸수있을텐데 빈으로 등록안하는 이유가 궁금합니다
-
미해결모두의 한국어 텍스트 분석과 자연어처리 with 파이썬
load_metric 에러 발생
from datasets import load_metricImportError: cannot import name 'load_metric' from 'datasets' (/usr/local/lib/python3.10/dist-packages/datasets/__init__.py) datasets에서 load_metric을 불러오려고 하는데 위와 같은 에러가 발생합니다. 계속 삽질하고 있는데 방법을 찾기가 쉽지가 않네요ㅠ 도움 부탁드립니다.
-
해결됨스프링 시큐리티 완전 정복 [6.x 개정판]
AuthenticationManager의 HttpSecurity 사용 부분에 질문 있습니다
CustomAuthenticationFilter 관련 설명에서 AuthenticationManager는 빈이 아니기 때문에 주입받지 못해 @Bean 선언하면 안된다고 설명하셨는데요.AuthenticationManager를 bean으로 등록하고 CustomAuthenticationFilter를 bean으로 등록해서 AuthenticationManager를 주입받는 식으로 코드를 짜도 될 것 같은데 그렇게 하지 않은 이유가 securityFilterChain 내에서만 사용되기 때문에 bean으로 등록할 이유가 없기 때문인가요? 아니면 혹시 다른 이유가 있나요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
야생형 코스는 MVC1편에서 바로 넘어가도 괜찮을까요??
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]노베이스에서 자바 기본편부터 차근차근 MVC1편까지 완강했네요 !! 근데 그냥 이론만 보면서 공부하니 실제로 어떻게 쓰는지 감이 안 오는 경우가 많아 저도 영한님이 말씀하신거처럼 부딪히면서 하는게 맞는거같아서 바로 실전으로 들어가고싶은데 야생형의 최저 강의조건이 어느정도인지 궁금하네요 ㅠㅠ현재 MVC 1편까지 완강했는데 MVC2편까지는 완강을 하고 들어가는게 나을까요?아니면 바로 JPA활용으로 들어가도 괜찮을까요
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
@PostConstruct와 @Transactional 빈 생명주기와 함께 순서를 정리해보고 싶습니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]비슷한 질문과 답변을 많이 봤는데 한번 정리한 것을 확인 받고 싶습니다. 너무 많이 질문 받아 번거로우시겠지만 확인해주시면 감사합니다 스프링 빈의 이벤트 라이프사이클은 다음과 같았습니다스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백(@PostConstruct) -> 사용 -> 소멸전 콜백 -> 스프링 종료김영한님이 답변에서 정리해주신 말씀은 다음과 같습니다@PostConstruct는 해당 빈 자체만 생성되었다고 가정하고 호출된다. 해당 빈에 관련된 AOP등을 포함한, 전체 스프링 애플리케이션 컨텍스트가 초기화 된 것을 의미하지는 않습니다. 트랜잭션을 처리하는 AOP등은 스프링의 후 처리기(post processer)가 완전히 동작을 끝내서, 스프링 애플리케이션 컨텍스트의 초기화가 완료되어야 적용된다.이를 종합해서 일어나는 순서를 더 세분화 하면 다음과 같다고 생각합니다.스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백(@PostConstruct) -> 스프링의 후처리기 적용(트랜잭션 AOP 등 프록시 객체 생성) -> 후 처리가 완료된 후 빈 등록 -> 스프링 애플리케이션 컨텍스트의 초기화가 완료 되어 어플리케이션 실행-> 사용 -> 소멸전 콜백 -> 스프링 종료예제 코드에서 위처럼 hello 클래스 로그를 찍어보면 프록시 객체라고 나오는 이유는 해당 메서드가 실행되는 시점이 사용 시점에 해당하기 때문이다전체적인 내용이 맞을까요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
섹션25
이건 무슨 오류 일까요?