inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

ios simulator 에러

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

Xcode build done. 3.1s Failed to build iOS app Error (Xcode): Target debug_unpack_ios failed: Exception: Failed to codesign /Users/2sumin/Desktop/test_proj.nosync/build/ios/Debug-iphonesimulator/Flutter.framework/Flutter with identity -. Could not build the application for the simulator. Error launching application on iPhone 16 Plus. 이렇게 에러가 발생하는데, icloud에 연동되지 않게 파일을 만들면 해결된다고 하는데 어떻게 파일을 만들어도 계속 에러가 발생합니다... 어떻게 해결해야 하나요?

  • flutter
  • 클론코딩
구리 댓글 2 좋아요 0 조회수 344

미세먼지앱 코딩 중 데이터를 못 가져오고 있습니다 ㅠㅠ

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

안녕하세요 코트팩토리님! 열심히 수강중인 수강생입니다. 현재 제가 미세먼지앱에서 데이터베이스에서 데이터 가져오기 파트를 듣는 중에 만약 !snapshot.hasData이라면 '데이터가 없습니다' 라고 코드를 치고 에뮬레이터를 실행을 해본 뒤로 계속 위에 이미지와 정보들은 사라지고 '데이터가 없습니다' 만 뜨고 있는 상황입니다. 그래서 왜 데이터가 없을까라는 생각에 막 이곳저곳 둘러보고 썼다 지우고 하다가 stat_repository에 print를 추가해보았습니다. static Future<void> fetchData() async { final isar = GetIt.I<Isar>(); for (ItemCode itemCode in ItemCode.values) { print('ItemCode: ${itemCode.name}'); await fetchDataByItemCode(itemCode: itemCode); } 중간에 저렇게 추가를 하였더니 I/flutter ( 3033): ItemCode: SO2 I/flutter ( 3033): ItemCode: SO2 D/EGL_emulation( 3033): app_time_stats: avg=2533.58ms min=26.00ms max=11703.56ms count=5 I/flutter ( 3033): ItemCode: SO2 E/flutter ( 3033): [ERROR:flutter/runtime/dart_vm_ initializer.cc (41)] Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'List<Map<String, dynamic>>' in type cast 밑에 로그에 이렇게 떠서 뭔가 이상하다 싶어 고쳐볼려 했으나 고치는 방법도 잘 모르겠고 저게 원인이 맞는지도 잘 모르겠습니다.. 미세먼지 파트가 어려워서 중간에 끊고 다시 듣는 중에 여기까지 와서 다시 돌아가긴 아깝고 제가 건드리면 더 엉망이 될까봐 이렇게 질문 드립니다.

  • flutter
  • 클론코딩
퓅호 댓글 2 좋아요 0 조회수 123

에뮬레이터가 실행하는데 오류가 납니다 - 2

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

자바 버전 : 21.0.5 gradle 버전 : 8.6 설치되어 있습니다

  • flutter
  • 클론코딩
lilete 댓글 2 좋아요 0 조회수 217

에뮬레이터가 실행하는데 오류가 납니다

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

Launching lib\main.dart on sdk gphone64 x86 64 in debug mode... Running Gradle task 'assembleDebug'... FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':webview_flutter_android:compileDebugJavaWithJavac'. > Could not resolve all files for configuration ':webview_flutter_android:androidJdkImage'. > Failed to transform core-for-system-modules.jar to match attributes {artifactType=_internal_android_jdk_image, org.gradle.libraryelements=jar, org.gradle.usage=java-runtime}. > Execution failed for JdkImageTransform: C:\Users\knp\AppData\Local\Android\sdk\platforms\android-34\core-for-system-modules.jar. > Error while executing process C:\Program Files\Android\Android Studio\jbr\bin\jlink.exe with arguments {--module-path C:\Users\knp\.gradle\caches\transforms-3\4a46fc89ed5f9adfe3afebf74eb8bfeb\transformed\output\temp\jmod --add-modules java.base --output C:\Users\knp\.gradle\caches\transforms-3\4a46fc89ed5f9adfe3afebf74eb8bfeb\transformed\output\jdkImage --disable-plugin system-modules} * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. > Get more help at https://help.gradle.org . BUILD FAILED in 16s Error: Gradle task assembleDebug failed with exit code 1 예전 다른 분이 올린글을 보고 수정했습니다 19인데 21로 한것은 오류메시지에서 21로 변경하라고 나와 수정했습니다 defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId = "com.example.web_view2" // You can update the following values to match your application needs. // For more information, see: https://flutter.dev/to/review-gradle-config. minSdkVersion 21 targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode versionName = flutter.versionName }

  • flutter
  • 클론코딩
lilete 댓글 2 좋아요 0 조회수 651

실행이 안됩니다. 강의 초반 hello 출력 배우는 처음 입니다.

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

위와 같이 에러가 납니다. 답변봇 말고 강사님께서 답변 부탁드립니다. 답변봇 답변들 몇 개 보니까 너무 일반적인 말만 합니다. 그리고 원격 요청은 어떻게 하는건가요/ 카톡 방 가도 아무도 없네요

  • flutter
  • 클론코딩
parue 댓글 2 좋아요 0 조회수 150

프로젝트시작에서 에러

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

이거는 어떻게 처리하면 되나요 실행은 됩니다

  • flutter
  • 클론코딩
vadain2000 댓글 2 좋아요 0 조회수 134

설치문의

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

o/s:윈도우10 pro 22h2 ASUS 노트북 사용자입니다 5년 되었습니다 cpu:Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz 2.90 GHz ram:16.0GB(15.9GB 사용 가능) 종류:64비트 운영 체제, x64 기반 프로세서 230GB_hdd c: 플러터,안드로이드 스튜디오,git,node 설치 230GB_hdd d:프로젝트 생성 저는 이렇게 쓰고 있는데 문제 소지가 있으면 변경 하려고 합니다 노트북이 오래 되어서 C:드라이브가 80% 되니 버벅거려서요 "꼭 프로잭트생성 드라이브를 C:드라이브로 해야합니까' 프로젝트생성을 D:할경우 문제가 많이 생기나요?

  • flutter
  • 클론코딩
vadain2000 댓글 2 좋아요 0 조회수 115

디바이스가 안 보입니다.

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

실행버튼 옆에 select device를 선택하려고 해도 안보입니다.

  • flutter
  • 클론코딩
parue 댓글 2 좋아요 0 조회수 293

패키지의 가장 최신 버전을 자동으로 다운받는다는 것의 의미

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

맨 앞에 캐럿(^)을 붙이면 major가 바뀌지 않는 선에서 가장 최신의 버전을 자동으로 다운받는다고 하셨는데, 정확히 언제 자동으로 다운받아지나요? 예를 들어 dependencies에 ^4.3.2로 작성했다면 4.3.3이 나오면 그때 자동으로 다시 다운받아지는 건가요? 코드팩토리 디스코드에 질문하면 더욱 빠르게 질문을 받아 볼 수 있습니다! [코드팩토리 디스코드] https://bit.ly/3HzRzUM - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

  • flutter
  • 클론코딩
푸른하늘 댓글 1 좋아요 0 조회수 92

web view 에러

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

web view 설치 후 아래 처럼 19 넣었는데 에러가 뜨네요 * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. > Get more help at https://help.gradle.org . BUILD FAILED in 1s Error: Gradle task assembleDebug failed with exit code 1 defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId = "com.example.web_view1" // You can update the following values to match your application needs. // For more information, see: https://flutter.dev/to/review-gradle-config. minSdk = minSdkVersion 19 targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode versionName = flutter.versionName }

  • flutter
  • 클론코딩
lilete 댓글 2 좋아요 0 조회수 362

initializeController 내부 setState의 필요성

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

4:24에서 "초기화된 상태를 반영해 주기 위해서 setState를 실행"해 준다고 하셨는데, intializeController은 initState 내부에서 호출되기 때문에 setState는 불필요하지 않나요? initState 호출 뒤에 build함수가 호출되니까요. 감사합니다!

  • flutter
  • 클론코딩
zhemgksl 댓글 3 좋아요 0 조회수 163

안드로이드 에뮬레이터가 띄워지질 않습니다

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

안녕하세요. 전 CPU가 AMD라 Intel 가상화툴을 사용하지 못하고 Android Emulator hypervisor driver SDK Tool을 사용해 등록된 디바이스를 에뮬레이터로 실행시켰습니다. 문제는 이 경우, 에뮬레이터 실행이나 빌드는 에러없이 되나 에뮬레이터 창을 확인할 수가 없습니다. 정확히는 에뮬레이터가 실행은 되나 작업 표시줄에서 클릭시 아무런 반응이 나오지 않습니다. BIOS에서 가상화 설정이 된것도 확인했고, 프로그램/기능에서 Hyper-V가 설치 후 실행중인것 까지도 확인이되었으나 동일한 문제가 반복되어 어떻게 해야할지 막막합니다. 현재 상태를 캡처로 첨부합니다.

  • flutter
  • 클론코딩
정성윤 댓글 3 좋아요 0 조회수 690

경로 기반 라우팅과 명령형(Imperative), 선언형(Declarative)과의 관계

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

중급 강의까지 모두 수강한 후 초급 강의 복습 중입니다. 좋은 강좌 제공해 주셔서 감사합니다! 본 강의에서는 MaterialApp 차원에서 라우트 경로(path)를 지정하는 경로 기반 라우팅이기 때문에 이를 "선언적(declarative) 라우팅"이라고 표현하신 것 같지만(강의 시간 1:05), 실제로는 여전히 명령형 라우팅(Imperative Routing)이 맞는 것 같아 질문드립니다. 저의 생각으로는: main.dart 파일에서의 routes 는 단순히 경로와 화면을 매핑하는 역할을 할 뿐, 실제 화면 전환은 개발자가 명령( pushNamed )해야 이루어지므로 경로를 정의하는 부분은 선언적처럼 보일 수 있지만, 화면 전환 자체는 명령형 방식이다. 제 생각이 맞는지 확인 부탁드립니다. 감사합니다!

  • flutter
  • 클론코딩
zhemgksl 댓글 3 좋아요 1 조회수 245

children: colors.map 부분에서 문제가 있습니다.

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

코드팩토리 디스코드에 질문하면 더욱 빠르게 질문을 받아 볼 수 있습니다! [코드팩토리 디스코드] https://bit.ly/3HzRzUM - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 강좌 잘 듣고 있습니다. 수업 진행 중 이부분에서 막혀서 질문 드립니다. 버전 차이 인지 모르겠지만 import 'package:row_and_column/const/colors.dart'; 이부분이 회색으로 표시되면서 지워도 된다는 문구가 뜨고 class HomeScreen extends StatelessWidget { const HomeScreen({super.key}); @override Widget build(BuildContext context) { return Scaffold( body: SafeArea( child: Column( children: colors.map( (e) => Container( height: 50.0, width: 50.0, color: e, ), ).toList(), ), ), ); } } children: colors.map( colors 를 불러 올수 없습니다. 아울러 사용하시는 안드로이드 스튜디오에서는 코드에 가이드라인(?) 처럼 선으로 중요부분을 구별해 주는데 저는 인터넷 찾아보고 했는데 가이드 라인이 보이지 않습니다. 잘 부탁드립니다 (__);;;

  • flutter
  • 클론코딩
조성주 댓글 2 좋아요 0 조회수 173

포트폴리오 고민 있습니다.

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

강의 내용 중 어떤 프로젝트부터 포트폴리오로 작성하면 좋을까요?

  • flutter
  • 클론코딩
조은형 댓글 2 좋아요 0 조회수 153

멀티덱스 오류

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

Because vid_player requires SDK version >=3.2.1 <4.0.0, version solving failed. 로 인하여 멀티덱스 오류를 해결 못하고 있습니다.

  • flutter
  • 클론코딩
댓글 2 좋아요 0 조회수 139

쿠키 저장이 되지 않습니다.

미해결

따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)

auth.ts에서 //비번이 맞으면 토큰 생성 const token = jwt.sign({username}, process.env.JWT_SECRET) console.log(token) //쿠키 저장 res.set("Set-Cookie", cookie.serialize('token', token)); return res.json({user, token}); token은 잘 찍히고 요청 헤더에 포함되어 있는데 TypeError serialize 부분에서 에러가 뜨고 실제 응답 에러가 납니다.... 쿠키 저장이 안되는 것 같습니다. serialize가 undefine 되었다는데 위에 const token으로 제대로 선언되고 출력까지 잘 되는데 이유를 모르겠습니다...

  • react
  • node.js
  • postgresql
  • docker
  • typescript
  • 클론코딩
  • next.js
마곡동김두팔 댓글 1 좋아요 0 조회수 264

AxiosError {message: 'Request failed with status code 401/500', name: 'AxiosError', code: 'ERR_BAD_RESPONSE', (2)

미해결

따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)

아래 질문 관련입니다. server.ts origin 부분을 강사님처럼 다음과 같이 작성하면 header 오류가 납니다. const origin = process.env.ORIGIN; app.use(cors({ origin, credentials: true })) 근데 아래처럼 const origin을 다음과 같이 환경변수를 거치지 않고 명시하면 헤더 오류 대신 500 오류가 나면서 토큰이 생성되지 않습니다. (로그인 페이지에서 로그인 시) const origin = 'http://localhost:3000'; app.use(cors({ origin, credentials: true })) 서버에서 process.env.ORIGIN, process.env.JWT_SECRET을 찍어봤을땐 잘 나오는데... 이 이유로 //비번이 맞으면 토큰 생성 const token = jwt.sign({username}, process.env.JWT_SECRET) 이 명령줄이 제대로 실행되지 않는 걸까 싶어 process.env.JWT_SECRET를 'super_secret'으로 바꿔봐도 똑같은 증상입니다. 확실하진 않지만 이 때문에 토큰 생성에 오류가 생겨서 500 에러가 뜨는 것인가 싶은데 어떻게 해결하면 좋을까요?

  • react
  • node.js
  • postgresql
  • docker
  • typescript
  • 클론코딩
  • next.js
마곡동김두팔 댓글 1 좋아요 0 조회수 620

한글이 깨져요

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

코드팩토리 디스코드에 질문하면 더욱 빠르게 질문을 받아 볼 수 있습니다! [코드팩토리 디스코드] https://bit.ly/3HzRzUM - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 한글 깨짐 현상이 일어나는데 이건 어떻게 해결해야하나요 ?

  • flutter
  • 클론코딩
2403docB 댓글 2 좋아요 0 조회수 357

AxiosError {message: 'Request failed with status code 401/500', name: 'AxiosError', code: 'ERR_BAD_RESPONSE',

미해결

따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)

로그인 페이지에서 로그인을 하면 500, 커뮤니티 생성 페이지에서 생성을 하면 401 AxiosError가 뜹니다. <login.tsx> import axios from 'axios'; import InputGroup from '../components/InputGroup' import Link from 'next/link' import { useRouter } from 'next/router'; import React,{ FormEvent, useState } from 'react' import { useAuthDispatch } from '../context/auth'; axios.defaults.withCredentials = true; const Login = () => { let router = useRouter(); const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [errors, setErrors] = useState<any>({}); const dispatch = useAuthDispatch(); const handleSubmit = async (event: FormEvent) => { event.preventDefault(); try{ const res = await axios.post("/auth/login", {password, username}, {headers: {'Access-Control-Allow-Origin': 'http://localhost:3000'}}) dispatch("LOGIN", res.data?.user); } catch(error: any){ //console.log(error); setErrors(error.response?.data || {}) } } return ( <div className='bg-white'> <div className='flex flex-col items-center justify-center h-screen p-6'> <div className='w-10/12 mx-auto md:w-96'> <h1 className='mb-2 text-lg font-medium'>로그인</h1> <form onSubmit={handleSubmit}> <InputGroup placeholder='Username' value={username} setValue={setUsername} error={errors.username} /> <InputGroup placeholder='Password' value={password} setValue={setPassword} error={errors.password} /> <button className='w-full py-2 mb-1 text-xs font-bold text-white uppercase bg-gray-400 border border-gray-400 rounded'> 로그인 </button> </form> <small> 아직 아이디가 없으신가요? <Link href="/register" legacyBehavior> <a className='ml-1 text-blue-500 uppercase'>회원가입</a> </Link> </small> </div> </div> </div> ) } export default Login <create.tsx> import axios from "axios"; import { GetServerSideProps } from "next"; import InputGroup from "../../components/InputGroup" import {useState, FormEvent} from "react"; import {useRouter} from "next/router" axios.defaults.withCredentials = true; const SubCreate = () => { const [name, setName] = useState(""); const [title, setTitle] = useState(""); const [description, setDescription] = useState(""); const [errors, setErrors] = useState<any>({}); let router = useRouter(); const handleSubmit = async (event: FormEvent) => { event.preventDefault(); try { const res = await axios.post("/subs", {name, title, description}, {headers: {'Access-Control-Allow-Origin': 'http://localhost:3000'}}) router.push(`/r/${res.data.name}`); } catch (error: any) { // console.log(error); setErrors(error.response?.data || {}); } } return ( <div className="flex flex-col justify-center pt-16"> <div className="w-10/12 mx-auto md:w-96"> <h1 className="mb-2 text-lg font-medium"> 그룹 만들기 </h1> <hr /> <form onSubmit={handleSubmit}> <div className="my-6"> <p className="font-medium">Name</p> <p className="mb-2 text-xs text-gray-400"> 그룹 이름은 변경할 수 없습니다. </p> <InputGroup placeholder="이름" value={name} setValue={setName} error={errors.name} /> </div> <div className="my-6"> <p className="font-medium">Title</p> <p className="mb-2 text-xs text-gray-400"> 주제를 입력해 주세요. </p> <InputGroup placeholder="주제" value={title} setValue={setTitle} error={errors.title} /> </div> <div className="my-6"> <p className="font-medium">Description</p> <p className="mb-2 text-xs text-gray-400"> 그룹에 대한 설명을 입력해주세요. </p> <InputGroup placeholder="설명" value={description} setValue={setDescription} error={errors.description} /> </div> <div className="flex jstify-end"> <button className="px-4 py-1 text-sm font-semibold rounded text-white bg-gray-400 border" > 그룹 만들기 </button> </div> </form> </div> </div> ) } export default SubCreate <subs.ts> import {Router, Request, Response} from "express"; import jwt from "jsonwebtoken" import { User } from "../entities/User"; import userMiddleware from "../middlewares/user" import authMiddleware from "../middlewares/auth" import { AppDataSource } from "../data-source"; import Sub from "../entities/Sub"; import { isEmpty } from "class-validator"; const createSub = async (req: Request, res: Response, next) => { const {name, title, description} = req.body; try { let errors: any = {}; if (isEmpty(name)) errors.name = "이름은 비워둘 수 없습니다."; if (isEmpty(title)) errors.title = "제목은 비워둘 수 없습니다."; const sub = await AppDataSource.getRepository(Sub) .createQueryBuilder("sub") .where("lower(sub.name) = :name", { name: name.toLowerCase() }) .getOne(); if (sub) errors.name = "서브가 이미 존재합니다."; if (Object.keys(errors).length > 0) { throw errors; } } catch (error) { console.log(error); return res.status(500).json({ error: "문제가 발생했습니다." }); } try { const user: User = res.locals.user; const sub = new Sub(); sub.name = name; sub.description = description; sub.title = title; sub.user = user; await sub.save(); return res.json(sub); } catch (error) { console.log(error); return res.status(500).json({ error: "문제가 발생했습니다." }); } }; const router = Router(); router.post("/", userMiddleware,authMiddleware, createSub); export default router; <server.ts> import express, { response } from "express"; import morgan from "morgan"; import { AppDataSource } from "./data-source"; import authRoutes from './routes/auth' import subRoutes from './routes/subs' import cors from 'cors'; import dotenv from 'dotenv'; import cookieParser from "cookie-parser"; const app = express(); const origin = process.env.ORIGIN; const corsOption = { origin: "http://localhost:3000", credentials: true } app.use(cors(corsOption)) app.use(express.json()); app.use(morgan('dev')); app.use(cookieParser()); dotenv.config(); app.get("/", (_, res) => {res.send("running")}); app.use("/api/auth", authRoutes) app.use("/api/subs", subRoutes) console.log(process.env.ORIGIN) let port = 4000; app.listen(port, async () => { console.log('server running at http://localhost:${port}'); AppDataSource.initialize().then(async () =>{ console.log("database initialized") }).catch(error => console.log(error)) })

  • react
  • node.js
  • postgresql
  • docker
  • typescript
  • 클론코딩
  • next.js
마곡동김두팔 댓글 1 좋아요 0 조회수 694

인기 태그

인프런 TOP Writers

주간 인기글