묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨한 입 크기로 잘라먹는 Next.js(v15)
on-Demand-ISR 사용질문드립니다!
안녕하세요! on demand isr 의 실제 사용 관련해서 질문 드려요!const revalidate = async () => { try { const response = await fetch("/api/revalidate"); const result = await response.json(); if (result.revalidate) { //페이지 갱신이 됐을 때 } else { //페이지 경신 안됐을 때 } } catch (error) { //에러처리 } };특정 조건에 따라 on demand isr을 제대로 사용하려면 이런식으로 저희가 만든 api를 호출하는 비동기 함수를 만들어서 특정 조건문 아래에서 이 새로만든 함수를 호출하면 되는걸까요?? 감사합니다!
-
해결됨아바타 커뮤니티앱 만들기 (React Native Expo)
[5-1] 글작성 후 저장이 되지 않습니다.
❗질문 작성시 꼭 참고해주세요현재 문제(또는 에러)와 코드(또는 github)를 첨부해주세요. 맥/윈도우, 안드로이드/iOS, Expo, Node 버전 등의 개발환경을 함께 적어주시면 도움이 됩니다. 에러메세지는 일부분이 아닌 전체 상황을 올려주세요. (일부만 자르거나 복사하지말아주세요.) 개발환경/코드에 대한 정보가 없을경우 답변이 어렵습니다.윈도우에서 개발중이고 백엔드 서버 잘셋팅 되어 있습니다(로그인 부분은 잘 넘어갔습니다)다만 글 저장이 안되어서 도저히 봐도 모르겠어서 올려주신 소스 그대로 다운 받아 다시 설치 후 해봐도 저장이 되지 않습니다. 콘솔에 오류도 안뜨고 디버깅 이것저것 해봐도 도통 모르겠습니다 (소스 받아서 해도 안되서요 ㅠㅠ) 다만 axios.ts에서 안드로이드 저 주소가 되지 않아제 로컬 아이피 주소를 했더니 로그인 부분이 잘 넘어갔습니다. 이 주소는 그대로 해도 그냥 제 로컬 아이피 주소를 해도 어찌되었던 저장은 되지 않습니다. 여기서 진도가 나가지 않아 답답하네요 ㅠㅠexport const baseUrls = { android: "http://10.0.2.2:3030", ios: "http://localhost:3030", };
-
해결됨한 입 크기로 잘라먹는 Next.js(v15)
useEffect 경고
안녕하세요! 섹션3 2.14)SSG2.정적 경로에 적용하기 강의 17분23초에서 useEffect 의존성 배열 관련해서 React Hook useEffect has a missing dependency: 'fetchSearchResult' 라고 이 함수를 의존성 배열에서 빠트렸다고 경고가 저도 나왔는데 여기서 함수를 의존성 배열에 꼭 넣어야 하는건가요?? 감사합니다!
-
미해결한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
12.16 Viewer.css background-color 질문
css를 적용하였는데도 감정 이미지의 background가 적용이 되지 않는데 잘못된 것이 있을까요??.Viewer > section{ width:100%; margin-bottom: 100px; display: flex; flex-direction: column; align-items: center; text-align: center; } .Viewer > section > h4{ font-size:22px; font-weight: bold; } .Viewer .emotion_img_wrapper{ width:250px; height:250px; border-radius: 5px; display:flex; flex-direction: column; align-items: center; justify-content: space-around; color: white; font-size: 25px; } .Viewer .emotion_img_wrapper_1{ background-color: rgb(100,201,100); } .Viewer .emotion_img_wrapper_2{ background-color: rgb(157,215,114); } .Viewer .emotion_img_wrapper_3{ background-color: rgb(253,206,23); } .Viewer .emotion_img_wrapper_4{ background-color: rgb(253,132,70); } .Viewer .emotion_img_wrapper_5{ background-color: rgb(253,86,95); }
-
미해결처음 만난 리액트(React)
상태가 업데이트될때 컴포넌트 최상단의 console.log 코드가 두번 실행되는 이유가 궁금합니다.
import React, { useEffect, useState } from "react"; import useCounter from "./useCounter"; const MAX_CAPACITY = 10; export default function Accommodate() { const [isFull, setIsFull] = useState(false); const [count, increaseCount, decreaseCount] = useCounter(0); console.log(count,"rendor Accommodate", new Date().getMilliseconds()) useEffect(() => { console.log("===================="); console.log("useEffect() is called."); console.log("isFull:", isFull); }); useEffect(() => { setIsFull(count >= MAX_CAPACITY); console.log("Current count value:", count); }, [count]) return <> <button onClick={increaseCount}>입장</button> <button onClick={decreaseCount}>퇴장</button> {isFull && <p>정원이 가득 찼습니다.</p>} </>; }안녕하세요! 실습 진행 중에 이해가 안되는 부분이 있어 질문드립니다!우선 컴포넌트 내부에 포함된 state가 변경될때 컴포넌트가 재렌더링 되는게 맞을까요?그게 맞다면, 다음과 같은 순서로 실행된다고 생각했는데요.입장 버튼 클릭increaseCount가 실행되면서 count 상태가 변경됨Accommodate 컴포넌트가 재렌더링첫번째 useEffect함수가 실행두번째 useEffect함수가 실행 그리고 위 순서에 따라 console에는 다음과 같이 출력될 것이라고 예상했는데, 실제로는 캡쳐화면처럼 출력되더라구요.어떤 이유로 컴포넌트 최상단에 있는 console.log(count,"rendor Accommodate", new Date().getMilliseconds()) 코드가 두번 실행되는 건지 이해가 안됩니다.ㅠ제가 놓치고 있는 부분이 많은 것 같은데 어디서 부터 놓친건지 잘 정리가 되지 않네요!ㅠㅠ0 'rendor Accommodate' 991 ==================== useEffect() is called. isFull: false Current count value: 0 1 'rendor Accommodate' 430 ==================== useEffect() is called. isFull: false Current count value: 1
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
완벽한 프론트엔드
고농축 프론트엔드 강의와 완벽한 프론트엔드 강의 커리큘럼이 차이가 많이 날까요?추가된 강의 공지는 읽어봤는데 기존의 기본적인 리액트 내용에서 업데이트가 많이 되었다던가 등 차이가 많이 나는지 궁금합니다.
-
미해결비전공자를 위한 진짜 입문 올인원 개발 부트캠프
그랩마켓 웹화면 구현하기 -2 질문입니다.
header 에서는 header-area를 따로 만들어서 이미지를 관리를 하였는데body에서 배너는 배너-area를 따로 안만들고 바로 banner에 이미지를 넣어서 관리하는 이유가 따로 있나여?? 무슨차이인가요
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
refreshToken 저장의 문제
아래에 질문이 있으나 해결안이 없어 다시 문의드립니다.refreshToken, 쿠키는 정상적으로 전달되고 있습니다.setCookie도 나옵니다. 그러나, Application에 나타나지 않습니다.그리고 조금 기다렸다가 acessToken을 재발급하려고 클릭하면 아래와 같은 메시지가 나타납니다. 크롬에서 써드파티 쿠키를 다 accept하도록 설정이 되어있고, 시크릿 모드에서도 진행해봤고 사파리에서도 동일합니다. 클릭하여 나타난 통신기록을 총 3번입니다.첫번째 통신은 accessToken만료로 발생한 것으로 보입니다.네트워크 통신기록을 살펴보면 UNAUTHENTICATED가 발생된 것을 알수 있습니다. 두번째 통신은 restoreAccessToken의 뮤테이션입니다. 헤더와 페이로드는 아래와 같습니다. jwt가 첨부되지 않았다는 부분입니다. 3번째 통신의 Header와 payload, response입니다. 이 부분은 주어진 조건으로 사용자 정보를 불러오는 query같습니다. 사용자에 관련된 정보가 없이 시도되어 _id null이 표시된것 같습니다.인터넷에 검색해보았지만 잘 모르겠습니다. axios통신으로 refreshToken을 직접 저장해주는 코드를 보긴 했는데, graphql은 설정만 바꾼다고 하셔서 refreshToken을 어떻게 처리하는지 잘 모르겠습니다.관련해서 검색을 통해 https로 환경을 바꾸면 될거다 하여, localhost:3000을 mkcert로 https로 환경을 바꾸려고 해봤는데 설치만 하고 아래의 글을 발견해서 잠깐 멈추었습니다. https://shingy.tistory.com/46 _id null의 문제가 local에 받아온 쿠키를 저장하지 못하는 문제인것 같은데, 어떻게 처리할수있는 방법이 있나 싶어서 여쭤봅니다. 코드 getAccessToken의 코드 import { GraphQLClient, gql } from "graphql-request"; import { IMutation } from "../../../commons/types/generated/types"; const RESTORE_ACCESS_TOKEN = gql` mutation { restoreAccessToken { accessToken } } `; export const getAccessToken = async (): Promise<string | undefined> => { try { const graphQLClient = new GraphQLClient( "https://backend-practice.codebootcamp.co.kr/graphql", { credentials: "include" }, ); const result = await graphQLClient.request<Pick<IMutation, "restoreAccessToken">>( RESTORE_ACCESS_TOKEN, ); const newAccessToken = result.restoreAccessToken.accessToken; return newAccessToken; } catch (error) { if (error instanceof Error) console.log(error); } }; 아폴로 클라이언트 코드 import { ApolloClient, InMemoryCache, ApolloProvider, ApolloLink, fromPromise, } from "@apollo/client"; import { createUploadLink } from "apollo-upload-client"; import { useRecoilState } from "recoil"; import { accessTokenState } from "../../../commons/store"; import { useEffect } from "react"; import { ErrorResponse, onError } from "@apollo/client/link/error"; import { getAccessToken } from "../libraries/getAccessToken"; const GLOBAL_STATE = new InMemoryCache(); interface IApolloSettingProps { children: JSX.Element; } export default function ApolloSetting(props: IApolloSettingProps) { const [accessToken, setAccessToken] = useRecoilState(accessTokenState); useEffect(() => { const result = localStorage.getItem("accessToken"); console.log(result); console.log("현재는 브라우저입니다"); setAccessToken(result ?? ""); }, []); const errorLink = onError(({ graphQLErrors, operation, forward }) => { //1-1.에러캐치 if (typeof graphQLErrors !== "undefined") { for (const err of graphQLErrors) { //1-2.토큰 만료에러인지 체크 if (err.extensions?.code === "UNAUTHENTICATED") { return fromPromise( getAccessToken() .then((newAccessToken) => { setAccessToken(newAccessToken ?? ""); operation.setContext({ headers: { ...operation.getContext().headers, Authorization: `Bearer ${newAccessToken}`, }, }); }) .catch((err) => { console.log("오류입니다"); }), ).flatMap(() => forward(operation)); } } } }); const uploadLink = createUploadLink({ uri: "https://backend-practice.codebootcamp.co.kr/graphql", headers: { Authorization: `Bearer ${accessToken}`, credentials: "include", }, }); const client = new ApolloClient({ link: ApolloLink.from([errorLink, uploadLink]), uri: "http://backend-practice.codebootcamp.co.kr/graphql", cache: GLOBAL_STATE, }); return <ApolloProvider client={client}>{props.children}</ApolloProvider>; }로그인 success의 코드import { gql, useApolloClient, useQuery } from "@apollo/client"; import type { IQuery } from "../../../src/commons/types/generated/types"; import { wrapAsync } from "../../../src/components/commons/libraries/asyncFunt"; const FETCH_USER_LOGGED_IN = gql` query fetchUserLoggedIn { fetchUserLoggedIn { email name } } `; export default function LoginPage() { const client = useApolloClient(); const onClickButton = async (): Promise<void> => { const result = await client.query({ query: FETCH_USER_LOGGED_IN, }); console.log(result); }; return ( <> {/* <div>{data?.fetchUserLoggedIn.name}님, 환영합니다.</div> */} <div>환영</div> <button onClick={wrapAsync(onClickButton)}>클릭하세요</button> </> ); }
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
5.4) Props로 데이터 전달하기 Button 추가 시 서버가 응답을 하지 않습니다.
commponents 폴더 하위에 Button.jsx 파일을 만들고 const Button = () => { return <Button>Click</Button>; }; export default Button; 이렇게 입력한 후에 App.jsx에서 import "./App.css"; import Header from "./commponents/Header.jsx"; import Footer from "./commponents/Footer.jsx"; import Main from "./commponents/Main.jsx"; import Button from "./commponents/Button.jsx"; function App() { return ( <> <Button /> <Button /> <Button /> </> ); } export default App; 이렇게 입력하고 새로고침을 하면 계속 이렇게 나오는데 왜 그런걸까요. 🚨 아래의 가이드라인을 꼭 읽고 질문을 올려주시기 바랍니다 🚨질문 하시기 전에 꼭 확인해주세요- 질문 전 구글에 먼저 검색해보세요 (답변을 기다리는 시간을 아낄 수 있습니다)- 코드에 오타가 없는지 면밀히 체크해보세요 (Date와 Data를 많이 헷갈리십니다)- 이전에 올린 질문에 달린 답변들에 꼭 반응해주세요 (질문에 대한 답변만 받으시고 쌩 가시면 속상해요 😢)질문 하실때 꼭 확인하세요- 제목만 보고도 무슨 문제가 있는지 대충 알 수 있도록 자세한 제목을 정해주세요 (단순 단어 X)- 질문의 배경정보를 제공해주세요 (이 문제가 언제 어떻게 발생했고 어디까지 시도해보셨는지)- 문제를 재현하도록 코드샌드박스나 깃허브 링크로 전달해주세요 (프로젝트 코드에서 문제가 발생할 경우)- 답변이 달렸다면 꼭 확인하고 반응을 남겨주세요- 강의의 몇 분 몇 초 관련 질문인지 알려주세요!- 서로 예의를 지키며 존중하는 문화를 만들어가요. - 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
해결됨한 입 크기로 잘라먹는 Next.js(v15)
자동으로 import 되는 패키지 관련 문의
안녕하세요 덕분에 좋은 강의 잘 듣고 있습니다!next.js 강의의 2.9 의 14분 가량 보면 <Link> 태그 입력하면 자동으로 import 문이 작성되는데 어떤 패키지를 쓰시는건지 물어봐도 될까요?
-
해결됨한 입 크기로 잘라먹는 Next.js(v15)
[해결완료] 실습용 백엔드 서버 연결 오류
혹시나 아래와 같은 오류가 발생하시는 분들중에 비밀번호도 다 알맞게 설정했는데 오류가 발생하신다면 supabase에 새로운 project를 생성하여 시도해보시는 것도 좋을 것 같아요! 계속 안 되다가 새로 만들어서 시도했더니 되네요...ㅠㅠ며칠동안 해결하려고 노력했다가 log보고 그냥 다시 만들어볼까해서 시도해봤는데 해결했습니다..ㅎ다른 분들이 올려주신 오류와 유사하게 supabase와 연결하는 과정에서 오류가 발생합니다. supabase database log를 확인하였을 때에 error는 확인되지 않고, 비밀번호를 수정해봐도 오류가 바뀌지 않습니다. 비밀번호가 틀릴 경우에도 log에 error는 확인되지 않는걸까요?
-
해결됨[코드캠프] 부트캠프에서 만든 '완벽한' 프론트엔드 코스
피그마 링크는 어디 있을까요?!
피그마 링크를 못찾겠어요ㅠ 이미지 다운 받아야 하는데 어디서 볼 수 있을까요?
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
컴포넌트 외부에 선언한 함수에 대하여 질문드립니다.
안녕하세요 강의 재밌게 잘 듣고 있습니다~ 수업 내용 중 getMonthlyData은 Home 컴포넌트 외부에, getSortedData는 DiaryList 컴포넌트 내부에 작성하셨는데요.이전 강의 내용에 따르면 getMonthlyData를 컴포넌트 외부에 작성하신 이유는 Home 컴포넌트가 재렌더링 될 때 다시 선언할 필요가 없어서가 맞나요??그렇다면 비슷한 이유로 getSortedData도 컴포넌트 외부에 작성 가능할 것 같은데 안쪽에 작성하신 이유가 궁금합니다. props를 받아서 계산하고 있긴 하지만 인자값으로 넘겨주면 될 것 같아서요감사합니다.
-
미해결아바타 커뮤니티앱 만들기 (React Native Expo)
[5-4]글 수정/삭제 기능 구현하기(2) - API연동 부분에서 수정하기 누르면 제목과 내용이 비어있는데요,,, 한번 더 수정하기 눌러야 이전 제목과, 내용이 나옵니다...
import CustomButton from "@/components/CustomButton"; import DescriptionInput from "@/components/DescriptionInput"; import TitleInput from "@/components/TitleInput"; import { ImageUri } from "@/types"; import { router, useLocalSearchParams, useNavigation } from "expo-router"; import { useEffect } from "react"; import { FormProvider, useForm } from "react-hook-form"; import { StyleSheet,View } from "react-native"; import { KeyboardAwareScrollView } from "react-native-keyboard-aware-scroll-view"; import useGetPost from "@/hooks/queries/useGetPost"; import useUpdatePost from "@/hooks/queries/useUpdatePost"; type FormValues= { title:string; description: string; imageUris:ImageUri[]; }; export default function PostUpdateScreen () { const {id} = useLocalSearchParams(); const navigation = useNavigation(); const {data:post} = useGetPost(Number(id)); const updatePost = useUpdatePost(); const postForm = useForm<FormValues>({ defaultValues:{ title:post?.title, description:post?.description, imageUris:post?.imageUris, }, }); const onSubmit = (formValues: FormValues)=> { updatePost.mutate({ id: Number(id), body: formValues, },{ onSuccess:() => router.back(), } ); }; useEffect(()=>{ navigation.setOptions({ headerRight:() => ( <CustomButton label="저장" size="medium" variant="standard" onPress={postForm.handleSubmit(onSubmit)} /> ), }); },[]); return( <FormProvider {...postForm}> <KeyboardAwareScrollView contentContainerStyle={styles.container}> <TitleInput /> <DescriptionInput /> </KeyboardAwareScrollView> </FormProvider> ); } const styles = StyleSheet.create({ container:{ margin:16, gap:16, }, });
-
해결됨React, Node.js, MongoDB로 만드는 나만의 회사 웹사이트: 완벽 가이드
req.cookies.token == undefined 현상
logout을 해보니 400BadRequest:이미 로그아웃 됨 상태가 지속됩니다. console.log(req.cookies.token); 출력해보니 undefined 라고 출력됩니다. 쿠키를 제대로 읽지 못하는것 같은데 왜 이런 현상이 뜨는지 궁금합니다.. const express = require("express"); const router = express.Router(); const bcrypt = require("bcrypt"); const User = require("../models/User"); const axios = require("axios"); const jwt = require("jsonwebtoken"); router.post("/signup", async (req, res) => { try { const { username, password } = req.body; const existingUser = await User.findOne({ username }); if (existingUser) { return res.status(400).json({ message: "이미 존재하는 사용자입니다." }); } const hashedPassword = await bcrypt.hash(password, 10); const user = new User({ username, password: hashedPassword, }); await user.save(); res.status(201).json({ message: "회원가입이 완료되었습니다." }); } catch (error) { res.status(500).json({ message: "서버 오류가 발생했습니다." }); console.log(error); } }); router.post("/login", async (req, res) => { try { const { username, password } = req.body; const user = await User.findOne({ username }).select("+password"); //왜인지 password가 select되지 않아서 추가함 if (!user) { return res.status(401).json({ message: "존재하지 않는 사용자입니다." }); } if (!user.isActive) { return res.status(401).json({ message: "비활성화된 사용자입니다." }); } if (user.isLoggedIn == true) { return res.status(401).json({ message: "이미 접속 중인 사용자입니다." }); } const isValidPassword = await bcrypt.compare(password, user.password); //비밀번호 비교 if (!isValidPassword) { user.failedLoginAttempts += 1; user.lastLoginAttempt = new Date(); if (user.failedLoginAttempts >= 5) { user.isActive = false; //다섯번 틀리면 계정 비활성화 ㅋㅋ await user.save(); return res.status(401).json({ message: "비밀번호를 5회 이상 틀려 계정이 비활성화되었습니다.", }); } await user.save(); return res.status(401).json({ message: "비밀번호가 일치하지 않습니다.", remainingAttempts: 5 - user.failedLoginAttempts, }); } user.failedLoginAttempts = 0; user.lastLoginAttempt = new Date(); user.isLoggedIn = true; try { const response = await axios.get("https://api.ipify.org?format=json"); //공공장소 사용금지요 const ipAddress = response.data.ip; //한번 정제함 user.lastLoginIp = ipAddress; } catch (error) { console.log("IP 주소를 가져오는데 실패했습니다: ", error.message); } await user.save(); const token = jwt.sign( { userId: user._id, username: user.username }, process.env.JWT_SECRET, { expiresIn: "24h" } //토큰 만료는 24시간 ); console.log(token); //오 된다 res.cookie("token", token, { httpOnly: true, //자바스크립트에서 쿠키 접근 불가 secure: "production", //https에서만 쿠키 전송 sameSite: "strict", //같은 사이트에서만 쿠키 전송 maxAge: 24 * 60 * 60 * 1000, //24시간 }); const userWithoutPassword = user.toObject(); //구글링 해보니 이렇게 하면 문서 타입을 일반 객체로 변환할 수 있다고 한다 delete userWithoutPassword.password; //보안때문에 비밀번호는 삭제할 수 있다고 한다 res.json({ user: userWithoutPassword }); } catch (error) { console.log("서버 오류: ", error); res.status(500).json({ message: "서버 오류가 발생했습니다." }); } }); router.post("/logout", async (req, res) => { console.log(req.cookies.token); try { const token = req.cookies.token; if (!token) { return res.status(400).json({ message: "이미 로그아웃된 상태입니다." }); } try { const decoded = jwt.verify(token, process.env.JWT_SECRET); const user = await User.findById(decoded.userId); if (user) { user.isLoggedIn = false; await user.save(); } } catch (error) { console.log("토큰 검증 오류: ", error.message); } res.clearCookie("token", { httpOnly: true, secure: "production", sameSite: "strict", }); res.json({ message: "로그아웃되었습니다." }); } catch (error) { console.log("로그아웃 오류: ", error.message); res.status(500).json({ message: "서버 오류가 발생했습니다." }); } }); router.delete("/delete/:userId", async (req, res) => { try { const user = await User.findByIdAndDelete(req.params.userId); if (!user) { return res.status(404).json({ message: "사용자를 찾을 수 없습니다." }); } res.json({ message: "사용자가 성공적으로 삭제되었습니다." }); } catch (error) { res.status(500).json({ message: "서버 오류가 발생했습니다." }); } }); module.exports = router;
-
해결됨한 입 크기로 잘라먹는 Next.js(v15)
[해결 완료] [14:50] 문제가 발생했습니다. 다시 시도하세요
안녕하세요 강사님http://localhost:3000/book/100 URL로 테스트 진행 시에 저는 왜 문제가 발생했습니다. 다시 시도해주세요 문구가 웹페이지에 보이지 않는건가요?[해결 완료]강사님 인강에서 아무리 찾아봐도 fetch-one-book.ts 파일에 if (!response.ok) throw new Error(""); 코드를 추가한 내역이 인강에서 보이지가 않습니다.. 몇 번을 되돌려봐도 못찾고 있습니다. 혹시 누락 사항일까요? import style from "./[id].module.css"; import {GetStaticPropsContext, InferGetStaticPropsType} from "next"; import fetchOneBook from "@/lib/fetch-one-book"; import { useRouter } from "next/router"; export const getStaticPaths = () => { return { paths: [ { params: { id: "1" } }, { params: { id: "2" } }, { params: { id: "3" } }, ], // fallback: "blocking", fallback: true, }; }; export const getStaticProps = async ( context: GetStaticPropsContext ) => { const id = context.params!.id; const book = await fetchOneBook(Number(id)); return { props: { book, }, }; }; export default function Page({ book, }: InferGetStaticPropsType<typeof getStaticProps>) { const router = useRouter(); if (router.isFallback) return "로딩중입니다"; console.log("booktest") console.log(book) if (!book) return "문제가 발생했습니다 다시 시도하세요"; const { id, title, subTitle, description, author, publisher, coverImgUrl, } = book; return ( <div className={style.container}> <div className={style.cover_img_container} style={{backgroundImage: `url('${coverImgUrl}')`}} > <img src={coverImgUrl} alt={""}/> </div> <div className={style.title}>{title}</div> <div className={style.subTitle}>{subTitle}</div> <div className={style.author}> {author} | {publisher} </div> <div className={style.description}>{description}</div> </div> ); }
-
해결됨아바타 커뮤니티앱 만들기 (React Native Expo)
[5-4]글 수정/삭제 기능 구현하기(2) - API연동 부분에서 수정하기 누르면 제목과 내용이 비어있는데요,,, 한번 더 수정하기 눌러야 이전 제목과, 내용이 나옵니다...
수정하기 누르면 한번에 바로 ,이전 제목과 내용이 바로 나오는게 아니고;빈상태로 나오다가, 한번더 수정하기 눌러야 이전 제목과 내용이 나오더라구요;; 한번에 바로 나오게하는 방법은 없을까요?
-
해결됨(2025) MBTI 테스트 기반 수익형 웹사이트 만들기 - <코딩 배워 사업하자>
TEST.js 파일은 어디에 있나요?
안녕하세요! 수업을 듣는데 Test.js 파일이 없어서요다운받은 파일에도 없어요
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
Querydsl 검색처리에서 테스트 결과가 잘 안 나오는 거 같습니다
로직 작성하고 테스트 실행해봤는데 카운트 쿼리까지는 실행된 거 같은데 todoDTO의 결과가 표시되지 않네요하단에 있는 실행 결과를 봐주시고 답변을 해주시면 감사드리겠습니다 혹시 더 필요한 게 있으시면 말씀해 주세요 > Task :clean> Task :compileJava> Task :processResources> Task :classes> Task :compileTestJava> Task :processTestResources NO-SOURCE> Task :testClasses11:41:34.918 [Test worker] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [org.zerock.apiserver.service.TodoServiceTests]: TodoServiceTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.11:41:34.987 [Test worker] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration org.zerock.apiserver.ApiserverApplication for test class org.zerock.apiserver.service.TodoServiceTests . ____ _ __ _ _ /\\ / ___'_ __ _ ()_ __ __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.4.1)2025-02-22T11:41:35.222+09:00 INFO 10348 --- [apiserver] [ Test worker] o.z.apiserver.service.TodoServiceTests : Starting TodoServiceTests using Java 21.0.5 with PID 10348 (started by zzamp in C:\Users\zzamp\Desktop\apiserver\apiserver)2025-02-22T11:41:35.223+09:00 INFO 10348 --- [apiserver] [ Test worker] o.z.apiserver.service.TodoServiceTests : No active profile set, falling back to 1 default profile: "default"2025-02-22T11:41:35.536+09:00 INFO 10348 --- [apiserver] [ Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.2025-02-22T11:41:35.578+09:00 INFO 10348 --- [apiserver] [ Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 35 ms. Found 1 JPA repository interface.2025-02-22T11:41:35.798+09:00 INFO 10348 --- [apiserver] [ Test worker] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]2025-02-22T11:41:35.837+09:00 INFO 10348 --- [apiserver] [ Test worker] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.6.4.Final2025-02-22T11:41:35.858+09:00 INFO 10348 --- [apiserver] [ Test worker] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled2025-02-22T11:41:36.016+09:00 INFO 10348 --- [apiserver] [ Test worker] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer2025-02-22T11:41:36.033+09:00 INFO 10348 --- [apiserver] [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...2025-02-22T11:41:36.084+09:00 INFO 10348 --- [apiserver] [ Test worker] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection org.mariadb.jdbc.Connection@7e1d8d412025-02-22T11:41:36.085+09:00 INFO 10348 --- [apiserver] [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.2025-02-22T11:41:36.116+09:00 INFO 10348 --- [apiserver] [ Test worker] org.hibernate.orm.connections.pooling : HHH10001005: Database info: Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] Database driver: undefined/unknown Database version: 10.11.10 Autocommit mode: undefined/unknown Isolation level: undefined/unknown Minimum pool size: undefined/unknown Maximum pool size: undefined/unknown2025-02-22T11:41:36.523+09:00 INFO 10348 --- [apiserver] [ Test worker] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)2025-02-22T11:41:36.558+09:00 INFO 10348 --- [apiserver] [ Test worker] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'2025-02-22T11:41:36.897+09:00 WARN 10348 --- [apiserver] [ Test worker] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning2025-02-22T11:41:37.114+09:00 INFO 10348 --- [apiserver] [ Test worker] o.z.apiserver.service.TodoServiceTests : Started TodoServiceTests in 2.018 seconds (process running for 2.672)Mockito is currently self-attaching to enable the inline-mock-maker. This will no longer work in future releases of the JDK. Please add Mockito as an agent to your build what is described in Mockito's documentation: https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#0.3WARNING: A Java agent has been loaded dynamically (C:\Users\zzamp\.gradle\caches\modules-2\files-2.1\net.bytebuddy\byte-buddy-agent\1.15.11\a38b16385e867f59a641330f0362ebe742788ed8\byte-buddy-agent-1.15.11.jar)WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warningWARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more informationWARNING: Dynamic loading of agents will be disallowed by default in a future release2025-02-22T11:41:37.366+09:00 INFO 10348 --- [apiserver] [ Test worker] o.z.a.repository.search.TodoSearchImpl : search1.................Hibernate: select t1_0.tno,t1_0.complete,t1_0.content,t1_0.due_date,t1_0.title from tbl_todo t1_0 order by t1_0.tno desc limit ?,?Hibernate: select count(t1_0.tno) from tbl_todo t1_02025-02-22T11:41:37.646+09:00 INFO 10348 --- [apiserver] [ Test worker] o.z.apiserver.service.TodoServiceTests : org.zerock.apiserver.dto.PageResponseDTO@11f81488Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended2025-02-22T11:41:37.658+09:00 INFO 10348 --- [apiserver] [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'2025-02-22T11:41:37.659+09:00 INFO 10348 --- [apiserver] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...2025-02-22T11:41:37.662+09:00 INFO 10348 --- [apiserver] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.> Task :testBUILD SUCCESSFUL in 5s5 actionable tasks: 5 executed오전 11:41:37: 실행이 완료되었습니다 ':test --tests "org.zerock.apiserver.service.TodoServiceTests.testGetList"'.
-
해결됨한 입 크기로 잘라먹는 Next.js(v15)
enterKey로 페이지 이동 관련 질문
안녕하세요! 섹션3 2.8)페이지별 레이아웃 설정하기 강의에서 20분44초부터 시작하는 enterKey로 페이지 이동하는 부분에서 질문 있습니다 <form>태그 + e.preventDefault() 그리고 onSubmit을 사용하면 클릭+enterKey를 작동하게 할 수 있잖아요 혹시 강사님께서는 file같은 form을 진짜 제출하는게 아닐땐 form태그 사용하는걸 지양하시는 편인가요?? 혹시 그렇다면 이유도 물어봐도 될까요?? 감사합니다!!