묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
5.2강의에서 header태그 에러
const Header = () => { return { <header> <h1>header</h1> </header> }; }; 위의 코드 작성시속성 할당이 필요합니다.선언 또는 문이 필요합니다.식이 필요합니다.선언 또는 문이 필요합니다.이 4가지 에러가 표시됩니다.
-
해결됨React, Node.js, MongoDB로 만드는 나만의 회사 웹사이트: 완벽 가이드
코드 다시 만져보면서 추가질문입니다.
문의하기에서 접수 완료 후 (현재 기본 로컬~문의완료되었습니다.) 알럿 뜨는거 저번에 배운 게시글 처럼 넣어서 이쁘게 꾸며도 사용상 문제없는거 맞죠?만약에 참고할만한 알럿 다른 라이브러리나 깃허브 같은건 보통 실무에서 어떻게 참조하나요?몽고DB랑 AWS_S3로 저희가 이미지 및 데이터를 저장하잖아요, 그럼 실무에서는 그냥 도메인 및 호스팅만 따로 구매해서 넘겨드리고 사용 하시면 된다고 하면서 넘겨드리고, 몽고DB 및 AWS_S3는 제가 한 계정(제 개발계정)에 같이 폴더만 나눠서 관리하는 식으로 많이하나요? 궁금합니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
포트원 질문입니다
const onClickLoad = async (event: MouseEvent<HTMLDivElement>) => { const IMP = window.IMP; IMP.init("imp00000000"); //실제로는 강의자료에 있는 식별코드 사용했습니다! IMP.request_pay( { pg: "kakaopay", pay_method: "card", name: "아이리버 무선 마우스 외 1개", amount: 10000, buyer_email: "이메일@gmail.com", buyer_name: "홍길동", buyer_tel: "010-4242-4242", buyer_addr: "서울특별시 강남구 신사동", buyer_postcode: "01181", m_redirect_url: "/", }, function (rsp: any) { if (rsp.success) { alert("결제가 성공했습니다."); console.log(rsp); } else { alert("결제에 실패했습니다."); } }, ); };위와 같은 코드로 정상적으로 rsp를 받고, imp_uid 까지 받았습니다. 그런데graphql api 호출을 했더니 _id 가 null이라는 에러가 계속해서 발생하네요. 챗gpt 도움을 받아보니, 백엔드가 impUid를 기반으로 결제 정보를 조회하고 DB에 적립하는 로직이 정상적으로 동작하는지 확인해야한다고 하는데, 에러원인이 무엇이고,어떻게 해결해야 하는지 알려주세요! 포트원 가맹점 식별코드는 강의 자료에 있는 식별코드를 사용했습니다!
-
해결됨React, Node.js, MongoDB로 만드는 나만의 회사 웹사이트: 완벽 가이드
로그인 문제에 대해서
안녕하세요 선생님강의 잘들었습니다! 마지막 영어 및 다국어 변환만 들으면 벌써 완강이네요 감사합니다 :)전체적으로 코드를 보다가 궁금증이 있어서 문의합니다.코드 정리하면서 기능 하나씩 눌러보니, 1. 회원가입 페이지가 저희 프로젝트에는 없어서 몽고db에 수동으로 등록하면서 진행했잖아요 이부분을 회원가입으로 어떻게 연동하는지 궁금합니다.2. 실무에서 사용하는 강의라고 하셨는데 이부분은 실무에서 저희 프로젝트처럼 진행하면 어떻게 설명하는지도 궁금합니다. "로그인이 다른곳에되어있습니다"이렇게 어드민에 뜨게 되면 지금이야 저희가 몽고db에 들어가서 false로 변경하면 들어가지긴하나, 이걸 온라인에 배포한다고 하면 어떻게 실무적으로 처리하나요??
-
해결됨React, Node.js, MongoDB로 만드는 나만의 회사 웹사이트: 완벽 가이드
노션 파일 중에서 contact input내용이 전부 날아가있네요
코드가 조금 다른 것 같습니다.2. 문의하기 누르면 어드민으로 문의하기가 넘어가고 어드민으로 들어왔을때 확인 되어야하는거죠?제가 놓친 것 같아서 깃허브를 찾아서 복사 붙여넣기하니,아래 처럼 뜹니다.저희가 이걸 배운적이 있나요? 있다면 어느 부분인지 궁금합니다.import ContactLocale from "../../Locale/Contact.json"; [plugin:vite:import-analysis] Failed to resolve import "../../Locale/Contact.json" from "src/Page/Contact/Contact.jsx". Does the file exist?C:/Users/shin/Desktop/company_website/frontend/src/Page/Contact/Contact.jsx:4:2619 | import { motion } from "framer-motion"; 20 | import axios from "axios"; 21 | import ContactLocale from "../../Locale/Contact.json"; | ^ 22 | const Contact = () => { 23 | _s();
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
12.11 오류 관련
강의 19:07까지 따라하다가 오류가 갑자기 많이 뜨는데 어디에서 잘못된 것인지 모르겠습니다...DiaryList.jsximport "./DiaryList.css"; import Button from "./Button"; import DiaryItem from "./DiaryItem"; const DiaryList=({data})=>{ return <div className="DiaryList"> <div className="menu_bar"> <select> <option value={"latest"}>Newest</option> <option value={"oldest"}>Oldest</option> </select> <Button text={"write new diary"} type={"POSITIVE"} /> </div> <div className="list_wrapper"> {data.map((item)=><DiaryItem key={item.id} {...item}/>)} </div> </div>; }; export default DiaryList;DiaryItem.jsximport {getEmotionImage} from "../util/get-emotion-image"; import Button from "./Button"; import "./DiaryItem.css"; const DiaryItem=({id,emotionId,createdDate,content})=>{ return (<div className="DiaryItem"> <div className={`img_section img_section_${emotionId}`}> <img src={getEmotionImage(emotionId)}/> </div> <div className="info_section"> <div className="created_date"> {new Date(createdDate).toLocaleDateString()}; </div> <div className="content">{content}</div> </div> <div className="button_section"> <Button text={"수정하기"} /> </div> </div> ); }; export default DiaryItem;App.jsximport './App.css' import{useReducer,useRef,createContext} from "react"; import {Routes,Route} from "react-router-dom"; import Home from "./pages/Home"; import Diary from "./pages/Diary"; import New from "./pages/New"; import Edit from "./pages/Edit"; import Notfound from "./pages/Notfound"; const mockData=[ { id:1, createdDate:new Date("2025-02-18").getTime(), emotionId:1, content:"1번 일기 내용", }, { id:2, createdDate:new Date("2025-02-17").getTime(), emotionId:2, content:"2번 일기 내용", }, { id:3, createdDate:new Date("2025-01-15").getTime(), emotionId:3, content:"3번 일기 내용", }, ]; function reducer(state,action){ switch(action.type){ case "CREATE": return [action.data,...state]; case "UPDATE": return state.map((item)=> String(item.id)===String(action.data.id) ?action.data : item ); case "DELETE": return state.filter( (item)=>String(item.id)!==String(action.id) ); default: return state; } } export const DiaryStateContext=createContext(); export const DiaryDispatchContext=createContext(); function App() { const [data,dispatch]=useReducer(reducer,mockData); const idRef=useRef(3); //새로운 일기 추가 const onCreate=(createdDate,emotionId,content)=>{ dispatch({ type:"CREATE", data:{ id: idRef.current++, createdDate, emotionId, content, }, }); }; //기존 일기 수정 const onUpdate =(id,createdDate,emotionId,content)=>{ dispatch({ type:"UPDATE", data: { id, createdDate, emotionId, content, }, }); }; //기존 일기 삭제 const onDelete=(id)=>{ dispatch({ type:"DELETE", id, }); }; return ( <> <DiaryStateContext.Provider value={data}> <DiaryDispatchContext.Provider value={{ onCreate, onUpdate, onDelete, }} > <Routes> <Route path="/" element={<Home />} /> <Route path="/new" element={<New />} /> <Route path="/diary/:id" element={<Diary />} /> <Route path="/edit/:id" element={<Edit />} /> <Route path="*" element={<Notfound />} /> </Routes> </DiaryDispatchContext.Provider> </DiaryStateContext.Provider> </> ); } export default App
-
해결됨React, Node.js, MongoDB로 만드는 나만의 회사 웹사이트: 완벽 가이드
매번 새로운 프로젝트를 실행할 때 cmd 설정문의
저희가 수업진행하면서 프론트엔드,백엔드에 많은 npm으로 설치하잖아요. 이런 라이브러리들을 매번 새로운 프로젝트마다설정해야할까요??비슷한 작업을 뽑아낸다고할때 기존 지금 폴더를 다시 연 다음에 이미지 및 텍스트 수정할때말고 다시 비슷한 프로젝트 폴더를 만들어서 한다고 하면 반드시 다시 전부 깔아야하는거죠? ㅠㅠ
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
[해결완료] TodoItem을 import했지만, 코드에서 사용하지 않아서 발생하는 ESLint 경고
한 입 크기로 잘라먹는 리액트 책 잘 보고 있습니다.카운터앱 프로젝트는 완료 후,두 번째 할 일 관리 앱 실행 중에 문제가 발생해서 문의드려요. 1. 문제 : 326쪽까지 문제없이 잘 실행이 되었는데, 327쪽 <div>{it.content}</div> 이 코드를 넣었을때부터 327쪽 책과 동일하게 코드 넣었는데, 에러 문구가 아래처럼 나왔어요. WARNING in [eslint] src\component\TodoList.js Line 1:8: 'TodoItem' is defined but never used no-unused-vars webpack compiled with 1 warning TodoItem을 import했지만, 코드에서 사용하지 않아서 발생하는 ESLint 경고인 것 같은데, {todo.map((it) => ( <TodoItem key={it.id} content={it.content} /> ))}여기서 TodoItem이 개별 할 일을 나타내는 컴포넌트라고 가정하고 content를 props로 전달했습니다.(이때, key 값으로 it.id를 사용하여 React에서 리스트 렌더링 최적화를 도와야 합니다.)파란색 부분과 같은 조언을 받아 코드를 수정했더니 npm run start 실행하면 서버에서 지금까지 한 모든 화면이 안 보이고 백지화 되었어요. ㅠㅠ 기존에 html5로 이펍3 만들기 조금 배웠고, css개념 어느 정도 이해하는 수준의 초보인데,책 보고 프로젝트1 마치고, 프로젝트2도 거의 다 와가서 재미있게 하는 중에 날벼락이 ㅠㅠ; 혼자서는 도저히 해결이 안 될 거 같아서 강의등록 후 문의드려요.. 초보라 문의도 이렇게 하는게 맞는지 모르겠네요.답변 부탁드릴게요~ 참고 todoeditor.js return 이하App.js import "./App.css"; import Header from "./component/Header"; import TodoEditor from "./component/TodoEditor"; import TodoList from "./component/TodoList"; import { useState, useRef } from "react"; const mockTodo = [ { id: 0, isDone: false, content: "React 공부하기", createDate: new Date().getTime(), }, {id: 1, isDone: false, content: "빨래 널기", createDate: new Date().getTime(), }, {id: 2, isDone: false, content: "노래 연습하기", createDate: new Date().getTime(), }, ]; function App() { const idRef = useRef(3); const [todos, setTodos] = useState(mockTodo); const onCreate = (content) => { const newItem = { id: idRef.current, content, isDone: false, createDate: new Date().getTime(), }; setTodos([newItem,...todos]); idRef.current += 1; }; return ( <div className="App"> <Header /> <TodoEditor onCreate={onCreate} /> <TodoList todos={todos}/> </div> ); } export default App;
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
새 강의쿠폰 질문있습니다
저번에 사놓고(2시간들음)다시 공부를 시작하려는데 혹시 새로운 강의로 들을수있을까요! 이번에는 꼭 완강 하겠습니다
-
미해결실무 중심! FE 입문자를 위한 React
jotai로 변경했을 때 코드
Recoil과 비슷해 보이는 Jotai로 혼자 바꿔보고 있는 중입니다 ㅠㅠ 근데 이번 강의 코드는 어떻게 바꿔야 하는지 감이 안 와요....
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
RTK에서 draft, state 차이가 있나요?
강의 들으면서 제로초님 RTK GitHub 코드도 보고 있는데요. RTK는 immer가 내부적으로 사용되어 state를 써도 불변성을 자동으로 처리하는 걸로 알고 있습니다. 그런데 https://github.com/ZeroCho/react-nodebird/blob/master/toolkit/front/reducers/user.js에선 리듀서 마다 state를 쓰는 곳이 있고 draft를 쓰는 곳이 있어서 질문합니다!역할은 같지만 단지 코드를 명시적이고 의도를 나타내기 위해 구분해서 쓰는 것이라고 생각되는데 구분해서 쓰는 다른 이유가 있는지 궁금합니다.
-
해결됨React, Node.js, MongoDB로 만드는 나만의 회사 웹사이트: 완벽 가이드
선생님 잘듣고있습니다.
여기 이 강의를 다듣고 회사 및 기업 홈페이지리를만들고,1. FIREBASE 강의도 들어서 로그인 기능 더 추가하면 되는거죠?2. 결제기능도 넣고 싶은데 강의 만들 계획이 있으신가요? 있다면 언제쯤일까요? 3. 카카오지도 API 끌고와서 호갱노노나 부동산지인 같은 홈페이지도 만들어 보고싶습니다. 한국부동산원 API 이런 API를 들고와서 설정하는 방법도 알고싶어요!아마 1,2,3이 합친다면 웬만한건 다 만들 수 있지않을까요?? 감사합니다
-
미해결한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
오픈 그래프 적용이 안되네요..
오픈 그래프가 아무것도 적용이 되지 않는데 문제를 못 찾겠습니다..index.html 에서<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <link rel="icon" type="image/svg+xml" href="/favicon.ico" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>감정일기장</title> <meta property="og:title" content="감정 일기장" /> <meta property="og:description" content="나만의 작은 감정 일기장" /> <meta property="og:image" content="/thumbnail.png" /> </head> <body> <div id="root"></div> <script type="module" src="/src/main.jsx"></script> </body> </html> 으로 작성을 하고 배포를 했는데 오픈 그래프 3가지 중 아무것도 적용이 안되네요..카톡말고도 티 스토리 블로그 글쓰기에서도 적용이 안 되는걸로 보아 캐시 문제는 아닌 것 같은데.. 오타가 있는지도 다른 분들 코드 보면서 비교해봤고 이미지도 public 폴더에 잘 있습니다..뭐가 문제일까요?..배포링크: https://emotion-diary-dfgr3t44x-watnus-projects.vercel.app/배포링크에서 썸네일 확인:https://emotion-diary-dfgr3t44x-watnus-projects.vercel.app/thumbnail.png
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
9.2 useReducer 체크박스 관련질문입니다.
문제상황: 수정을 위해 체크박스를 체크해도 아무 변화도 생기지 않는 상황reducer 내용 const reducer = (state, action) => { switch(action.type){ case 'CREATE': return [action.data,...state]; case 'UPDATE': return state.map((item) => { console.log(action, item.id, item.isDone) return item.id === action.targetId ? {...item, isDone: !item.isDone} : item }) case 'DELETE': return state.filter((item) => item.targetId !== action.targetId) default: state } } const onUpdate = (targetId) => { dispatch({ type:"UPDATE", targetId }) } 예상 문제: console.log(action.targetId, item.id, item.isDone)을 해본결과action.targetId가 내가 원하는 id값만 가져오는것이 아닌 저렇게 객체 전체를 가져오기 때문에 action.targetId와 item.id가 일치하지 않아 체크가 되지않는 현상인것 같습니다. 어디를 보면 좋을지 및 무엇을 수정해야하는지 알려주시면 감사하겠습니다.
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
만약 비동기 작업이 완료되었을 때는 넘겨주는 콜백 함수가 없다면 어떻게 되나요?
제가 이해한 내용이 맞는지 궁금하여 질문드립니다! 콜백 함수 없이 비동기 작업을 Web APIs에게 넘겨준다면 비동기 작업이 처리되고 넘겨줄 콜백 함수가 없으므로 아무일도 일어나지 않는다.개발자가 자바스크립트에서 비동기적으로 어떠한 코드를 처리하기 위한 목적으로 비동기 코드와 콜백 함수를 같이 작성한다. 라고 생각해도 될까요?
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
React Hooks 만들때는 첫 번째 파일명을 대문자로 안해도되나요?
안녕하세요! 질문있습니다.(강의 구간: 10:43초)강사님께서 평소 컴포넌트 파일들을 만들때파일명 첫 번째에는 항상 대문자로 적으셨는데hooks를 만들때는 첫 번째 글자를 소문자로 적어주셨는데hooks만들때는 첫 번째 글자를 소문자로 적는건가요?
-
미해결대용량 채팅 TPS 처리를 위한 웹소켓 통신 만들며 학습하기
소켓 연결과 http
강의중에 "websocket을 연결할때 ip가 변경되는 정책으로인해 http로 구현했다"고 말씀하신부분에 질문이 있습니다. dns를 사용한다면 서버 ip 변경이 있어도 연결이 가능하지 않을까 생각하는데요. 그렇다면 ws을 유지하는게 더 좋았을거라고 생각하시나요? 아니면 dns의 적용의 지연시간이나 기타 다른 이유들로인해 여전히 http를 선택했을지 궁금합니다
-
해결됨React, Node.js, MongoDB로 만드는 나만의 회사 웹사이트: 완벽 가이드
npm install --save @tinymce/tinymce-react 오류 입니다.
리액트 버젼이 19.0 이상이라서 안된다고하는데 리액트를 다운그레이드해야하나요??...리액트를 다운그래이드 안하고 사용하는 방법은 없을까요?
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
usereducer 투두리스트 업그레이드 질문
usereducer 강의를 들으면서 코드를 바꿨습니다import './App.css' import {useState, useRef,useReducer} from "react"; import Header from './components/Header' import Editor from './components/Editor' import List from './components/List' const mockData = [ { id : 0, isDone : false, content : "react study", date : new Date().getTime(), }, { id : 1, isDone : false, content : "lol", date : new Date().getTime(), }, { id : 2, isDone : false, content : "fifa", date : new Date().getTime(), }, ]; function reducer (state,action) { switch(action.type){ case 'CREATE' : return [action.data,...state]; case 'UPDATE' : return state.map((item)=> item.id === action.targetId ?{...item, isDone : !item.isDone} : item ); case 'DELETE' : return state.filter((item)=> item.id !== action.targetId); default: return state; } } function App() { const [todos, dispatch] = useReducer(reducer,mockData); const idRef = useRef(3); const onCreate = (content) => { dispatch({ type : "CREATE", data : { id : useRef.current++, isDone : false, content : content, date : new Date().getTime(), } }) } const onUpdate = (targetId)=> { dispatch({ type : "UPDATE", targetId : targetId, }); }; const onDelete = (targetId)=> { dispatch({ type : "DELETE", targetId : targetId, }); }; return ( <div className="App"> <Header/> <Editor onCreate = {onCreate}/> <List todos={todos} onUpdate={onUpdate} onDelete={onDelete}/> </div> ) } export default App; 문제는 이렇게 바꾼 후에 초기 mock data는 check box와 삭제가 문제가 없지만새롭게 추가한 리스트에 대해서는 check box와 삭제가 제대로 실행되지 않습니다.강의를 몇번 돌려봐도 app.jsx를 제외한 부분을 고치는 과정은 없었고 usereducer로 바꾸기 직전으로 넘어가서 section 08에서는 새롭게 추가된 리스트에 대하여 check box와 삭제가 문제없는걸 보면 usereducer를 사용하면서 문제가 생긴 것 같은데 뭐가 문제인지 잘 모르겠습니다
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
23-05의 hoc적용시의 렌더링에 대한 질문드립니다.
강의를 너무 잘 듣고 있습니다. 쉽게 설명해주셔서 들으면 이해가 잘되지만, 혼자 코드할때에는 실수나 어림 짐작으로 적용했던 부분이 잘 작동되지 않는데, 이런 저런 시도로도 잘못한 부분을 이해하기 어려워 질문드립니다. 23강의 질문입니다. high-order-function을 진행하면서 hoc로 구분하여 설정하는 경우 렌더링에 대해 질문을 남깁니다. 특히 쿼리에 이름을 주어 작동하는 경우에 대해 질문드립니다. 23-3에서 login-success를 확인하는 쿼리를 제가 짰는데 쿼리에 이름을 주었습니다. 23-3의 login-success화면에서는 오류가 없어서, 해당 코드를 복붙하여 hoc부분에도 적용하였는데 초기 렌더링시에 데이터를 받아오지 못하는 현상이 발생하였습니다. 새로 고침을 해야 데이터가 받아와져서 나타납니다.순서를 붙여 1~4번까지 차례로 진행하였습니다. 23-3 코드의 정상 렌더링 (쿼리 네임을 주어도 정상 렌더링) loginCheck와 mypage로 구분되지 않는 코드에서 graphql에 query를 보내면서 이름을 주었습니다. (hoc가 아닌 전체 로직이 한꺼번에 구성되는 경우 쿼리에 이름을 주는 경우에도 --->정상 렌더링 되었어요. )해당 부분의 쿼리는 아래와 같으며 JWT로서 데이터를 받아와 사용자명이 렌더링 되었습니다.const FETCH_USER_LOGGED_IN = gql` query fetchUserLoggedIn{ fetchUserLoggedIn { email name } } `; 23-5부분에 hoc를 이용하여 loginCheck를 분리한 경우(이 부분은 1번의 (23-3의 코드를 복붙하여 mypage와 logincheck로 분리하였습니다. 오류가 없어서 굳이 수정하지 않아도될것 같아 그냥 두었던 부분입니다) 그런데 사용자명을 받아오지 못한채로 화면이 렌더링이 되었습니다. (graphql이 실패한 것으론 나타납니다. 네트워크를 보면 쿼리를 보내면서 토큰을 첨부하지 못해서 bearer뒷 부분이 없었습니다.) 다만 새로고침을 하면 정상 렌더링이 됩니다. MyPage 코드는 아래와 같습니다. import { gql, useQuery } from "@apollo/client"; import type { IQuery } from "../../../src/commons/types/generated/types"; import { loginCheck } from "../../../src/components/commons/hocs/loginCheck"; const FETCH_USER_LOGGED_IN = gql` query fetchUserLoggedIn{ fetchUserLoggedIn { email name } } `; function MyPage() { const { data } = useQuery<Pick<IQuery, "fetchUserLoggedIn">>(FETCH_USER_LOGGED_IN); return <>{data?.fetchUserLoggedIn.name}님, 환영합니다.</>; } export default loginCheck(MyPage); loginCheck는 아래와 같습니다.import { useEffect } from "react"; import { useRouter } from "next/router"; export const loginCheck = (컴포넌트: any) => (프롭스: any) => { const router = useRouter(); useEffect(() => { if (localStorage.getItem("accessToken") === null) { alert("로그인 후 이용가능합니다"); void router.push("/section23/23-05-login-check-hoc"); } }, []); //if return <컴포넌트 {...프롭스} />; }; hoc를 이용하여 loginCheck를 분리한 경우에 작동원리에 대해 여러가지 검색을 하고, 그 결과를 참조하여 loginCheck에서 accessToken을 받아오고, 만약에 토큰이 없으면 myPage를 렌더링하지 않도록 설정했더니 쿼리네임이 있는 경우에도 정상렌더링이 되었습니다.import { useEffect } from "react"; import { useRouter } from "next/router"; export const loginCheck = (컴포넌트: any) => (프롭스: any) => { const router = useRouter(); const accessToken = localStorage.getItem("accessToken"); useEffect(() => { if (localStorage.getItem("accessToken") === null) { alert("로그인 후 이용가능합니다"); void router.push("/section23/23-05-login-check-hoc"); } }, []); if(accessToken == null ) return null; return <컴포넌트 {...프롭스} />; }; 그리고 더불어, 원두님이 하신것처럼 이름이 없는 쿼리로 설정하였을 때는 loginCheck에 토큰 관련 설정을 넣지 않아도 페이지는 정상 렌더링 되었습니다. (이 부분은 수업에서 진행하신 것입니다)const FETCH_USER_LOGGED_IN = gql` query { fetchUserLoggedIn { email name } } `; 인공지능 모델들은 쿼리에 이름이 있는 경우는 cash에 내용을 참조하여 Header에 토큰이 없는 상태의 설정대로 query를 보내고 받아온다고 설명합니다. 그리고 원두님처럼 쿼리명을 주지 않으면 무명쿼리로서 새로 토큰을 붙이고 쿼리를 보내는 과정을 수행한다고 합니다. 그러나 제가 항상 토큰을 지우고 새로 고침한후에 로그인 부분을 확인하므로 기존의 쿼리를 받은 기록이 캐시에 남아서 영향을 미칠것 같지는 않습니다. 그리고, hoc가 아닌 기존의 23-3은 잘 작동했으니, 이 부분의 통신에 대해서 어떤 부분인가 제가 잘 이해하지 못하는 부분이 있는 것 같습니다. 이후 hoc함수를 사용할때에도 유의해야 할것 같아 왜 이러한 현상이 나타나는 것인지에 대해 조언해 주시면 추가적으로 검색을 통해 이해고자 합니다.