글 수정기능을 추가하고 useReducer로 바꿔서 했는데 글을 추가해도 새로운 내용이 나타나지 않고, 마지막 요소가 다시 추가되었습니다. [{content:"To1"}, {content:"To1"}] 확인해보니 컴포넌트에서 받은 props를 useState초기화값으로 넣으면 바뀌지 않는 사실을 알게되었습니다. 하지만 이부분을 useEffect형식으로 바꿔 적어주니 새로운 내용으로 바뀌는 것을 확인했습니다. // props content를 useState 초기화값으로 적용 const TodoItem = ({ content, id, isDone, date, onUpdate, onDelete }) => { const [upContent, setUpcontent] = useState(content); ... } //////////////////////////////////////////// // useEffect 적용 const TodoItem = ({ content, id, isDone, date, onUpdate, onDelete }) => { const [upContent, setUpcontent] = useState(""); useEffect(() => { if (content) { setUpcontent(content); } }, [content]); ... } useReducer를 적용하지 않을때 props를 useState초기화값을 넣어도 잘 구동되었습니다. // props content를 useState 초기화값으로 적용 const TodoItem = ({ content, id, isDone, date, onUpdate, onDelete }) => { const [upContent, setUpcontent] = useState(content); ... } 이것이 리액트 라이프 사이클 때문에 이러한 현상이 발생한것인가요?
학습 중에 fastapi는 get과 post만 지원하기 때문에 별도로 미들웨어를 이용해 put, patch, delete를 구현해야 한다고 이해를 하게 되었습니다. 헌데 다른 학습 웹 문서나, gpt에게 여러 요청을 통해 확인을 하는 과정에서 app. 혹은 @router. 을 사용해 이미 지원되는 put, patch, delete를 사용할 수 있다고 설명을 하는 것을 확인할 수 있었습니다. 제가 학습 영상에 대해 이해를 잘못하고 있는 것인지 혹 놓친게 있는지 알고 싶어 질문을 드립니다.
일코 강사님께서 일전에 "끼워넣기를 통해 아래아한글의 여러파일을 병합하는 코드"를 짜주셨는데요. 해당 코드가 작동은 하지만, 일부 기능은 원하는 대로 되지 않는 부분이 있어서 개선방법을 문의 드립니다. 현재의 파이썬 코드는 아래와 같습니다. from pyhwpx import Hwp # 임포트 hwp = Hwp() # 한/글 실행 import os # 작업할 디렉토리를 명시적으로 설정 (예: "C:/Users/Username/Documents") target_dir = "D:\magicfolder" # 작업 디렉토리로 변경 os.chdir(target_dir) # 끼워넣기 file_list = [i for i in os.listdir() if i.endswith(".hwp")] hwp.open(file_list[0]) # 첫 번째(0) 파일 열기 for i in file_list[1:]: # 첫 번째(0) 파일은 제외하고 두 번째(1)파일부터 아래 들여쓰기한 코드 반복 hwp.MoveDocEnd() # 한/글의 문서 끝으로 이동해서 hwp.BreakPage() # <----------------------- 페이지나누기(Ctrl-Enter) hwp.insert_file(i) # 문서끼워넣기(기본값은 섹션, 글자, 문단, 스타일 모두 유지??) hwp.save_as("취합본.hwp") # 반복이 끝났으면 "취합본.hwp"로 다른이름으로저장 hwp.Quit() # 한/글 프로그램 종료 "D:\magicfolder"에 n개의 파일을 넣어두고 위 코드를 실행하면, 첫 번째(0) 파일을 먼저 열고, 문서 끼워 넣기(ctrl+o)를 이용해 두 번째(1), 세 번째(2), ... n번째(n-1) 파일을 차례로 끼워넣기 합니다. 문서 끼워 넣기(ctrl+o) 팝업에서 아래아한글에서 체크할 수 있는 옵션은 아래의 4개 입니다. 제가 의도하는 것은 문서 끼워 넣기(ctrl+o) 시 매번 위 4개 항목(글자 모양 유지, 스타일 유지, 문단 모양 유지, 쪽 모양 유지)에 체크된 상태로 끼워넣는 것입니다. 여기서, 원하는 것은 끼워 넣는 다양한 파일들이 구역설정이나 스타일이 다를 때 각각의 원본을 그래로 유지한 채 병합하는 것입니다. 현재 코드에 일코님께서 메모해 주시기로는 hwp.insert_file(i) # 문서끼워넣기(기본값은 섹션, 글자, 문단, 스타일 모두 유지) 라고 하셨으나, 실제 코드를 실행한 결과는 첫 번째(0) 파일의 편집 용지(F7) 상 구역설정 1가지만 취합본에 적용된 것이 확인됩니다. 이게 불편한 이유는, 예를 들면 첫 번째(0) 파일, 두 번째(0) 파일, ..., n번째(n-1) 파일의 구역설정(상하좌우 용지여백 등)이 다를 때 첫 번째(0) 파일의 구역설정 1가지에 맞추어서 취합되면, 작성내용이 다 틀어지기 때문입니다. hwp.insert_file( ) 이라는 기능을 아래아한글 API문서에서 찾기 시도했으나 발견하지 못했습니다. hwp.insert_file( )이라는 기능은 일코님이 제작하신 pyhwpx 패키지에만 포함된 기능일까요? 코드를 실행해 문서 끼워 넣기(ctrl+o) 시, 글자 모양 유지, 스타일 유지, 문단 모양 유지, 쪽 모양 유지를 강제로 체크하도록 하는 방법이 있을까요? 도움 부탁드립니다. 감사합니다.
주기적으로 업데이트한다고 강의 소개에 크게 적어놓으셨는데, 왜 2023년 초 이후로 업데이트가 없나요? 그리고 새로운 버전 강의가 나왔던데, 이전 버전 수강자들에게는 무료로 제공되나요? 이 강의가 저렴한 것도 아니고 몇십만 원이나 하는데, 그 정도 보상은 해주셔야 한다고 생각합니다.
안녕하세요 현재 useReducer를 이용하여 투두리스트 업그레이드 부분중에 몇가지 질문이 있습니다. useReducer에 대해서 어느정도 이해는 했지만 dispatch는 어느 부분에 작성을 해야되는지 조금 헷갈리는데 이 강의에서는 onCreate 함수안에 dispatch를 작성했는데 이 함수에 dispatch를 사용한 이유가 조금 헷갈립니다. 그리고 useRudcer는 비슷한 기능을 하는 함수들을(업데이트, 삭제) 좀 더 간단하게 만들기 위해 사용한다라고 이해하고 있으면 되는지도 궁금합니다. 마지막으로 리덕스와 조금 비슷한것같은데 useReducer와 리덕스는 완전 다른 개념인건가요?
배포했는데 화면에 아무것도 안 뜨고 콘솔창에 아래와 같은 오류가 뜹니다. ▶ ReferenceError: require is not defined 검색해보니 vite가 require를 지원하지 않아서 라는데, 해결방법이 있을까요? (+) 구글링 했더니 package.json에 아래 코드를 추가하면 된다는데, 이 방법도 아닌 것 같아요. "type": "commonjs",
안녕하세요. 날짜 뒤에 요일 붙이기 코드가 작동이 되지 않아서 문의 드립니다. 제가 손코딩 한게 뭔가 오류가 있나 싶어서 강의에 있는 코드를 복붙해서 실행해봐도 아무런 변화가 없네요. 한글 파일은 자료다운에서 받은 실작업공정표를 사용했고 한글 2022, 한글 2024 두가지 버전 모두 아무런 변화가 없습니다ㅠㅠ import os import datetime as dt import win32com.client as win32 def init_hwp(): hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject") hwp.XHwpWindows.Item(0).Visible = True hwp.RegisterModule("FilePathCheckDLL", "FileCheckerModule") return hwp hwp = init_hwp() hwp.Open(os.path.join(os.getcwd(),r"C:\Users\cctom\Desktop\python\hwp2python\실작업공정표.hwpx")) # date().weekday() : 월화수목금토일 # 0 1 2 3 4 5 6 def get_value(): hwp.InitScan(Range=0xff) # 추출범위를 "선택영역"으로 지정 text = hwp.GetText()[1] # 선택범위 문자열값 추출 hwp.ReleaseScan() # 검색종료 return text # 추출값 리턴 def get_weekday(text): week_list = ["월", "화", "수", "목", "금", "토", "일"] month, day = [int(i) for i in text.split(".")[:2]] week_num = dt.date(2022, month, day).weekday() week_day = week_list[week_num] return f"({week_day})" def insert_text(text): act = hwp.CreateAction("InsertText") pset = act.CreateSet() pset.SetItem("Text", text) act.Execute(pset) if __name__ == '__main__': hwp.FindCtrl() # 표 선택 hwp.Run("ShapeObjTableSelCell") # 첫 번째 셀로 진입(셀선택상태) while True: # 무한반복 text = get_value() # 셀의 텍스트 추출 if text.endswith("."): # 셀 안의 텍스트가 "."으로 끝나면(날짜셀을 구분하는 임의의 방법) weekday = get_weekday(text) # 요일 파악 hwp.Run("Cancel") # 셀선택 취소 hwp.Run("MoveLineEnd") # 문자열 끝으로 이동 insert_text(weekday) # 요일 삽입 hwp.Run("TableCellBlock") # 다시 셀선택 if not hwp.HAction.Run("TableRightCell"): # 우측으로 이동하다 break # 끝에 도달하면 while문 종료
안녕하세요 이번 9회차 실기 시험을 봤는데.. 합격을 하지 못했습니다ㅜㅜ 내년 상반기에 10회 실기 시험을 다시 응시하려고하는데.. 강의가 4월2일에 만료라서.. 혹시나 3개월정도 일시정지 가능할까요? 내년 시험기간쯔음에 다시 공부해서 꼭합격 하고 싶어요ㅜㅜㅜㅜ 다른 문의글 보니 메일주소를 남겨달라는 답변을 모아서 남깁니다 메일주소는 topk49@naver.com 입니다ㅜㅜ
안녕하세요 어제에 이어 강의 내용을 따라 가고 있는데요. 강의 내용대로 PostModelViewSet을 선언하고 (영상기준 8분30초까지 진행) pytest를 실행앴더니 test_unauthenticated_user_cannot_create_post 에서 assert 403 == 400 test_non_author_cannot_update_post 에서 assert 403 == 200 test_nonauthor_cannot_delete_post 에서 assert 403 == 204 오류가 각기 발생합니다. 강의를 따라가고 있는데 이런식으로만 오류가 발생하니 원인이 어디인지 찾기가 너무 힘든거 같습니다. 원인이 뭐고 이런 오류를 잡으려면 어떻게 해야할까요?
안녕하세요! 제가 강의를 모두 수강하고 프로젝트에서 리액트 쿼리를 통해 SSR을 적용하려고 하고 있습니다. 아래 코드는 fetchAPISever 함수를 통해 백엔드 api로부터 데이터를 요청하는 함수입니다. 이때 fetchAPIsever 함수는 next/header 의 cookies() 를 통해 사용자의 토큰이 있으면 토큰을 넣어서 api를 요청하는 함수입니다. export const getBestAndPendingReviews = async (): Promise<ReviewePageResponse> => { const res = await fetchAPIServer('/api/review', 'GET'); if (res.code === 'SUCCESS') { return res.result; } throw new Error( `리뷰 페이지 데이터 불러오기 실패 ${res.code}-${res.message}`, ); }; 아래 코드는 리뷰 페이지에서 서버 사이드 렌더링으로 보여주기 위해 리액트 쿼리로 Hydration을 적용한 코드입니다. // src\app\reviews\page.tsx import { HydrationBoundary, QueryClient, dehydrate, } from '@tanstack/react-query'; import ReviewDashboard from './_components/ReviewDashboard'; import { getBestAndPendingReviews } from './_lib/getBestAndPendingReviews'; export default async function ReviewsPage() { const queryClient = new QueryClient(); await queryClient.prefetchQuery({ queryKey: ['reviews', 'best'], queryFn: getBestAndPendingReviews, }); const dehydrateState = dehydrate(queryClient); return ( <HydrationBoundary state={dehydrateState}> <ReviewDashboard /> </HydrationBoundary> ); } ' <ReviewDashboard/> 컴포넌트에서 UserInfo 컴포넌트를 반환하도록 설정하고 useQuery 훅을 사용하려 했으나, fetchAPIServer 함수에서 next/headers 를 import하고 있어서 클라이언트 컴포넌트에서 사용할 수 없다는 에러가 발생했습니다. 그러면 SSR을 적용하기 위해서는 getQueryData 를 사용해야하는 걸까요..? import { QueryClient } from '@tanstack/react-query'; import { ReviewePageResponse } from '../_lib/getBestAndPendingReviews'; export default function UserInfo() { const queryClient = new QueryClient(); const reviews = queryClient.getQueryData<ReviewePageResponse>([ 'reviews', 'best', ]); const { total } = reviews!; if (!reviews) return <p>리뷰가 없습니다.</p>; console.log('reviews', reviews); return <p>작성한 리뷰 {total || 0}</p>; } 또는 useQuery를 쓰되 쿼리 함수를 Promise.Resolve()로 서버에서 전달 받은 데이터를 받는게 나은가 요? 'use client'; import { useQuery } from '@tanstack/react-query'; export default function UserInfo() { const { data: reviews, isLoading } = useQuery({ queryKey: ['reviews', 'best'], queryFn: () => Promise.resolve(), // 서버 데이터 재활용 }); if (isLoading) return <p>Loading...</p>; if (!reviews) return <p>리뷰가 없습니다.</p>; const { total } = reviews!; console.log('reviews', reviews); return <p>작성한 리뷰 {total || 0}</p>; }