묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
타임리프 화면 출력 오류(entity-> dto 변환후)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)https://drive.google.com/file/d/1G3OvEzKlffIJB8WkcuULPE7xN_A0s4KB/view 강의 중간에 controller 에서 @PostMapping 으로 폼 데이터를 받을경우 entitiy 그대로 뿌리는것이아닌 dto로 변환하여 뿌리는 게 좋다고 하셔서 한번 그 방식대로 해보았는데 화면에 데이터가 뿌려지지 않아요 ㅜ 뭐가 잘못된건지 모르겠는데 한번 확인 부탁드립니다 ..
-
미해결프로젝트로 배우는 Python 챗봇 만들기 - LangChain, Gradio 활용
poetry --version 명령어 실행시 에러가 납니다.
poetry 설치후 환경변수를 추가하고 파워셀에서 poetry --version 을 실행하면 아래와 같은 에러가 납니다. poetry: 'poetry' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로그램 이름으로 인식되지 않습니다. 이름이 정확한지 확인하고 경로가 포함된 경우 경로가 올바른지 검증한 다음 다시 시도하십시오. 현재 시스템환경 변수에 %APPDATA%\Python\Scripts 를 추가하였고 %APPDATA%\pypoetry\venv\Scripts\poetry도 추가한 상태입니다.파워셀도 다시 접속하여 실행했습니다.
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
css 서버사이드 랜더링이 적용되지 않아서 문의 드립니다.
https://www.inflearn.com/course/lecture?courseSlug=%EB%85%B8%EB%93%9C%EB%B2%84%EB%93%9C-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%A6%AC%EB%89%B4%EC%96%BC&unitId=49018&category=questionDetail&tab=community&q=1075492안녕하세요 제로초님!위의 질문 답변을 보고 css 서버사이드 랜더링을 하기위해서 이것저것 해보았는데 적용이 안되서 문의 드립니다..babelrc 작성next.config.js에서도 옵션으로 가능하다고해서 수정_document.js 수정빌드 하고 npm start하고 테스트위 링크의 답변 참고해서 @ant-design/cssinjs 적용해봄 그럼에도 적용안되더라구요 ㅠpages/_docuemnts.js (이 전에는 제로초님깃헙의 것을 썼었습니다. 안돼서 @ant-design/cssinjs 적용한 버전입니다.import React from "react"; import Document, { Html, Head, Main, NextScript } from "next/document"; import { createCache, extractStyle, StyleProvider } from "@ant-design/cssinjs"; import { ServerStyleSheet } from "styled-components"; export default class MyDocument extends Document { static async getInitialProps(ctx) { const cache = createCache(); const sheet = new ServerStyleSheet(); const originalRenderPage = ctx.renderPage; try { ctx.renderPage = () => originalRenderPage({ enhanceApp: (App) => (props) => ( <StyleProvider cache={cache}> <App {...props} /> </StyleProvider> ), }); const initialProps = await Document.getInitialProps(ctx); const style = extractStyle(cache, true); return { ...initialProps, styles: ( <> {initialProps.styles} <style dangerouslySetInnerHTML={{ __html: style }} /> </> ), }; } catch (error) { console.error(error); } finally { sheet.seal(); } } render() { return ( <Html> <Head /> <body> <Main /> <NextScript /> </body> </Html> ); } } next.config.jsconst withBundleAnalyzer = require("@next/bundle-analyzer")({ enabled: process.env.ANALYZE === "true", }); module.exports = withBundleAnalyzer({ images: { domains: ["react-nodebird.s3.ap-northeast-2.amazonaws.com", "react-nodebird-s3.s3.amazonaws.com"], }, compress: true, compiler: { styledComponents: { ssr: true, displayName: true, }, }, webpack(config, { webpack }) { const prod = process.env.NODE_ENV === "production"; return { ...config, mode: prod ? "production" : "development", devtool: prod ? "hidden-source-map" : "inline-source-map", plugins: [...config.plugins], }; }, }); .eslintrc{ "parser": "@babel/eslint-parser", "parserOptions": { "ecmaVersion": "latest", "sourceType": "module", "ecmaFeatures": { "jsx": true }, "requireConfigFile": false, "babelOptions": { "presets": ["next/babel"] } }, "env": { "browser": true, "node": true, "es6": true }, "extends": [ "airbnb", "next/babel" ], "plugins": ["import", "react-hooks", "jsx-a11y"], "rules": { "react/react-in-jsx-scope": "off", "jsx-a11y/label-has-associated-control": "off", "jsx-a11y/anchor-is-valid": "off", "no-console": "off", "no-underscore-dangle": "off", "react/forbid-prop-types": "off", "react/jsx-filename-extension": "off", "react/jsx-one-expression-per-line": "off", "react/jsx-props-no-spreading": "off", "object-curly-newline": "off", "linebreak-style": "off", "no-param-reassign": "off", "max-len": "off" } } /.babelrc{ "presets": ["next/babel"], "plugins": [ [ "styled-components", { "ssr": true, "displayName": true } ] ] } https://github.com/dydcodydco/react-nodebird혹시나해서 깃헙 주소도 남깁니다.마지막으로 하나 더 궁금한게 있습니다.이 강의를 내껄로 만들고, 다음강의 슬랙까지 강의보고 하면중고신입으로 개발자 이직할 수 있을지도 궁금합니다.좋은 강의 정말 감사합니다.
-
미해결이것이 진짜 크롤링이다 - 기본편
실행오류
실행버튼이 없었던것은 찾아보니 확장프로그램 미설치 문제인것 같아 설치했더니 생성되어서 이부분은 해결이 되었는데요...명령어 함수가 제대로 작동을 안하는것 같아요 강의설명대로 똑같이 입력했는데 저는 색깔도 안바뀌고 실행버튼 누르면 밑에 저렇게 뜨네요;;뭐가 문제일까요..ㅠㅠ
-
미해결Vue 강의 끝판왕 : Nuxt 3 완벽 마스터
macro=true 는 뭔가요?
강의 잘 보고 있습니다.nuxt3가 버전없이 되어서 그런지, 강의에서는 안 보이는 _nuxt/pages/index.vue?macro=true 이런게 많이 보입니다.라우팅을 확인하기 위해서 개발자 도구의 network에서 보면 이런 코드가 다 들어가 보이는데..이건 뭐며, 로딩이 안되게나 해당 페이지 사용시 로드하는 형태는 불가능한가요??home으로 이동시 index.vue 로드해서 가져오고, about 클릭시 about.vue를 정상적으로 로드해서 정상적으로 code split이 이루어지고 있는 상태인데.. 해당 페이지를 리로드해서 가져오면.. 이처럼 pages 밑에 있는 모든 파일의 macro=true로 다 가져오고 있거든요..알려주시면 감사하겠습니다.. 아.. 코드 오류 발생시 저 macro=true 붙은 것을 화면에 많이 뿌려주어서 더 궁금합니다..
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
팔로워 3명씩 불러오고 데이터 합쳐주는걸로 바꾸고 서버요청을 무한으로하고있습니다.
안녕하세요 제로초님.강의중에 말씀해주셨건걸 참고해서팔로워, 팔로잉을 3명 호출하고, 이후에 다음3명씩 호출하고 불러온 데이터를 합쳐서 리스트를 만드는식으로 바꿔봤습니다.그런데 이슈가 한번 불러오기, 더보기 다 작동하는데 서버 요청을 무한으로 하고 있습니다.어떤 부분을 수정해야할지 봐주실 수 있을까요?limit은 3으로 고정, page를 조절해서 다음 3명씩/pages/profile.jsimport Head from "next/head"; import { useDispatch, useSelector } from "react-redux"; import { useCallback, useEffect, useState } from "react"; import { useRouter } from "next/router"; import axios from "axios"; import useSWR from "swr"; import { loadFollowersRequestAction, loadFollowingsRequestAction, loadMyInfo } from "../reducers/user"; import AppLayout from "../components/AppLayout"; import NicknameEditForm from "../components/NicknameEditForm"; import FollowList from "../components/FollowList"; import wrapper from "../store/configurStore"; const fetcher = (url) => axios.get(url, { widthCredentials: true }).then((result) => { console.log("fetcher----------------------"); return result.data; }); const Profile = () => { const router = useRouter(); const dispatch = useDispatch(); const { me } = useSelector((state) => state.user); const [followersLimit, setFollowersLimit] = useState(1); const [followingsimit, setFollowingsLimit] = useState(1); const [followers, setFollowers] = useState([]); const [followings, setFollowings] = useState([]); const { data: followersData, error: followerError, isLoading: followerLoading, } = useSWR(`http://localhost:3065/user/followers?page=${followersLimit}`, fetcher, { onSuccess: (data) => { setFollowers((prev) => [...prev, ...data]); }, }); const { data: followingsData, error: followingError, isLoading: followingLoading, } = useSWR(`http://localhost:3065/user/followings?page=${followingsimit}`, fetcher, { onSuccess: (data) => { setFollowings((prev) => [...prev, ...data]); }, }); useEffect(() => { if (!(me && me.id)) { router.push("/"); } }, [me && me.id]); const loadMoreFollowings = useCallback(() => { setFollowingsLimit((prev) => prev + 1); }, []); const loadMoreFolloweers = useCallback(() => { setFollowersLimit((prev) => prev + 1); }, []); if (!me) { return <div>내정보 로딩중...</div>; } if (followerError || followingError) { console.error(followerError || followingError); return <div>팔로잉/팔로워 로딩 중 에러 발생...</div>; } return ( <> <Head> <title>내 프로필 | NodeBird</title> </Head> <AppLayout> <NicknameEditForm /> <FollowList header='팔로워' data={followers} onClickMore={loadMoreFolloweers} loading={followerLoading} /> <FollowList header='팔로잉' data={followings} onClickMore={loadMoreFollowings} loading={followingLoading} /> </AppLayout> </> ); }; export const getServerSideProps = wrapper.getServerSideProps((store) => async ({ req }) => { console.log(req.headers); const cookie = req ? req.headers.cookie : ""; axios.defaults.headers.Cookie = ""; if (req && cookie) { axios.defaults.headers.Cookie = cookie; } await store.dispatch(loadMyInfo()); }); export default Profile; /routes/userl.js// GET /user/followers 팔로워즈 불러오기 router.get("/followers", isLoggedIn, async (req, res, next) => { try { // 나를 먼저 찾고 const user = await User.findOne({ where: { id: req.user.id }, }); // 내 팔로워즈 get 하기 const limit = parseInt(req.query.limit, 10) || 3; // 기본값 3 const page = parseInt(req.query.page, 10) || 1; // 기본값 1 const offset = (page - 1) * limit; const followers = await user.getFollowers({ limit, offset }); res.status(200).json(followers); } catch (error) { console.error(error); next(error); } }); // GET /user/followings 팔로잉즈 불러오기 // 미들웨어... (req, res, next) 이 콜백함수도 미들웨어 router.get("/followings", isLoggedIn, async (req, res, next) => { try { const user = await User.findOne({ where: { id: req.user.id }, }); const limit = parseInt(req.query.limit, 10) || 3; // 기본값 3 const page = parseInt(req.query.page, 10) || 1; // 기본값 1 const offset = (page - 1) * limit; const followings = await user.getFollowings({ limit, offset }); res.status(200).json(followings); } catch (error) { console.error(error); next(error); } });
-
미해결이것이 진짜 크롤링이다 - 기본편
풀레이 아이콘이 없어요;;
안녕허세요 선생님 저는 이제 코딩 입문한 코린이인데요 강의보고 따라하는데 저는 헬로 스타트코딩명령어 우측 상단에 삼각형 플레이 아이콘이 아예 없어요ㅠ 그래서 밑에 따로 프롬프트란을 켜봐도 노란색 명령어도 안나오는데 어찌해야하나요;;;
-
미해결김영한의 실전 자바 - 중급 2편
Possible typo - "row" to "raw"
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 아니오[질문 내용]제네릭 용어와 관례 챕터에서 row type 이 기재돼있는데 raw type 을 말씀하시는 것 같네요. Raw (생/날 것) 이 오타난 것 같아 알려드립니다.
-
미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
ai의 공격 애니메이션 rpc를 어떻게 해야할지 모르겠습니다
characternonplayer의 공격 애니메이션 rpc를 어떻게 해야할지 모르겠습니다h:UFUNCTION(Server, Reliable)void ServerAttack();UFUNCTION(Client, Unreliable)void ClientRPCAttack();cpp:void ServerAttack_Implementation(){ ProcessComboCommand(); ClientRPCAttack();}void ClientRPCAttack_Implementation(){ UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance(); AnimInstance->StopAllMontages(0.0f); AnimInstance->Montage_Play(ComboActionMontage);}플레이어가 아닌 액터들의 rpc는 어떤식으로 진행해야하나요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
final 과 this
[질문 내용]여기에 질문 내용을 남겨주세요. service 에서 repository 호출 시 final 쓰는 이유 좀 설명해주세요 ㅠ 그리고 this의 의미가 setName(String name){.....} 에서 매개변수로 넘어온 (String name)을 지칭하는 것인가요??
-
미해결Selenium 기본 과정
현재 네이버 코드가 바뀐거 같습니다.
현재 네이버 플레이스 페이지에서 펼쳐서보기 -> 더보기로 바뀌었는데 이부분 대처할수 있는 방법이 있을까요?
-
미해결U-Net 구현으로 배우는 딥러닝 논문 구현 with TensorFlow 2.0 - 딥러닝 의료영상 분석
안녕하세요 train evaluate부분 질문드립니다
1.앞에 고민올리신 분대로 코드를 바꿔보니 train부분은 돌아가더라고요,5/2000번 이라서 왜그런지는 모르겟으나 너무 느리고 반쯤가다가 멈추더라고요.2.2000번 다안되서 50번으로 바꿔서 돌려보니 되더라고요(loss 값은 강의만큼 떨어지지는 않지만.. 돌아가긴하네요.) 그리고 앞에 커뮤니티 올리신 분도 비슷한 문제가 있어 https://gist.github.com/solaris33/771639041b8a4500b6d81951d4a2b814여기있는대로 evaluate구현해보니 Traceback (most recent call last):File "evaluate_isbi_2012.py", line 89, in <module>app.run(main)File "D:\anaconda\envs\tfunet\lib\site-packages\absl\app.py", line 308, in runrunmain(main, args)File "D:\anaconda\envs\tfunet\lib\site-packages\absl\app.py", line 254, in runmainsys.exit(main(argv))File "evaluate_isbi_2012.py", line 66, in mainunet_model.load_weights(FLAGS.checkpoint_path)File "D:\anaconda\envs\tfunet\lib\site-packages\keras\utils\traceback_utils.py", line 70, in error_handlerraise e.with_traceback(filtered_tb) from NoneFile "D:\anaconda\envs\tfunet\lib\site-packages\tensorflow\python\training\py_checkpoint_reader.py", line 31, in error_translatorraise errors_impl.NotFoundError(None, None, error_message)tensorflow.python.framework.errors_impl.NotFoundError: Unsuccessful TensorSliceReader constructor: Failed to find any matching files for saved_model_isbi_2012/unet_model.ckpt 이런문제가 뜨더라고요..3.제가 쓰는 파이썬은 3.7.9이고 tensorflow 2.11 을 쓰고 있어요 예전버전쓰니까 이상한 문제가 있다고 train도 구현이 되질않아서요.. 가능하시면 2.11버전에 맞게 코드 변경 부탁드려요.. 몇일을 실랑이 하다가 어떻게 해야될지 몰라 올려보네요..아니면 requirement라도 넣어주시면 감사하겠습니다.
-
미해결설계독학맛비's 실전 FPGA를 이용한 HW 가속기 설계 (LED 제어부터 Fully Connected Layer 가속기 설계까지)
AXI4-Lite로 Read가 되지 않습니다.
안녕하세요 맛비님, 좋은 강의 해주셔서 항상 감사드립니다.저는 현재 설계했던 연산기 core를 검증하기 위해 AXI4-lite 인터페이스를 통해 input과 weight를 write하고, output값을 read하는 모듈을 만들고 있습니다. 맛비님 강의에서처럼 bram을 사용하여 메모리를 통해 읽는다면 문제가 되지 않았겠지만, 메모리를 사용하지 않고 이미 설계해논 연산기 core 검증을 위해 무식하게 output값을 read해야 하는 상황입니다. write 할 때, led를 점등하게 하여 write는 잘 되는것은 확인 하였는데, output값이 0으로만 출력되더라고요.core(o_out_c) --> top --> myip_v1_0. --> myip_v_1_0_S00_AXI(i_out_c) 로 값이 이동합니다.다음과 같이 slave register 0~6은 write전용, 7은 read전용으로 선언하였고, 코어 bitwidth가 16비트라 AXI와의 호환을 위해 32비트로 늘려주었습니다.Simulation을 통해 i_out_c에 강제로 값을 넣어주어도 axi_rdata는 읽히지 않더라고요.(Ready, Valid 모두 1 확인 했습니다)0x1c번지에 write한 값을 바로 read할 때는 올바르게 출력되는데,read only로 선언하면 왜 읽히지 않는 걸까요..?혹시 메모리를 통해 저장해논 값만 읽을 수 있는 걸까요? AXI 구조를 제대로 이해하지 못했기 때문일까요..? 양해 부탁드립니다...
-
미해결ASP.NET Core MVC +ASP.NET Core +REST API +.NET 8.0
해외에서는 웹 어플리케이션 개발할때 프로시저를 더많이 사용하나요?
안녕하세요. 강의를 듣다가 해외에서 프로시저를 사용하는 부분에서 궁금한점이 들어서 질문을 남깁니다.해외의 경우 웹 애플리케이션을 개발할때 전부 프로시저로 개발하거나 비중이 높은 사이트나 회사도 있나요?(범용적으로 유지보수와 가독성을 위해서 적절히 섞어서 사용한다고 알고 있습니다.)만약 프로시저 비중이 높거나 전체를 개발 된 사이트가 있다면 혹시 어떻게 생각하는지 들을 수 있을까요?(저는 별로라고 생각합니다!)
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
jpa문법 강의 질문있습니다.
1. 프로젝션(SELECT) 11분 37초에 질문있습니다..List resultList=em.createQuery("select m.username,m.age from member m") .getResultList(); Object o =resultList.get(1); 일경우에 뭐가나오나요?resultList에username | age 이렇게 저장되나요?2. Object o=resultList.get(0);이후에 Object[] result=(Object[]) o;이렇게 들어가있는데요. o가 Object객체 타입인데 Object 배열로 다운캐스팅 된거에요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
폼데이터 GET 요청 시, WhiteLabel 페이지 출력
환경: Mac OS, Spring Boot 3.2.5, Java 17 강의, 문서 코드 그대로 작성했습니다.10:10부터 설명해주시는 폼데이터 GET 요청 시, WhiteLabel 페이지가 출력이 됩니다.반환하는 뷰 이름과 뷰 파일 이름이 매칭이 되지 않는지 확인했고, 무슨 문제인지 감이 잘 잡히지 않습니다. 확인 한 번만 부탁드리겠습니다! 감사합니다
-
미해결실리콘밸리 엔지니어에게 배우는 파이썬 아파치 스파크
Spark Structured Streaming Gracefully shutdown 질문
안녕하세요. 좋은 강의 재밌게 수강하고 있습니다.Spark Structured Streaming Fault Tolerance 강의에서 아래와 같이 gracefully 하게 스트리밍을 종료할 수 있다고 말씀 주신 부분에서 질문이 있습니다..config("spark.streaming.stopGracefullyOnShutdown", "true")현재 업무에서 Spark Streaming을 사용했을 때 아래 코드와 같이 파라미터에 명확하게 stopGracefully 이 존재하여서 이를 이용하여 스트리밍을 안전하게 종료했습니다.def stop(stopSparkContext: Boolean, stopGracefully: Boolean): Unit 하지만, Spark Strucutred Streaming으로 전환했을 때 이러한 파라미터가 존재하지 않아서, 아래 링크를 참고하여 직접 구현하였습니다. https://stackoverflow.com/questions/45717433/stop-structured-streaming-query-gracefully 강의에서 알려주신 것처럼 아래와 같이 사용하면 동일하게 Structured Streaming도 Gracefully하게 종료할 수 있다고 이해하면 될까요? .config("spark.streaming.stopGracefullyOnShutdown", "true")Gracefully 스트리밍을 종료 한다라는 의미가 현재 처리 중인 마이크로 배치까지는 모두 다 처리 및 체크포인트 작성까지 한 후 스트리밍 종료로 이해하면 될까요?마지막으로, DR 같이 스트리밍 종료가 아닌 클러스터가 모두 비정상적으로 종료되었을 경우 Gracefully 옵션이 적용되지 않는 케이스를 경험 했는데, 이런한 케이스는 현업에서 주로 어떻게 대처하고 있을까요?(예를 들어 체크 포인트 등이 불일치하게 스트리밍이 종료)감사합니다.
-
미해결김영한의 실전 자바 - 중급 1편
주요 메서드2 부분 수업자료 오타가 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]수업자료 pdf 주요 메서드 2 부분의 처음 코드 (replace 부분)에서코드에는 `replaceAll()` 메서드의 내용이 없는데 결과에는 해당 내용이 포함되어 있습니다! 해당 내용 => [모든 'Java'를 'World'으로 대체: Hello, World! Welcome to World]
-
미해결애니메이션과 이모티콘 만드는 진짜 애니메이트 클래스
프레임 숫자 변경
안녕하세요! 열심히 수강하고있는 학생입니다.너무 마음에드는 그림을 그려서 그 그림으로 강의를 보며 연습하고있는데, 다 그리고 보니 처음 생성시 프레임 숫자를 20이 아닌 30으로 했더라고요 ...ㅠㅠㅠ프레임 숫자 변경하는 방법이 있을까요?없다면 프레임 숫자를 변경하지 않고 히어로 포즈 1부 강의를 들어도 무관할까요 ?..ㅠㅠㅠ
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 퀘스트&업적 시스템
원하는 타이밍에 퀘스트를 등록하고 싶다면 어떻게 해야할까요
프로젝트에 해당 수업 내용을 구현해서 작업 중인데 만약 어떤 오브젝트에 상호작용 한 후에 퀘스트가 등록되게 하고싶다면 어떻게 해야할까요?