묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
트랜잭션 템플릿과 AOP의 프록시객체
안녕하세요.앞에서 템플릿 콜백 패턴으로 트랜잭션 템플릿(스프링이 제공한 것이긴 하지만)을 구현했던 것처럼 AOP의 프록시 객체 클래스를 직접 구현할 수도 있을까요??구현할 수 있다면 어떤 방식으로 구현하는지,구현이 어렵다면 어떤 부분 때문에 어려운지 궁금합니다...!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
SimpleOrderDto에서의 Address
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.SimpleOrderDto에서의 Address를 왜 (order.getDelivery().getAddress()) 오더의 딜리버리에서 가져오는 건가요?? 오더에 멤버에서 가져올수도 있는데 딜리버리에서 가져오는 이유가 있을까요? 멤버에서 가져오면 쿼리가 3번이면 끝나고 딜리버리에서 가져오면 5번의 쿼리를 거쳐서 조금 헷갈립니다
-
미해결실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD
상품등록 API 개발, JPA로 변환하기 에서
org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "PRODUCTS" not found (this database is empty); SQL statement:select product0_.name as name1_0_0_, product0_.discount_policy as discount2_0_0_, product0_.id as id3_0_0_, product0_.price as price4_0_0_ from products product0_ where product0_.name=? [42104-214] 이런 에러가 나옵니다.. application.properties 에서 jpa 관련 설정해준건 없고따라하기만 했을 뿐인데 저런 에러가 뜨네요.. 제가 알기론 jpa 의 ddl-auto 가 create 라서 저절로 생성해주는걸로 알고있는데 ,, 왜 저런 에러가 뜨는지그리고 강사님이랑 같은 코드를 입력했는데 발생하는지 궁금하네요
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
자료구조가 뭔가요?
선형 자료구조 섹션을 다 봤는데요.자료구조라는게 뭔가요? 왜 만드나요? 자료구조에서의 선형이라는 말은 뭘 의미하나요? 섹션 마지막까지 이 질문에 대한 답을 찾을 수 없었습니다. 이 섹션은 입문자를 기준으로 만들어진 강의같지 않습니다. 이 글을 보신다면 꼭 좀 답변 부탁드립니다.이전에 연결리스트 강의에 올렸던 질문도 답변 부탁드립니다. 초심자의 경우 확신을 얻어가는 경험이 무엇보다 중요합니다. 부탁합니다.
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
jwt + OAuth2 문의
안녕하세요 현재 jwt 코드 리뷰 까지 듣고수업 코드를 참고해 oauth2 + jwt를 만들어보고 있는데요응답한 jwt토큰이 요청 헤더에 포함되지 않는 문제를도무지 해결하지 못해서 질문드립니다 ㅠㅠ OAuth2 로그인-> loadUser에서 유저 정보를 받아 임시 세션에 저장 -> 핸들러에서 토큰 생성후 응답. 순서로 만들었습니다. OAuth2User 구현체에 유저 정보 세팅해 임시 세션에 저장시켰습니다.@Service public class CustomOauth2UserService extends DefaultOAuth2UserService { @Override public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { OAuth2User oAuth2User = super.loadUser(userRequest); UserEntity userEntity = new UserEntity(); userEntity.setProvider(userRequest.getClientRegistration().getClientName()); userEntity.setUsername(oAuth2User.getAttribute("name")); userEntity.setEmail(oAuth2User.getAttribute("email")); userEntity.setRole("ROLE_USER"); // oAuth2User 와 userEntity 로 OAuth2User 구현체 생성 return new DefaultOauth2User(userEntity, oAuth2User.getAttributes()); } }핸들러로 넘어와 토큰을 생성하고 응답 헤더에 추가시켰습니다.JwtProcess나 JwtVO는 선생님 코드랑 똑같이 만들었습니다.@Component public class Oauth2SuccessHandler extends SimpleUrlAuthenticationSuccessHandler { @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { DefaultOauth2User oAuth2User = (DefaultOauth2User) authentication.getPrincipal(); String jwtToken = JwtProcess.create(oAuth2User); response.addHeader(JwtVO.HEADER, jwtToken); getRedirectStrategy().sendRedirect(request, response, "/"); } }시큐리티 설정파일입니다.cors설정인 configurationSource도 선생님과 같습니다.@Configuration @EnableWebSecurity @RequiredArgsConstructor public class SecurityConfig { private final CustomOauth2UserService userService; private final Oauth2SuccessHandler successHandler; @Bean SecurityFilterChain filterChain(HttpSecurity http) throws Exception{ http.headers().frameOptions().disable(); http.csrf().disable(); http.httpBasic().disable(); http.cors().configurationSource(configurationSource()); http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); http.authorizeRequests() .antMatchers("/user/**").authenticated() .antMatchers("/admin/**").hasRole("ADMIN") .anyRequest().permitAll() .and() .oauth2Login() .loginPage("/loginForm") .successHandler(successHandler) .userInfoEndpoint().userService(userService); return http.build(); } 구글 로그인 시 /로 리다이렉트는 정상적으로 됩니다.그런데 크롬 개발자 도구를 보면 response 헤더에는 jwt토큰이 있는데요청 헤더에는 jwt토큰이 없습니다... 프론트 쪽은 html 파일들만 생성했는데 혹시 자바스크립트로 뭔가 해줘야 하나요?검색 결과들 참고해서 만들었는데 혹시 oauth2와 jwt를 합치는 방향 자체가 틀렸을까요? 아니면 구글에서 받은 access토큰이 jwt인가요?
-
미해결[백문이불여일타] 데이터 분석을 위한 중급 SQL
Average Population 질문 있습니다.
답이 SELECT ROUND(AVG(population)) FROM city;이건데SELECT AVG(POPULATION) AS AVG_POP FROM CITYWHERE ROUND(AVG_POP, 0);이렇게 하면 안되던데 WHERE 을 쓰면 안되는건가요?
-
미해결진짜 현업에서 쓰이는 직장인의 실무 엑셀 - 데이터 가공부터 분석까지
3강 OPEN AI 고급 편집기
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요. 3강 OPEN AI 학습 중인데 질문이 있어 글 남깁니다. URL 나누는 작업을 하는데, EXCEL 버전이 달라서 그런지, 편집기의 화면이 달라서입력 방법 문의드립니다.남자1 여자2, 기간202208 등 강의와 동일하게 설정을 하려면 어떻게 해야 할까요?
-
해결됨유니티 머신러닝 에이전트 완전정복 (기초편)
yaml을 이용한 GAIL 및 BC를 mlagents-learn으로 실행 시 에러
python API 를 이용한 BC는 무사히 잘 작동합니다.재밌네요. ㅎㅎ현재는 제목처럼, yaml에 GAIL 및 BC를 설정해서, 유니티의 mlagents-learn으로 실행하는 하는 것을 시도하고 있습니다.Kart.exe 의 창이 뜨고 잘 진행되는 듯하다가 다음과 같이 커맨트창에 에러를 내놓고 꺼집니다.저의 yaml 파일 내용을 다음과 같습니다.
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
primary 취소선이 있어요.. 어떻게 하나요?
(사진)
-
해결됨스케치업 실무활용 SketchUp2023
단축키 -2.skp 파일
안녕하세요. 단축키- 2. skp 파일을 어디서 다운 받을 수 있는지 궁금합니다.감사합니다.
-
해결됨실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
모바일에서 접속한 것처럼 안되는 문제
user-agent를 변경하고 실행해도 pc에서 접속한 것처럼 보입니다.제 코드는 아래와 같으며 파이참에서 작성했습니다.from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By import time # 모바일에서 접속한 것처럼 보이게 하기 user_agent="Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1" options = Options() options.add_experimental_option("detach",True) # 화면이 안꺼지는 옵션 options.add_argument("--start-maximized") options.add_argument(f"user_agent={user_agent}") service = Service(ChromeDriverManager().install()) #크롬 드라이버를 자동설치하는 서비스를 만듬 driver = webdriver.Chrome(service=service,options=options) url = "https://m2.melon.com/index.htm" driver.get(url) if driver.current_url != url: driver.get(url) time.sleep(2)
-
미해결쉽게 시작하는 쿠버네티스(v1.30) - {{ x86-64, arm64 }}
안녕하세요 질문있습니다.
질문 답변을 제공하지만, 강의 비용에는 Q&A는 포함되어 있지 않습니다. 다만 실습이 안되거나, 잘못된 내용의 경우는 알려주시면 가능한 빠르게 조치하겠습니다![질문 전 답변]1. 강의에서 다룬 내용과 관련된 질문인가요? [예 | 아니요]2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? [예 | 아니요]3. 질문 잘하기 법을 읽어보셨나요? [예 | 아니요](https://www.inflearn.com/blogs/1719)4. 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.5. vagrant up 에서 발생하는 문제는 주로 호스트 시스템(Windows, MacOS)과 연관된 다양한 조건에 의해 발생합니다. 따라서 이를 모두 제가 파악할 수 없어서 해결이 어렵습니다. vagrant up으로 진행이 어렵다면 제공해 드리는 가상 머신(VM) 이미지를 import해서 진행하시기 바랍니다. (https://www.inflearn.com/questions/992407/comment/281901)[질문 하기]mac os m1 pro은 vagrant를 통해 virtualbox 설치 할 수 있는 방법이 아직 없나요?virtualbox 관련해서 arm 버전들이 있어서 시도는 해봤는데 설치가 되질 않네요.m1 나 m2는 현재 이미지 설치 방법 밖에 없는지 궁금합니다. 시도해보니 unsupported cpu가 나오면서 되질 않네요.그리고 호스트 전용 어댑터가 virtualbox 7.0 부터는 deprecated가 되어 있네요..
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
Immer 적용시 에러 문의드립니다.
안녕하세요. React Immer 적용시 나타나는 에러인데확인한번 부탁드려도 될까요?Immer 적용 전까지 코드는 잘 돌아갔는데, 에러 추적이 힘드네요. 웹 팩 환경설정 문제일까요? immer module은 잘 설치되어 있습니다. 에러내용소스코드front/reducers/user.jsimport produce from 'immer'; export const initialState = { logInLoading : false, // 로그인 시도중 logInDone : false, loginError : null, logOutLoading : false, // 로그아웃 시도중 logOutDone : false, logOutError : null, signUpLoading : false, // 회원가입 시도중 signUpDone : false, signUpFailure : null, changeNicknameLoading : false, // 닉네임 변경 시도중 changeNicknameDone : false, changeNicknameFailure : null, me : null, signUpData : {}, loginData : {}, }; const dummyUser = (data) => ({ ...data, nickname : '제로초', id : 1, Posts : [{ id : 1}], Followings : [{nickname : 'AAA'}, {nickname : 'BBB'}, {nickname : 'CCC'}], Followers : [{nickname : 'AAA'}, {nickname : 'BBB'}, {nickname : 'CCC'}], }); export const LOG_IN_REQUEST = 'LOG_IN_REQUEST'; // 액션의 이름 export const LOG_IN_SUCCESS = 'LOG_IN_SUCCESS'; export const LOG_IN_FAILURE = 'LOG_IN_FAILURE'; export const LOG_OUT_REQUEST = 'LOG_OUT_REQUEST'; // 액션의 이름 export const LOG_OUT_SUCCESS = 'LOG_OUT_SUCCESS'; export const LOG_OUT_FAILURE = 'LOG_OUT_FAILURE'; export const SIGN_UP_REQUEST = 'SIGN_UP_REQUEST'; export const SIGN_UP_SUCCESS = 'SIGN_UP_SUCCESS'; export const SIGN_UP_FAILURE = 'SIGN_UP_FAILURE'; export const CHANGE_NICKNAME_REQUEST = 'CHANGE_NICKNAME_REQUEST'; export const CHANGE_NICKNAME_SUCCESS = 'CHANGE_NICKNAME_SUCCESS'; export const CHANGE_NICKNAME_FAILURE = 'CHANGE_NICKNAME_FAILURE'; export const FOLLOW_REQUEST = 'FOLLOW_REQUEST'; export const FOLLOW_SUCCESS = 'FOLLOW_SUCCESS'; export const FOLLOW_FAILURE = 'FOLLOW_FAILURE'; export const UNFOLLOW_REQUEST = 'UNFOLLOW_REQUEST'; export const UNFOLLOW_SUCCESS = 'UNFOLLOW_SUCCESS'; export const UNFOLLOW_FAILURE = 'UNFOLLOW_FAILURE'; export const ADD_POST_TO_ME = 'ADD_POST_TO_ME'; export const REMOVE_POST_OF_ME = 'REMOVE_POST_OF_ME'; export const signUpAction = (data) => { return { type: SIGN_UP_REQUEST, data, }; }; export const changeNicknameAction = (data) => { return { type: CHANGE_NICKNAME_REQUEST, data, }; }; export const loginRequestAction = (data) => { return { type: LOG_IN_REQUEST, data, } }; export const logoutRequestAction = { type: LOG_OUT_REQUEST, }; const reducer = (state = initialState, action) => produce(state, (draft) => { switch (action.type) { // 로그인 case LOG_IN_REQUEST: draft.state = true; draft.loginError = null; draft.logInDone = false; break; case LOG_IN_SUCCESS: draft.logInLoading = false; draft.logInDone = true; draft.me = dummyUser(action.data); break; case LOG_IN_FAILURE: draft.logInLoading = false; draft.loginError = action.error; break; // 로그아웃 case LOG_OUT_REQUEST : draft.logOutLoading = true; draft.logOutError = null; break; case LOG_OUT_SUCCESS : draft.logOutLoading = false; draft.logOutDone = false; draft.me = null; break; case LOG_OUT_FAILURE : draft.logOutLoading = false; draft.logOutError = action.error; break; // 회원가입 case SIGN_UP_REQUEST : draft.signUpLoading = true; draft.signUpDone = false; draft.signUpError = null; break; case SIGN_UP_SUCCESS : draft.signUpLoading = false; draft.signUpDone = true; break; case SIGN_UP_FAILURE : draft.signUpLoading = false; draft.signUpData = action.error; break; // 닉네임 변경 case CHANGE_NICKNAME_REQUEST : draft.changeNicknameLoading= true; draft.changeNicknameDone= false; draft.changeNicknameError= null; break; case CHANGE_NICKNAME_SUCCESS : draft.changeNicknameLoading = false; draft.changeNicknameDone = true; break; case CHANGE_NICKNAME_FAILURE : draft.changeNicknameLoading = false; draft.changeNicknameData = action.error; break; // 게시글 등록시 사용자 dummy Data에 동기화 case ADD_POST_TO_ME : draft.me.Posts.unshift({ id : action.data}) break; // return { // ...state, // me : { // ...state.me // Posts: [ { id.action.data}, ...state.me.Posts] // } // } // 게시글 삭제 case REMOVE_POST_OF_ME : draft.me.Posts = draft.me.Posts.filter((v) => v.id !== action.data) break; // return { // ...state, // me : { // ...state.me, // Posts : state.me.Posts.filter((v) => v.id !== action.data) // } // } default: break; } }); export default reducer;
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
와우... 익숙하지 않은 방법이라 어렵네요. 객체로 데이터를 가공해서 풀어봤습니다. [리뷰부탁드려요]
const solution = (arr, mathScore={}) => { let count = result = 0; arr.forEach((list) => { list.forEach((rank, idx) => { mathScore[rank] = mathScore[rank] ? [...mathScore[rank], idx] : [idx] }); }); for(let i=1;i<=arr[0].length; i++) { for(let j=1;j<=arr[0].length; j++) { count=0 if(i !== j) { for(let k=0;k<arr.length; k++) { mathScore[i][k] > mathScore[j][k] && count++ } } count === arr.length && result++ } } return result }
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
class MainActivity : FragmentActivity()로 작성을 해야지 실행이 됩니다.
앱실행시 계속 오류가나서이것저것 알아본결과Main Activity.kt의class MainActivity : AppCompatActivity()를class MainActivity : FragmentActivity()로 바꾸어 실행하였더니 실행되었습니다. 최근에 컴퓨터를 바꿔서 안드로이드 스튜디오를 새로 깔았는데 혹시 이게 원인이 될 수 있을까요? 최신버전에서 NavHostFragment를 사용하기 위해서는 AppCompatActivity()를 사용해야 동작하는 건가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
강의 내용을 복습하는 도중 에러발생
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의 내용을 복습하는 도중 WEB-INF/views 에있는 jsp 파일을foward 하는 과정에서 에러가 발생합니다.아무리 봐도 틀린것도없고 문제되는 사항도없는거같은데이상하게 404 에러가 계속 출력되네요오타도없구요 ..강의 내용을 복습하며 스스로 만들어보고자 하고 따라하다가 이상하길래 소스코드까지 비교 해가며 했지만 다를게 없는데 안되네요 https://drive.google.com/file/d/1Zpk7Dk007LNbtLLHE_OKICgq-gmki2Jp/view?usp=sharing 구글드라이브 링크로 소스코드 첨부 합니다 뭐가 문제인지좀 봐주실수잇을까요 ? mvc에 url-patterns에 /home을 하였는데localhost:8080/home 에 접속하면WEB-INF/views/test.jsp 내용이 출력되어야하는데그냥 404에러만 뜹니다.
-
해결됨디지털포렌식 입문자를 위한 디지털포렌식 전문가 2급 실기 시험대비 강의(Encase/Autopsy)
Autopsy에서 DHCP, IP 확인 방법 및 hwp 내부구조 확인방법
안녕하세요Autopsy에서 DHCP, IP 주소 확인 방법과 hwp 등 파일의 내부구조를 확인하는 방법이 궁금합니다.
-
미해결파이썬 무료 강의 (활용편2) - GUI 프로그래밍 (4시간)
리스트박스 항목 추가
Listbox에 항목을 추가할때 일일이 다listbox.insert(0, "example")이런 형태로 작성해야 하나요?여러개의 항목을 추가할 때 조금 불편할 거 같아서..
-
미해결
@NamedEntityGraph으로 여러개의 엔티티를 패치조인 할 때, 오류발생
안녕하세요. 지난 번에 하나의 엔티티에 oneToMany 연관관계가 있는 두 개의 엔티티를 패치조인 하는 방식을 여쭤어보았습니다.https://www.inflearn.com/questions/999265 답변은 NamedEntityGraph를 활용하여 두 개의 엔티티를 패치조인 하는 방식으로 알려주셨는데요. 조언 주신 방법을 적용해보니 다음과 같은 에러가 나왔습니다.org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags: [com.project.kftcCenter.domain.securityMedia.model.KftcSecurityMedia.kftcSecurityMediaHistoryList, com.project.kftcCenter.domain.securityMedia.model.KftcSecurityMedia.kftcToken]....'cannot simultaneously fetch multiple bags'를 키워드로 검색해보니 2개 이상에 OneToMany 자식 테이블에 패치조인을 선언했을 때 나는 에러라고 하는데.. 딱 제가 조인 하려는 케이스 같은데요. 이럴 때 대안으로 하나만 패치조인을 하고 나머지는 lazy 조인을 하라는게.. 인터넷 서치를 해본 솔루션인데... 이거 말고 다른 방법으로 해결 할 수 있는 방법은 없을까요? 올바른 솔루션이 무엇일지 궁금합니다.
-
해결됨풀스택 리액트 라이브코딩 - 간단한 쇼핑몰 만들기
query 에러 발생했습니다.
Unexpected Application Error!No QueryClient set, use QueryClientProvider to set oneError: No QueryClient set, use QueryClientProvider to set one at useQueryClient (http://localhost:3000/node_modules/.vite/deps/chunk-PPRRYNMJ.js?v=afce5f27:2826:11) at useBaseQuery (http://localhost:3000/node_modules/.vite/deps/chunk-PPRRYNMJ.js?v=afce5f27:3003:23) at useQuery (http://localhost:3000/node_modules/.vite/deps/chunk-PPRRYNMJ.js?v=afce5f27:3051:10) at ProductList (http://localhost:3000/src/pages/products/index.tsx?t=1694339505145:26:7) at renderWithHooks (http://localhost:3000/node_modules/.vite/deps/chunk-MMW4JUSU.js?v=afce5f27:12169:26) at mountIndeterminateComponent (http://localhost:3000/node_modules/.vite/deps/chunk-MMW4JUSU.js?v=afce5f27:14919:21) at beginWork (http://localhost:3000/node_modules/.vite/deps/chunk-MMW4JUSU.js?v=afce5f27:15900:22) at beginWork$1 (http://localhost:3000/node_modules/.vite/deps/chunk-MMW4JUSU.js?v=afce5f27:19747:22) at performUnitOfWork (http://localhost:3000/node_modules/.vite/deps/chunk-MMW4JUSU.js?v=afce5f27:19192:20) at workLoopSync (http://localhost:3000/node_modules/.vite/deps/chunk-MMW4JUSU.js?v=afce5f27:19131:13)import { Suspense, useEffect } from "react"; import { getClient } from "./queryClient"; import { QueryClientProvider } from "@tanstack/react-query"; import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; import { routes } from "./routes"; import { useRoutes } from "react-router-dom"; const App = () => { const elem = useRoutes(routes); const queryClient = getClient(); console.log("QueryClient:", queryClient); // useEffect(() => { console.log("QueryClientProvider is mounted."); }, []); return ( <QueryClientProvider client={queryClient}> <Suspense fallback={<div>Loading...</div>}>{elem}</Suspense> <ReactQueryDevtools initialIsOpen={false} /> </QueryClientProvider> ); }; export default App; import React from "react"; export const DynamicIndex = React.lazy(() => import("./pages/index")); export const DynamicProductsIndex = React.lazy(() => import("./pages/products/index")); export const DynamicProductsId = React.lazy(() => import("./pages/products/[id]"));import GlobalLayout from "./pages/_layout"; import * as Lazy from "./Lazy"; export const routes = [ { path: "/", element: <GlobalLayout />, children: [ { path: "/", element: <Lazy.DynamicIndex />, index: true }, { path: "/products", element: <Lazy.DynamicProductsIndex />, index: true }, { path: "/products/:id", element: <Lazy.DynamicProductsId /> }, ], }, ]; export const pages = [{ route: "/" }, { route: "/products" }, { route: "/products/:id" }]; queryclient와 queryprovider를 잘 설정한것 같은데 에러가 발생하고 있습니다. 거의 4시간 가까이 찾아본것 같습니다.. Lazy부분은 따로 분리를 안하면 경고를 띄워서 분리를 했습니다. 이리저리 만져서 tool도 안뜨는걸 뜨게 했는데 저 에러는 도저히 해결이 안되네요 ... https://github.com/littleduck1219/Web_Toy_Project/tree/main/shopping-mall