useState는 componet의 구성요소의 상태값일 관리하고 상태변환시에 biz처리 및 관련된 자식 구성요소로 props 전달을 하고자 할때 사용하는 것으로 강의를 이해했습니다. 반면 useErrect는 라이프싸이클을 통해 biz 로직을 구현하고자 할때 사용하는 것으로 아래 이했습니다. mount - 초기 실행시 (초기 데이터 설정-db select통한 값을 설정 처리 등) update - state에서 관리되는 상태에 대한 실시간 확인과 처리(useState의 setXXXX는 비동기로 실시간 값이 어려워 useEffect를 활용해 v실시간 alidation을 체크하는데 있을것으로 이해하였습니다. 질문) 실무에서 useEffect의 어떻게 활용하나요? 지금은 hook을 배우는 단계라 실무에서 어떻게 사용될지도 많이 궁금합니다.
터미널에서 npm install -g create-react-app 작성 후에 아래와 같은 메세지가 뜹니다. 이럴 경우 어떻게 해야 하나요?? adminui-MacBook-Pro:grab-market-web admin$ npm install -g create-react-app npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. npm warn deprecated fstream-ignore@1.0.5: This package is no longer supported. npm warn deprecated uid-number@0.0.6: This package is no longer supported. npm warn deprecated rimraf@2.7.1: Rimraf versions prior to v4 are no longer supported npm warn deprecated glob@7.2.3: Glob versions prior to v9 are no longer supported npm warn deprecated fstream@1.0.12: This package is no longer supported. npm warn deprecated tar@2.2.2: This version of tar is no longer supported, and will not receive security updates. Please upgrade asap. changed 64 packages in 968ms 4 packages are looking for funding run npm fund for details adminui-MacBook-Pro:grab-market-web admin$
이슈 함수: deleteMemo 이슈 흐름: "+" 버튼 클릭, 새로운 메모 아이템(Untitled)생성 → memo 2 삭제 → memo 1 삭제 이슈 내용: Untitled 메모 아이템이 있음에도 "메모가 없습니다" 로 처리됨. 이유: 삭제 시 배열의 길이가 달라지면서 index 에 영향이가는데 selectedMemoIndex 값은 그에 따라 변하지 않아서 단순히 index === selectedMemoIndex 의 조건문으로 만족하지 않음. 해결방법: 삭제 시 selectedMemoIndex 에도 새로운 값을 넣어줘야함. 저는 아래와 같이 해결했습니다. if (index > selectedMemoIndex) { setSelectedMemoIndex(selectedMemoIndex + 1); } else if (index < selectedMemoIndex) { setSelectedMemoIndex(selectedMemoIndex - 1); } else if (index === selectedMemoIndex) { setSelectedMemoIndex(0); }
providers를 통해 등록된 UsersService는 싱글톤인지 궁금하여 nest.js 공식문서를 찾아보았습니다. UsersModule의 exports를 통해 캡슐화된 공급자들을 내보내고, AppModule에 UsersModule을 imports배열에 추가해서 가져오면 providers에 등록하지 않아도 자동으로 주입을 해주며, 인스턴스를 공유하는 싱글톤으로 주입받는다고 이해했습니다. 반면, UsersService를 필요한 모듈 각각의 providers 배열에 등록하게 된다면 등록된 모듈마다 인스턴스가 생성해서 주입하는 것으로 이해하였습니다. 공식문서에는 싱글톤으로 생성되서 관리된다면 메모리를 아낄 수 있고, 리소스의 관리가 쉬워진다는데 질문 1. 리소스의 관리가 쉬워지는건 같은 변수를 공유하기 때문이라고 이해해도 괜찮을까요? 질문 2. 제가 이해한 내용에서 잘못된 부분이 있는지 궁금합니다. 질문 3. providers 배열에 모듈마다 등록해서 인스턴스를 계속 찍어내야 하는 예시가 궁금합니다. (싱글톤의 장점은 어느정도 이해가 되지만, 그 반대의 경우에는 어떤 상황에서 사용할 때 장점이 있는지 생각이 떠오르지 않습니다) (집에 가면서 생각해봤는데 설정이 서로 다르게 주입되어야 하는 경우가 있다면 사용될 수 있을 것 같습니다.)
투두 리스트 작성 앱 개발에서 다음과 같이 콜백함수에 중괄호를 사용하니 제대로 동작하지 않더군요. 그래서 중괄호를 제거하니 올바르게 작동하는데, 통상적으로는 중괄호를 사용해야 하잖아요. 중괄호를 사용할 때 왜 제대로 작동하지 않는지 그 이유가 궁금합니다. 아래 코드에서 첫 번째 코드는 제대로 동작하지 않는 코드이고, 두 번째 코드는 제대로 동작하는 코드입니다. (아래 코드에서 todos.filter 메서드에 주목해 주세요.) const getFilteredData = () => { if(search === "") { return todos; } return todos.filter((todo) => { todo.content.includes(search) }); } const getFilteredData = () => { if(search === "") { return todos; } return todos.filter((todo) => todo.content.includes(search) ); }
const getEnv = async ()=>{ const response = await axios.get(’/비밀키요청’) return response.data } 강의에서 위 코드를 통해 비밀키를 받아오는 예시를 작성해 주셨는데 ConfigModule.forRoot({isGlobal:true, load: [getEnv]}) 과정에서getEnv와 같은 비동기 함수를 등록한 경우 forRoot 내부적으로 await을 통해 메서드가 동작을 완료할때까지 기다리는지 궁금합니다.(비동기 함수를 등록해도 forRoot의 내부 동작으로 처리되는지?)
타입 포함된 버전을 설치한 후에도 타입에러가 계속 생기는데 버전이슈일까요.. "dependencies": { "@ant-design/icons": "^5.5.2", "@apollo/client": "^3.11.9", "@emotion/react": "^11.13.3", "@emotion/styled": "^11.13.0", "antd": "^5.21.6", "axios": "^1.7.7", "graphql": "^16.9.0", "lodash": "^4.17.21", "next": "12.1.0", "react": "17.0.2", "react-daum-postcode": "^3.2.0", "react-dom": "17.0.2", "react-infinite-scroller": "^1.2.6", "ts-node": "^10.9.2" }, "devDependencies": { "@eslint/js": "^9.18.0", "@graphql-codegen/cli": "^5.0.3", "@graphql-codegen/typescript": "^4.1.2", "@types/node": "17.0.2", "@types/react": "17.0.2", "@types/react-infinite-scroller": "^1.2.5", "eslint": "^9.18.0", "eslint-config-next": "15.1.4", "eslint-config-prettier": "^10.0.1", "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-react": "^7.37.4", "globals": "^15.14.0", "prettier": "^3.4.2", "typescript": "^5.7.3", "typescript-eslint": "^8.20.0" "react-infinite-scroller": "^1.2.6", 이고 "@types/react-infinite-scroller": "^1.2.5", 로 되어있습니다. ++ return ( <div style={{ height: '700px', overflow: 'auto' }}> <InfiniteScroll pageStart={0} loadMore={onLoadMore} hasMore={hasMorePosts} loader={ <div className='loader' key='loader'> Loading... </div> } useWindow={false} > {data?.fetchBoards?.map((el) => el ? ( <div key={el._id}> <span style={{ margin: '10px' }}>{el.title}</span> <span style={{ margin: '10px' }}>{el.writer}</span> </div> ) : null, ) ?? []} </InfiniteScroll> </div> ); 1. InfiniteScroll 'InfiniteScroll' cannot be used as a JSX component. Its instance type 'InfiniteScroll' is not a valid JSX element. Property 'refs' is missing in type 'InfiniteScroll' but required in type 'ElementClass' 3. loader Type 'Element' is not assignable to type ReactElement<unknown, string | JSXElementConstructor<any>> Types of property 'key' are incompatible. TYpe 'Key | null' is not assignable to type 'string | null'. Type 'number' is not assignable to type 'string'. 4. {data?.~</div>;})} Type 'void[] | undefined' is not assignable to type 'ReactNode'. 2. {data?.~</div>;})} Type 'void[] | undefined' is not assignable to type 'ReactNode'. (이하 생략) 이런 에러였었는데, 상단에 타입선언 해주고 모두 해결 되었습니다. import React, { ReactElement } from 'react'; declare module 'react-infinite-scroller' { interface InfiniteScrollProps { pageStart?: number; loadMore: () => void; hasMore?: boolean; loader?: ReactElement | null; useWindow?: boolean; children?: React.ReactNode; } export default function InfiniteScroll(props: InfiniteScrollProps): ReactElement; } 모듈이 덜 설치된건지 ㅠㅠ 왜 이런 에러가 생긴지 모르겠네요 ㅠㅠ