묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
플러터 코드푸쉬
좋은 강의 잘 수강했습니다!플러터를 처음 시작할 때 장단점에 대한 부분에서 코드푸쉬와 앱 업데이트 관련 부분이 플러터의 약점이라고 들었는데, 앱 내부에 조금의 변화라도 있으려면 마켓 승인을 다시 받아야 한다는 뜻인가요?작은 예시로, 배달의 민족 앱을 플러터로 제작하고, 새로운 가게들을 추가하려면, 그 때 마다 외부 데이터베이스와의 연동으로 해결할 수 있는 문제인지, 아니면 마켓에 일일이 승인을 받아야 하는건가요?
-
미해결Flutter + Firebase로 넷플릭스 UI 클론 코딩하기 [무작정 플러터]
firebase 설치이후 디버깅하면 아래와 같은 에러가 발생하는데 알려주실분 계실까요?
code build done. 540.2sFailed to build iOS appError (Xcode): redefinition of module 'Firebase'/Users/hoon/development/flutter_Test_Pj1/hoon_nexflex/flutter_application_1/ios/Pods/Firebase/CoreOnly/Sources/module.modulemap:0:7Error (Xcode): could not build module 'Flutter'/Users/hoon/development/flutter_Test_Pj1/hoon_nexflex/flutter_application_1/ios/Runner/GeneratedPluginRegistrant.h:9:8Error (Xcode): failed to emit precompiled header'/Users/hoon/Library/Developer/Xcode/DerivedData/Runner-awozdwnprnvtdrcrfughfazvzhji/Build/Intermediates.noindex/PrecompiledHeaders/Runner-Bridging-Header-swift_1TK2KTDMIUV5Y-clang_2JGQSHWY4RAHY.pch' for bridging header'/Users/hoon/development/flutter_Test_Pj1/hoon_nexflex/flutter_application_1/ios/Runner/Runner-Bridging-Header.h'Could not build the application for the simulator.Error launching application on iPhone 13.
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
NextJS 강의 순서 질문입니다.
안녕하세요. 레딧사이트 프로젝트를 진행하기 앞서 올려주신 NextJS 강의를 먼저 들으려고 합니다.강의 듣는 순서가 부록(섹션11) 먼저 듣고 섹션10(13버전)을 들으면 될까요?아니면 섹션10만 들어도 괜찮을까요?
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
SliverAppBar -> flexibleSpace에서 백그라운드 이미지 페이드아웃
안녕하세요 잘 보고 있습니다!! 플러터만세..CustomScrollView - SliverAppBar 뽀개버리기 강의에서,SliverAppBar에 flexibleSpace에 background에 image를 넣어서 스크롤을 위아래로 하실때 앱바에 이미지가 페이드 아웃 페이드 인 되듯이 자연스럽게 되는데 저는 이미지가 뚝 없어졌다가 뚝 생깁니다!! 따로 설정을 해주어야 하나요?
-
해결됨[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Package 선택 어떻게 알아요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.코드팩토리 디스코드https://bit.ly/3HzRzUMFlutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다! ===================================프로젝트를 만들때 어떤 종류의 pub.dev package 들이 사용되는지 어떻게 알 수 있나요? 구글링인가요?
-
해결됨[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
calendar 프로젝트에서 저장한 데이터 백업하는 방법
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.코드팩토리 디스코드https://bit.ly/3HzRzUMFlutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다! calendar 프로젝트에서 앱으로 로컬에 저장한 데이터들을 백업해서 따로 파일로 보관하는 인터페이스를 앱에 구현하고싶은데,어떤식으로 구현해야하나요?
-
해결됨[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
IOS Simulator로 run 시도 시 에러가 발생합니다.
프로젝트 기본 세팅(home_screen.dart 추가 및 widget 생성) 이후 asset을 추가하고video_player와 image_picker의 dependency를 추가한 다음 pub get을 실행한 뒤info.plist에 image_picker 관련 권한을 추가하여 영상에서 나온 것 처럼 세팅을 마치고run을 실행하니 아래 사진과 같은 에러가 발생합니다.flutter doctor 를 실행했을 때 이상이 없는 것을 보아 프로젝트 세팅이 잘못 된 것 같은데, 혹시 어떤 부분이 잘못되었을까요?
-
해결됨[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
터미널 명령어 문의
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.코드팩토리 디스코드https://bit.ly/3HzRzUMFlutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다!MacBookAir make_calendar % flutter pub run build_runner buildDeprecated. Use dart run instead.Could not find package "build_runner". Did you forget to add a dependency?위 명령어 입력했더니 Deprecated되어서pub.dev에서 builder_runner를 yaml파일에 추가후 다 시 진행하니까실행은 되는데[INFO] Succeeded after 19ms with 0 outputs (0 actions)이렇게 아웃풋 파일이 안생기네요.. 어떻게 해야하나요?
-
해결됨[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
datepicker 질문있어요!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.코드팩토리 디스코드https://bit.ly/3HzRzUMFlutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다!datepicker에서 일은 빼고 년과 월만 뜨게 하고싶은데, datepicker에서 어떤 속성을 변경해줘야 할까요? 검색해도 잘 안나와서요..
-
해결됨따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
Entity 생성 시 import 내용 자동 생성
제가 코드를 한 번에 입력하지 않고 나눠서 강의를 봐서 놓친 것일 수도 있는데..@Entity("votes")를 입력하면 제일 위쪽에 자동으로 import {Entity} from "typeorm" 등의 코드가 강의에서는 생기던데 혹시 import 코드가 자동으로 생성되지 않는 이유는 무엇일까요?
-
해결됨[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Android license status unknown 에러 발생
flutter doctor --android-licenses 명령어를 하면 이런 에러가 뜨네요..java.lang.UnsupportedClassVersionError 라고 하는데 현재 자바버전은 19입니다. Android Studio에서 SDK tool은 다 설치를 했구요.어떻게 하면 해결될까요?? ㅠㅠ
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
calendar 프로젝트에서 overflow에러
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.코드팩토리 디스코드https://bit.ly/3HzRzUMFlutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다! 내용으로 텍스트를 많이 넣게되면 이렇게 오버플로우 에러가 나는데 어떻게 해결할 수 있을까요?
-
해결됨[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
섹션 16. 근태관리 앱 세팅하기 에러
버전이 맞지 않다고 뜨네요강의보면서 멈춰가면서 그대로 따라했습니다 C:\flutter\bin\flutter.bat --no-color pub getRunning "flutter pub get" in chool_check...Resolving dependencies...The current Dart SDK version is 2.19.6.Because chool_check requires SDK version >=3.0.0 <4.0.0, version solving failed.pub get failedcommand: "C:\flutter\bin\cache\dart-sdk\bin\dart __deprecated_pub --directory . get --example"pub env: { "FLUTTER_ROOT": "C:\flutter", "PUB_ENVIRONMENT": "flutter_cli:get", "PUB_CACHE": "C:\Users\manjin han\AppData\Local\Pub\Cache",}exit code: 1Process finished with exit code 1
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
스타일링 마무리 진행시 에러 발생
안녕하세요 선생님 앞전에 다른분글의 리플로stat_repository.dart파일에 return response.data['response']['body']['items'] 여기서 예외가 발생했다는 _TypeError (type 'String' is not a subtype of type 'int' of 'index')에러가 난다고 리플 달았었고 선생님께서 타입때문에 나는오류일 것이다 라고 답변 주셨었는데요. 제가 어제 7월30일 일요일 해당강의를 처음부터 다시 코드를 따라쳐서 Hive까지 정상적으로 강의를 마쳤습니다.그리고 에러가 날까봐 스타일링 에러나기전 구간과, 스타일링마무리 직후 코드를 따로 저장을 했고.이상없이 강의를 마친후 마무리 코드역시 저장해서 백업했습니다. 그리고 오늘 3번째 코드작성을 했는데스타일링 마무리하기에서 같은 에러가 뜹니다.그래서 어제 정상적으로 진행했던 코드3개를 하나씩 다시 복원하며 실행해보고 시뮬레이터의 앱도 삭제한 뒤 재실행해봐도 똑같은 에러가 발생합니다. 분명 어제는 정상작동하던 코드였습니다.선생님의 깃헙의 코드를 그대로 복사해서 붙혀넣어도 에러가 발생합니다. 저는 이유를 잘 모르겠지만.혹시 드는생각에 API자체에서 뭔가 다른타입으로 된 json코드가 들어오는건 아닌가?? 싶은 생각이 들지만 저는 초보라 알수가 없습니다. 아무튼 코드를 원상복귀 한뒤 디버그 콘솔에서 뜨는 메세지는 [VERBOSE-2:dart_vm_initializer.cc(41)] Unhandled Exception: type 'String' is not a subtype of type 'int' of 'index'#0 StatRepository.fetchData<asynchronous suspension>#1 Future.wait.<anonymous closure> (dart:async/future.dart:525:21)<asynchronous suspension>#2 _HomeScreenState.fetchData<asynchronous suspension> 입니다.1.번구간의 코드는stat_repsitory.dart 파일에 return response.data['response']['body']['items']에서 발생하고2.번구간의 코드는home_screen.dart 파일에final results = await Future.wait(futures);에서 발생합니다.추가로 포스트맨에서 해당 api를 호출하면 <OpenAPI_ServiceResponse> <cmmMsgHeader> <errMsg>SERVICE ERROR</errMsg> <returnAuthMsg>LIMITED_NUMBER_OF_SERVICE_REQUESTS_EXCEEDS_ERROR</returnAuthMsg> <returnReasonCode>22</returnReasonCode> </cmmMsgHeader> </OpenAPI_ServiceResponse>이렇게 호출됩니다. 원래는 정상적으로 json 타입으로 호출이 됐었습니다. 호출수 제한에 걸려서 에러가 나는걸까요? 아무튼 현재 저의 고민은중급강의는 이미 구매했지만 초급강의 마지막 달력스케쥴과,미세먼지앱 강의가 어려워 넘어가기전에 최대한 3~4번 이상 복습하고 넘어가려했는데 혹시 이 에러로 인해 코드복습이 어렵다면바로 중급강의로 넘어가도 될지 궁금합니다.현재 저의 수준은 모든강의를 3번 정도는 봤고처음따라하면 아무것도 모르겠고 그냥 코드만 따라치다가두번째는 단편적인 흐름은 보이지만 여전히 반은 무지성이고세번째 봐야 그래도 어느정도 이해되는 부분이 꽤 생기는그런 수준에 있습니다.중급강의는 무서워서 못넘어가고 있습니다.
-
해결됨[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
캘린더 위에 달을 조정하는 부분 색상은 어떻게 바꾸나요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.코드팩토리 디스코드https://bit.ly/3HzRzUMFlutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다!여기 양옆에 화살표 부분 색상이 파란색으로 이상하게 뜨는데수업에서 한 것처럼 검정색으로 바꾸려면 어떤 파라미터를 사용해야하나요?
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
onPressed 함수를 HomeScreen으로 이동 시 에러가 발생합니다.
_TopPart에서 아래 사진과 같이 onPressed를 만들고기존에 사용하던 함수를 HomeScreen으로 이동 시켜 함수를 생성한 뒤, _TopPart()를 호출(?)하는 부분에서 해당 callbac함수를 추가하니 void 타입을 가지고 있어 사용할 수 없다는 에러가 노출됩니다.강의 영상에서는 위 callback 함수에 void 타입을 지정해 정상적으로 빌드 및 테스트 하는 모습이 나오는데 저는 빌드를 하기 전 부터 에러가 발생합니다.혹시 위 작업 중 잘못 된 부분이 있을까요?
-
해결됨Slack 클론 코딩[실시간 채팅 with React]
event.dataTransfer.items의 타입이 무엇인가요?
MDN의 가이드에 따라 DragNDrop 코드를 작성하는데파일을 가져오기 위한 코드인 event.dataTransfer.items 에서 아래와 같은 오류가 발생햇습니다.'DataTransferItemList' 형식은 배열 형식이 아닙니다.ts(2461)MDN DataTransfer: items 속성 가이드에서는 목록을 반환하고 항목이없어도 빈목록을 반환한다고 되어있고MDN DataTransferItemList 타입 가이드에서 객체라고 명시되어 있던데 개별항목에는 [ ]표기법으로 접근할수 있다는걸로 보아 event.dataTransfer.items의 타입은 리스트가 아닌 오브젝트에 숫자를 KEY로 값을 넣어놓은 형태인가요?? 아님 또다른 타입인건가요?코드 function dropHandler(ev: React.DragEvent<HTMLDivElement>): void { console.log('File(s) dropped'); // Prevent default behavior (Prevent file from being opened) ev.preventDefault(); if (ev.dataTransfer.items) { // Use DataTransferItemList interface to access the file(s) [...ev.dataTransfer.items].forEach((item, i) => { // If dropped items aren't files, reject them if (item.kind === 'file') { const file = item.getAsFile(); if (file) { console.log(`… file[${i}].name = ${file.name}`); } } }); } else { // Use DataTransfer interface to access the file(s) const files = ev.dataTransfer.files; [...files].forEach((file, i) => { console.log(`… file[${i}].name = ${file.name}`); }); } }MDN DragNDrop가이드https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/File_drag_and_dropMDN DataTransfer: items 속성 가이드https://developer.mozilla.org/ko/docs/Web/API/DataTransfer/itemsMDN DataTransferItemList 타입 가이드https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItemList
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
더티 에러
최종 실행에서 다음과 같은 에러가 뜨네요. 해결방법이 어떻게 될까요?
-
해결됨Slack 클론 코딩[실시간 채팅 with React]
infinite scroll에서 최초 랜더링한 페이지가 한페이지에 안나올때 추가로 페이지를 불러 올수 있나요?
만약 Page의 단위를 5로 잡아서 최초 랜더링한 페이지가 스크롤이 되지않는다면 onScroll 이벤트가 발생하지 않으니 setSize 이벤트도 발생할수 없습니다.이렇게 최초 데이터의 개수가 모자라서 이벤트 자체가 발생하지 않으면 별개의 이벤트로 scroll이 가능할때까지 페이지를 불러와야 하는데 좋은 방법이 잇는가요?페이지를 5개로 잡을떄페이지를 20개로 잡을떄참조 코드import ChatBox from '@components/ChatBox'; import ChatList from '@components/ChatList'; import useInput from '@hooks/useInput'; import { Header, Container } from '@pages/DirectMessage/styles'; import fetcher from '@utils/fetcher'; import makeSection from '@utils/makeSection'; import axios from 'axios'; import gravatar from 'gravatar'; import React, { FC, FormEventHandler, useCallback, useEffect, useRef, useState } from 'react'; import Scrollbars from 'react-custom-scrollbars-2'; import { useParams } from 'react-router'; import useSWR from 'swr'; import useSWRInfinite from 'swr/infinite'; const PAGE_SIZE = 5; const DirectMessage: FC = () => { const { workspace, id } = useParams(); const { data: myData } = useSWR<IUser, false>('/api/users', fetcher); const { data: userData } = useSWR<IUser, false>(`/api/workspaces/${workspace}/users/${id}`, fetcher); const [chat, onChangeChat, setChat] = useInput(''); // const scrollbarRef = useRef(null); const { data: chatData, mutate: mutateChat, setSize, } = useSWRInfinite<IDM[]>( (index) => `/api/workspaces/${workspace}/dms/${id}/chats?perPage=${PAGE_SIZE}&page=${index + 1}`, fetcher, ); const isEmpty = chatData?.[0]?.length === 0; const isReachingEnd = isEmpty || (chatData && chatData[chatData.length - 1]?.length < PAGE_SIZE); const chatSection = makeSection(chatData ? [...chatData].flat().reverse() : []); const onSubmitForm = useCallback<FormEventHandler>( (event) => { event.preventDefault(); if (!chat || !chat?.trim()) { return; } axios .post(`/api/workspaces/${workspace}/dms/${id}/chats`, { content: chat, }) .then(() => { mutateChat(); setChat(''); }) .catch(console.error); console.log('제출'); }, [chat, id, mutateChat, setChat, workspace], ); const scrollbarRef = useRef<Scrollbars>(null); return !userData || !myData || !chatData ? null : ( <Container> <Header> <img src={gravatar.url(userData.email, { s: '24px', d: 'retro' })} alt={userData.nickname} /> <span>{userData.nickname}</span> </Header> <ChatList chatSections={chatSection} isEmpty={isEmpty} isReachingEnd={isReachingEnd} setSize={setSize} ref={scrollbarRef} /> <ChatBox onSubmitForm={onSubmitForm} chat={chat} onChangeChat={onChangeChat} placeholder={`Message ${userData.nickname}`} otherData={[userData]} /> </Container> ); }; export default DirectMessage;import Chat from '@components/Chat'; import { ChatZone, Section, StickyHeader } from '@components/ChatList/styles'; import React, { FC, MutableRefObject, forwardRef, useCallback } from 'react'; import { Scrollbars, positionValues } from 'react-custom-scrollbars-2'; interface Props { chatSections: { [key: string]: (IDM | IChat)[] }; isEmpty: boolean; isReachingEnd?: boolean; setSize: (f: (size: number) => number) => Promise<(IDM | IChat)[][] | undefined>; } const ChatList = forwardRef<Scrollbars, Props>(({ chatSections, isReachingEnd, isEmpty, setSize }, scrollRef) => { const onScroll = useCallback( (values: positionValues) => { if (values.scrollTop === 0 && !isReachingEnd) { setSize((size) => size + 1).then(() => { const current = (scrollRef as MutableRefObject<Scrollbars>)?.current; if (current) { current.scrollTop(current.getScrollHeight() - values.scrollHeight); } }); } }, [isReachingEnd, scrollRef, setSize], ); return ( <ChatZone> <Scrollbars autoHide ref={scrollRef} onScrollFrame={onScroll}> {Object.entries(chatSections).map(([dateData, chatData]) => ( <Section className={`section-${dateData}`} key={dateData}> <StickyHeader> <button>{dateData}</button> </StickyHeader> {chatData.map((chat) => ( <Chat key={chat.id} data={chat} /> ))} </Section> ))} </Scrollbars> </ChatZone> ); }); export default ChatList;
-
해결됨Slack 클론 코딩[실시간 채팅 with React]
concat시 2차원 배열이면 쪼개지지않나요?
원본값을 유지하기위해 concat을 사용하셧는데지금 같은 1차원 배열일때는 문제가 없지만 2차원 배열일 경우 해당 배열이 다쪼개져서 1차원 배열이 되는걸로 알고있습니다 그래서 저는 원본을 유지할때 스프레드 문법을 사용하는데 concat이 더 좋은경우도 있나요?두가지 방법을 다 알려주시긴 하셧는데 차이점이 잇는가 궁금합니다.예시상황const chatData = [[1, 2], [3, 4], [5, 6]];[].concat(...chatData).reverse() => [6, 5, 4, 3, 2, 1][...chatData].reverse()=> [[5, 6], [3, 4], [1, 2]]