강의에서 Typescript를 사용하고 있는데, 정작 타입은 제대로 안 잡고 넘어가는 경우가 많네요 수강생 타겟이 초보라고 되어 있지만, 타입 에러가 방치돼 있어서 따라가기가 더 어려운 느낌이에요 오히려 타입을 명확히 잡고 넘어갔으면 더 수월하게 진행됐을 것 같다는 생각이 드네요
안녕하세요 ! 섹션 6. 페이지 캐싱 강의를 듣고 루트(/) 페이지를 static page 로 만들어 보기 위한 실습 과정에서 app/layout.tsx 파일 내부의 모든 도서를 패칭하는 fetch 함수의 option에는 아무 옵션도 설정하지 않고 (Next15 버전 기본값은 no-store ), 루트 페이지 내부의 동일한 데이터 패칭만 cache 옵션( force-cache )을 추가하여 데이터가 캐싱되도록 설정했습니다. 이러한 과정 후 npm run build 를 통해 빌드 하니 루트 페이지가 정적 페이지(static page)로 빌드 되었습니다. 정적 페이지가 되기 위해서는 동적 함수를 사용하지 않아야 하며, 데이터를 반드시 캐싱해야 되는데 동일한 url 로 데이터 패칭을 보냈을 때 서로 다른 옵션 을 사용하게 되면 request memoization으로 캐싱된 데이터 force-cache 로 설정된 데이터)를 우선적으로 사용해서 정적 페이지로 동작하는 건가요? 1번 과정에서 궁금한 점이 발생하여 이번에는 layout.tsx 페이지의 데이터 패칭 옵션을 강제로 cache : "no-store" 를 추가하여 빌드 를 진행했더니 빌드 가 정상적으로 완료되지 않고 오류가 발생하여 빌드가 완료되지 않는 문제가 발생했습니다. 동일한 url로 데이터 패치를 보낼 때 기본 값을 사용한 패치와 옵션을 추가한 패치가 있다면 옵션을 추가한 패치를 우선적으로 사용하고, 서로 다른 옵션은 추가할 수 없는건가요? (기존 build 파일인 .next 폴더를 제거하고 빌드하니 빌드가 성공적으로 동작했으며, 루트 페이지가 Dynamic page로 빌드되었네요.. 기존 빌드된 .next 폴더가 있을 때 2번 상황 처럼 동일한 fetch url에 옵션만 다르게 설정하여 빌드하니 오류가 발생한 이유를 모르겠네요..ㅎㅎ) dynamic page 에서 dynamic params 에 generateStaticParams 함수를 통해 params 값을 미리 전달하여 페이지를 만드는 경우, return 값으로 전달하지 않은 params 의 페이지를 사전 렌더링 할 때 page router의 getStaticPaths의 fallback 옵션 blocking 처럼 동작하는 건가요? 테스트 과정에서 발생한 문제들을 이해하고 싶은데 이해가 가지 않아서 질문 드립니다 ! app/layout.tsx import "./globals.css"; import Link from "next/link"; import style from "./layout.module.css"; import { BookData } from "@/types"; async function Footer() { const response = await fetch( `${process.env.NEXT_PUBLIC_API_SERVER_URL}/book`, { cache: "no-store", } ); if (!response.ok) { return <footer>제작 @rekoding</footer>; } const books: BookData[] = await response.json(); return ( <footer> <div>제작 @rekoding</div> <div>총{books.length}권</div> </footer> ); } export default function RootLayout({ children, }: Readonly<{ children: React.ReactNode; }>) { return ( <html lang="en"> <body> <div className={style.container}> <header> <Link href={"/"}>📚 ONEBITE BOOKS</Link> </header> <main>{children}</main> <Footer /> </div> </body> </html> ); } (with-searchbar)/page.tsx import BookItem from "@/components/book-item"; import style from "./page.module.css"; import { BookData } from "@/types"; const AllBooks = async () => { try { const response = await fetch( `${process.env.NEXT_PUBLIC_API_SERVER_URL}/book`, { cache: "force-cache", } ); if (!response.ok) { throw new Error(); } const allBooks: BookData[] = await response.json(); return allBooks.map((book) => <BookItem key={book.id} {...book} />); } catch (error) { console.error(error); return <div>예상치 않은 문제가 발생했습니다.</div>; } }; const RandomBooks = async () => { try { const response = await fetch( `${process.env.NEXT_PUBLIC_API_SERVER_URL}/book/random`, { next: { revalidate: 3 }, } ); if (!response.ok) { throw new Error(); } const randomBooks: BookData[] = await response.json(); return randomBooks.map((book) => <BookItem key={book.id} {...book} />); } catch (error) { console.error(error); return <div>예상치 않은 문제가 발생했습니다.</div>; } }; export default async function Home() { return ( <div className={style.container}> <section> <h3>지금 추천하는 도서</h3> <RandomBooks /> </section> <section> <h3>등록된 모든 도서</h3> <AllBooks /> </section> </div> ); }
안녕하세요. 저는 현재 고농축 프론트엔드와 백엔드 강의를 모두 수강 중 인데요, 최근에 ‘완벽한 프론트엔드’ 강의가 새로 생긴 걸 알게 됐습니다. 이미 고농축 강의를 수강 중인데도, 완벽한 프론트엔드 강의도 수강하는 게 도움이 될까요? 그리고 ‘고농축 프론트엔드’와 ‘완벽한 프론트엔드’의 가장 큰 차이점 이 궁금합니다. 혹시 고농축 강의를 수강한 사람 입장에서 완벽한 프론트에서 꼭 들어야 하는 파트가 있다면 추천도 부탁드립니다! 그리고 혹시 ‘완벽한 프론트엔드’ 강의에 대해 쿠폰을 받을 수 있는지도 문의드립니다.
안녕하세요. 지금 Next.js강의중 글로벌 레이아웃강의를 듣고있는데 css를 자동완성해주는 styledcomponent가 적용이 안되서 문의드립니다. 구글링을 통해 vscode-styled component의 버전을 낮춰보기도하고 typescripts에 버전을 낮추니 next.js가 적용이 안되어서 다시 돌려놓긴했는데 여전히 적용이 안돼서 뭐가 문제인지 몰라서 질문드립니다. 혹시몰라 제가 설치한 모든 확장프로그램들을 보내드립니다.
vercel 배포중 문제가 발생합니다 빌드중에는 아무런 문제가 없는데 해당이미지 처럼 빌드에서 문제가 생긴다고 합니다 빌드 로그 부분인데 해당부분을 오른쪽 부분처럼 promise로 바꿔도 보고 왼쪽처럼 사용을해봐도 똑같아서 그러는데 제가혹시 다른부분을 고치고 있는건지 어떻게 고쳐야할지 궁금해서 문의해봅니다
안녕하세요! 회원가입 시 서버 액션을 작성 중인데 궁금한 점이 있어 질문드립니다. 현재 서버 액션 함수는 아래와 같이 작성하였고, 클라이언트에서는 useActionState를 사용하여 액션의 반환 값을 받아 에러 메세지를 처리하고 있습니다. if (!id || !nickname || !password) { return { status: false, messages: "정보를 입력해주세요." } } try { const response = await fetch(`${baseUrl}/api/users`, { method: "POST", body: formData, }) return { status: true, messages: "" } } catch (err) { return { status: false, messages: "회원가입에 실패했습니다." } } // redirect("/home")을 여기에 위치 했었음 } 회원가입 성공 시에는 /home 으로 이동시키고 싶어서 redirect를 사용하려고 하는데, redirect는 return문 때문에 실행되지 않는 문제가 있습니다. 이런 상황에서는 다음 중 어떤 게 더 적절한 방법인지 궁금합니다..! 1) 서버 액션에서 회원가입 성공 시 return { status: true, messages: "" } 형태로 값을 반환하고, 클라이언트에서 성공 여부를 판단해 라우팅을 처리하는 방식 2) 서버 액션 내부에 let isSignupSuccess = false 같은 변수를 선언한 뒤, 회원가입 성공하면 return문 없이 isSignupSuccess = true 로 값을 변경하고, try-catch문 이후에 if (isSignupSuccess) redirect("/home") 형태로 라우팅을 처리하는 방식
안녕하세요. 우선 매번 좋은 강의 감사드립니다! 다름이 아니라, 이 강의 전 버전에서 html,css,js를 수강하여 이번 버전에선 섹션3. [중급] 웹 프론트엔드 부트캠프 부터 수강중입니다! 수업노트에 있는 노션에 들어가보니 [과제] 탭이 따로 있더라구요! 과제01이 섹션01이랑 같은 부분이라서 섹션01을 수강 후 과제01을 해보는 식으로 진행하면 되는건가요? 섹션12까지 수강하였는데 강의중에는 따로 말씀이 없으셔서 그냥 강의만 듣고 자체적으로 복습만 했습니다. 저게 아니라면 과제는 언제부터 시작하는건지 알 수 있을까요?
안녕하세용 이번에 revalidatePath로 서버단에서 데이터를 변경하고 리랜더링 까지 하는 작업을 보고 궁금한게 하나 생겼습니다. 기존 csr 방식처럼 상태값이 변경될시에 리랜더링이 발생하는 방식 말고 이렇게 서버액션을 통해 데이터를 받고 재랜더링을 하는 이유가 완전히 서버 컴포넌트들로만 작동하게 되어 SSG로 구현이 가능하기 때문인건가요? 머릿속이 지금 복잡해서 그냥 useEffect랑 state를 쓰고싶다는 욕망이 크게 느껴지고 있는데 왜 이걸 사용해야 하는지에 대해 조금 명쾌한 해답을 듣고 싶습니다!
이번 장에서 서버액션에 관한 내용을 들었는데 유지보수 측면에서 이 기술이 좋은 방법일까 하는 의문이 들었습니다! 아래는 이런 경우가 생기지 않을까 해서 적어둔 내용입니다. 서버액션으로 프론트에서 "a를 오른쪽으로 옮겨주세요" 라는 api를 백엔드에 만들었습니다. 그런데 기존의 백엔드 api에선 a는 왼쪽으로 옮기는 스크립트를 만들어놨는데 서버액션으로 인해 백엔드 서버엔 예정에 없던 동작이 발생했습니다. 그러다 나중에 a를 오른쪽으로 옮긴것에 대해 문제가 발생해서 백엔드 코드를 하루 꼬박 세면서 뒤져봤는데 오류를 못 찾았습니다 그런데 알고보니 프론트에서 서버액션으로 보내는 a를 오른쪽으로 옮겨라는 코드 때문에 발생한 문제였습니다. 이런 상황이 실무에서 발생할거 같다는 생각이 들어서 이 서버액션 기능을 실제로도 많이 사용하는지 궁금합니다!!