묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[R을 R려줘] R 데이터 시각화
데이터 제공 종료했다고합니다.. 마지막 강의 듣고싶은데, 데이터를 받을 수가 없어요..어찌해야되나요
https://data.seoul.go.kr/dataList/OA-20470/F/1/datasetView.do서울시 홈페이지에 가도 없는것같습니다.너무 아쉽습니다설령 찾더라도 이전과 내용이 너무 많이 달라서 적용이 안되는게 너무 많아서 어렵더라구요.백신데이터 접종 시각화 강의 마저도 @이 안되길래r버젼을 다운그레이드하고, rstudio를 재설치해도 안되서 답답하더라구요.. 이번 공공데이터 강의도 현재버젼과 맞지 않은 부분이 있을까봐 걱정됩니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
AI 답변에 대한 재문의
아!.. 제가 궁금한것은/addForm()에서 생성된 빈 객체가1. addITem 메소드 호출시 바인딩 되는 객체와 동일한 객체인지 와editForm 메소드에서 findById 로 찾는 객체와같은 객체인지 궁금합니다!또한,Item 객체가 단순히 자바빈으로 등록되어있는것이지, 싱글톤은 아니죠?( 꼬리에 꼬리를 무는생각으로 이어진고민입니다.).aI 답변을 받았는데 아직 이해가 잘 가지 않아서 재질문 드립니다!
-
미해결스프링 배치
spring batch 5
spring batch5에서 더이상 JobBuilderFactory와 StepBuilderFactory를 지원하지 않아 스프링 가이드를 참고해 JobBuilder와 StepBuilder로 해보고 있는데 아무래도 수업내용과는 코드차이가 있어 어려움이 있는데요, 혹시 spring batch5에 호환되는 버젼의 코드 업데이트 예정이 있으신지 여쭈어봅니다!
-
미해결화이트해커가 되기 위한 8가지 웹 해킹 기술
sudo beef-xss 하면 파이어폭스와 연동이 안됩니다
어떻게 해결할 수 있을까요 ? 자꾸 Unable to connect라 합니다
-
미해결홍정모의 따라하며 배우는 C언어
운영체제 구성 그림에서 입출력 장치의 위치
안녕하세요. "0.3.운영체제가 해주는 일들" 설명을 듣다가 의문점이 생겨서 질문 남깁니다. <그림1>위의 그림을 보면서 저는 사용자가 하드웨어 자원을 사용하기 위해서는 직접 하드웨어를 사용할 수 없기에, 응용 프로그램을 실행하고 응용 프로그램은 커널을 통해 하드웨어 자원을 사용하는 것이라고 이해했습니다. CPU, 메모리, 보조기억 장치는 직접 사용자와 상호작용을 할 수 없다는 것은 이해가 되지만(직접 손으로 조작하여 사용할 수 없기 때문), 입출력 장치는 사용자와 직접 상호작용 한다고 생각했습니다. 왜냐하면 직관적으로 생각을 해보면, 프로그램을 실행 할 때 "마우스로 응용프로그램을 클릭 or 키보드로 명령어 입력(입출력 장치 사용)-> 응용 프로그램 실행-> Kernel을 통한 하드웨어 사용(CPU, 메모리, 보조 기억장치)" 과 같은 과정이 일어나기 때문에, 입출력 장치는 사용자와 제일 먼저 상호작용 하는 것 아닌가? 라는 생각을 했습니다. <그림2>궁금증을 해결하기 위해 검색을 해보니, 다음과 같은 그림을 찾을 수 있었습니다. 위 그림을 보면 키보드 마우스 등등 입출력 장치는 사용자와 가장 먼저 상호작용을 하는 것처럼 나와있고 이는 직관적으로 이해가 됩니다. 요약해서 질문을 드리면 입출력 장치는 사용자와 가장 먼저 상호작용 하는 하드웨어임에도 불구하고 왜 <그림1>에서는 사용자와 가장 멀리 떨어진 부분에 위치하는 지 궁금합니다. 긴 글 읽어주셔서 감사드립니다.
-
미해결따라하며 배우는 도커와 CI환경 [2023.11 업데이트]
COPY --from=builder /usr/src.\/app/build 문 not found 에러 발생
안녕하세요 수업내용 중 운영환경 도케 이미지를 위한 Dockerfile 작성하기 에서 ***********************************************FROM node:alpine as builder WORKDIR /usr/src/app COPY package.json ./ RUN npm install COPY ./ ./ CMD ["npm", "run", "build"] FROM nginx COPY --from=builder /usr/src/app/build /usr/share/nginx/html***********************************************위 와 같이 작성하였더니 아래 이미지와 같은 에러가 확인되었습니다. > [stage-1 2/2] COPY --from=builder /usr/src/app/build /usr/share/nginx/html:------Dockerfile:9-------------------- 8 | FROM nginx 9 | >>> COPY --from=builder /usr/src/app/build /usr/share/nginx/html--------------------ERROR: failed to solve: failed to compute cache key: failed to calculate checksum of ref 800cbe25-2c37-4cd8-a955-7b83c9ca7ed6::qsbcjgd4h6b5x2kfg8hzb8sb0: "/usr/src/app/build": not found*********************************************** >>> 경로를 생성하지 못하여 발생하는 것처럼 느껴져 RUN make -p 명령어를 사용하여 not found 되고 있다는 경로를 직접 생성해주고 나니 정상 build 되기는 하였습니다만.이렇게 하면 혹시 덮어쓰기 되지 않을까해서 문의를 별도로 넣습니다.FROM node:alpine as builder WORKDIR /usr/src/app RUN mkdir -p /usr/src/app/build COPY package.json ./ RUN npm install COPY ./ ./ CMD ["npm", "run", "build"] FROM nginx COPY --from=builder /usr/src/app/build /usr/share/nginx/html
-
미해결
tdd에 대한 질문 있습니다
안녕하세요. tdd에 대해 배운지 얼마 안된 학생입니다.실패하는 코드를 짠다 -> 돌아가는 코드를 만든다 -> 리펙터링을 한다까지는 이해가 되고 이렇게 코드를 작성함으로써 프로그램이 더 견고해지는 느낌은 마음에 듭니다. 하지만 나중에 요구사항이 바뀔 시 테스트코드도 싹 다 엎어버려야하는 것 아닌가요?꼼꼼하게 테스트 코드를 작성했는데 요구사항이 바뀌면 수정하는데 시간이 두 배 더 드는게 아닐까 싶어서요.메서드 명이나 필드명을 바꾸고 싶을 땐 테스트코드에 있는것들도 다 바꿔야 하는거잖아요.이런건 어쩔 수 없는 부분인가요? 소위 말하는 테스트 코드가 "깨진다"에 대한 노하우가 있는지 궁금합니다.
-
미해결Next + React Query로 SNS 서비스 만들기
children 오류??
(afterLogin)의 layout.tsx에서 35번째 주석부분 children이요여기 children에 각 폴더 page.tsx, layout.tsx이 들어가는건가요??여기 35번 줄 children 주석풀고 실행해보면이런 오류 뜨는데 왜 이런지 알 수 있을까요??
-
해결됨토비의 스프링 부트 - 이해와 원리
자동 구성 정보 클래스를 작성한다면
@Configuration(proxyBeanMethods = false) static class MyConfig { private final Common common; public MyConfig(Common common) { this.common = common; } @Bean public Bean1 bean1() { System.out.println("bean1 생성자"); return new Bean1(common); } @Bean public Bean2 bean2() { System.out.println("bean2 생성자"); return new Bean2(common); } } @Configuration(proxyBeanMethods = false) static class MyCommonConfig { @Bean public Common common() { return new Common(); } }과@Configuration(proxyBeanMethods = false) static class MyConfig { @Autowired private Common common; public MyConfig() { } @Bean public Bean1 bean1() { System.out.println("bean1 생성자"); return new Bean1(common); } @Bean public Bean2 bean2() { System.out.println("bean2 생성자"); return new Bean2(common); } @Bean public Common common() { return new Common(); } }빈 구성 정보를 프록시 객체로 생성하지 않는다는 대안을 코드로 작성해보면 별도의 구성 정보를 사용하는 방식과내부에서 필드 주입으로 초기화 하는 방식이 생각났습니다. 별도의 구성정보를 사용하면 어떤 클래스를 의존하는지 생성자를 보고 확인할 수 있다는 장점과 테스트 코드를 작성할때 더 편할거라 생각이 들고,밑에 방식은 Common이라는 클래스가 MyConfig 에서만 사용된다면 관리하기도 편할거라 생각이 들었습니다. 그리고 설정 정보 클래스니까 굳이 생성자로 초기화를 하지 않아도 되지 않을까 라는 생각도 들었습니다. 강사님께서 Config 클래스도 테스트를 해봐야한다고 말씀해주셨는데 이런 경우라면 상황에 따라 선택해야하는 부분인가요 ?아니면 설정 정보도 환경에 따라 다를 경우가 있느니까 별도로 분리하는게 나을까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
postmapping 에서의 모델바인딩 객체
폼에서 작성한 데이터들이 @PostMapping("/add)로 넘어가서 @ModelAttribute 를 통해 item 객체에요청 파라미터를 프로퍼티 접근법으로 값을 세팅하고 모델에 item 객체를 item 의 이름으로 바인딩 되는것이 맞죠?맞다면, @ModelAttribute 를 통해 바인딩 되는 객체는addForm 메소드에서 만들어주어서 타임리프에 활용가능하게 넘겨주었던 그 item 객체인가요?(같은 객체를 재사용하는건지) ,아니면 새로운 객체를 또 만들어서 새로운객체에 값을 세팅해주고 모델에 바인딩을 해주는것인지 궁금합니다 수정폼에서 Item item = itemRepository.findById(itemId); 에서 찾는 item (entity?) 도 addForm 에서 새로 생성했던던 그 객체인것이죠?
-
미해결홍정모의 따라하며 배우는 C언어
*str 의 값
안녕하세요 교수님께서 10분 30초 쯤에 작성하시던 코드에서while (*str)이라고 작성하신 부분이 있는데요, 이 부분은 *str이 0이 아니면 while문을 진행시킵니다.또한 강의 중while (*str)와 while (*str != '\0')는 같은 역할은 한다고 말씀하신 바가 있습니다. str주소를 하나씩 옮겨가면서 읽을 값은 차례대로 1, 2, 3, 4, 5, \0 인데 \0과 0은 다릅니다.근데 어떻게 *str != 0로 처리돼서 while문이 진행된건지 궁금합니다.
-
해결됨
H2 설정삭제시초기화 방법
삭제해서 재설치해도똑같아요 복귀하는방법좀알려주세요 ㅠㅠ윈도우기준
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@ResponseBody 어노테이션을 쓰는 메소드와 안 쓰는 메소드 차이가 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 강의를 듣다가 헷갈리는 부분이 있어서 질문 드립니다. @ResponseBody를 메소드에 붙이고 안 붙히는 기준이 궁금합니다. 일단 제가 이해한 @ResponseBody는 뷰를 따로 사용하지 않고 HTTP 응답 본문에 메소드가 리턴한 정보(원시 데이터 또는 객체=json)를 입력해서 응답하는 것으로 이해했습니다. 근데 아래 사진의 빨간 밑줄 친 메서드들을 보면 뷰의 논리적 이름이 아닌 ResponseEntity 객체를 리턴하는 것으로 보여지고 객체를 리턴하면 HTTP 응답 본문에 입력하려면 @ResponseBody 어노테이션이 필요한 것이 아닌가 궁금합니다. 그런데 ResponseEntity의 코드를 보니까 HttpEntity를 상속 받던데 ResponseEntity가 HTTP 응답 그 자체라서 @ResponseBody를 사용하지 않는 것인가요?답변 주시면 정말 감사하겠습니다.
-
미해결HTML+CSS+JS 포트폴리오 실전 퍼블리싱(시즌1)
rotate, skewX, translate 값 찾기 질문드립니다..
.app-ui { /* border: 1px solid red; */ width: 340px; height: 640px; transform: rotate(-30deg) skewX(20deg); /* transform: skewX(); */ position: relative; } .app-ui:hover img:nth-child(1){ transform: translate(40px, -40px); }.app-ui 요소를 rotate (-30deg) skewX(20deg) 해서 .app-ui:hover 밑에 이미지를 translate(40px, -40px) 한 것 같은데 이 때 숫자는 어떻게 40이라는 값이 나온걸까요? 수직으로 올리는 값을 어떻게 정하는 걸까요? 10 20 30 40 다 넣어보면서 찾는건가요..? ㅠㅠ
-
미해결장고 설계철학으로 시작하는 파이썬 장고 입문
URL 매핑 관련해서 질문드립니다.
안녕하세요 선생님. 수업 잘듣고 있습니다. "장고앱 폴더만 다른 프로젝트로 복사하면 복잡한 설정없이 사용할 수 있다."라는 것에 대해 질문이 있는데요.폴더를 복사해서 사용하게 되면복사가된 폴더와 복사를 한 폴더의 models 파일이 같은 테이블을 바라보게 되는데 한 폴더에서 models의 내용을 수정해 table내용을 변경하게 된다면 나머지 다른 폴더도 변경해줘야 하지 않을까요? 그렇게 된다면 models라는 폴더는 공용으로 쓰는게 맞지 않나 생각합니다. 또 다른 질문이 있습니다. FastAPI를 사용했다는 가정하에 Layer가 잘 나눠져 있다는 가정하에 UrL이 매핑되어 있어도 Controller 함수만 하나더 추가하면 더 유연한 구조가 될거 같은데요. 선생님 생각은 어떤지 궁금합니다. 느슨한 결합 부분에서 복붙을해서 프로젝트를 확장하는 것이 확장성이 있는 장점인지 잘 모르곘습니다. 수업 잘듣고 있습니다. 감사합니다!
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
코드 질문드립니다.
import "./App.css"; import { BrowserRouter, Route, Routes } from "react-router-dom"; import Board from "./common/Board"; import Login from "./component/Login"; import { useEffect } from "react"; function App() { useEffect(() => console.log("app is loading"), []); return ( <BrowserRouter> <Routes> <Route path="/login" element={<Login />}></Route> <Route path="/board/:boardId/page/:page" element={<Board />}></Route> <Route path="/board/:boardId/new" element={<Board />}></Route> <Route path="/board/:boardId/post/:postId" element={<Board />}></Route> <Route path="/board/:boardId/post/:postId/edit" element={<Board />} ></Route> </Routes> </BrowserRouter> ); } export default App; import React, { useEffect, useState, useContext } from "react"; import { useNavigate, useParams } from "react-router-dom"; // useParams를 import import BoardList from "../component/BoardList"; import BoardEdit from "../component/BoardEdit"; import BoardView from "../component/BoardView"; import Layout from "../layout/Layout"; import axios from "axios"; import { TokenProcess } from "../common/TokenProcess"; export const BbsSettingContext = React.createContext(); const Board = () => { const { boardId, postId, page } = useParams(); // const [currentUrl, setCurrentUrl] = useState(null); const [boardSettData, setBoardSettData] = useState(null); const navigate = useNavigate(); useEffect(() => { console.log("board:::::::::::::::::"); const fetchData = async () => { const access_token = localStorage.getItem("Authorization"); try { const response = await axios.get( `http://localhost:8080/api/board/${boardId}`, { headers: { Authorization: `Bearer ${access_token}`, }, } ); setBoardSettData(response.data.returnData.board); let mode = ""; if ( window.location.pathname.split("/")[3] == "page" && window.location.pathname.split("/")[5] == null ) { mode = "page"; } else if ( window.location.pathname.split("/")[3] == "post" && window.location.pathname.split("/")[5] == null ) { mode = "view"; } else if (window.location.pathname.split("/")[5] == "new") { mode = "new"; } else if (window.location.pathname.split("/")[5] == "edit") { mode = "edit"; } else { mode = ""; } setCurrentUrl(mode); console.log("모드" + mode); } catch (error) { console.log(error); if ( error.response.status == 401 && error.response.data.data == "EXPIRE_TOKEN" ) { (await TokenProcess()) ? fetchData() : navigate("/login"); } else { console.log(error); return false; } } }; fetchData(); }, [window.location.pathname]); return ( <BbsSettingContext.Provider value={boardSettData}> {currentUrl == "page" ? ( <Layout> <BoardList boardId={boardId} page={page} /> </Layout> ) : currentUrl == "new" ? ( <Layout> <BoardEdit /> </Layout> ) : currentUrl == "edit" ? ( <Layout> <BoardEdit boardId={boardId} postId={postId} /> </Layout> ) : currentUrl == "view" ? ( <Layout> <BoardView boardId={boardId} postId={postId} /> </Layout> ) : null} </BbsSettingContext.Provider> ); }; export default Board; 아래는 상세 보기입니다.import React, { useState, useEffect, useContext, useRef } from "react"; import { useNavigate } from "react-router-dom"; import axios from "axios"; import { BbsSettingContext } from "../common/Board"; import ToastEditor from "../component/ToastEditor"; import MyButton from "../common/ComButton"; import { TokenProcess } from "../common/TokenProcess"; const BoardView = ({ postId }) => { const titleInputRef = useRef(); const contentsAreaRef = useRef(); const toastEditorRef = useRef(); // ToastEditor의 ref const navigate = useNavigate(); const [post, setPost] = useState({ postId: "", postTitle: "", postContent: "", regDate: "", }); const [boardSetting, setBoardSetting] = useState(null); const boardSetData = useContext(BbsSettingContext); const Navigate = useNavigate(); const formatDate = (timestamp) => { const date = new Date(timestamp); const options = { year: "numeric", month: "long", day: "numeric" }; return date.toLocaleDateString("ko-KR", options); }; useEffect(() => { console.log("view>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); if (boardSetData) { setBoardSetting(boardSetData); const access_token = localStorage.getItem("Authorization"); const fetchData = async () => { try { const response = await axios.get( `http://localhost:8080/api/board/${boardSetData.boardId}/post/${postId}`, { headers: { Authorization: `Bearer ${access_token}`, }, } ); console.log(response.data.returnData); setPost({ postId: response.data.returnData.postId, postTitle: response.data.returnData.postTitle, postContent: response.data.returnData.postContent, regDate: response.data.returnData.regDate, }); } catch (error) { console.log(error); if ( error.response.status == 401 && error.response.data.data == "EXPIRE_TOKEN" ) { (await TokenProcess()) ? fetchData() : navigate("/login"); } else { console.log(error); return false; } } }; fetchData(); } }, [boardSetData, postId]); const editBoard = async () => { navigate(`/board/${boardSetting.boardId}/post/${postId}/edit`); }; return ( <div className="BoardView"> <div className="upInfoArea"> <div type="text" name="boardTitle" className="titleDiv"> {post.postTitle} </div> <div type="text" name="regId" className="regIdDIv"> {formatDate(post.regDate)} </div> </div> <div className="contentArea"> <div className="contentsText">{post.postContent}</div> </div> <section> <div className="btnArea"> <MyButton text={"리스트이동"} onClick={() => Navigate(-1)} /> <MyButton text={"수정하기"} type="positive" onClick={editBoard} /> </div> </section> </div> ); }; export default BoardView; 리스트이동이라는 버튼을 누르면 바로 이동을 하는데브라우저에서 <- 뒤로가기 버튼을 누르면 갑자기 BoardView의 useEffect를 타는데 이유를 모르겠습니다 .어떻게 해야될까요. ..
-
해결됨모두의 깃 & 깃허브
당연하겠지만.. 윈도우 사용하면 맥은 모두 패스 해도 되지요?
혼자 공부하는 컴퓨터구조 + 운영체제, 모두의 깃 & 깃 허브 책 구입해놓고 영상이 좋아서 영상만 보고 있네요.
-
미해결Next + React Query로 SNS 서비스 만들기
dvw를 사용하는 경우와 vw를 사용하는 경우의 차이
안녕하세요 제로초님! 강의 즐겁게 듣고 있습니다. 깃허브의 코드를 보면 main.module.css에서 container를 잡을 때 width와 heigth로 dvw, dvh단위를 사용하시고다른 부분(login.module.css 와 signup.module.css)에서는 vw를 사용하시고 있어서요. dvw를 사용하시는 경우와 vw를 사용하시는 경우의 차이가 궁금합니다.
-
미해결따라하며 배우는 리액트, 파이어베이스 - 채팅 어플리케이션 만들기[2023.12 리뉴얼]
[리덕스 미들웨어]강의 중에 createStore에서 막혔습니다.
강사님과 같이 했는데 저는 이렇게 빨간 줄이 뜨면서 리액트앱을 실행시키면 이러한 오류가 뜹니다.ㅠㅠ왜이런걸까요..? 어떻게 해결해야 할까요?
-
미해결공공데이터로 파이썬 데이터 분석 시작하기
주피터 노트북 설치오류
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. Traceback (most recent call last):File "C:\Users\lyl89\anaconda3\Lib\site-packages\notebook\traittypes.py", line 235, in _resolve_classesklass = self._resolve_string(klass)^^^^^^^^^^^^^^^^^^^^^^^^^^^File "C:\Users\lyl89\AppData\Roaming\Python\Python311\site-packages\traitlets\traitlets.py", line 2018, in _resolve_stringreturn import_item(string)^^^^^^^^^^^^^^^^^^^File "C:\Users\lyl89\AppData\Roaming\Python\Python311\site-packages\traitlets\utils\importstring.py", line 31, in import_itemmodule = __import__(package, fromlist=[obj])^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ModuleNotFoundError: No module named 'jupyter_server.contents'During handling of the above exception, another exception occurred:Traceback (most recent call last):File "C:\Users\lyl89\anaconda3\Scripts\jupyter-notebook-script.py", line 10, in sys.exit(main())^^^^^^File "C:\Users\lyl89\AppData\Roaming\Python\Python311\site-packages\jupyter_core\application.py", line 280, in launch_instancesuper().launch_instance(argv=argv, **kwargs)File "C:\Users\lyl89\AppData\Roaming\Python\Python311\site-packages\traitlets\config\application.py", line 1051, in launch_instanceapp = cls.instance(**kwargs)^^^^^^^^^^^^^^^^^^^^^^File "C:\Users\lyl89\AppData\Roaming\Python\Python311\site-packages\traitlets\config\configurable.py", line 583, in instanceinst = cls(*args, **kwargs)^^^^^^^^^^^^^^^^^^^^File "C:\Users\lyl89\AppData\Roaming\Python\Python311\site-packages\traitlets\traitlets.py", line 1294, in __new__inst.setup_instance(*args, **kwargs)File "C:\Users\lyl89\AppData\Roaming\Python\Python311\site-packages\traitlets\traitlets.py", line 1337, in setup_instancesuper(HasTraits, self).setup_instance(*args, **kwargs)File "C:\Users\lyl89\AppData\Roaming\Python\Python311\site-packages\traitlets\traitlets.py", line 1313, in setup_instanceinit(self)File "C:\Users\lyl89\anaconda3\Lib\site-packages\notebook\traittypes.py", line 226, in instance_initself._resolve_classes()File "C:\Users\lyl89\anaconda3\Lib\site-packages\notebook\traittypes.py", line 238, in _resolve_classeswarn(f"{klass} is not importable. Is it installed?", ImportWarning)TypeError: warn() missing 1 required keyword-only argument: 'stacklevel' 이런 오류가 떠요ㅠㅠ 어떻게 해결할 수 있을까요?